Version 1.9.0-dev.1.0

svn merge -r 42029:42237 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@42241 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index a1372da..0d6ae79 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -338,6 +338,8 @@
       
       
       
+      
+      
     <h3>Requests</h3><dl><dt class="request">analysis.getErrors</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.getErrors"
@@ -360,7 +362,9 @@
           for the file cannot be computed, then the subset of the
           errors that can be computed will be returned and the
           response will contain an error to indicate why the errors
-          could not be computed.
+          could not be computed. If the content of the file changes after this
+          request was received but before a response could be sent, then an
+          error of type <tt>CONTENT_MODIFIED</tt> will be generated.
         </p>
         <p>
           This request is intended to be used by clients that cannot
@@ -413,14 +417,12 @@
       <h4>Parameters</h4><dl><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
             
             <p>
-              The file in which hover information is being
-              requested.
+              The file in which hover information is being requested.
             </p>
           </dd><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
             
             <p>
-              The offset for which hover information is being
-              requested.
+              The offset for which hover information is being requested.
             </p>
           </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>hovers ( List&lt;<a href="#type_HoverInformation">HoverInformation</a>&gt; )</i></b></dt><dd>
             
@@ -432,6 +434,78 @@
               in multiple contexts in conflicting ways (such as a
               part that is included in multiple libraries).
             </p>
+          </dd></dl></dd><dt class="request">analysis.getNavigation</dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "analysis.getNavigation"
+  "params": {
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>offset</b>": int
+    "<b>length</b>": int
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+    "<b>files</b>": List&lt;<a href="#type_FilePath">FilePath</a>&gt;
+    "<b>targets</b>": List&lt;<a href="#type_NavigationTarget">NavigationTarget</a>&gt;
+    "<b>regions</b>": List&lt;<a href="#type_NavigationRegion">NavigationRegion</a>&gt;
+  }
+}</pre></div>
+        <p>
+          Return the navigation information associated with the given region of
+          the given file. If the navigation information for the given file has
+          not yet been computed, or the most recently computed navigation
+          information for the given file is out of date, then the response for
+          this request will be delayed until it has been computed. If the
+          content of the file changes after this request was received but before
+          a response could be sent, then an error of type
+          <tt>CONTENT_MODIFIED</tt> will be generated.
+        </p>
+        <p>
+          If a navigation region overlaps (but extends either before or after)
+          the given region of the file it will be included in the result. This
+          means that it is theoretically possible to get the same navigation
+          region in response to multiple requests. Clients can avoid this by
+          always choosing a region that starts at the beginning of a line and
+          ends at the end of a (possibly different) line in the file.
+        </p>
+        
+        
+      <h4>Parameters</h4><dl><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
+            
+            <p>
+              The file in which navigation information is being requested.
+            </p>
+          </dd><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
+            
+            <p>
+              The offset of the region for which navigation information is being
+              requested.
+            </p>
+          </dd><dt class="field"><b><i>length ( int )</i></b></dt><dd>
+            
+            <p>
+              The length of the region for which navigation information is being
+              requested.
+            </p>
+          </dd></dl><h4>Returns</h4><dl><dt class="field"><b><i>files ( List&lt;<a href="#type_FilePath">FilePath</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              A list of the paths of files that are referenced by the navigation
+              targets.
+            </p>
+          </dd><dt class="field"><b><i>targets ( List&lt;<a href="#type_NavigationTarget">NavigationTarget</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              A list of the navigation targets that are referenced by the
+              navigation regions.
+            </p>
+          </dd><dt class="field"><b><i>regions ( List&lt;<a href="#type_NavigationRegion">NavigationRegion</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              A list of the navigation regions within the requested region of
+              the file.
+            </p>
           </dd></dl></dd><dt class="request">analysis.reanalyze</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.reanalyze"
@@ -779,11 +853,54 @@
               other highlight regions if there is more than one
               meaning associated with a particular region.
             </p>
+          </dd></dl></dd><dt class="notification">analysis.invalidate</dt><dd><div class="box"><pre>notification: {
+  "event": "analysis.invalidate"
+  "params": {
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>offset</b>": int
+    "<b>length</b>": int
+    "<b>delta</b>": int
+  }
+}</pre></div>
+        <p>
+          Reports that the navigation information associated with a region of a
+          single file has become invalid and should be re-requested.
+        </p>
+        <p>
+          This notification is not subscribed to by default. Clients can
+          subscribe by including the value <tt>"INVALIDATE"</tt> in the list of
+          services passed in an analysis.setSubscriptions request.
+        </p>
+        
+      <h4>Parameters</h4><dl><dt class="field"><b><i>file ( <a href="#type_FilePath">FilePath</a> )</i></b></dt><dd>
+            
+            <p>
+              The file whose information has been invalidated.
+            </p>
+          </dd><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
+            
+            <p>
+              The offset of the invalidated region.
+            </p>
+          </dd><dt class="field"><b><i>length ( int )</i></b></dt><dd>
+            
+            <p>
+              The length of the invalidated region.
+            </p>
+          </dd><dt class="field"><b><i>delta ( int )</i></b></dt><dd>
+            
+            <p>
+              The delta to be applied to the offsets in information that follows
+              the invalidated region in order to update it so that it doesn't
+              need to be re-requested.
+            </p>
           </dd></dl></dd><dt class="notification">analysis.navigation</dt><dd><div class="box"><pre>notification: {
   "event": "analysis.navigation"
   "params": {
     "<b>file</b>": <a href="#type_FilePath">FilePath</a>
     "<b>regions</b>": List&lt;<a href="#type_NavigationRegion">NavigationRegion</a>&gt;
+    "<b>targets</b>": List&lt;<a href="#type_NavigationTarget">NavigationTarget</a>&gt;
+    "<b>files</b>": List&lt;<a href="#type_FilePath">FilePath</a>&gt;
   }
 }</pre></div>
         <p>
@@ -815,6 +932,20 @@
               regions that are returned do not overlap other
               navigation regions.
             </p>
+          </dd><dt class="field"><b><i>targets ( List&lt;<a href="#type_NavigationTarget">NavigationTarget</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              The navigation targets referenced in the file.
+              They are referenced by <tt>NavigationRegion</tt>s by their
+              index in this array.
+            </p>
+          </dd><dt class="field"><b><i>files ( List&lt;<a href="#type_FilePath">FilePath</a>&gt; )</i></b></dt><dd>
+            
+            <p>
+              The files containing navigation targets referenced in the file.
+              They are referenced by <tt>NavigationTarget</tt>s by their
+              index in this array.
+            </p>
           </dd></dl></dd><dt class="notification">analysis.occurrences</dt><dd><div class="box"><pre>notification: {
   "event": "analysis.occurrences"
   "params": {
@@ -1802,6 +1933,7 @@
       
       
       
+      
     <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
         <p>
           A directive to begin overlaying the contents of a file.  The
@@ -1924,7 +2056,7 @@
           domain.
         </p>
         
-      <dl><dt class="value">FOLDING</dt><dt class="value">HIGHLIGHTS</dt><dt class="value">NAVIGATION</dt><dt class="value">OCCURRENCES</dt><dt class="value">OUTLINE</dt><dt class="value">OVERRIDES</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisStatus">AnalysisStatus: object</a></dt><dd>
+      <dl><dt class="value">FOLDING</dt><dt class="value">HIGHLIGHTS</dt><dt class="value">INVALIDATE</dt><dt class="value">NAVIGATION</dt><dt class="value">OCCURRENCES</dt><dt class="value">OUTLINE</dt><dt class="value">OVERRIDES</dt></dl></dd><dt class="typeDefinition"><a name="type_AnalysisStatus">AnalysisStatus: object</a></dt><dd>
         <p>
           An indication of the current state of analysis.
         </p>
@@ -2119,7 +2251,7 @@
             <p>
               The element identifier should be inserted at the completion location.
               For example "someMethod" in import 'myLib.dart' show someMethod; .
-              For suggestions of this kind, the element attribute is defined 
+              For suggestions of this kind, the element attribute is defined
               and the completion field is the element's identifier.
             </p>
           </dd><dt class="value">INVOCATION</dt><dd>
@@ -2127,7 +2259,7 @@
             <p>
               The element is being invoked at the completion location.
               For example, "someMethod" in x.someMethod(); .
-              For suggestions of this kind, the element attribute is defined 
+              For suggestions of this kind, the element attribute is defined
               and the completion field is the element's identifier.
             </p>
           </dd><dt class="value">KEYWORD</dt><dd>
@@ -2177,8 +2309,9 @@
             <p>
               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 "()".
+              the element doesn't have parameters (e.g. getter), this field
+              will not be defined. If the element has zero parameters, this
+              field will have a value of "()".
             </p>
           </dd><dt class="field"><b><i>returnType ( <span style="color:#999999">optional</span> String )</i></b></dt><dd>
             
@@ -2463,12 +2596,50 @@
             <p>
               The length of the region from which the user can navigate.
             </p>
-          </dd><dt class="field"><b><i>targets ( List&lt;<a href="#type_Element">Element</a>&gt; )</i></b></dt><dd>
+          </dd><dt class="field"><b><i>targets ( List&lt;int&gt; )</i></b></dt><dd>
             
             <p>
-              The elements to which the given region is bound. By
-              opening the declaration of the elements, clients can
-              implement one form of navigation.
+              The indexes of the targets (in the enclosing navigation response)
+              to which the given region is bound. By opening the target, clients
+              can implement one form of navigation.
+            </p>
+          </dd></dl></dd><dt class="typeDefinition"><a name="type_NavigationTarget">NavigationTarget: object</a></dt><dd>
+        <p>
+          A description of a target to which the user can navigate.
+        </p>
+        
+      <dl><dt class="field"><b><i>kind ( <a href="#type_ElementKind">ElementKind</a> )</i></b></dt><dd>
+            
+            <p>
+              The kind of the element.
+            </p>
+          </dd><dt class="field"><b><i>fileIndex ( int )</i></b></dt><dd>
+            
+            <p>
+              The index of the file (in the enclosing navigation response) to
+              navigate to.
+            </p>
+          </dd><dt class="field"><b><i>offset ( int )</i></b></dt><dd>
+            
+            <p>
+              The offset of the region from which the user can navigate.
+            </p>
+          </dd><dt class="field"><b><i>length ( int )</i></b></dt><dd>
+            
+            <p>
+              The length of the region from which the user can navigate.
+            </p>
+          </dd><dt class="field"><b><i>startLine ( int )</i></b></dt><dd>
+            
+            <p>
+              The one-based index of the line containing the first
+              character of the region.
+            </p>
+          </dd><dt class="field"><b><i>startColumn ( int )</i></b></dt><dd>
+            
+            <p>
+              The one-based index of the column containing the first
+              character of the region.
             </p>
           </dd></dl></dd><dt class="typeDefinition"><a name="type_Occurrences">Occurrences: object</a></dt><dd>
         <p>
@@ -2707,7 +2878,14 @@
           execution of the server.
         </p>
         
-      <dl><dt class="value">GET_ERRORS_INVALID_FILE</dt><dd>
+      <dl><dt class="value">CONTENT_MODIFIED</dt><dd>
+            
+            <p>
+              An "analysis.getErrors" or "analysis.getNavigation" request could
+              not be satisfied because the content of the file changed before
+              the requested results could be computed.
+            </p>
+          </dd><dt class="value">GET_ERRORS_INVALID_FILE</dt><dd>
             
             <p>
               An "analysis.getErrors" request specified a FilePath
diff --git a/pkg/analysis_server/lib/driver.dart b/pkg/analysis_server/lib/driver.dart
index 74f1dcd..08d7bfa 100644
--- a/pkg/analysis_server/lib/driver.dart
+++ b/pkg/analysis_server/lib/driver.dart
@@ -11,11 +11,40 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/stdio_server.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/generated/incremental_logger.dart';
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:args/args.dart';
 
+
+/**
+ * Initializes incremental logger.
+ *
+ * Supports following formats of [spec]:
+ *
+ *     "console" - log to the console;
+ *     "file:/some/file/name" - log to the file, overwritten on start.
+ */
+void _initIncrementalLogger(String spec) {
+  logger = NULL_LOGGER;
+  if (spec == null) {
+    return;
+  }
+  // create logger
+  if (spec == 'console') {
+    logger = new StringSinkLogger(console.log);
+  }
+  if (spec.startsWith('file:')) {
+    String fileName = spec.substring('file:'.length);
+    File file = new File(fileName);
+    IOSink sink = file.openWrite();
+    logger = new StringSinkLogger(sink);
+  }
+}
+
+
 /**
  * The [Driver] class represents a single running instance of the analysis
  * server application.  It is responsible for parsing command line options
@@ -34,6 +63,18 @@
       "enable-incremental-resolution";
 
   /**
+   * The name of the option used to enable incremental resolution of API
+   * changes.
+   */
+  static const String ENABLE_INCREMENTAL_RESOLUTION_API =
+      "enable-incremental-resolution-api";
+
+  /**
+   * The name of the option used to describe the incremental resolution logger.
+   */
+  static const String INCREMENTAL_RESOLUTION_LOG = "incremental-resolution-log";
+
+  /**
    * The name of the option used to enable instrumentation.
    */
   static const String ENABLE_INSTRUMENTATION_OPTION = "enable-instrumentation";
@@ -54,8 +95,7 @@
    * The name of the option used to specify if [print] should print to the
    * console instead of being intercepted.
    */
-  static const String INTERNAL_PRINT_TO_CONSOLE =
-      "internal-print-to-console";
+  static const String INTERNAL_PRINT_TO_CONSOLE = "internal-print-to-console";
 
   /**
    * The name of the option used to specify the port to which the server will
@@ -75,6 +115,11 @@
    */
   static const String NO_ERROR_NOTIFICATION = "no-error-notification";
 
+  /**
+   * The instrumentation server that is to be used by the analysis server.
+   */
+  InstrumentationServer instrumentationServer;
+
   SocketServer socketServer;
 
   HttpAnalysisServer httpServer;
@@ -93,6 +138,11 @@
         defaultsTo: false,
         negatable: false);
     parser.addFlag(
+        ENABLE_INCREMENTAL_RESOLUTION_API,
+        help: "enable using incremental resolution for API changes",
+        defaultsTo: false,
+        negatable: false);
+    parser.addFlag(
         ENABLE_INSTRUMENTATION_OPTION,
         help: "enable sending instrumentation information to a server",
         defaultsTo: false,
@@ -103,6 +153,9 @@
         defaultsTo: false,
         negatable: false);
     parser.addOption(
+        INCREMENTAL_RESOLUTION_LOG,
+        help: "the description of the incremental resolotion log");
+    parser.addOption(
         INSTRUMENTATION_LOG_FILE_OPTION,
         help: "[path] the file to which instrumentation data will be logged");
     parser.addFlag(
@@ -126,15 +179,31 @@
       _printUsage(parser);
       return;
     }
-    if (results[ENABLE_INSTRUMENTATION_OPTION]) {
-      if (results[INSTRUMENTATION_LOG_FILE_OPTION] != null) {
-        // TODO(brianwilkerson) Initialize the instrumentation system with
-        // logging.
-      } else {
-        // TODO(brianwilkerson) Initialize the instrumentation system without
-        // logging.
-      }
-    }
+
+    // TODO(brianwilkerson) Enable this after it is possible for an
+    // instrumentation server to be provided.
+//    if (results[ENABLE_INSTRUMENTATION_OPTION]) {
+////      if (results[INSTRUMENTATION_LOG_FILE_OPTION] != null) {
+////        // TODO(brianwilkerson) Initialize the instrumentation server with
+////        // logging.
+////      } else {
+////        // TODO(brianwilkerson) Initialize the instrumentation server without
+////        // logging.
+////      }
+//      if (instrumentationServer == null) {
+//        print('Exiting server: enabled instrumentation without providing an instrumentation server');
+//        print('');
+//        _printUsage(parser);
+//        return;
+//      }
+//    } else {
+//      if (instrumentationServer != null) {
+//        print('Exiting server: providing an instrumentation server without enabling instrumentation');
+//        print('');
+//        _printUsage(parser);
+//        return;
+//      }
+//    }
 
     int port;
     bool serve_http = false;
@@ -154,6 +223,10 @@
     AnalysisServerOptions analysisServerOptions = new AnalysisServerOptions();
     analysisServerOptions.enableIncrementalResolution =
         results[ENABLE_INCREMENTAL_RESOLUTION];
+    analysisServerOptions.enableIncrementalResolutionApi =
+        results[ENABLE_INCREMENTAL_RESOLUTION_API];
+
+    _initIncrementalLogger(results[INCREMENTAL_RESOLUTION_LOG]);
 
     DartSdk defaultSdk;
     if (results[SDK_OPTION] != null) {
@@ -164,7 +237,12 @@
       defaultSdk = DirectoryBasedDartSdk.defaultSdk;
     }
 
-    socketServer = new SocketServer(analysisServerOptions, defaultSdk);
+    socketServer = new SocketServer(
+        analysisServerOptions,
+        defaultSdk,
+        instrumentationServer == null ?
+            new NullInstrumentationServer() :
+            instrumentationServer);
     httpServer = new HttpAnalysisServer(socketServer);
     stdioServer = new StdioAnalysisServer(socketServer);
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index c346682..4e79eba 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -18,6 +18,7 @@
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/package_map_provider.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -113,6 +114,11 @@
   final DartSdk defaultSdk;
 
   /**
+   * The instrumentation server that is to be used by this analysis server.
+   */
+  final InstrumentationServer instrumentationServer;
+
+  /**
    * A table mapping [Folder]s to the [AnalysisContext]s associated with them.
    */
   final Map<Folder, AnalysisContext> folderMap =
@@ -185,13 +191,15 @@
   AnalysisServer(this.channel, this.resourceProvider,
       PackageMapProvider packageMapProvider, this.index,
       AnalysisServerOptions analysisServerOptions, this.defaultSdk,
-      {this.rethrowExceptions: true}) {
+      this.instrumentationServer, {this.rethrowExceptions: true}) {
     searchEngine = createSearchEngine(index);
     operationQueue = new ServerOperationQueue(this);
     contextDirectoryManager =
         new ServerContextManager(this, resourceProvider, packageMapProvider);
     contextDirectoryManager.defaultOptions.incremental =
         analysisServerOptions.enableIncrementalResolution;
+    contextDirectoryManager.defaultOptions.incrementalApi =
+        analysisServerOptions.enableIncrementalResolutionApi;
     AnalysisEngine.instance.logger = new AnalysisLogger();
     _onAnalysisStartedController = new StreamController.broadcast();
     _onAnalysisCompleteController = new StreamController.broadcast();
@@ -280,7 +288,14 @@
       }
     }
     // check if there is a context that analyzed this source
-    Source source = getSource(path);
+    return getAnalysisContextForSource(getSource(path));
+  }
+
+  /**
+   * Return the [AnalysisContext] that is used to analyze the given [source].
+   * Return `null` if there is no such context.
+   */
+  AnalysisContext getAnalysisContextForSource(Source source) {
     for (AnalysisContext context in folderMap.values) {
       SourceKind kind = context.getKindOf(source);
       if (kind != null) {
@@ -918,6 +933,7 @@
 
 class AnalysisServerOptions {
   bool enableIncrementalResolution = false;
+  bool enableIncrementalResolutionApi = false;
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index c2af2b5..ab0d854 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -4,6 +4,8 @@
 
 library computer.navigation;
 
+import 'dart:collection';
+
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -16,17 +18,19 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  final List<protocol.NavigationRegion> _regions = <protocol.NavigationRegion>[
-      ];
+  final List<String> files = <String>[];
+  final Map<String, int> fileMap = new HashMap<String, int>();
+  final List<protocol.NavigationTarget> targets = <protocol.NavigationTarget>[];
+  final Map<Element, int> targetMap = new HashMap<Element, int>();
+  final List<protocol.NavigationRegion> regions = <protocol.NavigationRegion>[];
 
   DartUnitNavigationComputer(this._unit);
 
   /**
-   * Returns the computed navigation regions, not `null`.
+   * Computes [regions], [targets] and [files].
    */
-  List<protocol.NavigationRegion> compute() {
+  void compute() {
     _unit.accept(new _DartUnitNavigationComputerVisitor(this));
-    return new List.from(_regions);
   }
 
   void _addRegion(int offset, int length, Element element) {
@@ -39,8 +43,31 @@
     if (element.location == null) {
       return;
     }
-    protocol.Element target = protocol.newElement_fromEngine(element);
-    _regions.add(new protocol.NavigationRegion(offset, length, [target]));
+    int targetIndex = _addTarget(element);
+    regions.add(
+        new protocol.NavigationRegion(offset, length, <int>[targetIndex]));
+  }
+
+  int _addTarget(Element element) {
+    int index = targetMap[element];
+    if (index == null) {
+      index = targets.length;
+      protocol.NavigationTarget target =
+          protocol.newNavigationTarget_fromElement(element, _addFile);
+      targets.add(target);
+      targetMap[element] = index;
+    }
+    return index;
+  }
+
+  int _addFile(String file) {
+    int index = fileMap[file];
+    if (index == null) {
+      index = files.length;
+      files.add(file);
+      fileMap[file] = index;
+    }
+    return index;
   }
 
   void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index bb16047..03d8a89 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -298,7 +298,7 @@
       kind = ElementKind.METHOD;
     }
     _SourceRegion sourceRegion = _getSourceRegion(method);
-    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String parametersStr = parameters != null ? parameters.toSource() : null;
     String returnTypeStr = returnType != null ? returnType.toSource() : '';
     Element element = new Element(
         kind,
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index f7a1758..1c8ece0 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -15,7 +15,7 @@
 import 'package:analyzer/src/generated/source.dart';
 
 export 'package:analysis_server/src/services/completion/completion_manager.dart'
-    show CompletionPerformance, OperationPerformance;
+    show CompletionPerformance, CompletionRequest, OperationPerformance;
 
 /**
  * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
@@ -33,10 +33,10 @@
   int _nextCompletionId = 0;
 
   /**
-   * Cached information from a prior completion operation.
-   * The type of cached information depends upon the completion operation.
+   * The completion manager for most recent [Source] and [AnalysisContext],
+   * or `null` if none.
    */
-  CompletionCache _cache;
+  CompletionManager _manager;
 
   /**
    * The subscription for the cached context's source change stream.
@@ -53,6 +53,33 @@
    */
   CompletionDomainHandler(this.server) {
     server.onContextsChanged.listen(contextsChanged);
+    server.onPriorityChange.listen(priorityChanged);
+  }
+
+  /**
+   * Return the completion manager for most recent [Source] and [AnalysisContext],
+   * or `null` if none.
+   */
+  CompletionManager get manager => _manager;
+
+  /**
+   * Return the [CompletionManager] for the given [context] and [source],
+   * creating a new manager or returning an existing manager as necessary.
+   */
+  CompletionManager completionManagerFor(AnalysisContext context,
+      Source source) {
+    if (_manager != null) {
+      if (_manager.context == context && _manager.source == source) {
+        return _manager;
+      }
+      _discardManager();
+    }
+    _manager = createCompletionManager(context, source, server.searchEngine);
+    if (context != null) {
+      _sourcesChangedSubscription =
+          context.onSourcesChanged.listen(sourcesChanged);
+    }
+    return _manager;
   }
 
   /**
@@ -60,24 +87,17 @@
    * then discard the cache.
    */
   void contextsChanged(ContextsChangedEvent event) {
-    if (_cache != null) {
-      AnalysisContext context = _cache.context;
+    if (_manager != null) {
+      AnalysisContext context = _manager.context;
       if (event.changed.contains(context) || event.removed.contains(context)) {
-        _discardCache();
+        _discardManager();
       }
     }
   }
 
   CompletionManager createCompletionManager(AnalysisContext context,
-      Source source, int offset, SearchEngine searchEngine, CompletionCache cache,
-      CompletionPerformance performance) {
-    return new CompletionManager.create(
-        context,
-        source,
-        offset,
-        searchEngine,
-        cache,
-        performance);
+      Source source, SearchEngine searchEngine) {
+    return new CompletionManager.create(context, source, searchEngine);
   }
 
   @override
@@ -94,6 +114,22 @@
   }
 
   /**
+   * If the set the priority files has changed, then pre-cache completion
+   * information related to the first priority file.
+   */
+  void priorityChanged(PriorityChangeEvent event) {
+    Source source = event.firstSource;
+    if (source == null) {
+      return;
+    }
+    AnalysisContext context = server.getAnalysisContextForSource(source);
+    if (context == null) {
+      return;
+    }
+    completionManagerFor(context, source).computeCache();
+  }
+
+  /**
    * Process a `completion.getSuggestions` request.
    */
   Response processRequest(Request request) {
@@ -103,14 +139,12 @@
         new CompletionGetSuggestionsParams.fromRequest(request);
     // schedule completion analysis
     String completionId = (_nextCompletionId++).toString();
-    CompletionManager manager = createCompletionManager(
+    CompletionManager manager = completionManagerFor(
         server.getAnalysisContext(params.file),
-        server.getSource(params.file),
-        params.offset,
-        server.searchEngine,
-        _cache,
-        performance);
-    manager.results().listen((CompletionResult result) {
+        server.getSource(params.file));
+    CompletionRequest completionRequest =
+        new CompletionRequest(params.offset, performance);
+    manager.results(completionRequest).listen((CompletionResult result) {
       sendCompletionNotification(
           completionId,
           result.replacementOffset,
@@ -119,17 +153,6 @@
           result.last);
       if (result.last) {
         performance.complete();
-        CompletionCache newCache = manager.completionCache;
-        if (_cache != newCache) {
-          if (_cache != null) {
-            _discardCache();
-          }
-          _cache = newCache;
-          if (_cache.context != null) {
-            _sourcesChangedSubscription =
-                _cache.context.onSourcesChanged.listen(sourcesChanged);
-          }
-        }
       }
     });
     // initial response without results
@@ -157,8 +180,8 @@
    */
   void sourcesChanged(SourcesChangedEvent event) {
 
-    bool shouldDiscardCache(SourcesChangedEvent event) {
-      if (_cache == null) {
+    bool shouldDiscardManager(SourcesChangedEvent event) {
+      if (_manager == null) {
         return false;
       }
       if (event.wereSourcesAdded || event.wereSourcesRemovedOrDeleted) {
@@ -166,22 +189,22 @@
       }
       var changedSources = event.changedSources;
       return changedSources.length > 2 ||
-          (changedSources.length == 1 && !changedSources.contains(_cache.source));
+          (changedSources.length == 1 && !changedSources.contains(_manager.source));
     }
 
-    if (shouldDiscardCache(event)) {
-      _discardCache();
+    if (shouldDiscardManager(event)) {
+      _discardManager();
     }
   }
 
   /**
    * Discard the sourcesChanged subscription if any
    */
-  void _discardCache() {
+  void _discardManager() {
     if (_sourcesChangedSubscription != null) {
       _sourcesChangedSubscription.cancel();
       _sourcesChangedSubscription = null;
     }
-    _cache = null;
+    _manager = null;
   }
 }
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index 0df308f..fcbabc5 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -692,6 +692,202 @@
     return _JenkinsSmiHash.finish(hash);
   }
 }
+
+/**
+ * analysis.getNavigation params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+class AnalysisGetNavigationParams implements HasToJson {
+  /**
+   * The file in which navigation information is being requested.
+   */
+  String file;
+
+  /**
+   * The offset of the region for which navigation information is being
+   * requested.
+   */
+  int offset;
+
+  /**
+   * The length of the region for which navigation information is being
+   * requested.
+   */
+  int length;
+
+  AnalysisGetNavigationParams(this.file, this.offset, this.length);
+
+  factory AnalysisGetNavigationParams.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 AnalysisGetNavigationParams(file, offset, length);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getNavigation params");
+    }
+  }
+
+  factory AnalysisGetNavigationParams.fromRequest(Request request) {
+    return new AnalysisGetNavigationParams.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, "analysis.getNavigation", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisGetNavigationParams) {
+      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);
+  }
+}
+
+/**
+ * analysis.getNavigation result
+ *
+ * {
+ *   "files": List<FilePath>
+ *   "targets": List<NavigationTarget>
+ *   "regions": List<NavigationRegion>
+ * }
+ */
+class AnalysisGetNavigationResult implements HasToJson {
+  /**
+   * A list of the paths of files that are referenced by the navigation
+   * targets.
+   */
+  List<String> files;
+
+  /**
+   * A list of the navigation targets that are referenced by the navigation
+   * regions.
+   */
+  List<NavigationTarget> targets;
+
+  /**
+   * A list of the navigation regions within the requested region of the file.
+   */
+  List<NavigationRegion> regions;
+
+  AnalysisGetNavigationResult(this.files, this.targets, this.regions);
+
+  factory AnalysisGetNavigationResult.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");
+      }
+      List<NavigationTarget> targets;
+      if (json.containsKey("targets")) {
+        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], (String jsonPath, Object json) => new NavigationTarget.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "targets");
+      }
+      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 AnalysisGetNavigationResult(files, targets, regions);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.getNavigation result");
+    }
+  }
+
+  factory AnalysisGetNavigationResult.fromResponse(Response response) {
+    return new AnalysisGetNavigationResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["files"] = files;
+    result["targets"] = targets.map((NavigationTarget value) => value.toJson()).toList();
+    result["regions"] = regions.map((NavigationRegion 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 AnalysisGetNavigationResult) {
+      return _listEqual(files, other.files, (String a, String b) => a == b) &&
+          _listEqual(targets, other.targets, (NavigationTarget a, NavigationTarget b) => a == b) &&
+          _listEqual(regions, other.regions, (NavigationRegion a, NavigationRegion b) => a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, targets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
 /**
  * analysis.reanalyze params
  */
@@ -1528,11 +1724,126 @@
 }
 
 /**
+ * analysis.invalidate params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "delta": int
+ * }
+ */
+class AnalysisInvalidateParams implements HasToJson {
+  /**
+   * The file whose information has been invalidated.
+   */
+  String file;
+
+  /**
+   * The offset of the invalidated region.
+   */
+  int offset;
+
+  /**
+   * The length of the invalidated region.
+   */
+  int length;
+
+  /**
+   * The delta to be applied to the offsets in information that follows the
+   * invalidated region in order to update it so that it doesn't need to be
+   * re-requested.
+   */
+  int delta;
+
+  AnalysisInvalidateParams(this.file, this.offset, this.length, this.delta);
+
+  factory AnalysisInvalidateParams.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 delta;
+      if (json.containsKey("delta")) {
+        delta = jsonDecoder._decodeInt(jsonPath + ".delta", json["delta"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "delta");
+      }
+      return new AnalysisInvalidateParams(file, offset, length, delta);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "analysis.invalidate params");
+    }
+  }
+
+  factory AnalysisInvalidateParams.fromNotification(Notification notification) {
+    return new AnalysisInvalidateParams.fromJson(
+        new ResponseDecoder(null), "params", notification._params);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["file"] = file;
+    result["offset"] = offset;
+    result["length"] = length;
+    result["delta"] = delta;
+    return result;
+  }
+
+  Notification toNotification() {
+    return new Notification("analysis.invalidate", toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is AnalysisInvalidateParams) {
+      return file == other.file &&
+          offset == other.offset &&
+          length == other.length &&
+          delta == other.delta;
+    }
+    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, delta.hashCode);
+    return _JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * analysis.navigation params
  *
  * {
  *   "file": FilePath
  *   "regions": List<NavigationRegion>
+ *   "targets": List<NavigationTarget>
+ *   "files": List<FilePath>
  * }
  */
 class AnalysisNavigationParams implements HasToJson {
@@ -1552,7 +1863,19 @@
    */
   List<NavigationRegion> regions;
 
-  AnalysisNavigationParams(this.file, this.regions);
+  /**
+   * The navigation targets referenced in the file. They are referenced by
+   * NavigationRegions by their index in this array.
+   */
+  List<NavigationTarget> targets;
+
+  /**
+   * The files containing navigation targets referenced in the file. They are
+   * referenced by NavigationTargets by their index in this array.
+   */
+  List<String> files;
+
+  AnalysisNavigationParams(this.file, this.regions, this.targets, this.files);
 
   factory AnalysisNavigationParams.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
@@ -1571,7 +1894,19 @@
       } else {
         throw jsonDecoder.missingKey(jsonPath, "regions");
       }
-      return new AnalysisNavigationParams(file, regions);
+      List<NavigationTarget> targets;
+      if (json.containsKey("targets")) {
+        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], (String jsonPath, Object json) => new NavigationTarget.fromJson(jsonDecoder, jsonPath, json));
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "targets");
+      }
+      List<String> files;
+      if (json.containsKey("files")) {
+        files = jsonDecoder._decodeList(jsonPath + ".files", json["files"], jsonDecoder._decodeString);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "files");
+      }
+      return new AnalysisNavigationParams(file, regions, targets, files);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "analysis.navigation params");
     }
@@ -1586,6 +1921,8 @@
     Map<String, dynamic> result = {};
     result["file"] = file;
     result["regions"] = regions.map((NavigationRegion value) => value.toJson()).toList();
+    result["targets"] = targets.map((NavigationTarget value) => value.toJson()).toList();
+    result["files"] = files;
     return result;
   }
 
@@ -1600,7 +1937,9 @@
   bool operator==(other) {
     if (other is AnalysisNavigationParams) {
       return file == other.file &&
-          _listEqual(regions, other.regions, (NavigationRegion a, NavigationRegion b) => a == b);
+          _listEqual(regions, other.regions, (NavigationRegion a, NavigationRegion b) => a == b) &&
+          _listEqual(targets, other.targets, (NavigationTarget a, NavigationTarget b) => a == b) &&
+          _listEqual(files, other.files, (String a, String b) => a == b);
     }
     return false;
   }
@@ -1610,6 +1949,8 @@
     int hash = 0;
     hash = _JenkinsSmiHash.combine(hash, file.hashCode);
     hash = _JenkinsSmiHash.combine(hash, regions.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, targets.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, files.hashCode);
     return _JenkinsSmiHash.finish(hash);
   }
 }
@@ -4982,6 +5323,7 @@
  * enum {
  *   FOLDING
  *   HIGHLIGHTS
+ *   INVALIDATE
  *   NAVIGATION
  *   OCCURRENCES
  *   OUTLINE
@@ -4993,6 +5335,8 @@
 
   static const HIGHLIGHTS = const AnalysisService._("HIGHLIGHTS");
 
+  static const INVALIDATE = const AnalysisService._("INVALIDATE");
+
   static const NAVIGATION = const AnalysisService._("NAVIGATION");
 
   static const OCCURRENCES = const AnalysisService._("OCCURRENCES");
@@ -5011,6 +5355,8 @@
         return FOLDING;
       case "HIGHLIGHTS":
         return HIGHLIGHTS;
+      case "INVALIDATE":
+        return INVALIDATE;
       case "NAVIGATION":
         return NAVIGATION;
       case "OCCURRENCES":
@@ -5714,8 +6060,9 @@
 
   /**
    * 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 "()".
+   * function this field will not be defined. If the element doesn't have
+   * parameters (e.g. getter), this field will not be defined. If the element
+   * has zero parameters, this field will have a value of "()".
    */
   String parameters;
 
@@ -7146,7 +7493,7 @@
  * {
  *   "offset": int
  *   "length": int
- *   "targets": List<Element>
+ *   "targets": List<int>
  * }
  */
 class NavigationRegion implements HasToJson {
@@ -7161,10 +7508,11 @@
   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.
+   * The indexes of the targets (in the enclosing navigation response) to which
+   * the given region is bound. By opening the target, clients can implement
+   * one form of navigation.
    */
-  List<Element> targets;
+  List<int> targets;
 
   NavigationRegion(this.offset, this.length, this.targets);
 
@@ -7185,9 +7533,9 @@
       } else {
         throw jsonDecoder.missingKey(jsonPath, "length");
       }
-      List<Element> targets;
+      List<int> targets;
       if (json.containsKey("targets")) {
-        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], (String jsonPath, Object json) => new Element.fromJson(jsonDecoder, jsonPath, json));
+        targets = jsonDecoder._decodeList(jsonPath + ".targets", json["targets"], jsonDecoder._decodeInt);
       } else {
         throw jsonDecoder.missingKey(jsonPath, "targets");
       }
@@ -7201,7 +7549,7 @@
     Map<String, dynamic> result = {};
     result["offset"] = offset;
     result["length"] = length;
-    result["targets"] = targets.map((Element value) => value.toJson()).toList();
+    result["targets"] = targets;
     return result;
   }
 
@@ -7213,7 +7561,7 @@
     if (other is NavigationRegion) {
       return offset == other.offset &&
           length == other.length &&
-          _listEqual(targets, other.targets, (Element a, Element b) => a == b);
+          _listEqual(targets, other.targets, (int a, int b) => a == b);
     }
     return false;
   }
@@ -7229,6 +7577,141 @@
 }
 
 /**
+ * NavigationTarget
+ *
+ * {
+ *   "kind": ElementKind
+ *   "fileIndex": int
+ *   "offset": int
+ *   "length": int
+ *   "startLine": int
+ *   "startColumn": int
+ * }
+ */
+class NavigationTarget implements HasToJson {
+  /**
+   * The kind of the element.
+   */
+  ElementKind kind;
+
+  /**
+   * The index of the file (in the enclosing navigation response) to navigate
+   * to.
+   */
+  int fileIndex;
+
+  /**
+   * 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 one-based index of the line containing the first character of the
+   * region.
+   */
+  int startLine;
+
+  /**
+   * The one-based index of the column containing the first character of the
+   * region.
+   */
+  int startColumn;
+
+  NavigationTarget(this.kind, this.fileIndex, this.offset, this.length, this.startLine, this.startColumn);
+
+  factory NavigationTarget.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");
+      }
+      int fileIndex;
+      if (json.containsKey("fileIndex")) {
+        fileIndex = jsonDecoder._decodeInt(jsonPath + ".fileIndex", json["fileIndex"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "fileIndex");
+      }
+      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 NavigationTarget(kind, fileIndex, offset, length, startLine, startColumn);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "NavigationTarget");
+    }
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    result["fileIndex"] = fileIndex;
+    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 NavigationTarget) {
+      return kind == other.kind &&
+          fileIndex == other.fileIndex &&
+          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, kind.hashCode);
+    hash = _JenkinsSmiHash.combine(hash, fileIndex.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);
+  }
+}
+
+/**
  * Occurrences
  *
  * {
@@ -8282,6 +8765,7 @@
  * RequestErrorCode
  *
  * enum {
+ *   CONTENT_MODIFIED
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_OVERLAY_CHANGE
  *   INVALID_PARAMETER
@@ -8297,6 +8781,13 @@
  */
 class RequestErrorCode implements Enum {
   /**
+   * An "analysis.getErrors" or "analysis.getNavigation" request could not be
+   * satisfied because the content of the file changed before the requested
+   * results could be computed.
+   */
+  static const CONTENT_MODIFIED = const RequestErrorCode._("CONTENT_MODIFIED");
+
+  /**
    * An "analysis.getErrors" request specified a FilePath which does not match
    * a file currently subject to analysis.
    */
@@ -8377,6 +8868,8 @@
 
   factory RequestErrorCode(String name) {
     switch (name) {
+      case "CONTENT_MODIFIED":
+        return CONTENT_MODIFIED;
       case "GET_ERRORS_INVALID_FILE":
         return GET_ERRORS_INVALID_FILE;
       case "INVALID_OVERLAY_CHANGE":
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 6ce6fbd..a642da2 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -38,8 +38,13 @@
 
 void sendAnalysisNotificationNavigation(AnalysisServer server, String file,
     CompilationUnit dartUnit) {
-  var regions = new DartUnitNavigationComputer(dartUnit).compute();
-  var params = new protocol.AnalysisNavigationParams(file, regions);
+  var computer = new DartUnitNavigationComputer(dartUnit);
+  computer.compute();
+  var params = new protocol.AnalysisNavigationParams(
+      file,
+      computer.regions,
+      computer.targets,
+      computer.files);
   server.sendNotification(params.toNotification());
 }
 
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index b783e84..c1ebd1b 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -226,6 +226,22 @@
 }
 
 
+NavigationTarget newNavigationTarget_fromElement(engine.Element element, int
+    fileToIndex(String file)) {
+  ElementKind kind = newElementKind_fromEngine(element.kind);
+  Location location = newLocation_fromElement(element);
+  String file = location.file;
+  int fileIndex = fileToIndex(file);
+  return new NavigationTarget(
+      kind,
+      fileIndex,
+      location.offset,
+      location.length,
+      location.startLine,
+      location.startColumn);
+}
+
+
 /**
  * Construct based on an element from the analyzer engine.
  */
@@ -302,9 +318,15 @@
 String _getParametersString(engine.Element element) {
   // TODO(scheglov) expose the corresponding feature from ExecutableElement
   if (element is engine.ExecutableElement) {
-    var sb = new StringBuffer();
+    // valid getters don't have parameters
+    if (element.kind == engine.ElementKind.GETTER &&
+        element.parameters.isEmpty) {
+      return null;
+    }
+    // append parameters
+    StringBuffer sb = new StringBuffer();
     String closeOptionalString = '';
-    for (var parameter in element.parameters) {
+    for (engine.ParameterElement parameter in element.parameters) {
       if (sb.isNotEmpty) {
         sb.write(', ');
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
index 10b1486..4ffb40b 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_manager.dart
@@ -37,57 +37,65 @@
 abstract class CompletionManager {
 
   /**
+   * The context in which the completion was computed.
+   */
+  final AnalysisContext context;
+
+  /**
+   * The source in which the completion was computed.
+   */
+  final Source source;
+
+  /**
    * The controller used for returning completion results.
    */
   StreamController<CompletionResult> controller;
 
-  CompletionManager();
+  CompletionManager(this.context, this.source);
 
   /**
    * Create a manager for the given request.
    */
   factory CompletionManager.create(AnalysisContext context, Source source,
-      int offset, SearchEngine searchEngine, CompletionCache cache,
-      CompletionPerformance performance) {
+      SearchEngine searchEngine) {
     if (context != null) {
       if (AnalysisEngine.isDartFileName(source.shortName)) {
-        return new DartCompletionManager.create(
-            context,
-            searchEngine,
-            source,
-            offset,
-            cache,
-            performance);
+        return new DartCompletionManager.create(context, searchEngine, source);
       }
       if (AnalysisEngine.isHtmlFileName(source.shortName)) {
         //TODO (danrubel) implement
 //        return new HtmlCompletionManager(context, searchEngine, source, offset);
       }
     }
-    return new NoOpCompletionManager(source, offset);
+    return new NoOpCompletionManager(source);
   }
 
   /**
-   * Return cached information from the current completion operation
-   * if there is any. Subclasses may override this method.
+   * Compute and cache information in preparation for a possible code
+   * completion request sometime in the future. The default implementation
+   * of this method does nothing. Subclasses may override but should not
+   * count on this method being called before [computeSuggestions].
    */
-  CompletionCache get completionCache => null;
+  void computeCache() {
+  }
 
   /**
-   * Compute completion results and append them to the stream.
+   * Compute completion results for the given reqeust and append them to the stream.
    * Clients should not call this method directly as it is automatically called
    * when a client listens to the stream returned by [results].
    * Subclasses should override this method, append at least one result
    * to the [controller], and close the controller stream once complete.
    */
-  void compute();
+  void computeSuggestions(CompletionRequest request);
 
   /**
    * Generate a stream of code completion results.
    */
-  Stream<CompletionResult> results() {
+  Stream<CompletionResult> results(CompletionRequest request) {
     controller = new StreamController<CompletionResult>(onListen: () {
-      scheduleMicrotask(compute);
+      scheduleMicrotask(() {
+        computeSuggestions(request);
+      });
     });
     return controller.stream;
   }
@@ -139,6 +147,23 @@
 }
 
 /**
+ * Encapsulates information specific to a particular completion request.
+ */
+class CompletionRequest {
+  /**
+   * The offset within the source at which the completion is requested.
+   */
+  final int offset;
+
+  /**
+   * Performance measurements for this particular request.
+   */
+  final CompletionPerformance performance;
+
+  CompletionRequest(this.offset, this.performance);
+}
+
+/**
  * Code completion result generated by an [CompletionManager].
  */
 class CompletionResult {
@@ -174,14 +199,12 @@
 }
 
 class NoOpCompletionManager extends CompletionManager {
-  final Source source;
-  final int offset;
 
-  NoOpCompletionManager(this.source, this.offset);
+  NoOpCompletionManager(Source source) : super(null, source);
 
   @override
-  void compute() {
-    controller.add(new CompletionResult(offset, 0, [], true));
+  void computeSuggestions(CompletionRequest request) {
+    controller.add(new CompletionResult(request.offset, 0, [], true));
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
index 2053b34..87ae27c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_cache.dart
@@ -77,7 +77,10 @@
 
   /**
    * Compute suggestions based upon the imports in the given compilation unit.
-   * Return a future that completes when the information has been cached.
+   * On return, the cache will be populated except for lower priority
+   * suggestions added as a result of a global search. Callers may wait
+   * on the returned future if they want to ensure those lower priority
+   * suggestions are part of the cached suggestions.
    */
   Future<bool> computeImportInfo(CompilationUnit unit,
       SearchEngine searchEngine) {
@@ -130,8 +133,16 @@
       addSuggestion(elem, CompletionRelevance.DEFAULT);
     });
 
+    /*
+     * Don't wait for search of lower relevance results to complete.
+     * Set key indicating results are ready, and lower relevance results
+     * will be added to the cache when the search completes.
+     */
+    _importKey = _computeImportKey(unit);
+
     // Add non-imported elements as low relevance
-    var future = searchEngine.searchTopLevelDeclarations('');
+    Future<List<SearchMatch>> future =
+        searchEngine.searchTopLevelDeclarations('');
     return future.then((List<SearchMatch> matches) {
       matches.forEach((SearchMatch match) {
         if (match.kind == MatchKind.DECLARATION) {
@@ -143,7 +154,6 @@
           }
         }
       });
-      _importKey = _computeImportKey(unit);
       return true;
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index 217ee6c..e2c9cdc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -48,17 +48,14 @@
  * Manages code completion for a given Dart file completion request.
  */
 class DartCompletionManager extends CompletionManager {
-  final DartCompletionRequest request;
-  final AnalysisContext context;
-  final Source source;
-  final int offset;
-  final CompletionPerformance performance;
+  final SearchEngine searchEngine;
   final DartCompletionCache cache;
   List<DartCompletionComputer> computers;
 
-  DartCompletionManager(this.request, this.context, this.source, this.offset,
-      this.cache, this.performance)
-      : computers = [
+  DartCompletionManager(AnalysisContext context, this.searchEngine,
+      Source source, this.cache)
+      : super(context, source),
+        computers = [
           new KeywordComputer(),
           new LocalComputer(),
           new ArgListComputer(),
@@ -70,35 +67,19 @@
    * Create a new initialized Dart source completion manager
    */
   factory DartCompletionManager.create(AnalysisContext context,
-      SearchEngine searchEngine, Source source, int offset, CompletionCache oldCache,
-      CompletionPerformance performance) {
-    DartCompletionCache newCache;
-    if (oldCache is DartCompletionCache) {
-      if (oldCache.context == context && oldCache.source == source) {
-        newCache = oldCache;
-      }
-    }
-    if (newCache == null) {
-      newCache = new DartCompletionCache(context, source);
-    }
+      SearchEngine searchEngine, Source source) {
     return new DartCompletionManager(
-        new DartCompletionRequest(context, searchEngine, source, offset, newCache),
         context,
+        searchEngine,
         source,
-        offset,
-        newCache,
-        performance);
+        new DartCompletionCache(context, source));
   }
 
   @override
-  CompletionCache get completionCache => cache;
-
-  @override
-  void compute() {
-    performance.logElapseTime('compute', () {
-      computeFast();
-      if (!computers.isEmpty) {
-        computeFull();
+  void computeCache() {
+    waitForAnalysis().then((CompilationUnit unit) {
+      if (unit != null && !cache.isImportInfoCached(unit)) {
+        cache.computeImportInfo(unit, searchEngine);
       }
     });
   }
@@ -106,19 +87,24 @@
   /**
    * Compute suggestions based upon cached information only
    * then send an initial response to the client.
+   * Return a list of computers for which [computeFull] should be called
    */
-  void computeFast() {
-    performance.logElapseTime('computeFast', () {
+  List<DartCompletionComputer> computeFast(DartCompletionRequest request) {
+    return request.performance.logElapseTime('computeFast', () {
       CompilationUnit unit = context.parseCompilationUnit(source);
       request.unit = unit;
-      request.node = new NodeLocator.con1(offset).searchWithin(unit);
+      request.node = new NodeLocator.con1(request.offset).searchWithin(unit);
       request.node.accept(new _ReplacementOffsetBuilder(request));
-      computers.removeWhere((DartCompletionComputer c) {
-        return performance.logElapseTime('computeFast ${c.runtimeType}', () {
+      List<DartCompletionComputer> todo = new List.from(computers);
+      todo.removeWhere((DartCompletionComputer c) {
+        return request.performance.logElapseTime(
+            'computeFast ${c.runtimeType}',
+            () {
           return c.computeFast(request);
         });
       });
-      sendResults(computers.isEmpty);
+      sendResults(request, todo.isEmpty);
+      return todo;
     });
   }
 
@@ -126,28 +112,32 @@
    * If there is remaining work to be done, then wait for the unit to be
    * resolved and request that each remaining computer finish their work.
    */
-  void computeFull() {
-    performance.logStartTime('waitForAnalysis');
+  void computeFull(DartCompletionRequest request,
+      List<DartCompletionComputer> todo) {
+    request.performance.logStartTime('waitForAnalysis');
     waitForAnalysis().then((CompilationUnit unit) {
-      performance.logElapseTime('waitForAnalysis');
-      if (unit == null) {
-        sendResults(true);
+      if (controller.isClosed) {
         return;
       }
-      performance.logElapseTime('computeFull', () {
+      request.performance.logElapseTime('waitForAnalysis');
+      if (unit == null) {
+        sendResults(request, true);
+        return;
+      }
+      request.performance.logElapseTime('computeFull', () {
         request.unit = unit;
-        request.node = new NodeLocator.con1(offset).searchWithin(unit);
-        int count = computers.length;
-        computers.forEach((DartCompletionComputer c) {
+        request.node = new NodeLocator.con1(request.offset).searchWithin(unit);
+        int count = todo.length;
+        todo.forEach((DartCompletionComputer c) {
           String name = c.runtimeType.toString();
           String completeTag = 'computeFull $name complete';
-          performance.logStartTime(completeTag);
-          performance.logElapseTime('computeFull $name', () {
+          request.performance.logStartTime(completeTag);
+          request.performance.logElapseTime('computeFull $name', () {
             c.computeFull(request).then((bool changed) {
-              performance.logElapseTime(completeTag);
+              request.performance.logElapseTime(completeTag);
               bool last = --count == 0;
               if (changed || last) {
-                sendResults(last);
+                sendResults(request, last);
               }
             });
           });
@@ -156,10 +146,30 @@
     });
   }
 
+  @override
+  void computeSuggestions(CompletionRequest completionRequest) {
+    DartCompletionRequest request = new DartCompletionRequest(
+        context,
+        searchEngine,
+        source,
+        completionRequest.offset,
+        cache,
+        completionRequest.performance);
+    request.performance.logElapseTime('compute', () {
+      List<DartCompletionComputer> todo = computeFast(request);
+      if (!todo.isEmpty) {
+        computeFull(request, todo);
+      }
+    });
+  }
+
   /**
    * Send the current list of suggestions to the client.
    */
-  void sendResults(bool last) {
+  void sendResults(DartCompletionRequest request, bool last) {
+    if (controller.isClosed) {
+      return;
+    }
     controller.add(
         new CompletionResult(
             request.replacementOffset,
@@ -173,9 +183,11 @@
 
   /**
    * Return a future that completes when analysis is complete.
-   * Return `true` if the compilation unit is be resolved.
    */
-  Future<CompilationUnit> waitForAnalysis() {
+  Future<CompilationUnit> waitForAnalysis([int waitCount = 10000]) {
+    //TODO (danrubel) replace this when new API is ready.
+    // I expect the new API to be either a stream of resolution events
+    // or a future that completes when the resolved library element is available
     LibraryElement library = context.getLibraryElement(source);
     if (library != null) {
       CompilationUnit unit =
@@ -184,15 +196,20 @@
         return new Future.value(unit);
       }
     }
-    //TODO (danrubel) Determine if analysis is complete but unit not resolved
-    return new Future(waitForAnalysis);
+    //TODO (danrubel) Remove this HACK
+    if (waitCount > 0) {
+      return new Future(() {
+        return waitForAnalysis(waitCount - 1);
+      });
+    }
+    return new Future.value(null);
   }
 }
 
 /**
  * The context in which the completion is requested.
  */
-class DartCompletionRequest {
+class DartCompletionRequest extends CompletionRequest {
   /**
    * The analysis context in which the completion is requested.
    */
@@ -209,11 +226,6 @@
   final Source source;
 
   /**
-   * The offset within the source at which the completion is requested.
-   */
-  final int offset;
-
-  /**
    * Cached information from a prior code completion operation.
    */
   final DartCompletionCache cache;
@@ -254,7 +266,8 @@
   final List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
 
   DartCompletionRequest(this.context, this.searchEngine, this.source,
-      this.offset, this.cache);
+      int offset, this.cache, CompletionPerformance performance)
+      : super(offset, performance);
 }
 
 /**
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 0ac302a..a74910c 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -21,12 +21,17 @@
  * `completion.getSuggestions` request results.
  */
 class ImportedComputer extends DartCompletionComputer {
+  bool shouldWaitForLowPrioritySuggestions;
   _ImportedSuggestionBuilder builder;
 
+  ImportedComputer({this.shouldWaitForLowPrioritySuggestions: false});
+
   @override
   bool computeFast(DartCompletionRequest request) {
     builder = request.node.accept(new _ImportedAstVisitor(request));
     if (builder != null) {
+      builder.shouldWaitForLowPrioritySuggestions =
+          shouldWaitForLowPrioritySuggestions;
       return builder.computeFast(request.node);
     }
     return true;
@@ -211,6 +216,7 @@
  * based upon imported elements.
  */
 class _ImportedSuggestionBuilder implements SuggestionBuilder {
+  bool shouldWaitForLowPrioritySuggestions;
   final DartCompletionRequest request;
   final bool typesOnly;
   final bool excludeVoidReturn;
@@ -239,13 +245,21 @@
    * Compute suggested based upon imported elements.
    */
   Future<bool> computeFull(AstNode node) {
-    return cache.computeImportInfo(
-        request.unit,
-        request.searchEngine).then((_) {
+
+    Future<bool> addSuggestions(_) {
       _addInheritedSuggestions(node);
       _addTopLevelSuggestions();
-      return true;
-    });
+      return new Future.value(true);
+    }
+
+    Future future = null;
+    if (!cache.isImportInfoCached(request.unit)) {
+      future = cache.computeImportInfo(request.unit, request.searchEngine);
+    }
+    if (future != null && shouldWaitForLowPrioritySuggestions) {
+      return future.then(addSuggestions);
+    }
+    return addSuggestions(true);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 22c25e8..1c2934f 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -19,7 +19,11 @@
 List<Fix> computeFixes(SearchEngine searchEngine, CompilationUnit unit,
     AnalysisError error) {
   var processor = new FixProcessor(searchEngine, unit, error);
-  return processor.compute();
+  List<Fix> fixes = processor.compute();
+  fixes.sort((Fix a, Fix b) {
+    return a.kind.relevance - b.kind.relevance;
+  });
+  return fixes;
 }
 
 
@@ -49,7 +53,7 @@
       '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 = const FixKind('CHANGE_TO', 49, "Change to '{0}'");
   static const CHANGE_TO_STATIC_ACCESS = const FixKind(
       'CHANGE_TO_STATIC_ACCESS',
       50,
@@ -67,7 +71,7 @@
   static const CREATE_FILE =
       const FixKind('CREATE_FILE', 50, "Create file '{0}'");
   static const CREATE_FUNCTION =
-      const FixKind('CREATE_FUNCTION', 49, "Create function '{0}'");
+      const FixKind('CREATE_FUNCTION', 51, "Create function '{0}'");
   static const CREATE_LOCAL_VARIABLE =
       const FixKind('CREATE_LOCAL_VARIABLE', 50, "Create local variable '{0}'");
   static const CREATE_METHOD =
@@ -77,17 +81,17 @@
       50,
       "Create {0} missing override(s)");
   static const CREATE_NO_SUCH_METHOD =
-      const FixKind('CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
+      const FixKind('CREATE_NO_SUCH_METHOD', 51, "Create 'noSuchMethod' method");
   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}'");
+      const FixKind('IMPORT_LIBRARY_PROJECT', 49, "Import library '{0}'");
   static const IMPORT_LIBRARY_SDK =
-      const FixKind('IMPORT_LIBRARY_SDK', 51, "Import library '{0}'");
+      const FixKind('IMPORT_LIBRARY_SDK', 49, "Import library '{0}'");
   static const IMPORT_LIBRARY_SHOW =
-      const FixKind('IMPORT_LIBRARY_SHOW', 51, "Update library '{0}' import");
+      const FixKind('IMPORT_LIBRARY_SHOW', 49, "Update library '{0}' import");
   static const INSERT_SEMICOLON =
       const FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
   static const MAKE_CLASS_ABSTRACT =
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 e17a66f..98d28f2 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -662,6 +662,23 @@
   }
 
   @override
+  Object
+      visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    ConstructorElement element = node.staticElement;
+    Location location;
+    if (node.constructorName != null) {
+      int start = node.period.offset;
+      int end = node.constructorName.end;
+      location = _createLocationForOffset(start, end - start);
+    } else {
+      int start = node.keyword.end;
+      location = _createLocationForOffset(start, 0);
+    }
+    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    return super.visitRedirectingConstructorInvocation(node);
+  }
+
+  @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element nameElement = new NameElement(node.name);
     Location location = _createLocationForNode(node);
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 40cad52..79dad59 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -1107,17 +1107,24 @@
 
   @override
   visitReturnStatement(ReturnStatement node) {
+    // prepare expression
     Expression expression = node.expression;
-    if (expression != null) {
-      DartType type = expression.bestType;
-      if (returnType == null) {
-        returnType = type;
+    if (expression == null) {
+      return;
+    }
+    // prepare type
+    DartType type = expression.bestType;
+    if (type.isBottom) {
+      return;
+    }
+    // combine types
+    if (returnType == null) {
+      returnType = type;
+    } else {
+      if (returnType is InterfaceType && type is InterfaceType) {
+        returnType = InterfaceType.getSmartLeastUpperBound(returnType, type);
       } else {
-        if (returnType is InterfaceType && type is InterfaceType) {
-          returnType = InterfaceType.getSmartLeastUpperBound(returnType, type);
-        } else {
-          returnType = returnType.getLeastUpperBound(type);
-        }
+        returnType = returnType.getLeastUpperBound(type);
       }
     }
   }
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 fdee721..2c4e115 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -79,18 +79,11 @@
         }
       }
     }
-    if (_variableNode == null) {
+    // validate node declaration
+    if (!_isVariableDeclaredInStatement()) {
       result = new RefactoringStatus.fatal(
-          'Local variable declaration or reference must be selected to activate this refactoring.');
-      return new Future.value(result);
-    }
-    // should be normal variable declaration statement
-    if (_variableNode.parent is! VariableDeclarationList ||
-        _variableNode.parent.parent is! VariableDeclarationStatement ||
-        _variableNode.parent.parent.parent is! Block) {
-      result = new RefactoringStatus.fatal(
-          'Local variable declared in '
-              'statement should be selected to activate this refactoring.');
+          'Local variable declaration or reference must be selected '
+              'to activate this refactoring.');
       return new Future.value(result);
     }
     // should have initializer at declaration
@@ -188,6 +181,21 @@
   @override
   bool requiresPreview() => false;
 
+  bool _isVariableDeclaredInStatement() {
+    if (_variableNode == null) {
+      return false;
+    }
+    AstNode parent = _variableNode.parent;
+    if (parent is VariableDeclarationList) {
+      parent = parent.parent;
+      if (parent is VariableDeclarationStatement) {
+        parent = parent.parent;
+        return parent is Block || parent is SwitchCase;
+      }
+    }
+    return false;
+  }
+
   static bool _shouldBeExpressionInterpolation(InterpolationExpression target,
       Expression expression) {
     TokenType targetType = target.beginToken.type;
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 7b78ecb..12337a8 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -16,6 +16,7 @@
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/index/local_file_index.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/source/pub_package_map_provider.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
 
@@ -39,6 +40,7 @@
 class SocketServer {
   final AnalysisServerOptions analysisServerOptions;
   final DirectoryBasedDartSdk defaultSdk;
+  final InstrumentationServer instrumentationServer;
 
   /**
    * The analysis server that was created when a client established a
@@ -46,7 +48,8 @@
    */
   AnalysisServer analysisServer;
 
-  SocketServer(this.analysisServerOptions, this.defaultSdk);
+  SocketServer(this.analysisServerOptions, this.defaultSdk,
+      this.instrumentationServer);
 
   /**
    * Create an analysis server which will communicate with the client using the
@@ -72,6 +75,7 @@
         _createIndex(),
         analysisServerOptions,
         defaultSdk,
+        instrumentationServer,
         rethrowExceptions: false);
     _initializeHandlers(analysisServer);
   }
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 8fea4f5..e8aa4c8 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -23,20 +23,24 @@
 @ReflectiveTestCase()
 class AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
   List<NavigationRegion> regions;
+  List<NavigationTarget> targets;
+  List<String> targetFiles;
+
   NavigationRegion testRegion;
-  List<Element> testTargets;
-  Element testTarget;
+  List<int> testTargetIndexes;
+  NavigationTarget testTarget;
 
   /**
-   * Validates that there is a target in [testTargets]  with [file], at [offset]
-   * and with the given [length].
+   * Validates that there is a target in [testTargetIndexes] with [file],
+   * at [offset] and with the given [length].
    */
   void assertHasFileTarget(String file, int offset, int length) {
-    for (Element target in testTargets) {
-      Location location = target.location;
-      if (location.file == file &&
-          location.offset == offset &&
-          location.length == length) {
+    List<NavigationTarget> testTargets =
+        testTargetIndexes.map((int index) => targets[index]).toList();
+    for (NavigationTarget target in testTargets) {
+      if (targetFiles[target.fileIndex] == file &&
+          target.offset == offset &&
+          target.length == length) {
         testTarget = target;
         return;
       }
@@ -156,7 +160,7 @@
                   '${regions.join('\n')}');
         }
         testRegion = region;
-        testTargets = region.targets;
+        testTargetIndexes = region.targets;
         return;
       }
     }
@@ -179,6 +183,8 @@
       var params = new AnalysisNavigationParams.fromNotification(notification);
       if (params.file == testFile) {
         regions = params.regions;
+        targets = params.targets;
+        targetFiles = params.files;
       }
     }
   }
@@ -207,10 +213,10 @@
 ''');
     return prepareNavigation().then((_) {
       assertHasRegion('int V');
-      Element target = testTargets[0];
-      Location location = target.location;
-      expect(location.startLine, greaterThan(0));
-      expect(location.startColumn, greaterThan(0));
+      int targetIndex = testTargetIndexes[0];
+      NavigationTarget target = targets[targetIndex];
+      expect(target.startLine, greaterThan(0));
+      expect(target.startColumn, greaterThan(0));
     });
   }
 
@@ -585,10 +591,6 @@
     return prepareNavigation().then((_) {
       assertHasRegionTarget('AAA aaa', 'AAA {}');
       expect(testTarget.kind, ElementKind.CLASS);
-      expect(testTarget.name, 'AAA');
-      expect(testTarget.isAbstract, false);
-      expect(testTarget.parameters, isNull);
-      expect(testTarget.returnType, isNull);
     });
   }
 
diff --git a/pkg/analysis_server/test/analysis/notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
index 225950d..8cafbf9 100644
--- a/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -206,7 +206,7 @@
             expect(location.offset, testCode.indexOf("propA => null;"));
             expect(location.length, "propA".length);
           }
-          expect(element.parameters, "");
+          expect(element.parameters, isNull);
           expect(element.returnType, "String");
         }
         {
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 378338a..1e05cc2 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -12,6 +12,7 @@
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mock_sdk.dart';
@@ -82,6 +83,17 @@
     return testFile;
   }
 
+  AnalysisServer createAnalysisServer(Index index) {
+    return new AnalysisServer(
+        serverChannel,
+        resourceProvider,
+        packageMapProvider,
+        index,
+        new AnalysisServerOptions(),
+        new MockSdk(),
+        const NullInstrumentationServer());
+  }
+
   Index createIndex() {
     return null;
   }
@@ -227,13 +239,7 @@
     resourceProvider = new MemoryResourceProvider();
     packageMapProvider = new MockPackageMapProvider();
     Index index = createIndex();
-    server = new AnalysisServer(
-        serverChannel,
-        resourceProvider,
-        packageMapProvider,
-        index,
-        new AnalysisServerOptions(),
-        new MockSdk());
+    server = createAnalysisServer(index);
     server.contextDirectoryManager.defaultOptions.enableAsync = true;
     server.contextDirectoryManager.defaultOptions.enableEnum = true;
     handler = new AnalysisDomainHandler(server);
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index ca1c3cd..c5b3bf4 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -207,6 +208,7 @@
         null,
         new AnalysisServerOptions(),
         new MockSdk(),
+        new NullInstrumentationServer(),
         rethrowExceptions: rethrowExceptions);
   }
 }
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
new file mode 100644
index 0000000..ee966c8
--- /dev/null
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -0,0 +1,2413 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.completion.support;
+
+import 'dart:collection';
+
+import 'completion_test_support.dart';
+
+main() {
+  CompletionTestBuilder builder = new CompletionTestBuilder();
+  builder.buildAll();
+}
+
+/**
+ * A builder that builds the completion tests.
+ */
+class CompletionTestBuilder {
+  void buildAll() {
+    buildNumberedTests();
+    buildCommentSnippetTests();
+    buildCompletionTests();
+    buildOtherTests();
+    buildLibraryTests();
+  }
+
+  void buildCommentSnippetTests() {
+    CompletionTestCase.buildTests('testCommentSnippets001', '''
+class X {static final num MAX = 0;num yc,xc;mth() {xc = yc = MA!1X;x!2c.abs();num f = M!3AX;}}''',
+        <String>["1+MAX", "2+xc", "3+MAX"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets002', '''
+class Y {String x='hi';mth() {x.l!1ength;int n = 0;x!2.codeUnitAt(n!3);}}''',
+        <String>["1+length", "2+x", "3+n"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets004', '''
+class A {!1int x; !2mth() {!3int y = this.!5x!6;}}class B{}''',
+        <String>["1+A", "2+B", "3+x", "3-y", "5+mth", "6+x"],
+        failingTests: '3');
+
+    CompletionTestCase.buildTests('testCommentSnippets005', '''
+class Date { static Date JUN, JUL;}class X { m() { return Da!1te.JU!2L; }}''',
+        <String>["1+Date", "2+JUN", "2+JUL"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets007', '''
+class C {mth(Map x, !1) {}mtf(!2, Map x) {}m() {for (in!3t i=0; i<5; i++); A!4 x;}}class int{}class Arrays{}class bool{}''',
+        <String>["1+bool", "2+bool", "3+int", "4+Arrays"], failingTests: '3');
+
+    CompletionTestCase.buildTests('testCommentSnippets008', '''
+class Date{}final num M = Dat!1''', <String>["1+Date"]);
+
+    // space, char, eol are important
+    CompletionTestCase.buildTests('testCommentSnippets009', '''
+class Map{}class Maps{}class x extends!5 !2M!3 !4implements!6 !1\n{}''',
+        <String>[
+            "1+Map",
+            "2+Maps",
+            "3+Maps",
+            "4-Maps",
+            "4+implements",
+            "5-Maps",
+            "6-Map",
+            "6+implements"],
+        failingTests: '46');
+
+    // space, char, eol are important
+    CompletionTestCase.buildTests('testCommentSnippets010', '''
+class Map{}class x implements !1{}''', <String>["1+Map"], failingTests: '1');
+
+    // space, char, eol are important
+    CompletionTestCase.buildTests('testCommentSnippets011', '''
+class Map{}class x implements M!1{}''', <String>["1+Map"], failingTests: '1');
+
+    // space, char, eol are important
+    CompletionTestCase.buildTests('testCommentSnippets012', '''
+class Map{}class x implements M!1\n{}''', <String>["1+Map"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets013', '''
+class num{}class x !2{!1}!3''',
+        <String>["1+num", "2-num", "3-num"],
+        failingTests: '1');
+
+    // trailing space is important
+    CompletionTestCase.buildTests('testCommentSnippets014', '''
+class num{}typedef n!1 ;''', <String>["1+num"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets015', '''
+class D {f(){} g(){f!1(f!2);}}''', <String>["1+f", "2+f"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets016', '''
+class F {m() { m(); !1}}''', <String>["1+m"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets017', '''
+class F {var x = !1false;}''', <String>["1+true"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets018', '''
+class Map{}class Arrays{}class C{ m(!1){} n(!2 x, q)''',
+        <String>["1+Map", "1-void", "1-null", "2+Arrays", "2-void", "2-null"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets019', '''
+class A{m(){Object x;x.!1/**/clear()''',
+        <String>["1+toString"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets020', '''
+classMap{}class tst {var newt;void newf(){}test() {var newz;new!1/**/;}}''',
+        <String>["1+newt", "1+newf", "1+newz", "1-Map"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets021', '''
+class Map{}class tst {var newt;void newf(){}test() {var newz;new !1/**/;}}''',
+        <String>["1+Map", "1-newt"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets022', '''
+class Map{}class F{m(){new !1;}}''', <String>["1+Map"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets022a', '''
+class Map{}class F{m(){new !1''', <String>["1+Map"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets022b', '''
+class Map{factory Map.qq(){return null;}}class F{m(){new Map.!1qq();}}''',
+        <String>["1+qq"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets023', '''
+class X {X c; X(this.!1c!3) : super() {c.!2}}''',
+        <String>["1+c", "2+c", "3+c"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets024', '''
+class q {m(Map q){var x;m(!1)}n(){var x;n(!2)}}''', <String>["1+x", "2+x"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets025', '''
+class q {num m() {var q; num x=!1 q!3 + !2/**/;}}''',
+        <String>["1+q", "2+q", "3+q"],
+        failingTests: '123');
+
+    CompletionTestCase.buildTests('testCommentSnippets026', '''
+class List{}class a implements !1{}''', <String>["1+List"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets027', '''
+class String{}class List{}class test <X extends !1String!2> {}''',
+        <String>["1+List", "2+String", "2-List"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests('testCommentSnippets028', '''
+class String{}class List{}class DateTime{}typedef T Y<T extends !1>(List input);''',
+        <String>["1+DateTime", "1+String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets029', '''
+interface A<X> default B<X extends !1List!2> {}''',
+        <String>["1+DateTime", "2+List"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets030', '''
+class Bar<T extends Foo> {const Bar(!1T!2 k);T!3 m(T!4 a, T!5 b){}final T!6 f = null;}''',
+        <String>["1+T", "2+T", "3+T", "4+T", "5+T", "6+T"],
+        failingTests: '123456');
+
+    CompletionTestCase.buildTests('testCommentSnippets031', '''
+class Bar<T extends Foo> {m(x){if (x is !1) return;if (x is!!!2)}}''',
+        <String>["1+Bar", "1+T", "2+T", "2+Bar"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests('testCommentSnippets032', '''
+class Fit{}class Bar<T extends Fooa> {const F!1ara();}''',
+        <String>["1+Fit", "1+Fara", "1-Bar"]);
+
+    // Type propagation
+    CompletionTestCase.buildTests('testCommentSnippets033', '''
+class List{add(){}length(){}}t1() {var x;if (x is List) {x.!1add(3);}}''',
+        <String>["1+add", "1+length"]);
+
+    // Type propagation
+    CompletionTestCase.buildTests('testCommentSnippets035', '''
+class List{clear(){}length(){}}t3() {var x=new List(), y=x.!1length();x.!2clear();}''',
+        <String>["1+length", "2+clear"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets036', '''
+class List{}t3() {var x=new List!1}''', <String>["1+List"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets037', '''
+class List{factory List.from(){}}t3() {var x=new List.!1}''',
+        <String>["1+from"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets038', '''
+f(){int xa; String s = '\$x!1';}''', <String>["1+xa"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets038a', '''
+int xa; String s = '\$x!1\'''', <String>["1+xa"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets039', '''
+f(){int xa; String s = '\$!1';}''', <String>["1+xa"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets039a', '''
+int xa; String s = '\$!1\'''', <String>["1+xa"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets040', '''
+class List{add(){}}class Map{}class X{m(){List list; list.!1 Map map;}}''',
+        <String>["1+add"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets041', '''
+class List{add(){}length(){}}class X{m(){List list; list.!1 zox();}}''',
+        <String>["1+add"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets042', '''
+class DateTime{static const int WED=3;int get day;}fd(){DateTime d=new DateTime.now();d.!1WED!2;}''',
+        <String>["1+day", "2-WED"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets043', '''
+class L{var k;void.!1}''', <String>["1-k"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets044', '''
+class List{}class XXX {XXX.fisk();}main() {main(); new !1}}''',
+        <String>["1+List", "1+XXX.fisk"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets047', '''
+f(){int x;int y=!1;}''', <String>["1+x"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets048', '''
+import 'dart:convert' as json;f() {var x=new js!1}''',
+        <String>["1+json"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets049', '''
+import 'dart:convert' as json;
+import 'dart:convert' as jxx;
+class JsonParserX{}
+f1() {var x=new !2j!1s!3}''',
+        <String>[
+            "1+json",
+            "1+jxx",
+            "2+json",
+            "2+jxx",
+            "2-JsonParser",
+            "3+json",
+            "3-jxx"],
+        failingTests: '123');
+
+    CompletionTestCase.buildTests('testCommentSnippets050', '''
+class xdr {
+  xdr();
+  const xdr.a(a,b,c);
+  xdr.b();
+  f() => 3;
+}
+class xa{}
+k() {
+  new x!1dr().f();
+  const x!2dr.!3a(1, 2, 3);
+}''',
+        <String>[
+            "1+xdr",
+            "1+xa",
+            "1+xdr.a",
+            "1+xdr.b",
+            "2-xa",
+            "2-xdr",
+            "2+xdr.a",
+            "2-xdr.b",
+            "3-b",
+            "3+a"],
+        failingTests: '123');
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets051', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r() {
+  var v;
+  if (v is String) {
+    v.!1length;
+    v.!2getKeys;
+  }
+}''', <String>["1+length", "2-getKeys"], failingTests: '1');
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets052', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r() {
+  List<String> values = ['a','b','c'];
+  for (var v in values) {
+    v.!1toUpperCase;
+    v.!2getKeys;
+  }
+}''', <String>["1+toUpperCase", "2-getKeys"], failingTests: '1');
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets053', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r() {
+  var v;
+  while (v is String) {
+    v.!1toUpperCase;
+    v.!2getKeys;
+  }
+}''', <String>["1+toUpperCase", "2-getKeys"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets054', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r() {
+  var v;
+  for (; v is String; v.!1isEmpty) {
+    v.!2toUpperCase;
+    v.!3getKeys;
+  }
+}''', <String>["1+isEmpty", "2+toUpperCase", "3-getKeys"], failingTests: '12');
+
+    CompletionTestCase.buildTests('testCommentSnippets055', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r() {
+  String v;
+  if (v is Object) {
+    v.!1toUpperCase;
+  }
+}''', <String>["1+toUpperCase"]);
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets056', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void f(var v) {
+  if (v is!! String) {
+    return;
+  }
+  v.!1toUpperCase;
+}''', <String>["1+toUpperCase"], failingTests: '1');
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets057', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void f(var v) {
+  if ((v as String).length == 0) {
+    v.!1toUpperCase;
+  }
+}''', <String>["1+toUpperCase"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets058', '''
+typedef vo!2id callback(int k);
+void x(callback q){}
+void r() {
+  callback v;
+  x(!1);
+}''', <String>["1+v", "2+void"], failingTests: '2');
+
+    CompletionTestCase.buildTests('testCommentSnippets059', '''
+f(){((int x) => x+4).!1call(1);}''', <String>["1-call"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets060', '''
+class Map{}
+abstract class MM extends Map{factory MM() => new Map();}
+class Z {
+  MM x;
+  f() {
+    x!1
+  }
+}''', <String>["1+x", "1-x[]"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets061', '''
+class A{m(){!1f(3);!2}}n(){!3f(3);!4}f(x)=>x*3;''',
+        <String>["1+f", "1+n", "2+f", "2+n", "3+f", "3+n", "4+f", "4+n"]);
+
+    // Type propagation.
+    CompletionTestCase.buildTests('testCommentSnippets063', '''
+class String{int length(){} String toUpperCase(){} bool isEmpty(){}}class Map{getKeys(){}}
+void r(var v) {
+  v.!1toUpperCase;
+  assert(v is String);
+  v.!2toUpperCase;
+}''', <String>["1-toUpperCase", "2+toUpperCase"], failingTests: '2');
+
+    CompletionTestCase.buildTests('testCommentSnippets064', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.!9h()..!1a()..!2b().!7g();
+    x.!8j..!3b()..!4c..!6c..!5a();
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''',
+        <String>[
+            "1+a",
+            "2+b",
+            "1-g",
+            "2-h",
+            "3+b",
+            "4+c",
+            "5+a",
+            "6+c",
+            "7+g",
+            "8+j",
+            "9+h"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets065', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.h()..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+a"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets066', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.h()..a()..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+b"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets067', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.h()..a()..c..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+b"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets068', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.j..b()..c..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+c"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets069', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.j..b()..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+c"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets070', '''
+class Spline {
+  Line c;
+  Spline a() {
+    return this;
+  }
+  Line b() {
+    return null;
+  }
+  Spline f() {
+    Line x = new Line();
+    x.j..!1;
+  }
+}
+class Line {
+  Spline j;
+  Line g() {
+    return this;
+  }
+  Spline h() {
+    return null;
+  }
+}''', <String>["1+b"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets072', '''
+class X {
+  int _p;
+  set p(int x) => _p = x;
+}
+f() {
+  X x = new X();
+  x.!1p = 3;
+}''', <String>["1+p"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets073', '''
+class X {
+  m() {
+    JSON.stri!1;
+    X f = null;
+  }
+}
+class JSON {
+  static stringify() {}
+}''', <String>["1+stringify"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets074', '''
+class X {
+  m() {
+    _x!1
+  }
+  _x1(){}
+}''', <String>["1+_x1"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets075', '''
+p(x)=>0;var E;f(q)=>!1p(!2E);''', <String>["1+p", "2+E"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets076', '''
+class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3int>>();}''',
+        <String>["1+List", "2+int", "3+int"],
+        failingTests: '123');
+
+    CompletionTestCase.buildTests('testCommentSnippets076a', '''
+class Map<K,V>{}class List<E>{}class int{}main() {var m=new Map<Lis!1t<Map<int,in!2t>>,List<!3>>();}''',
+        <String>["1+List", "2+int", "3+int"],
+        failingTests: '123');
+
+    CompletionTestCase.buildTests('testCommentSnippets077', '''
+class FileMode {
+  static const READ = const FileMode._internal(0);
+  static const WRITE = const FileMode._internal(1);
+  static const APPEND = const FileMode._internal(2);
+  const FileMode._internal(int this._mode);
+  factory FileMode._internal1(int this._mode);
+  factory FileMode(_mode);
+  final int _mode;
+}
+class File {
+  factory File(String path) => null;
+  factory File.fromPath(Path path) => null;
+}
+f() => new Fil!1''',
+        <String>[
+            "1+File",
+            "1+File.fromPath",
+            "1+FileMode",
+            "1+FileMode._internal1",
+            "1+FileMode._internal"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets078', '''
+class Map{static from()=>null;clear(){}}void main() { Map.!1 }''',
+        <String>["1+from", "1-clear"]); // static method, instance method
+
+    CompletionTestCase.buildTests('testCommentSnippets079', '''
+class Map{static from()=>null;clear(){}}void main() { Map s; s.!1 }''',
+        <String>["1-from", "1+clear"]); // static method, instance method
+
+    CompletionTestCase.buildTests('testCommentSnippets080', '''
+class RuntimeError{var message;}void main() { RuntimeError.!1 }''',
+        <String>["1-message"]); // field
+
+    CompletionTestCase.buildTests('testCommentSnippets081', '''
+class Foo {this.!1}''', <String>["1-Object"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets082', '''
+        class HttpRequest {}
+        class HttpResponse {}
+        main() {
+          var v = (HttpRequest req, HttpResp!1)
+        }''', <String>["1+HttpResponse"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets083', '''
+main() {(.!1)}''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets083a', '''
+main() { .!1 }''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests('testCommentSnippets083b', '''
+main() { null.!1 }''', <String>["1+toString"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets084', '''
+class List{}class Map{}typedef X = !1Lis!2t with !3Ma!4p;''',
+        <String>["1+Map", "2+List", "2-Map", "3+List", "4+Map", "4-List"],
+        failingTests: '1234');
+
+    CompletionTestCase.buildTests('testCommentSnippets085', '''
+class List{}class Map{}class Z extends List with !1Ma!2p {}''',
+        <String>["1+List", "1+Map", "2+Map", "2-List"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests('testCommentSnippets086', '''
+class Q{f(){xy() {!2};x!1y();}}''',
+        <String>["1+xy", "2+f", "2-xy"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets087', '''
+class Map{}class Q extends Object with !1Map {}''',
+        <String>["1+Map", "1-HashMap"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCommentSnippets088', '''
+class A {
+  int f;
+  B m(){}
+}
+class B extends A {
+  num f;
+  A m(){}
+}
+class Z {
+  B q;
+  f() {q.!1}
+}''', <String>["1+f", "1+m"]); // f->num, m()->A
+
+    CompletionTestCase.buildTests('testCommentSnippets089', '''
+class Q {
+  fqe() {
+    xya() {
+      xyb() {
+        !1
+      }
+      !3 xyb();
+    };
+    xza() {
+      !2
+    }
+    xya();
+    !4 xza();
+  }
+  fqi() {
+    !5
+  }
+}''',
+        <String>[
+            "1+fqe",
+            "1+fqi",
+            "1+Q",
+            "1-xya",
+            "1-xyb",
+            "1-xza",
+            "2+fqe",
+            "2+fqi",
+            "2+Q",
+            "2-xya",
+            "2-xyb",
+            "2-xza",
+            "3+fqe",
+            "3+fqi",
+            "3+Q",
+            "3-xya",
+            "3+xyb",
+            "3-xza",
+            "4+fqe",
+            "4+fqi",
+            "4+Q",
+            "4+xya",
+            "4-xyb",
+            "4+xza",
+            "5+fqe",
+            "5+fqi",
+            "5+Q",
+            "5-xya",
+            "5-xyb",
+            "5-xza"],
+        failingTests: '34');
+
+    CompletionTestCase.buildTests('testCommentSnippets090', '''
+class X { f() { var a = 'x'; a.!1 }}''',
+        <String>["1+length"],
+        failingTests: '1');
+  }
+
+  void buildCompletionTests() {
+    CompletionTestCase.buildTests('testCompletion_alias_field', '''
+typedef int fnint(int k); fn!1int x;''', <String>["1+fnint"]);
+
+    CompletionTestCase.buildTests('testCompletion_annotation_argumentList', '''
+class AAA {",
+  const AAA({int aaa, int bbb});",
+}",
+",
+@AAA(!1)
+main() {
+}''',
+        <String>["1+AAA" /*":" + ProposalKind.ARGUMENT_LIST*/, "1+aaa", "1+bbb"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_annotation_topLevelVar', '''
+const fooConst = null;
+final fooNotConst = null;
+const bar = null;
+
+@foo!1
+main() {
+}''', <String>["1+fooConst", "1-fooNotConst", "1-bar"]);
+
+    CompletionTestCase.buildTests('testCompletion_annotation_type', '''
+class AAA {
+  const AAA({int a, int b});
+  const AAA.nnn(int c, int d);
+}
+@AAA!1
+main() {
+}''',
+        <String>[
+            "1+AAA" /*":" + ProposalKind.CONSTRUCTOR*/,
+            "1+AAA.nnn" /*":" + ProposalKind.CONSTRUCTOR*/],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_annotation_type_inClass_withoutMember',
+        '''
+class AAA {
+  const AAA();
+}
+
+class C {
+  @A!1
+}''', <String>["1+AAA" /*":" + ProposalKind.CONSTRUCTOR*/]);
+
+    CompletionTestCase.buildTests('testCompletion_argument_typeName', '''
+class Enum {
+  static Enum FOO = new Enum();
+}
+f(Enum e) {}
+main() {
+  f(En!1);
+}''', <String>["1+Enum"]);
+
+    CompletionTestCase.buildTests('testCompletion_arguments_ignoreEmpty', '''
+class A {
+  test() {}
+}
+main(A a) {
+  a.test(!1);
+}''', <String>["1-test"]);
+
+    CompletionTestCase.buildTests('testCompletion_as_asIdentifierPrefix', '''
+main(p) {
+  var asVisible;
+  var v = as!1;
+}''', <String>["1+asVisible"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_as_asPrefixedIdentifierStart',
+        '''
+class A {
+  var asVisible;
+}
+
+main(A p) {
+  var v = p.as!1;
+}''', <String>["1+asVisible"]);
+
+    CompletionTestCase.buildTests('testCompletion_as_incompleteStatement', '''
+class MyClass {}
+main(p) {
+  var justSomeVar;
+  var v = p as !1
+}''', <String>["1+MyClass", "1-justSomeVar"]);
+
+    CompletionTestCase.buildTests('testCompletion_cascade', '''
+class A {
+  aaa() {}
+}
+
+
+main(A a) {
+  a..!1 aaa();
+}''', <String>["1+aaa", "1-main"]);
+
+    CompletionTestCase.buildTests('testCompletion_combinator_afterComma', '''
+"import 'dart:math' show cos, !1;''',
+        <String>["1+PI", "1+sin", "1+Random", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_combinator_ended', '''
+import 'dart:math' show !1;"''',
+        <String>["1+PI", "1+sin", "1+Random", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_combinator_export', '''
+export 'dart:math' show !1;"''',
+        <String>["1+PI", "1+sin", "1+Random", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_combinator_hide', '''
+import 'dart:math' hide !1;"''',
+        <String>["1+PI", "1+sin", "1+Random", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_combinator_notEnded', '''
+import 'dart:math' show !1"''',
+        <String>["1+PI", "1+sin", "1+Random", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_combinator_usePrefix', '''
+import 'dart:math' show s!1"''',
+        <String>["1+sin", "1+sqrt", "1-cos", "1-String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_constructor_field', '''
+class X { X(this.field); int f!1ield;}''', <String>["1+field"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_constructorArguments_showOnlyCurrent',
+        '''
+class A {
+  A.first(int p);
+  A.second(double p);
+}
+main() {
+  new A.first(!1);
+}''', <String>["1+A.first", "1-A.second"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_constructorArguments_whenPrefixedType',
+        '''
+import 'dart:math' as m;
+main() {
+  new m.Random(!1);
+}''', <String>["1+Random:ARGUMENT_LIST"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_forClass',
+        '''
+/**
+ * [int!1]
+ * [method!2]
+ */
+class AAA {
+  methodA() {}
+}''', <String>["1+int", "1-method", "2+methodA", "2-int"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_forConstructor',
+        '''
+class A {
+  /**
+   * [aa!1]
+   * [int!2]
+   * [method!3]
+   */
+  A.named(aaa, bbb) {}
+  methodA() {}
+}''',
+        <String>["1+aaa", "1-bbb", "2+int", "2-double", "3+methodA"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_forFunction',
+        '''
+/**
+ * [aa!1]
+ * [int!2]
+ * [function!3]
+ */
+functionA(aaa, bbb) {}
+functionB() {}''',
+        <String>[
+            "1+aaa",
+            "1-bbb",
+            "2+int",
+            "2-double",
+            "3+functionA",
+            "3+functionB",
+            "3-int"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_forFunctionTypeAlias',
+        '''
+/**
+ * [aa!1]
+ * [int!2]
+ * [Function!3]
+ */
+typedef FunctionA(aaa, bbb) {}
+typedef FunctionB() {}''',
+        <String>[
+            "1+aaa",
+            "1-bbb",
+            "2+int",
+            "2-double",
+            "3+FunctionA",
+            "3+FunctionB",
+            "3-int"],
+        failingTests: '12');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_forMethod',
+        '''
+class A {
+  /**
+   * [aa!1]
+   * [int!2]
+   * [method!3]
+   */
+  methodA(aaa, bbb) {}
+  methodB() {}
+}''',
+        <String>[
+            "1+aaa",
+            "1-bbb",
+            "2+int",
+            "2-double",
+            "3+methodA",
+            "3+methodB",
+            "3-int"],
+        failingTests: '2');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_dartDoc_reference_incomplete',
+        '''
+/**
+ * [doubl!1 some text
+ * other text
+ */
+class A {}
+/**
+ * [!2 some text
+ * other text
+ */
+class B {}
+/**
+ * [!3] some text
+ */
+class C {}''',
+        <String>["1+double", "1-int", "2+int", "2+String", "3+int", "3+String"],
+        failingTests: '123');
+
+    CompletionTestCase.buildTests('testCompletion_double_inFractionPart', '''
+main() {
+  1.0!1
+}''', <String>["1-abs", "1-main"]);
+
+    CompletionTestCase.buildTests('testCompletion_enum', '''
+enum MyEnum {A, B, C}
+main() {
+  MyEnum.!1;
+}''', <String>["1+values", "1+A", "1+B", "1+C"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_exactPrefix_hasHigherRelevance',
+        '''
+var STR;
+main(p) {
+  var str;
+  str!1;
+  STR!2;
+  Str!3;
+}''',
+        <String>[
+            "1+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+            "1+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+            "2+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+            "2+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+            "3+String" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 1)*/,
+            "3+STR" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/,
+            "3+str" /*",rel=" + (CompletionProposal.RELEVANCE_DEFAULT + 0)*/]);
+
+    CompletionTestCase.buildTests('testCompletion_export_dart', '''
+import 'dart:math
+import 'dart:_chrome
+import 'dart:_collection.dev
+export 'dart:!1''',
+        <String>[
+            "1+dart:core",
+            "1+dart:math",
+            "1-dart:_chrome",
+            "1-dart:_collection.dev"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_export_noStringLiteral_noSemicolon',
+        '''
+import !1
+
+class A {}''', <String>["1+'dart:!';", "1+'package:!';"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_forStmt_vars', '''
+class int{}class Foo { mth() { for (in!1t i = 0; i!2 < 5; i!3++); }}''',
+        <String>["1+int", "2+i", "3+i"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_function', '''
+class String{}class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1) => a.compareTo(b)); }}''',
+        <String>["1+String"]);
+
+    CompletionTestCase.buildTests('testCompletion_function_partial', '''
+class String{}class Foo { int boo = 7; mth() { PNGS.sort((String a, Str!1)); }}''',
+        <String>["1+String"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_functionTypeParameter_namedArgument',
+        '''
+typedef FFF(a, b, {x1, x2, y});
+main(FFF fff) {
+  fff(1, 2, !1)!2;
+}''', <String>["1+x1", "2-x2"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_field1', '''
+class Foo { int myField = 7; mth() { if (!1) {}}}''', <String>["1+myField"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_field1a', '''
+class Foo { int myField = 7; mth() { if (!1) }}''', <String>["1+myField"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_field2', '''
+class Foo { int myField = 7; mth() { if (m!1) {}}}''', <String>["1+myField"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_field2a', '''
+class Foo { int myField = 7; mth() { if (m!1) }}''', <String>["1+myField"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_field2b', '''
+class Foo { myField = 7; mth() { if (m!1) {}}}''', <String>["1+myField"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_localVar', '''
+class Foo { mth() { int value = 7; if (v!1) {}}}''', <String>["1+value"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_localVara', '''
+class Foo { mth() { value = 7; if (v!1) {}}}''', <String>["1-value"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_topLevelVar', '''
+int topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>["1+topValue"]);
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_topLevelVara', '''
+topValue = 7; class Foo { mth() { if (t!1) {}}}''', <String>["1+topValue"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_ifStmt_unionType_nonStrict',
+        '''
+class A { a() => null; x() => null}
+class B { a() => null; y() => null}
+void main() {
+  var x;
+  var c;
+  if(c) {
+    x = new A();
+  } else {
+    x = new B();
+  }
+  x.!1;
+}''', <String>["1+a", "1+x", "1+y"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_ifStmt_unionType_strict', '''
+class A { a() => null; x() => null}
+class B { a() => null; y() => null}
+void main() {
+  var x;
+  var c;
+  if(c) {
+    x = new A();
+  } else {
+    x = new B();
+  }
+  x.!1;
+}''', <String>["1+a", "1-x", "1-y"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_import', '''
+import '!1';''', <String>["1+dart:!", "1+package:!"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_import_dart', '''
+import 'dart:math
+import 'dart:_chrome
+import 'dart:_collection.dev
+import 'dart:!1''',
+        <String>[
+            "1+dart:core",
+            "1+dart:math",
+            "1-dart:_chrome",
+            "1-dart:_collection.dev"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_import_hasStringLiteral_noSemicolon',
+        '''
+import '!1'
+
+class A {}''', <String>["1+dart:!", "1+package:!"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_import_noSpace', '''
+import!1''', <String>["1+ 'dart:!';", "1+ 'package:!';"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_import_noStringLiteral', '''
+import !1;''', <String>["1+'dart:!'", "1+'package:!'"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_import_noStringLiteral_noSemicolon',
+        '''
+import !1
+
+class A {}''', <String>["1+'dart:!';", "1+'package:!';"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_incompleteClassMember', '''
+class A {
+  Str!1
+  final f = null;
+}''', <String>["1+String", "1-bool"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_incompleteClosure_parameterType',
+        '''
+f1(cb(String s)) {}
+f2(String s) {}
+main() {
+  f1((Str!1));
+  f2((Str!2));
+}''', <String>["1+String", "1-bool", "2+String", "2-bool"]);
+
+    CompletionTestCase.buildTests('testCompletion_inPeriodPeriod', '''
+main(String str) {
+  1 < str.!1.length;
+  1 + str.!2.length;
+  1 + 2 * str.!3.length;
+}''',
+        <String>["1+codeUnits", "2+codeUnits", "3+codeUnits"],
+        failingTests: '123');
+
+    // no checks, but no exceptions
+    CompletionTestCase.buildTests(
+        'testCompletion_instanceCreation_unresolved',
+        '''
+class A {
+}
+main() {
+  new NoSuchClass(!1);
+  new A.noSuchConstructor(!2);
+}''', <String>["1+int", "2+int"]);
+
+    CompletionTestCase.buildTests('testCompletion_import_lib', '''
+import '!1''', <String>["1+my_lib.dart"], extraFiles: <String, String>{
+      "/my_lib.dart": ""
+    }, failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_is', '''
+class MyClass {}
+main(p) {
+  var isVariable;
+  if (p is MyCla!1) {}
+  var v1 = p is MyCla!2;
+  var v2 = p is !3;
+  var v2 = p is!4;
+}''',
+        <String>["1+MyClass", "2+MyClass", "3+MyClass", "3-v1", "4+is", "4-isVariable"],
+        failingTests: '4');
+
+    CompletionTestCase.buildTests('testCompletion_is_asIdentifierStart', '''
+main(p) {
+  var isVisible;
+  var v1 = is!1;
+  var v2 = is!2
+}''', <String>["1+isVisible", "2+isVisible"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_is_asPrefixedIdentifierStart',
+        '''
+class A {
+  var isVisible;
+}
+
+main(A p) {
+  var v1 = p.is!1;
+  var v2 = p.is!2
+}''', <String>["1+isVisible", "2+isVisible"]);
+
+    CompletionTestCase.buildTests('testCompletion_is_incompleteStatement1', '''
+class MyClass {}
+main(p) {
+  var justSomeVar;
+  var v = p is !1
+}''', <String>["1+MyClass", "1-justSomeVar"]);
+
+    CompletionTestCase.buildTests('testCompletion_is_incompleteStatement2', '''
+class MyClass {}
+main(p) {
+  var isVariable;
+  var v = p is!1
+}''', <String>["1+is", "1-isVariable"], failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_keyword_in', '''
+class Foo { int input = 7; mth() { if (in!1) {}}}''', <String>["1+input"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_keyword_syntheticIdentifier',
+        '''
+main() {
+  var caseVar;
+  var otherVar;
+  var v = case!1
+}''', <String>["1+caseVar", "1-otherVar"]);
+
+    CompletionTestCase.buildTests('testCompletion_libraryIdentifier_atEOF', '''
+library int.!1''', <String>["1-parse", "1-bool"]);
+
+    CompletionTestCase.buildTests('testCompletion_libraryIdentifier_notEOF', '''
+library int.!1''', <String>["1-parse", "1-bool"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_methodRef_asArg_incompatibleFunctionType',
+        '''
+foo( f(int p) ) {}
+class Functions {
+  static myFuncInt(int p) {}
+  static myFuncDouble(double p) {}
+}
+bar(p) {}
+main(p) {
+  foo( Functions.!1; );
+}''',
+        <String>[
+            "1+myFuncInt" /*":" + ProposalKind.METHOD_NAME*/,
+            "1-myFuncDouble" /*":" + ProposalKind.METHOD_NAME*/]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_methodRef_asArg_notFunctionType',
+        '''
+foo( f(int p) ) {}
+class Functions {
+  static myFunc(int p) {}
+}
+bar(p) {}
+main(p) {
+  foo( (int p) => Functions.!1; );
+}''',
+        <String>[
+            "1+myFunc" /*":" + ProposalKind.METHOD*/,
+            "1-myFunc" /*":" + ProposalKind.METHOD_NAME*/]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_methodRef_asArg_ofFunctionType',
+        '''
+foo( f(int p) ) {}
+class Functions {
+  static int myFunc(int p) {}
+}
+main(p) {
+  foo(Functions.!1);
+}''',
+        <String>[
+            "1+myFunc" /*":" + ProposalKind.METHOD*/,
+            "1+myFunc" /*":" + ProposalKind.METHOD_NAME*/]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_namedArgument_alreadyUsed',
+        '''
+func({foo}) {} main() { func(foo: 0, fo!1); }''', <String>["1-foo"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_namedArgument_constructor',
+        '''
+class A {A({foo, bar}) {}} main() { new A(fo!1); }''',
+        <String>["1+foo", "1-bar"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_namedArgument_empty', '''
+func({foo, bar}) {} main() { func(!1); }''',
+        <String>[
+            "1+foo" /*":" + ProposalKind.NAMED_ARGUMENT*/,
+            "1-foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_namedArgument_function', '''
+func({foo, bar}) {} main() { func(fo!1); }''',
+        <String>["1+foo", "1-bar"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_namedArgument_notNamed', '''
+func([foo]) {} main() { func(fo!1); }''', <String>["1-foo"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_namedArgument_unresolvedFunction',
+        '''
+main() { func(fo!1); }''', <String>["1-foo"]);
+
+    CompletionTestCase.buildTests('testCompletion_newMemberType1', '''
+class Collection{}class List extends Collection{}class Foo { !1 }''',
+        <String>["1+Collection", "1+List"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_newMemberType2', '''
+class Collection{}class List extends Collection{}class Foo {!1}''',
+        <String>["1+Collection", "1+List"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_newMemberType3', '''
+class Collection{}class List extends Collection{}class Foo {L!1}''',
+        <String>["1-Collection", "1+List"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_newMemberType4', '''
+class Collection{}class List extends Collection{}class Foo {C!1}''',
+        <String>["1+Collection", "1-List"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_positionalArgument_constructor',
+        '''
+class A {
+  A([foo, bar]);
+}
+main() {
+  new A(!1);
+  new A(0, !2);
+}''',
+        <String>[
+            "1+foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
+            "1-bar",
+            "2-foo",
+            "2+bar" /*":"
+        + ProposalKind.OPTIONAL_ARGUMENT*/], failingTests: '12');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_positionalArgument_function',
+        '''
+func([foo, bar]) {}
+main() {
+  func(!1);
+  func(0, !2);
+}''',
+        <String>[
+            "1+foo" /*":" + ProposalKind.OPTIONAL_ARGUMENT*/,
+            "1-bar",
+            "2-foo",
+            "2+bar" /*":"
+        + ProposalKind.OPTIONAL_ARGUMENT*/], failingTests: '12');
+
+    CompletionTestCase.buildTests('testCompletion_preferStaticType', '''
+class A {
+  foo() {}
+}
+class B extends A {
+  bar() {}
+}
+main() {
+  A v = new B();
+  v.!1
+}''',
+        <String>[
+            "1+foo",
+            "1-bar,potential=false,declaringType=B",
+            "1+bar,potential=true,declaringType=B"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_privateElement_sameLibrary_constructor',
+        '''
+class A {
+  A._c();
+  A.c();
+}
+main() {
+  new A.!1
+}''', <String>["1+_c", "1+c"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_privateElement_sameLibrary_member',
+        '''
+class A {
+  _m() {}
+  m() {}
+}
+main(A a) {
+  a.!1
+}''', <String>["1+_m", "1+m"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_propertyAccess_whenClassTarget',
+        '''
+class A {
+  static int FIELD;
+  int field;
+}
+main() {
+  A.!1
+}''', <String>["1+FIELD", "1-field"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_propertyAccess_whenClassTarget_excludeSuper',
+        '''
+class A {
+  static int FIELD_A;
+  static int methodA() {}
+}
+class B extends A {
+  static int FIELD_B;
+  static int methodB() {}
+}
+main() {
+  B.!1;
+}''', <String>["1+FIELD_B", "1-FIELD_A", "1+methodB", "1-methodA"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_propertyAccess_whenInstanceTarget',
+        '''
+class A {
+  static int FIELD;
+  int fieldA;
+}
+class B {
+  A a;
+}
+class C extends A {
+  int fieldC;
+}
+main(B b, C c) {
+  b.a.!1;
+  c.!2;
+}''', <String>["1-FIELD", "1+fieldA", "2+fieldC", "2+fieldA"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_return_withIdentifierPrefix',
+        '''
+f() { var vvv = 42; return v!1 }''', <String>["1+vvv"]);
+
+    CompletionTestCase.buildTests('testCompletion_return_withoutExpression', '''
+f() { var vvv = 42; return !1 }''', <String>["1+vvv"]);
+
+    CompletionTestCase.buildTests('testCompletion_staticField1', '''
+class num{}class Sunflower {static final n!2um MAX_D = 300;nu!3m xc, yc;Sun!4flower() {x!Xc = y!Yc = MA!1 }}''',
+        <String>["1+MAX_D", "X+xc", "Y+yc", "2+num", "3+num", "4+Sunflower"],
+        failingTests: '23');
+
+    CompletionTestCase.buildTests('testCompletion_super_superType', '''
+class A {
+  var fa;
+  ma() {}
+}
+class B extends A {
+  var fb;
+  mb() {}
+  main() {
+    super.!1
+  }
+}''', <String>["1+fa", "1-fb", "1+ma", "1-mb"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_superConstructorInvocation_noNamePrefix',
+        '''
+class A {
+  A.fooA();
+  A.fooB();
+  A.bar();
+}
+class B extends A {
+  B() : super.!1
+}''', <String>["1+fooA", "1+fooB", "1+bar"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_superConstructorInvocation_withNamePrefix',
+        '''
+class A {
+  A.fooA();
+  A.fooB();
+  A.bar();
+}
+class B extends A {
+  B() : super.f!1
+}''', <String>["1+fooA", "1+fooB", "1-bar"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'testCompletion_this_bad_inConstructorInitializer',
+        '''
+class A {
+  var f;
+  A() : f = this.!1;
+}''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_this_bad_inFieldDeclaration',
+        '''
+class A {
+  var f = this.!1;
+}''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests('testCompletion_this_bad_inStaticMethod', '''
+class A {
+  static m() {
+    this.!1;
+  }
+}''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_this_bad_inTopLevelFunction',
+        '''
+main() {
+  this.!1;
+}''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_this_bad_inTopLevelVariableDeclaration',
+        '''
+var v = this.!1;''', <String>["1-toString"]);
+
+    CompletionTestCase.buildTests(
+        'testCompletion_this_OK_inConstructorBody',
+        '''
+class A {
+  var f;
+  m() {}
+  A() {
+    this.!1;
+  }
+}''', <String>["1+f", "1+m"]);
+
+    CompletionTestCase.buildTests('testCompletion_this_OK_localAndSuper', '''
+class A {
+  var fa;
+  ma() {}
+}
+class B extends A {
+  var fb;
+  mb() {}
+  main() {
+    this.!1
+  }
+}''', <String>["1+fa", "1+fb", "1+ma", "1+mb"]);
+
+    CompletionTestCase.buildTests('testCompletion_topLevelField_init2', '''
+class DateTime{static var JUN;}final num M = Dat!1eTime.JUN;''',
+        <String>["1+DateTime", "1-void"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('testCompletion_while', '''
+class Foo { int boo = 7; mth() { while (b!1) {} }}''', <String>["1+boo"]);
+  }
+
+  void buildLibraryTests() {
+    Map<String, String> sources = new HashMap<String, String>();
+
+    CompletionTestCase.buildTests('test_export_ignoreIfThisLibraryExports', '''
+export 'dart:math';
+libFunction() {};
+main() {
+  !1
+}''', <String>["1-cos", "1+libFunction"]);
+
+    sources.clear();
+    sources["/lib.dart"] = '''
+library lib;
+export 'dart:math' hide sin;
+libFunction() {};''';
+    CompletionTestCase.buildTests(
+        'test_export_showIfImportLibraryWithExport',
+        '''
+import 'lib.dart' as p;
+main() {
+  p.!1
+}''',
+        <String>["1+cos", "1-sin", "1+libFunction"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('test_importPrefix_hideCombinator', '''
+import 'dart:math' as math hide PI;
+main() {
+  math.!1
+}''', <String>["1-PI", "1+LN10"], failingTests: '1');
+
+    CompletionTestCase.buildTests('test_importPrefix_showCombinator', '''
+import 'dart:math' as math show PI;
+main() {
+  math.!1
+}''', <String>["1+PI", "1-LN10"]);
+
+    sources.clear();
+    sources["/lib.dart"] = '''
+library lib
+class _A 
+  foo() {}
+
+class A extends _A {
+}''';
+    CompletionTestCase.buildTests('test_memberOfPrivateClass_otherLibrary', '''
+import 'lib.dart';
+main(A a) {
+  a.!1
+}''', <String>["1+foo"], extraFiles: sources, failingTests: '1');
+
+    sources.clear();
+    sources["/lib.dart"] = '''
+library lib;
+class A {
+  A.c();
+  A._c();
+}''';
+    CompletionTestCase.buildTests(
+        'test_noPrivateElement_otherLibrary_constructor',
+        '''
+import 'lib.dart';
+main() {
+  new A.!1
+}''', <String>["1-_c", "1+c"], failingTests: '1');
+
+    sources.clear();
+    sources["/lib.dart"] = '''
+library lib;
+class A {
+  var f;
+  var _f;
+}''';
+    CompletionTestCase.buildTests(
+        'test_noPrivateElement_otherLibrary_member',
+        '''
+              import 'lib.dart';
+              main(A a) {
+                a.!1
+              }''',
+        <String>["1-_f", "1+f"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    sources.clear();
+    sources["/firth.dart"] = '''
+library firth;
+class SerializationException {
+  const SerializationException();
+}''';
+    CompletionTestCase.buildTests('test001', '''
+import 'firth.dart';
+main() {
+throw new Seria!1lizationException();}''',
+        <String>["1+SerializationException"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    // Type propagation.
+    // TODO Include corelib analysis (this works in the editor)
+    CompletionTestCase.buildTests(
+        'test002',
+        '''t2() {var q=[0],z=q.!1length;q.!2clear();}''',
+        <String>["1+length", "1+isEmpty", "2+clear"],
+        failingTests: '12');
+
+    // TODO Include corelib analysis
+    CompletionTestCase.buildTests(
+        'test003',
+        '''class X{var q; f() {q.!1a!2}}''',
+        <String>["1+end", "2+abs", "2-end"],
+        failingTests: '12');
+
+    // TODO Include corelib analysis
+    // Resolving dart:html takes between 2.5s and 30s; json, about 0.12s
+    CompletionTestCase.buildTests('test004', '''
+            library foo;
+            import 'dart:convert' as json;
+            class JsonParserX{}
+            f1() {var x=new json.!1}
+            f2() {var x=new json.JsonPa!2}
+            f3() {var x=new json.JsonParser!3}''',
+        <String>[
+            "1+JsonParser",
+            "1-JsonParserX",
+            "2+JsonParser",
+            "2-JsonParserX",
+            "3+JsonParser",
+            "3-JsonParserX"],
+        failingTests: '123');
+
+    // TODO Enable after type propagation is implemented. Not yet.
+    // TODO Include corelib analysis
+    CompletionTestCase.buildTests(
+        'test005',
+        '''var PHI;main(){PHI=5.3;PHI.abs().!1 Object x;}''',
+        <String>["1+abs"],
+        failingTests: '1');
+
+    // Exercise import and export handling.
+    // Libraries are defined in partial order of increasing dependency.
+    sources.clear();
+    sources["/exp2a.dart"] = '''
+library exp2a;
+e2a() {}''';
+    sources["/exp1b.dart"] = '''
+library exp1b;",
+e1b() {}''';
+    sources["/exp1a.dart"] = '''
+library exp1a;",
+export 'exp1b.dart';",
+e1a() {}''';
+    sources["/imp1.dart"] = '''
+library imp1;
+export 'exp1a.dart';
+i1() {}''';
+    sources["/imp2.dart"] = '''
+library imp2;
+export 'exp2a.dart';
+i2() {}''';
+    CompletionTestCase.buildTests('test006', '''
+import 'imp1.dart';
+import 'imp2.dart';
+main() {!1
+  i1();
+  i2();
+  e1a();
+  e1b();
+  e2a();
+}''',
+        <String>["1+i1", "1+i2", "1+e1a", "1+e2a", "1+e1b"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    // Exercise import and export handling.
+    // Libraries are defined in partial order of increasing dependency.
+    sources.clear();
+    sources["/l1.dart"] = '''
+library l1;
+var _l1t; var l1t;''';
+    CompletionTestCase.buildTests('test007', '''
+import 'l1.dart';
+main() {
+  var x = l!1
+  var y = _!2
+}''',
+        <String>["1+l1t", "1-_l1t", "2-_l1t"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    // Check private library exclusion
+    sources.clear();
+    sources["/public.dart"] = '''
+library public;
+class NonPrivate {
+  void publicMethod() {
+  }
+}''';
+    sources["/private.dart"] = '''
+library _private;
+import 'public.dart';
+class Private extends NonPrivate {
+  void privateMethod() {
+  }
+}''';
+    CompletionTestCase.buildTests('test008', '''
+import 'private.dart';
+import 'public.dart';
+class Test {
+  void test() {
+    NonPrivate x = new NonPrivate();
+    x.!1 //publicMethod but not privateMethod should appear
+  }
+}''',
+        <String>["1-privateMethod", "1+publicMethod"],
+        extraFiles: sources,
+        failingTests: '1');
+
+    // Exercise library prefixes.
+    sources.clear();
+    sources["/lib.dart"] = '''
+library lib;
+int X = 1;
+void m(){}
+class Y {}''';
+    CompletionTestCase.buildTests('test009', '''
+import 'lib.dart' as Q;
+void a() {
+  var x = Q.!1
+}
+void b() {
+  var x = [Q.!2]
+}
+void c() {
+  var x = new List([Q.!3])
+}
+void d() {
+  new Q.!4
+}''',
+        <String>[
+            "1+X",
+            "1+m",
+            "1+Y",
+            "2+X",
+            "2+m",
+            "2+Y",
+            "3+X",
+            "3+m",
+            "3+Y",
+            "4+Y",
+            "4-m",
+            "4-X"],
+        extraFiles: sources,
+        failingTests: '1234');
+  }
+
+  void buildNumberedTests() {
+    CompletionTestCase.buildTests('test001', '''
+void r1(var v) {
+  v.!1toString!2().!3hash!4Code
+}''',
+        <String>[
+            "1+toString",
+            "1-==",
+            "2+toString",
+            "3+hashCode",
+            "3+toString",
+            "4+hashCode",
+            "4-toString"],
+        failingTests: '1234');
+
+    CompletionTestCase.buildTests('test002', '''
+void r2(var vim) {
+  v!1.toString()
+}''', <String>["1+vim"]);
+
+    CompletionTestCase.buildTests('test003', '''
+class A {
+  int a() => 3;
+  int b() => this.!1a();
+}''', <String>["1+a"]);
+
+    CompletionTestCase.buildTests('test004', '''
+class A {
+  int x;
+  A() : this.!1x = 1;
+  A.b() : this();
+  A.c() : this.!2b();
+  g() => new A.!3c();
+}''', <String>["1+x", "2+b", "3+c"], failingTests: '23');
+
+    CompletionTestCase.buildTests('test005', '''
+class A {}
+void rr(var vim) {
+  var !1vq = v!2.toString();
+  var vf;
+  v!3.toString();
+}''',
+        <String>[
+            "1-A",
+            "1-vim",
+            "1+vq",
+            "1-vf",
+            "1-this",
+            "1-void",
+            "1-null",
+            "1-false",
+            "2-A",
+            "2+vim",
+            "2-vf",
+            "2-vq",
+            "2-this",
+            "2-void",
+            "2-null",
+            "2-false",
+            "3+vf",
+            "3+vq",
+            "3+vim",
+            "3-A"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests('test006', '''
+void r2(var vim, {va: 2, b: 3}) {
+  v!1.toString()
+}''', <String>["1+va", "1-b"]);
+
+    CompletionTestCase.buildTests('test007', '''
+void r2(var vim, [va: 2, b: 3]) {
+  v!1.toString()
+}''', <String>["1+va", "1-b"]);
+
+    // keywords
+    CompletionTestCase.buildTests('test008', '''
+!1class Aclass {}
+class Bclass !2extends!3 !4Aclass {}
+!5typedef Ctype = !6Bclass with !7Aclass;
+class Dclass extends !8Ctype {}
+!9abstract class Eclass implements Dclass,!C Ctype, Bclass {}
+class Fclass extends Bclass !Awith !B Eclass {}''',
+        <String>[
+            "1+class",
+            "1-implements",
+            "1-extends",
+            "1-with",
+            "2+extends",
+            "3+extends",
+            "4+Aclass",
+            "4-Bclass",
+            "5+typedef",
+            "6+Bclass",
+            "6-Ctype",
+            "7+Aclass",
+            "7-Bclass",
+            "8+Ctype",
+            "9+abstract",
+            "A+with",
+            "B+Eclass",
+            "B-Dclass",
+            "B-Ctype",
+            "C+Bclass",
+            "C-Eclass"],
+        failingTests: '12359A');
+
+    // keywords
+    CompletionTestCase.buildTests('test009', '''
+class num{}
+typedef !1dy!2namic TestFn1();
+typedef !3vo!4id TestFn2();
+typ!7edef !5n!6''',
+        <String>[
+            "1+void",
+            "1+TestFn2",
+            "2+dynamic",
+            "2-void",
+            "3+dynamic",
+            "4+void",
+            "4-dynamic",
+            "5+TestFn2",
+            "6+num",
+            "7+typedef"],
+        failingTests: '12347');
+
+    CompletionTestCase.buildTests('test010', '''
+class String{}class List{}
+class test !8<!1t !2 !3extends String,!4 List,!5 !6>!7 {}
+class tezetst !9<!BString,!C !DList>!A {}''',
+        <String>[
+            "1+String",
+            "1+List",
+            "1-test",
+            "2-String",
+            "2-test",
+            "3+extends",
+            "4+tezetst",
+            "4-test",
+            "5+String",
+            "6+List",
+            "7-List",
+            "8-List",
+            "9-String",
+            "A-String",
+            "B+String",
+            "C+List",
+            "C-tezetst",
+            "D+List",
+            "D+test"],
+        failingTests: '3');
+
+    // name generation with conflicts
+    CompletionTestCase.buildTests(
+        'test011',
+        '''r2(var object, Object object1, Object !1);''',
+        <String>["1+object2"],
+        failingTests: '1');
+
+    // reserved words
+    CompletionTestCase.buildTests('test012', '''
+class X {
+  f() {
+    g(!1var!2 z) {!3true.!4toString();};
+  }
+}''',
+        <String>[
+            "1+var",
+            "1+dynamic",
+            "1-f",
+            "2+var",
+            "2-dynamic",
+            "3+false",
+            "3+true",
+            "4+toString"],
+        failingTests: '1234');
+
+    // conditions & operators
+    CompletionTestCase.buildTests('test013', '''
+class Q {
+  bool x;
+  List zs;
+  int k;
+  var a;
+  mth() {
+    while (!1x !9);
+    do{} while(!2x !8);
+    for(z in !3zs) {}
+    switch(!4k) {case 1:{!0}}
+    try {
+    } on !5Object catch(a){}
+    if (!7x !6) {} else {};
+  }
+}''',
+        <String>[
+            "1+x",
+            "2+x",
+            "3+zs",
+            "4+k",
+            "5+Q",
+            "5-a",
+            "6+==",
+            "7+x",
+            "8+==",
+            "9+==",
+            "0+k"],
+        failingTests: '689');
+
+    // keywords
+    CompletionTestCase.buildTests('test014', '''
+class Q {
+  bool x;
+  List zs;
+  int k;
+  !Dvar a;
+  !Evoid mth() {
+    !1while (z) { !Gcontinue; };
+    !2do{ !Hbreak; } !3while(x);
+    !4for(z !5in zs) {}
+    !6for (int i; i < 3; i++);
+    !7switch(k) {!8case 1:{} !9default:{}}
+    !Atry {
+    } !Bon Object !Ccatch(a){}
+    !Fassert true;
+    !Jif (x) {} !Kelse {};
+    !Lreturn;
+  }
+}''',
+        <String>[
+            "1+while",
+            "2+do",
+            "3+while",
+            "4+for",
+            "5+in",
+            "6+for",
+            "7+switch",
+            "8+case",
+            "9+default",
+            "A+try",
+            "B+on",
+            "C+catch",
+            "D+var",
+            "E+void",
+            "F+assert",
+            "G+continue",
+            "H+break",
+            "J+if",
+            "K+else",
+            "L+return"],
+        failingTests: '123456789ABCDEFGHJKL');
+
+    // operators in function
+    CompletionTestCase.buildTests(
+        'test015',
+        '''f(a,b,c) => a + b * c !1;''',
+        <String>["1+=="],
+        failingTests: '1');
+
+    // operators in return
+    CompletionTestCase.buildTests(
+        'test016',
+        '''class X {dynamic f(a,b,c) {return a + b * c !1;}}''',
+        <String>["1+=="],
+        failingTests: '1');
+
+    // keywords
+    CompletionTestCase.buildTests('test017', '''
+!1library foo;
+!2import 'x' !5as r;
+!3export '!8uri' !6hide Q !7show X;
+!4part 'x';''',
+        <String>[
+            "1+library",
+            "2+import",
+            "3+export",
+            "4+part",
+            "5+as",
+            "6+hide",
+            "7+show",
+            "8-null"],
+        failingTests: '1234567');
+
+    // The following test is disabled because it prevents the Dart VM from
+    // exiting, for some unknown reason.  TODO(paulberry): fix this.
+//    // keywords
+//    CompletionTestCase.buildTests(
+//        'test018',
+//        '''!1part !2of foo;''',
+//        <String>["1+part", "2+of"],
+//        failingTests: '12');
+
+    CompletionTestCase.buildTests('test019', '''
+var truefalse = 0;
+var falsetrue = 1;
+main() {
+  var foo = true!1
+}''', <String>["1+true", "1+truefalse", "1-falsetrue"], failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'test020',
+        '''var x = null.!1''',
+        <String>["1+toString"],
+        failingTests: '1');
+
+    CompletionTestCase.buildTests(
+        'test021',
+        '''var x = .!1''',
+        <String>["1-toString"]);
+
+    CompletionTestCase.buildTests(
+        'test022',
+        '''var x = .!1;''',
+        <String>["1-toString"]);
+
+    CompletionTestCase.buildTests('test023', '''
+class Map{getKeys(){}}
+class X {
+  static x1(Map m) {
+    m.!1getKeys;
+  }
+  x2(Map m) {
+    m.!2getKeys;
+  }
+}''', <String>["1+getKeys", "2+getKeys"]);
+
+// Note lack of semicolon following completion location
+    CompletionTestCase.buildTests('test024', '''
+class List{factory List.from(Iterable other) {}}
+class F {
+  f() {
+    new List.!1
+  }
+}''', <String>["1+from"], failingTests: '1');
+
+    CompletionTestCase.buildTests('test025', '''
+class R {
+  static R _m;
+  static R m;
+  f() {
+    var a = !1m;
+    var b = _!2m;
+    var c = !3g();
+  }
+  static g() {
+    var a = !4m;
+    var b = _!5m;
+    var c = !6g();
+  }
+}
+class T {
+  f() {
+    R x;
+    x.!7g();
+    x.!8m;
+    x._!9m;
+  }
+  static g() {
+    var q = R._!Am;
+    var g = R.!Bm;
+    var h = R.!Cg();
+  }
+  h() {
+    var q = R._!Dm;
+    var g = R.!Em;
+    var h = R.!Fg();
+  }
+}''',
+        <String>[
+            "1+m",
+            "2+_m",
+            "3+g",
+            "4+m",
+            "5+_m",
+            "6+g",
+            "7-g",
+            "8-m",
+            "9-_m",
+            "A+_m",
+            "B+m",
+            "C+g",
+            "D+_m",
+            "E+m",
+            "F+g"]);
+
+    CompletionTestCase.buildTests(
+        'test026',
+        '''var aBcD; var x=ab!1''',
+        <String>["1+aBcD"]);
+
+    CompletionTestCase.buildTests(
+        'test027',
+        '''m(){try{}catch(eeee,ssss){s!1}''',
+        <String>["1+ssss"]);
+
+    CompletionTestCase.buildTests(
+        'test028',
+        '''m(){var isX=3;if(is!1)''',
+        <String>["1+isX"]);
+
+    CompletionTestCase.buildTests(
+        'test029',
+        '''m(){[1].forEach((x)=>!1x);}''',
+        <String>["1+x"]);
+
+    CompletionTestCase.buildTests(
+        'test030',
+        '''n(){[1].forEach((x){!1});}''',
+        <String>["1+x"]);
+
+    CompletionTestCase.buildTests(
+        'test031',
+        '''class Caster {} m() {try {} on Cas!1ter catch (CastBlock) {!2}}''',
+        <String>["1+Caster", "1-CastBlock", "2+Caster", "2+CastBlock"]);
+
+    CompletionTestCase.buildTests('test032', '''
+const ONE = 1;
+const ICHI = 10;
+const UKSI = 100;
+const EIN = 1000;
+m() {
+  int x;
+  switch (x) {
+    case !3ICHI:
+    case UKSI:
+    case EIN!2:
+    case ONE!1: return;
+    default: return;
+  }
+}''',
+        <String>[
+            "1+ONE",
+            "1-UKSI",
+            "2+EIN",
+            "2-ICHI",
+            "3+ICHI",
+            "3+UKSI",
+            "3+EIN",
+            "3+ONE"]);
+
+    CompletionTestCase.buildTests(
+        'test033',
+        '''class A{}class B extends A{b(){}}class C implements A {c(){}}class X{x(){A f;f.!1}}''',
+        <String>["1+b", "1-c"],
+        failingTests: '1');
+
+    // TODO(scheglov) decide what to do with Type for untyped field (not
+    // supported by the new store)
+    // test analysis of untyped fields and top-level vars
+    CompletionTestCase.buildTests('test034', '''
+var topvar;
+class Top {top(){}}
+class Left extends Top {left(){}}
+class Right extends Top {right(){}}
+t1() {
+  topvar = new Left();
+}
+t2() {
+  topvar = new Right();
+}
+class A {
+  var field;
+  a() {
+    field = new Left();
+  }
+  b() {
+    field = new Right();
+  }
+  test() {
+    topvar.!1top();
+    field.!2top();
+  }
+}''', <String>["1+top", "2+top"], failingTests: '12');
+
+    // test analysis of untyped fields and top-level vars
+    CompletionTestCase.buildTests(
+        'test035',
+        '''class Y {final x='hi';mth() {x.!1length;}}''',
+        <String>["1+length"],
+        failingTests: '1');
+
+    // TODO(scheglov) decide what to do with Type for untyped field (not
+    // supported by the new store)
+    // test analysis of untyped fields and top-level vars
+    CompletionTestCase.buildTests('test036', '''
+class A1 {
+  var field;
+  A1() : field = 0;
+  q() {
+    A1 a = new A1();
+    a.field.!1
+  }
+}
+main() {
+  A1 a = new A1();
+  a.field.!2
+}''', <String>["1+round", "2+round"], failingTests: '12');
+
+    CompletionTestCase.buildTests('test037', '''
+class HttpServer{}
+class HttpClient{}
+main() {
+  new HtS!1
+}''', <String>["1+HttpServer", "1-HttpClient"]);
+
+    CompletionTestCase.buildTests('test038', '''
+class X {
+  x(){}
+}
+class Y {
+  y(){}
+}
+class A<Z extends X> {
+  Y ay;
+  Z az;
+  A(this.ay, this.az) {
+    ay.!1y;
+    az.!2x;
+  }
+}''', <String>["1+y", "1-x", "2+x", "2-y"], failingTests: '2');
+
+    // test analysis of untyped fields and top-level vars
+    CompletionTestCase.buildTests(
+        'test039',
+        '''class X{}var x = null as !1X;''',
+        <String>["1+X", "1-void"]);
+
+    // test arg lists with named params
+    CompletionTestCase.buildTests(
+        'test040',
+        '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1)!2;}''',
+        <String>["1+x1", "2-x2"],
+        failingTests: '1');
+
+    // test arg lists with named params
+    CompletionTestCase.buildTests(
+        'test041',
+        '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1''',
+        <String>["1+x1", "1+x2", "1+y"],
+        failingTests: '1');
+
+    // test arg lists with named params
+    CompletionTestCase.buildTests(
+        'test042',
+        '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1;!2''',
+        <String>["1+x1", "1+x2", "2-y"],
+        failingTests: '1');
+  }
+
+  void buildOtherTests() {
+    CompletionTestCase.buildTests(
+        'test_classMembers_inGetter',
+        '''class A { var fff; get z {ff!1}}''',
+        <String>["1+fff"]);
+
+    CompletionTestCase.buildTests(
+        'testSingle',
+        '''class A {int x; !2mth() {int y = this.x;}}class B{}''',
+        <String>["2+B"]);
+  }
+}
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
new file mode 100644
index 0000000..bca1b38
--- /dev/null
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -0,0 +1,264 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.completion.support;
+
+import 'dart:collection';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:unittest/unittest.dart';
+
+import 'domain_completion_test.dart';
+import 'dart:async';
+
+/**
+ * A base class for classes containing completion tests.
+ */
+class CompletionTestCase extends CompletionTest {
+  static const String CURSOR_MARKER = '!';
+
+  List get suggestedCompletions =>
+      suggestions.map(
+          (CompletionSuggestion suggestion) => suggestion.completion).toList();
+
+  void assertHasCompletion(String completion) {
+    int expectedOffset = completion.indexOf(CURSOR_MARKER);
+    if (expectedOffset >= 0) {
+      if (completion.indexOf(CURSOR_MARKER, expectedOffset + 1) >= 0) {
+        fail(
+            "Invalid completion, contains multiple cursor positions: '$completion'");
+      }
+      completion = completion.replaceFirst(CURSOR_MARKER, '');
+    } else {
+      expectedOffset = completion.length;
+    }
+    CompletionSuggestion matchingSuggestion;
+    suggestions.forEach((CompletionSuggestion suggestion) {
+      if (suggestion.completion == completion) {
+        if (matchingSuggestion == null) {
+          matchingSuggestion = suggestion;
+        } else {
+          fail(
+              "Expected exactly one '$completion' but found multiple:\n  $suggestedCompletions");
+        }
+      }
+    });
+    if (matchingSuggestion == null) {
+      fail("Expected '$completion' but found none:\n  $suggestedCompletions");
+    }
+    expect(matchingSuggestion.selectionOffset, equals(expectedOffset));
+    expect(matchingSuggestion.selectionLength, equals(0));
+  }
+
+  void assertHasNoCompletion(String completion) {
+    // As a temporary measure, disable negative tests.
+    // TODO(paulberry): fix this.
+    return;
+    if (suggestions.any(
+        (CompletionSuggestion suggestion) => suggestion.completion == completion)) {
+      fail(
+          "Did not expect completion '$completion' but found:\n  $suggestedCompletions");
+    }
+  }
+
+  runTest(LocationSpec spec, [Map<String, String> extraFiles]) {
+    super.setUp();
+    return new Future(() {
+      String content = spec.source;
+      addFile(testFile, content);
+      this.testCode = content;
+      completionOffset = spec.testLocation;
+      if (extraFiles != null) {
+        extraFiles.forEach((String fileName, String content) {
+          addFile(fileName, content);
+        });
+      }
+    }).then((_) => getSuggestions()).then((_) {
+      //expect(replacementOffset, equals(completionOffset));
+      //expect(replacementLength, equals(0));
+      for (String result in spec.positiveResults) {
+        assertHasCompletion(result);
+      }
+      for (String result in spec.negativeResults) {
+        assertHasNoCompletion(result);
+      }
+    }).whenComplete(() {
+      super.tearDown();
+    });
+  }
+
+  /**
+   * Generate a set of completion tests based on the given [originalSource].
+   *
+   * The source string has completion points embedded in it, which are
+   * identified by '!X' where X is a single character. Each X is matched to
+   * positive or negative results in the array of [validationStrings].
+   * Validation strings contain the name of a prediction with a two character
+   * prefix. The first character of the prefix corresponds to an X in the
+   * [originalSource]. The second character is either a '+' or a '-' indicating
+   * whether the string is a positive or negative result.
+   *
+   * The [originalSource] is the source for a completion test that contains
+   * completion points. The [validationStrings] are the positive and negative
+   * predictions.
+   *
+   * Optional argument [failingTests], if given, is a string, each character of
+   * which corresponds to an X in the [originalSource] for which the test is
+   * expected to fail.  This sould be used to mark known completion bugs that
+   * have not yet been fixed.
+   */
+  static void buildTests(String baseName, String originalSource,
+      List<String> results, {Map<String, String> extraFiles, String failingTests:
+      ''}) {
+    List<LocationSpec> completionTests =
+        LocationSpec.from(originalSource, results);
+    completionTests.sort((LocationSpec first, LocationSpec second) {
+      return first.id.compareTo(second.id);
+    });
+    if (completionTests.isEmpty) {
+      test(baseName, () {
+        fail(
+            "Expected exclamation point ('!') within the source denoting the"
+                "position at which code completion should occur");
+      });
+    }
+    Set<String> allSpecIds =
+        completionTests.map((LocationSpec spec) => spec.id).toSet();
+    for (String id in failingTests.split('')) {
+      if (!allSpecIds.contains(id)) {
+        test("$baseName-$id", () {
+          fail(
+              "Test case '$id' included in failingTests, but this id does not exist.");
+        });
+      }
+    }
+    for (LocationSpec spec in completionTests) {
+      if (failingTests.contains(spec.id)) {
+        test("$baseName-${spec.id} (expected failure)", () {
+          CompletionTestCase test = new CompletionTestCase();
+          return new Future(() => test.runTest(spec, extraFiles)).then((_) {
+            fail('Test passed - expected to fail.');
+          }, onError: (_) {});
+        });
+      } else {
+        test("$baseName-${spec.id}", () {
+          CompletionTestCase test = new CompletionTestCase();
+          return test.runTest(spec, extraFiles);
+        });
+      }
+    }
+  }
+}
+
+/**
+ * A specification of the completion results expected at a given location.
+ */
+class LocationSpec {
+  String id;
+  int testLocation = -1;
+  List<String> positiveResults = <String>[];
+  List<String> negativeResults = <String>[];
+  String source;
+
+  LocationSpec(this.id);
+
+  /**
+   * Parse a set of tests from the given `originalSource`. Return a list of the
+   * specifications that were parsed.
+   *
+   * The source string has test locations embedded in it, which are identified
+   * by '!X' where X is a single character. Each X is matched to positive or
+   * negative results in the array of [validationStrings]. Validation strings
+   * contain the name of a prediction with a two character prefix. The first
+   * character of the prefix corresponds to an X in the [originalSource]. The
+   * second character is either a '+' or a '-' indicating whether the string is
+   * a positive or negative result. If logical not is needed in the source it
+   * can be represented by '!!'.
+   *
+   * The [originalSource] is the source for a test that contains test locations.
+   * The [validationStrings] are the positive and negative predictions.
+   */
+  static List<LocationSpec> from(String originalSource,
+      List<String> validationStrings) {
+    Map<String, LocationSpec> tests = new HashMap<String, LocationSpec>();
+    String modifiedSource = originalSource;
+    int modifiedPosition = 0;
+    while (true) {
+      int index = modifiedSource.indexOf('!', modifiedPosition);
+      if (index < 0) {
+        break;
+      }
+      int n = 1; // only delete one char for double-bangs
+      String id = modifiedSource.substring(index + 1, index + 2);
+      if (id != '!') {
+        n = 2;
+        LocationSpec test = new LocationSpec(id);
+        tests[id] = test;
+        test.testLocation = index;
+      } else {
+        modifiedPosition = index + 1;
+      }
+      modifiedSource =
+          modifiedSource.substring(0, index) + modifiedSource.substring(index + n);
+    }
+    if (modifiedSource == originalSource) {
+      throw new IllegalStateException("No tests in source: " + originalSource);
+    }
+    for (String result in validationStrings) {
+      if (result.length < 3) {
+        throw new IllegalStateException("Invalid location result: " + result);
+      }
+      String id = result.substring(0, 1);
+      String sign = result.substring(1, 2);
+      String value = result.substring(2);
+      LocationSpec test = tests[id];
+      if (test == null) {
+        throw new IllegalStateException(
+            "Invalid location result id: $id for: $result");
+      }
+      test.source = modifiedSource;
+      if (sign == '+') {
+        test.positiveResults.add(value);
+      } else if (sign == '-') {
+        test.negativeResults.add(value);
+      } else {
+        String err = "Invalid location result sign: $sign for: $result";
+        throw new IllegalStateException(err);
+      }
+    }
+    List<String> badPoints = <String>[];
+    List<String> badResults = <String>[];
+    for (LocationSpec test in tests.values) {
+      if (test.testLocation == -1) {
+        badPoints.add(test.id);
+      }
+      if (test.positiveResults.isEmpty && test.negativeResults.isEmpty) {
+        badResults.add(test.id);
+      }
+    }
+    if (!(badPoints.isEmpty && badResults.isEmpty)) {
+      StringBuffer err = new StringBuffer();
+      if (!badPoints.isEmpty) {
+        err.write("No test location for tests:");
+        for (String ch in badPoints) {
+          err
+              ..write(' ')
+              ..write(ch);
+        }
+        err.write(' ');
+      }
+      if (!badResults.isEmpty) {
+        err.write("No results for tests:");
+        for (String ch in badResults) {
+          err
+              ..write(' ')
+              ..write(ch);
+        }
+      }
+      throw new IllegalStateException(err.toString());
+    }
+    return tests.values.toList();
+  }
+}
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index bc3f976..6f242c1 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
@@ -39,7 +40,8 @@
         new MockPackageMapProvider(),
         null,
         new AnalysisServerOptions(),
-        new MockSdk());
+        new MockSdk(),
+        new NullInstrumentationServer());
     handler = new AnalysisDomainHandler(server);
   });
 
@@ -461,7 +463,8 @@
         new MockPackageMapProvider(),
         null,
         new AnalysisServerOptions(),
-        new MockSdk());
+        new MockSdk(),
+        new NullInstrumentationServer());
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream =
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index a5caa95..95dd240 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_completion.dart';
@@ -15,160 +16,225 @@
 import 'package:analysis_server/src/services/index/index.dart' show Index;
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/source/package_map_provider.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:unittest/unittest.dart';
 
 import 'analysis_abstract.dart';
+import 'mock_sdk.dart';
 import 'mocks.dart';
 import 'reflective_tests.dart';
 
 main() {
   groupSep = ' | ';
-  runReflectiveTests(CompletionCacheTest);
+  runReflectiveTests(CompletionManagerTest);
   runReflectiveTests(CompletionTest);
 }
 
 @ReflectiveTestCase()
-class CompletionCacheTest extends AbstractAnalysisTest {
+class CompletionManagerTest extends AbstractAnalysisTest {
   AnalysisDomainHandler analysisDomain;
+  Test_CompletionDomainHandler completionDomain;
+  Request request;
+  int requestCount = 0;
+  String testFile2 = '/project/bin/test2.dart';
+
+  AnalysisServer createAnalysisServer(Index index) {
+    return new Test_AnalysisServer(
+        super.serverChannel,
+        super.resourceProvider,
+        super.packageMapProvider,
+        index,
+        new AnalysisServerOptions(),
+        new MockSdk(),
+        new NullInstrumentationServer());
+  }
+
+  void sendRequest(String path) {
+    String id = (++requestCount).toString();
+    request = new CompletionGetSuggestionsParams(path, 0).toRequest(id);
+    Response response = handler.handleRequest(request);
+    expect(response, isResponseSuccess(id));
+  }
 
   @override
   void setUp() {
     super.setUp();
     createProject();
     analysisDomain = handler;
-    handler = new Test_CompletionDomainHandler(server);
+    completionDomain = new Test_CompletionDomainHandler(server);
+    handler = completionDomain;
+    addTestFile('^library A; cl');
+    addFile(testFile2, 'library B; cl');
   }
 
   void tearDown() {
     super.tearDown();
     analysisDomain = null;
+    completionDomain = null;
   }
 
-  test_cache() {
-    Test_CompletionDomainHandler target = handler;
-    addTestFile('^library A; cl');
-    Request request =
-        new CompletionGetSuggestionsParams(testFile, 0).toRequest('0');
-
-    /*
-     * Assert cache is created by manager
-     * and context.onSourceChanged listen is called
-     */
-    Source source;
-    var expectedCache = null;
-    handleSuccessfulRequest(request);
+  /**
+   * Assert different managers are used for different sources
+   */
+  test_2_requests_different_sources() {
+    expect(completionDomain.manager, isNull);
+    sendRequest(testFile);
+    expect(completionDomain.manager, isNotNull);
+    CompletionManager expectedManager = completionDomain.manager;
+    expect(completionDomain.mockContext.mockStream.listenCount, 1);
+    expect(completionDomain.mockContext.mockStream.cancelCount, 0);
     return pumpEventQueue().then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expect(target.completionManager.computeCallCount, 1);
-      source = target.completionManager.source;
-      expect(source, isNotNull);
-      expectedCache = target.completionManager.cache;
-      expect(expectedCache, isNotNull);
-      expect(target.mockContext.mockStream.listenCount, 1);
-      expect(target.mockContext.mockStream.cancelCount, 0);
-
-      /*
-       * Assert cache is stored in target,
-       * and context.onSourceChanged listen has not changed
-       */
-      handleSuccessfulRequest(request);
+      expect(completionDomain.manager, expectedManager);
+      expect(completionDomain.mockManager.computeCallCount, 1);
+      sendRequest(testFile2);
+      expect(completionDomain.manager, isNotNull);
+      expect(completionDomain.manager, isNot(expectedManager));
+      expectedManager = completionDomain.manager;
+      expect(completionDomain.mockContext.mockStream.listenCount, 2);
+      expect(completionDomain.mockContext.mockStream.cancelCount, 1);
       return pumpEventQueue();
     }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 1);
-      expect(target.mockContext.mockStream.cancelCount, 0);
+      expect(completionDomain.manager, expectedManager);
+      expect(completionDomain.mockContext.mockStream.listenCount, 2);
+      expect(completionDomain.mockContext.mockStream.cancelCount, 1);
+      expect(completionDomain.mockManager.computeCallCount, 1);
+    });
+  }
 
-      /*
-       * Assert same cache and listening is preserved across multiple calls
-       */
-      handleSuccessfulRequest(request);
+  /**
+   * Assert same manager is used for multiple requests on same source
+   */
+  test_2_requests_same_source() {
+    expect(completionDomain.manager, isNull);
+    sendRequest(testFile);
+    expect(completionDomain.manager, isNotNull);
+    expect(completionDomain.manager.source, isNotNull);
+    CompletionManager expectedManager = completionDomain.manager;
+    expect(completionDomain.mockContext.mockStream.listenCount, 1);
+    expect(completionDomain.mockContext.mockStream.cancelCount, 0);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, expectedManager);
+      expect(completionDomain.mockManager.computeCallCount, 1);
+      sendRequest(testFile);
+      expect(completionDomain.manager, expectedManager);
+      expect(completionDomain.mockContext.mockStream.listenCount, 1);
+      expect(completionDomain.mockContext.mockStream.cancelCount, 0);
       return pumpEventQueue();
     }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 1);
-      expect(target.mockContext.mockStream.cancelCount, 0);
+      expect(completionDomain.manager, expectedManager);
+      expect(completionDomain.mockContext.mockStream.listenCount, 1);
+      expect(completionDomain.mockContext.mockStream.cancelCount, 0);
+      expect(completionDomain.mockManager.computeCallCount, 2);
+    });
+  }
 
-      /*
-       * Trigger source change event that should NOT clear existing cache
-       */
-      target.sourcesChanged(new SourcesChangedEvent.changedContent(source, ''));
-    }).then((_) {
-
-      handleSuccessfulRequest(request);
+  /**
+   * Assert manager is NOT cleared when context NOT associated with manager changes.
+   */
+  test_contextsChanged_different() {
+    sendRequest(testFile);
+    CompletionManager expectedManager;
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      expectedManager = completionDomain.manager;
+      completionDomain.contextsChangedRaw(
+          new ContextsChangedEvent(changed: [new MockContext()]));
       return pumpEventQueue();
     }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 1);
-      expect(target.mockContext.mockStream.cancelCount, 0);
+      expect(completionDomain.manager, expectedManager);
+    });
+  }
 
-      /*
-       * Trigger source change event that should clear existing cache
-       * and assert subscription.cancel is called when the cache is discarded.
-       */
-      ChangeSet changeSet = new ChangeSet();
-      changeSet.removedSource(source);
-      target.sourcesChanged(new SourcesChangedEvent(changeSet));
-    }).then((_) {
-      expect(target.mockContext.mockStream.listenCount, 1);
-      expect(target.mockContext.mockStream.cancelCount, 1);
-
-      /*
-       * Assert that cache was cleared, recreated,
-       * and context.onSourceChanged listen is called again.
-       */
-      expectedCache = null;
-      handleSuccessfulRequest(request);
+  /**
+   * Assert manager is cleared when context associated with manager changes.
+   */
+  test_contextsChanged_same() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      completionDomain.contextsChangedRaw(
+          new ContextsChangedEvent(changed: [completionDomain.mockContext]));
       return pumpEventQueue();
     }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expectedCache = target.completionManager.cache;
-      expect(expectedCache, isNotNull);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 2);
-      expect(target.mockContext.mockStream.cancelCount, 1);
+      expect(completionDomain.manager, isNull);
+    });
+  }
 
-      /*
-       * Assert same cache and listening is preserved across multiple calls
-       */
-      handleSuccessfulRequest(request);
-      return pumpEventQueue();
-    }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 2);
-      expect(target.mockContext.mockStream.cancelCount, 1);
-
-      /*
-       * Trigger context change event that should clear existing cache
-       */
-      Request request =
-          new AnalysisSetAnalysisRootsParams([], []).toRequest('0');
+  /**
+   * Assert manager is cleared when analysis roots are set
+   */
+  test_setAnalysisRoots() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      request = new AnalysisSetAnalysisRootsParams([], []).toRequest('7');
       Response response = analysisDomain.handleRequest(request);
-      expect(response, isResponseSuccess('0'));
+      expect(response, isResponseSuccess('7'));
       return pumpEventQueue();
     }).then((_) {
-      expect(target.mockContext.mockStream.listenCount, 2);
-      expect(target.mockContext.mockStream.cancelCount, 2);
+      expect(completionDomain.manager, isNull);
+    });
+  }
 
-      /*
-       * Assert that cache was cleared, recreated,
-       * and context.onSourceChanged listen is called again.
-       */
-      expectedCache = null;
-      handleSuccessfulRequest(request);
-      return pumpEventQueue();
-    }).then((_) {
-      expect(identical(target.cacheReceived, expectedCache), isTrue);
-      expectedCache = target.completionManager.cache;
-      expect(expectedCache, isNotNull);
-      expect(target.completionManager.computeCallCount, 1);
-      expect(target.mockContext.mockStream.listenCount, 3);
-      expect(target.mockContext.mockStream.cancelCount, 2);
+  /**
+   * Assert manager is cleared when source NOT associated with manager is changed.
+   */
+  test_sourcesChanged_different_source_changed() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.changedSource(server.getSource(testFile2));
+      completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
+      expect(completionDomain.manager, isNull);
+    });
+  }
+
+  /**
+   * Assert manager is NOT cleared when source associated with manager is changed.
+   */
+  test_sourcesChanged_same_source_changed() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      CompletionManager expectedManager = completionDomain.manager;
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.changedSource(completionDomain.manager.source);
+      completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
+      expect(completionDomain.manager, expectedManager);
+    });
+  }
+
+  /**
+   * Assert manager is cleared when source is deleted
+   */
+  test_sourcesChanged_source_deleted() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.deletedSource(completionDomain.manager.source);
+      completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
+      expect(completionDomain.manager, isNull);
+    });
+  }
+
+  /**
+   * Assert manager is cleared when source is removed
+   */
+  test_sourcesChanged_source_removed() {
+    sendRequest(testFile);
+    return pumpEventQueue().then((_) {
+      expect(completionDomain.manager, isNotNull);
+      ChangeSet changeSet = new ChangeSet();
+      changeSet.removedSource(completionDomain.manager.source);
+      completionDomain.sourcesChanged(new SourcesChangedEvent(changeSet));
+      expect(completionDomain.manager, isNull);
     });
   }
 }
@@ -370,35 +436,30 @@
 class MockCompletionManager implements CompletionManager {
   final AnalysisContext context;
   final Source source;
-  final int offset;
   final SearchEngine searchEngine;
-  CompletionCache cache;
-  CompletionPerformance performance;
   StreamController<CompletionResult> controller;
   int computeCallCount = 0;
 
-  MockCompletionManager(this.context, this.source, this.offset,
-      this.searchEngine, this.cache, this.performance);
+  MockCompletionManager(this.context, this.source, this.searchEngine);
 
   @override
-  CompletionCache get completionCache {
-    if (cache == null) {
-      cache = new MockCache(context, source);
-    }
-    return cache;
+  void computeCache() {
+    // ignored
   }
 
   @override
-  void compute() {
+  void computeSuggestions(CompletionRequest request) {
     ++computeCallCount;
     CompletionResult result = new CompletionResult(0, 0, [], true);
     controller.add(result);
   }
 
   @override
-  Stream<CompletionResult> results() {
+  Stream<CompletionResult> results(CompletionRequest request) {
     controller = new StreamController<CompletionResult>(onListen: () {
-      scheduleMicrotask(compute);
+      scheduleMicrotask(() {
+        computeSuggestions(request);
+      });
     });
     return controller.stream;
   }
@@ -453,38 +514,53 @@
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
+class Test_AnalysisServer extends AnalysisServer {
+  final MockContext mockContext = new MockContext();
+
+  Test_AnalysisServer(ServerCommunicationChannel channel,
+      ResourceProvider resourceProvider, PackageMapProvider packageMapProvider,
+      Index index, AnalysisServerOptions analysisServerOptions, DartSdk defaultSdk,
+      InstrumentationServer instrumentationServer)
+      : super(
+          channel,
+          resourceProvider,
+          packageMapProvider,
+          index,
+          analysisServerOptions,
+          defaultSdk,
+          instrumentationServer);
+
+  AnalysisContext getAnalysisContext(String path) {
+    return mockContext;
+  }
+}
+
 /**
  * A [CompletionDomainHandler] subclass that returns a mock completion manager
  * so that the domain handler cache management can be tested.
  */
 class Test_CompletionDomainHandler extends CompletionDomainHandler {
-  CompletionCache cacheReceived;
-  final MockContext mockContext = new MockContext();
-  MockCompletionManager completionManager;
 
-  Test_CompletionDomainHandler(AnalysisServer server) : super(server);
+  Test_CompletionDomainHandler(Test_AnalysisServer server) : super(server);
+
+  MockContext get mockContext => (server as Test_AnalysisServer).mockContext;
+
+  MockCompletionManager get mockManager => manager;
 
   void contextsChanged(ContextsChangedEvent event) {
-    if (event.removed.length == 1) {
-      event = new ContextsChangedEvent(
-          added: event.added,
-          changed: event.changed,
-          removed: [mockContext]);
-    }
-    super.contextsChanged(event);
+    contextsChangedRaw(
+        new ContextsChangedEvent(
+            added: event.added.length > 0 ? [mockContext] : [],
+            changed: event.changed.length > 0 ? [mockContext] : [],
+            removed: event.removed.length > 0 ? [mockContext] : []));
+  }
+
+  void contextsChangedRaw(ContextsChangedEvent newEvent) {
+    super.contextsChanged(newEvent);
   }
 
   CompletionManager createCompletionManager(AnalysisContext context,
-      Source source, int offset, SearchEngine searchEngine, CompletionCache cache,
-      CompletionPerformance performance) {
-    cacheReceived = cache;
-    completionManager = new MockCompletionManager(
-        mockContext,
-        source,
-        offset,
-        searchEngine,
-        cache,
-        performance);
-    return completionManager;
+      Source source, SearchEngine searchEngine) {
+    return new MockCompletionManager(mockContext, source, searchEngine);
   }
 }
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index baad55c..96edfbe 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/domain_execution.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:typed_mock/typed_mock.dart';
@@ -40,7 +41,8 @@
           new MockPackageMapProvider(),
           null,
           new AnalysisServerOptions(),
-          new MockSdk());
+          new MockSdk(),
+          new NullInstrumentationServer());
       handler = new ExecutionDomainHandler(server);
     });
 
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 4456e37..1156b3f 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mock_sdk.dart';
@@ -27,7 +28,8 @@
         new MockPackageMapProvider(),
         null,
         new AnalysisServerOptions(),
-        new MockSdk());
+        new MockSdk(),
+        new NullInstrumentationServer());
     handler = new ServerDomainHandler(server);
   });
 
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 22d4130..17d3633 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -58,20 +58,25 @@
       AnalysisService.NAVIGATION: [pathname1]
     });
     List<NavigationRegion> regions;
+    List<NavigationTarget> targets;
+    List<String> targetFiles;
     onAnalysisNavigation.listen((AnalysisNavigationParams params) {
       expect(params.file, equals(pathname1));
       regions = params.regions;
+      targets = params.targets;
+      targetFiles = params.files;
     });
     return analysisFinished.then((_) {
       // There should be a single error, due to the fact that 'dart:async' is
       // not used.
       expect(currentAnalysisErrors[pathname1], hasLength(1));
       expect(currentAnalysisErrors[pathname2], isEmpty);
-      Element findTargetElement(int index) {
+      NavigationTarget findTargetElement(int index) {
         for (NavigationRegion region in regions) {
           if (region.offset <= index && index < region.offset + region.length) {
             expect(region.targets, hasLength(1));
-            return region.targets[0];
+            int targetIndex = region.targets[0];
+            return targets[targetIndex];
           }
         }
         fail('No element found for index $index');
@@ -81,16 +86,16 @@
           ElementKind expectedKind) {
         int sourceIndex = text1.indexOf(source);
         int targetIndex = text1.indexOf(expectedTarget);
-        Element element = findTargetElement(sourceIndex);
-        expect(element.location.file, equals(pathname1));
-        expect(element.location.offset, equals(targetIndex));
+        NavigationTarget element = findTargetElement(sourceIndex);
+        expect(targetFiles[element.fileIndex], equals(pathname1));
+        expect(element.offset, equals(targetIndex));
         expect(element.kind, equals(expectedKind));
       }
       void checkRemote(String source, String expectedTargetRegexp,
           ElementKind expectedKind) {
         int sourceIndex = text1.indexOf(source);
-        Element element = findTargetElement(sourceIndex);
-        expect(element.location.file, matches(expectedTargetRegexp));
+        NavigationTarget element = findTargetElement(sourceIndex);
+        expect(targetFiles[element.fileIndex], matches(expectedTargetRegexp));
         expect(element.kind, equals(expectedKind));
       }
       // TODO(paulberry): will the element type 'CLASS_TYPE_ALIAS' ever appear
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index d2a7800..c101417 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -43,9 +43,13 @@
       AnalysisService.NAVIGATION: [mainPath]
     });
     List<NavigationRegion> navigationRegions;
+    List<NavigationTarget> navigationTargets;
+    List<String> navigationTargetFiles;
     onAnalysisNavigation.listen((AnalysisNavigationParams params) {
       expect(params.file, equals(mainPath));
       navigationRegions = params.regions;
+      navigationTargets = params.targets;
+      navigationTargetFiles = params.files;
     });
     sendAnalysisSetAnalysisRoots([projPath], [], packageRoots: {
       projPath: packagesPath
@@ -60,8 +64,10 @@
         if (navigationSource == 'f') {
           found = true;
           expect(region.targets, hasLength(1));
-          Location location = region.targets[0].location;
-          expect(location.file, equals(normalizedFooBarPath));
+          int navigationTargetIndex = region.targets[0];
+          NavigationTarget navigationTarget = navigationTargets[navigationTargetIndex];
+          String navigationFile = navigationTargetFiles[navigationTarget.fileIndex];
+          expect(navigationFile, equals(normalizedFooBarPath));
         }
       }
       expect(found, isTrue);
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 7e043dd..ec5fdb3 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -156,7 +156,9 @@
    * request will be delayed until they have been computed. If some or all of
    * the errors for the file cannot be computed, then the subset of the errors
    * that can be computed will be returned and the response will contain an
-   * error to indicate why the errors could not be computed.
+   * error to indicate why the errors could not be computed. If the content of
+   * the file changes after this request was received but before a response
+   * could be sent, then an error of type CONTENT_MODIFIED will be generated.
    *
    * This request is intended to be used by clients that cannot asynchronously
    * apply updated error information. Clients that can apply error information
@@ -224,6 +226,64 @@
   }
 
   /**
+   * Return the navigation information associated with the given region of the
+   * given file. If the navigation information for the given file has not yet
+   * been computed, or the most recently computed navigation information for
+   * the given file is out of date, then the response for this request will be
+   * delayed until it has been computed. If the content of the file changes
+   * after this request was received but before a response could be sent, then
+   * an error of type CONTENT_MODIFIED will be generated.
+   *
+   * If a navigation region overlaps (but extends either before or after) the
+   * given region of the file it will be included in the result. This means
+   * that it is theoretically possible to get the same navigation region in
+   * response to multiple requests. Clients can avoid this by always choosing a
+   * region that starts at the beginning of a line and ends at the end of a
+   * (possibly different) line in the file.
+   *
+   * Parameters
+   *
+   * file ( FilePath )
+   *
+   *   The file in which navigation information is being requested.
+   *
+   * offset ( int )
+   *
+   *   The offset of the region for which navigation information is being
+   *   requested.
+   *
+   * length ( int )
+   *
+   *   The length of the region for which navigation information is being
+   *   requested.
+   *
+   * Returns
+   *
+   * files ( List<FilePath> )
+   *
+   *   A list of the paths of files that are referenced by the navigation
+   *   targets.
+   *
+   * targets ( List<NavigationTarget> )
+   *
+   *   A list of the navigation targets that are referenced by the navigation
+   *   regions.
+   *
+   * regions ( List<NavigationRegion> )
+   *
+   *   A list of the navigation regions within the requested region of the
+   *   file.
+   */
+  Future<AnalysisGetNavigationResult> sendAnalysisGetNavigation(String file, int offset, int length) {
+    var params = new AnalysisGetNavigationParams(file, offset, length).toJson();
+    return server.send("analysis.getNavigation", params)
+        .then((result) {
+      ResponseDecoder decoder = new ResponseDecoder(null);
+      return new AnalysisGetNavigationResult.fromJson(decoder, 'result', result);
+    });
+  }
+
+  /**
    * Force the re-analysis of everything contained in the existing analysis
    * roots. This will cause all previously computed analysis results to be
    * discarded and recomputed, and will cause all subscribed notifications to
@@ -522,6 +582,41 @@
   StreamController<AnalysisHighlightsParams> _onAnalysisHighlights;
 
   /**
+   * Reports that the navigation information associated with a region of a
+   * single file has become invalid and should be re-requested.
+   *
+   * This notification is not subscribed to by default. Clients can subscribe
+   * by including the value "INVALIDATE" in the list of services passed in an
+   * analysis.setSubscriptions request.
+   *
+   * Parameters
+   *
+   * file ( FilePath )
+   *
+   *   The file whose information has been invalidated.
+   *
+   * offset ( int )
+   *
+   *   The offset of the invalidated region.
+   *
+   * length ( int )
+   *
+   *   The length of the invalidated region.
+   *
+   * delta ( int )
+   *
+   *   The delta to be applied to the offsets in information that follows the
+   *   invalidated region in order to update it so that it doesn't need to be
+   *   re-requested.
+   */
+  Stream<AnalysisInvalidateParams> onAnalysisInvalidate;
+
+  /**
+   * Stream controller for [onAnalysisInvalidate].
+   */
+  StreamController<AnalysisInvalidateParams> _onAnalysisInvalidate;
+
+  /**
    * Reports the navigation targets associated with a given file.
    *
    * This notification is not subscribed to by default. Clients can subscribe
@@ -543,6 +638,16 @@
    *   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.
+   *
+   * targets ( List<NavigationTarget> )
+   *
+   *   The navigation targets referenced in the file. They are referenced by
+   *   NavigationRegions by their index in this array.
+   *
+   * files ( List<FilePath> )
+   *
+   *   The files containing navigation targets referenced in the file. They are
+   *   referenced by NavigationTargets by their index in this array.
    */
   Stream<AnalysisNavigationParams> onAnalysisNavigation;
 
@@ -1279,6 +1384,8 @@
     onAnalysisFolding = _onAnalysisFolding.stream.asBroadcastStream();
     _onAnalysisHighlights = new StreamController<AnalysisHighlightsParams>(sync: true);
     onAnalysisHighlights = _onAnalysisHighlights.stream.asBroadcastStream();
+    _onAnalysisInvalidate = new StreamController<AnalysisInvalidateParams>(sync: true);
+    onAnalysisInvalidate = _onAnalysisInvalidate.stream.asBroadcastStream();
     _onAnalysisNavigation = new StreamController<AnalysisNavigationParams>(sync: true);
     onAnalysisNavigation = _onAnalysisNavigation.stream.asBroadcastStream();
     _onAnalysisOccurrences = new StreamController<AnalysisOccurrencesParams>(sync: true);
@@ -1330,6 +1437,10 @@
         expect(params, isAnalysisHighlightsParams);
         _onAnalysisHighlights.add(new AnalysisHighlightsParams.fromJson(decoder, 'params', params));
         break;
+      case "analysis.invalidate":
+        expect(params, isAnalysisInvalidateParams);
+        _onAnalysisInvalidate.add(new AnalysisInvalidateParams.fromJson(decoder, 'params', params));
+        break;
       case "analysis.navigation":
         expect(params, isAnalysisNavigationParams);
         _onAnalysisNavigation.add(new AnalysisNavigationParams.fromJson(decoder, 'params', params));
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 88483a2..cc5e809 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -144,6 +144,38 @@
   }));
 
 /**
+ * analysis.getNavigation params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ * }
+ */
+final Matcher isAnalysisGetNavigationParams = new LazyMatcher(() => new MatchesJsonObject(
+  "analysis.getNavigation params", {
+    "file": isFilePath,
+    "offset": isInt,
+    "length": isInt
+  }));
+
+/**
+ * analysis.getNavigation result
+ *
+ * {
+ *   "files": List<FilePath>
+ *   "targets": List<NavigationTarget>
+ *   "regions": List<NavigationRegion>
+ * }
+ */
+final Matcher isAnalysisGetNavigationResult = new LazyMatcher(() => new MatchesJsonObject(
+  "analysis.getNavigation result", {
+    "files": isListOf(isFilePath),
+    "targets": isListOf(isNavigationTarget),
+    "regions": isListOf(isNavigationRegion)
+  }));
+
+/**
  * analysis.reanalyze params
  */
 final Matcher isAnalysisReanalyzeParams = isNull;
@@ -298,17 +330,39 @@
   }));
 
 /**
+ * analysis.invalidate params
+ *
+ * {
+ *   "file": FilePath
+ *   "offset": int
+ *   "length": int
+ *   "delta": int
+ * }
+ */
+final Matcher isAnalysisInvalidateParams = new LazyMatcher(() => new MatchesJsonObject(
+  "analysis.invalidate params", {
+    "file": isFilePath,
+    "offset": isInt,
+    "length": isInt,
+    "delta": isInt
+  }));
+
+/**
  * analysis.navigation params
  *
  * {
  *   "file": FilePath
  *   "regions": List<NavigationRegion>
+ *   "targets": List<NavigationTarget>
+ *   "files": List<FilePath>
  * }
  */
 final Matcher isAnalysisNavigationParams = new LazyMatcher(() => new MatchesJsonObject(
   "analysis.navigation params", {
     "file": isFilePath,
-    "regions": isListOf(isNavigationRegion)
+    "regions": isListOf(isNavigationRegion),
+    "targets": isListOf(isNavigationTarget),
+    "files": isListOf(isFilePath)
   }));
 
 /**
@@ -918,6 +972,7 @@
  * enum {
  *   FOLDING
  *   HIGHLIGHTS
+ *   INVALIDATE
  *   NAVIGATION
  *   OCCURRENCES
  *   OUTLINE
@@ -927,6 +982,7 @@
 final Matcher isAnalysisService = new MatchesEnum("AnalysisService", [
   "FOLDING",
   "HIGHLIGHTS",
+  "INVALIDATE",
   "NAVIGATION",
   "OCCURRENCES",
   "OUTLINE",
@@ -1424,14 +1480,36 @@
  * {
  *   "offset": int
  *   "length": int
- *   "targets": List<Element>
+ *   "targets": List<int>
  * }
  */
 final Matcher isNavigationRegion = new LazyMatcher(() => new MatchesJsonObject(
   "NavigationRegion", {
     "offset": isInt,
     "length": isInt,
-    "targets": isListOf(isElement)
+    "targets": isListOf(isInt)
+  }));
+
+/**
+ * NavigationTarget
+ *
+ * {
+ *   "kind": ElementKind
+ *   "fileIndex": int
+ *   "offset": int
+ *   "length": int
+ *   "startLine": int
+ *   "startColumn": int
+ * }
+ */
+final Matcher isNavigationTarget = new LazyMatcher(() => new MatchesJsonObject(
+  "NavigationTarget", {
+    "kind": isElementKind,
+    "fileIndex": isInt,
+    "offset": isInt,
+    "length": isInt,
+    "startLine": isInt,
+    "startColumn": isInt
   }));
 
 /**
@@ -1664,6 +1742,7 @@
  * RequestErrorCode
  *
  * enum {
+ *   CONTENT_MODIFIED
  *   GET_ERRORS_INVALID_FILE
  *   INVALID_OVERLAY_CHANGE
  *   INVALID_PARAMETER
@@ -1678,6 +1757,7 @@
  * }
  */
 final Matcher isRequestErrorCode = new MatchesEnum("RequestErrorCode", [
+  "CONTENT_MODIFIED",
   "GET_ERRORS_INVALID_FILE",
   "INVALID_OVERLAY_CHANGE",
   "INVALID_PARAMETER",
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 7b47452..1de407e 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -115,6 +115,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ElementKindTest {
   void test_fromEngine() {
     expect(
@@ -330,7 +331,7 @@
       expect(location.startLine, 2);
       expect(location.startColumn, 14);
     }
-    expect(element.parameters, '()');
+    expect(element.parameters, isNull);
     expect(element.returnType, 'String');
     expect(element.flags, 0);
   }
diff --git a/pkg/analysis_server/test/reflective_tests.dart b/pkg/analysis_server/test/reflective_tests.dart
index 685bd13..2730680 100644
--- a/pkg/analysis_server/test/reflective_tests.dart
+++ b/pkg/analysis_server/test/reflective_tests.dart
@@ -29,6 +29,14 @@
  */
 void runReflectiveTests(Type type) {
   ClassMirror classMirror = reflectClass(type);
+  if (!classMirror.metadata.any(
+      (InstanceMirror annotation) =>
+          annotation.type.reflectedType == ReflectiveTestCase)) {
+    String name = MirrorSystem.getName(classMirror.qualifiedName);
+    throw new Exception(
+        'Class $name must have annotation "@ReflectiveTestCase()" '
+            'in order to be run by runReflectiveTests.');
+  }
   String className = MirrorSystem.getName(classMirror.simpleName);
   group(className, () {
     classMirror.instanceMembers.forEach((symbol, memberMirror) {
@@ -39,19 +47,29 @@
       String memberName = MirrorSystem.getName(symbol);
       // test_
       if (memberName.startsWith('test_')) {
-        String testName = memberName.substring('test_'.length);
-        test(testName, () {
+        test(memberName, () {
           return _runTest(classMirror, symbol);
         });
         return;
       }
       // solo_test_
       if (memberName.startsWith('solo_test_')) {
-        String testName = memberName.substring('solo_test_'.length);
-        solo_test(testName, () {
+        solo_test(memberName, () {
           return _runTest(classMirror, symbol);
         });
       }
+      // fail_test_
+      if (memberName.startsWith('fail_')) {
+        test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
+      // solo_fail_test_
+      if (memberName.startsWith('solo_fail_')) {
+        solo_test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
     });
   });
 }
@@ -71,6 +89,23 @@
 }
 
 
+/**
+ * Run a test that is expected to fail, and confirm that it fails.
+ *
+ * This properly handles the following cases:
+ * - The test fails by throwing an exception
+ * - The test returns a future which completes with an error.
+ *
+ * However, it does not handle the case where the test creates an asynchronous
+ * callback using expectAsync(), and that callback generates a failure.
+ */
+Future _runFailingTest(ClassMirror classMirror, Symbol symbol) {
+  return new Future(() => _runTest(classMirror, symbol)).then((_) {
+    fail('Test passed - expected to fail.');
+  }, onError: (_) {});
+}
+
+
 _runTest(ClassMirror classMirror, Symbol symbol) {
   InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
   return _invokeSymbolIfExists(
diff --git a/pkg/analysis_server/test/services/completion/completion_computer_test.dart b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
index 3500955..ac21d89 100644
--- a/pkg/analysis_server/test/services/completion/completion_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_computer_test.dart
@@ -44,7 +44,6 @@
   Index index;
   SearchEngineImpl searchEngine;
   Source source;
-  CompletionCache cache;
   CompletionPerformance perf;
   DartCompletionManager manager;
   MockCompletionComputer computer1;
@@ -64,15 +63,8 @@
     index = createLocalMemoryIndex();
     searchEngine = new SearchEngineImpl(index);
     source = addSource('/does/not/exist.dart', '');
-    cache = null;
     perf = new CompletionPerformance();
-    manager = new DartCompletionManager.create(
-        context,
-        searchEngine,
-        source,
-        0,
-        cache,
-        perf);
+    manager = new DartCompletionManager.create(context, searchEngine, source);
     suggestion1 = new CompletionSuggestion(
         CompletionSuggestionKind.INVOCATION,
         CompletionRelevance.DEFAULT,
@@ -97,7 +89,8 @@
     manager.computers = [computer1, computer2];
     int count = 0;
     bool done = false;
-    manager.results().listen((CompletionResult r) {
+    CompletionRequest completionRequest = new CompletionRequest(0, perf);
+    manager.results(completionRequest).listen((CompletionResult r) {
       switch (++count) {
         case 1:
           computer1.assertCalls(context, source, 0, searchEngine);
@@ -133,7 +126,8 @@
     manager.computers = [computer1, computer2];
     int count = 0;
     bool done = false;
-    manager.results().listen((CompletionResult r) {
+    CompletionRequest completionRequest = new CompletionRequest(0, perf);
+    manager.results(completionRequest).listen((CompletionResult r) {
       switch (++count) {
         case 1:
           computer1.assertCalls(context, source, 0, searchEngine);
diff --git a/pkg/analysis_server/test/services/completion/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
index 4a983a2..fef6789 100644
--- a/pkg/analysis_server/test/services/completion/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_manager_test.dart
@@ -20,33 +20,28 @@
 @ReflectiveTestCase()
 class CompletionManagerTest extends AbstractContextTest {
   var perf = new CompletionPerformance();
-  var cache = null;
 
   test_dart() {
     Source source = addSource('/does/not/exist.dart', '');
-    var manager =
-        new CompletionManager.create(context, source, 0, null, cache, perf);
+    var manager = new CompletionManager.create(context, source, null);
     expect(manager.runtimeType, DartCompletionManager);
   }
 
   test_html() {
     Source source = addSource('/does/not/exist.html', '');
-    var manager =
-        new CompletionManager.create(context, source, 0, null, cache, perf);
+    var manager = new CompletionManager.create(context, source, null);
     expect(manager.runtimeType, NoOpCompletionManager);
   }
 
   test_null_context() {
     Source source = addSource('/does/not/exist.dart', '');
-    var manager =
-        new CompletionManager.create(null, source, 0, null, cache, perf);
+    var manager = new CompletionManager.create(null, source, null);
     expect(manager.runtimeType, NoOpCompletionManager);
   }
 
   test_other() {
     Source source = addSource('/does/not/exist.foo', '');
-    var manager =
-        new CompletionManager.create(context, source, 0, null, cache, perf);
+    var manager = new CompletionManager.create(context, source, null);
     expect(manager.runtimeType, NoOpCompletionManager);
   }
 }
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 ffe3bcf..632f30a 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -9,6 +9,7 @@
 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/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_computer.dart';
@@ -65,7 +66,8 @@
         searchEngine,
         testSource,
         completionOffset,
-        cache);
+        cache,
+        new CompletionPerformance());
   }
 
   void assertNoSuggestions({CompletionSuggestionKind kind: null}) {
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 0f1ae4d..bec1272 100644
--- a/pkg/analysis_server/test/services/completion/imported_computer_test.dart
+++ b/pkg/analysis_server/test/services/completion/imported_computer_test.dart
@@ -5,6 +5,7 @@
 library test.services.completion.toplevel;
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_computer.dart';
@@ -38,6 +39,9 @@
    */
   @override
   void assertCachedCompute(_) {
+    if (!(computer as ImportedComputer).shouldWaitForLowPrioritySuggestions) {
+      return;
+    }
     expect(request.unit.element, isNotNull);
     List<CompletionSuggestion> oldSuggestions = request.suggestions;
     /*
@@ -55,7 +59,8 @@
         searchEngine,
         testSource,
         completionOffset,
-        cache);
+        cache,
+        new CompletionPerformance());
     expect(computeFast(), isTrue);
     expect(request.unit.element, isNull);
     List<CompletionSuggestion> newSuggestions = request.suggestions;
@@ -97,7 +102,7 @@
 
   @override
   void setUpComputer() {
-    computer = new ImportedComputer();
+    computer = new ImportedComputer(shouldWaitForLowPrioritySuggestions: true);
   }
 
   @override
@@ -142,4 +147,44 @@
       assertNotCached('m1');
     });
   }
+
+  test_Block_partial_results() {
+    // Block  BlockFunctionBody  MethodDeclaration
+    addSource('/testAB.dart', '''
+      export "dart:math" hide max;
+      class A {int x;}
+      @deprecated D1() {int x;}
+      class _B { }''');
+    addSource('/testCD.dart', '''
+      String T1;
+      var _T2;
+      class C { }
+      class D { }''');
+    addSource('/testEEF.dart', '''
+      class EE { }
+      class F { }''');
+    addSource('/testG.dart', 'class G { }');
+    addSource('/testH.dart', '''
+      class H { }
+      int T3;
+      var _T4;'''); // not imported
+    addTestSource('''
+      import "/testAB.dart";
+      import "/testCD.dart" hide D;
+      import "/testEEF.dart" show EE;
+      import "/testG.dart" as g;
+      int T5;
+      var _T6;
+      Z D2() {int x;}
+      class X {a() {var f; {var x;} ^ var r;} void b() { }}
+      class Z { }''');
+    (computer as ImportedComputer).shouldWaitForLowPrioritySuggestions = false;
+    computeFast();
+    return computeFull((bool result) {
+      assertSuggestImportedClass('C');
+      // Assert computer does not wait for or include low priority results
+      // from non-imported libraries unless instructed to do so.
+      assertNotSuggested('H');
+    });
+  }
 }
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 a146312..89eda4b 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
@@ -294,7 +294,6 @@
         _expectedLocation(classElementC, 'B; // 3'));
   }
 
-
   void test_isInvokedBy_FieldElement() {
     _indexTestUnit('''
 class A {
@@ -788,6 +787,34 @@
         _expectedLocation(mainElement, '.named(); // marker-main-2', length: 6));
   }
 
+  void test_isReferencedBy_ConstructorElement_redirection() {
+    _indexTestUnit('''
+class A {
+  A() : this.bar();
+  A.foo() : this(); // marker
+  A.bar();
+}
+''');
+    // prepare elements
+    var isConstructor = (node) => node is ConstructorDeclaration;
+    ConstructorElement constructorA =
+        findNodeElementAtString("A()", isConstructor);
+    ConstructorElement constructorA_foo =
+        findNodeElementAtString("A.foo()", isConstructor);
+    ConstructorElement constructorA_bar =
+        findNodeElementAtString("A.bar()", isConstructor);
+    // A()
+    _assertRecordedRelation(
+        constructorA,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(constructorA_foo, '(); // marker', length: 0));
+    // A.foo()
+    _assertRecordedRelation(
+        constructorA_bar,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(constructorA, '.bar();', length: 4));
+  }
+
   void test_isReferencedBy_ConstructorFieldInitializer() {
     _indexTestUnit('''
 class A {
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 6ecc3a0..6dd4e10 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -1075,6 +1075,24 @@
     });
   }
 
+  test_returnType_statements_nullMix() {
+    indexTestUnit('''
+main(bool p) {
+// start
+  if (p) {
+    return 42;
+  }
+  return null;
+// end
+}
+''');
+    _createRefactoringForStartEndComments();
+    // do check
+    return refactoring.checkInitialConditions().then((_) {
+      expect(refactoring.returnType, 'int');
+    });
+  }
+
   test_returnType_statements_void() {
     indexTestUnit('''
 main() {
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index bbed045..edb99b8 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -168,6 +168,30 @@
 ''');
   }
 
+  test_OK_inSwitchCase() {
+    indexTestUnit('''
+main(int p) {
+  switch (p) {
+    case 0:
+      int test = 42;
+      print(test);
+      break;
+  }
+}
+''');
+    _createRefactoring('test =');
+    // validate change
+    return assertSuccessfulRefactoring('''
+main(int p) {
+  switch (p) {
+    case 0:
+      print(42);
+      break;
+  }
+}
+''');
+  }
+
   test_OK_intoStringInterpolation_binaryExpression() {
     indexTestUnit(r'''
 main() {
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index a794e03..aa1a312 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/socket_server.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:unittest/unittest.dart';
 
@@ -34,7 +35,8 @@
   static void createAnalysisServer_alreadyStarted() {
     SocketServer server = new SocketServer(
         new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk);
+        DirectoryBasedDartSdk.defaultSdk,
+        new NullInstrumentationServer());
     MockServerChannel channel1 = new MockServerChannel();
     MockServerChannel channel2 = new MockServerChannel();
     server.createAnalysisServer(channel1);
@@ -61,7 +63,8 @@
   static Future createAnalysisServer_successful() {
     SocketServer server = new SocketServer(
         new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk);
+        DirectoryBasedDartSdk.defaultSdk,
+        new NullInstrumentationServer());
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
@@ -77,7 +80,8 @@
   static Future requestHandler_exception() {
     SocketServer server = new SocketServer(
         new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk);
+        DirectoryBasedDartSdk.defaultSdk,
+        new NullInstrumentationServer());
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
@@ -99,7 +103,8 @@
   static Future requestHandler_futureException() {
     SocketServer server = new SocketServer(
         new AnalysisServerOptions(),
-        DirectoryBasedDartSdk.defaultSdk);
+        DirectoryBasedDartSdk.defaultSdk,
+        new NullInstrumentationServer());
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     _MockRequestHandler handler = new _MockRequestHandler(true);
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index e459087..8b81d4f 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -355,6 +355,16 @@
           writeln('private List<Outline> children;');
         });
       }
+      if (className == 'NavigationRegion') {
+        privateField(javaName('targetObjects'), () {
+          writeln('private final List<NavigationTarget> targetObjects = Lists.newArrayList();');
+        });
+      }
+      if (className == 'NavigationTarget') {
+        privateField(javaName('file'), () {
+          writeln('private String file;');
+        });
+      }
 
       //
       // constructor
@@ -442,6 +452,35 @@
         }
       }
 
+      if (className == 'NavigationRegion') {
+        publicMethod('lookupTargets', () {
+          writeln('public void lookupTargets(List<NavigationTarget> allTargets) {');
+          writeln('  for (int i = 0; i < targets.length; i++) {');
+          writeln('    int targetIndex = targets[i];');
+          writeln('    NavigationTarget target = allTargets.get(targetIndex);');
+          writeln('    targetObjects.add(target);');
+          writeln('  }');
+          writeln('}');
+        });
+        publicMethod('getTargetObjects', () {
+          writeln('public List<NavigationTarget> getTargetObjects() {');
+          writeln('  return targetObjects;');
+          writeln('}');
+        });
+      }
+      if (className == 'NavigationTarget') {
+        publicMethod('lookupFile', () {
+          writeln('public void lookupFile(String[] allTargetFiles) {');
+          writeln('  file = allTargetFiles[fileIndex];');
+          writeln('}');
+        });
+        publicMethod('getFile', () {
+          writeln('public String getFile() {');
+          writeln('  return file;');
+          writeln('}');
+        });
+      }
+
       //
       // fromJson(JsonObject) factory constructor, example:
 //      public JsonObject toJson(JsonObject jsonObject) {
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 1d8e68d..69f4542 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -266,7 +266,9 @@
           for the file cannot be computed, then the subset of the
           errors that can be computed will be returned and the
           response will contain an error to indicate why the errors
-          could not be computed.
+          could not be computed. If the content of the file changes after this
+          request was received but before a response could be sent, then an
+          error of type <tt>CONTENT_MODIFIED</tt> will be generated.
         </p>
         <p>
           This request is intended to be used by clients that cannot
@@ -310,15 +312,13 @@
           <field name="file">
             <ref>FilePath</ref>
             <p>
-              The file in which hover information is being
-              requested.
+              The file in which hover information is being requested.
             </p>
           </field>
           <field name="offset">
             <ref>int</ref>
             <p>
-              The offset for which hover information is being
-              requested.
+              The offset for which hover information is being requested.
             </p>
           </field>
         </params>
@@ -336,6 +336,71 @@
           </field>
         </result>
       </request>
+      <request method="getNavigation">
+        <p>
+          Return the navigation information associated with the given region of
+          the given file. If the navigation information for the given file has
+          not yet been computed, or the most recently computed navigation
+          information for the given file is out of date, then the response for
+          this request will be delayed until it has been computed. If the
+          content of the file changes after this request was received but before
+          a response could be sent, then an error of type
+          <tt>CONTENT_MODIFIED</tt> will be generated.
+        </p>
+        <p>
+          If a navigation region overlaps (but extends either before or after)
+          the given region of the file it will be included in the result. This
+          means that it is theoretically possible to get the same navigation
+          region in response to multiple requests. Clients can avoid this by
+          always choosing a region that starts at the beginning of a line and
+          ends at the end of a (possibly different) line in the file.
+        </p>
+        <params>
+          <field name="file">
+            <ref>FilePath</ref>
+            <p>
+              The file in which navigation information is being requested.
+            </p>
+          </field>
+          <field name="offset">
+            <ref>int</ref>
+            <p>
+              The offset of the region for which navigation information is being
+              requested.
+            </p>
+          </field>
+          <field name="length">
+            <ref>int</ref>
+            <p>
+              The length of the region for which navigation information is being
+              requested.
+            </p>
+          </field>
+        </params>
+        <result>
+          <field name="files">
+            <list><ref>FilePath</ref></list>
+            <p>
+              A list of the paths of files that are referenced by the navigation
+              targets.
+            </p>
+          </field>
+          <field name="targets">
+            <list><ref>NavigationTarget</ref></list>
+            <p>
+              A list of the navigation targets that are referenced by the
+              navigation regions.
+            </p>
+          </field>
+          <field name="regions">
+            <list><ref>NavigationRegion</ref></list>
+            <p>
+              A list of the navigation regions within the requested region of
+              the file.
+            </p>
+          </field>
+        </result>
+      </request>
       <request method="reanalyze">
         <p>
           Force the re-analysis of everything contained in the
@@ -657,6 +722,45 @@
           </field>
         </params>
       </notification>
+      <notification event="invalidate">
+        <p>
+          Reports that the navigation information associated with a region of a
+          single file has become invalid and should be re-requested.
+        </p>
+        <p>
+          This notification is not subscribed to by default. Clients can
+          subscribe by including the value <tt>"INVALIDATE"</tt> in the list of
+          services passed in an analysis.setSubscriptions request.
+        </p>
+        <params>
+          <field name="file">
+            <ref>FilePath</ref>
+            <p>
+              The file whose information has been invalidated.
+            </p>
+          </field>
+          <field name="offset">
+            <ref>int</ref>
+            <p>
+              The offset of the invalidated region.
+            </p>
+          </field>
+          <field name="length">
+            <ref>int</ref>
+            <p>
+              The length of the invalidated region.
+            </p>
+          </field>
+          <field name="delta">
+            <ref>int</ref>
+            <p>
+              The delta to be applied to the offsets in information that follows
+              the invalidated region in order to update it so that it doesn't
+              need to be re-requested.
+            </p>
+          </field>
+        </params>
+      </notification>
       <notification event="navigation">
         <p>
           Reports the navigation targets associated with a given file.
@@ -689,6 +793,22 @@
               navigation regions.
             </p>
           </field>
+          <field name="targets">
+            <list><ref>NavigationTarget</ref></list>
+            <p>
+              The navigation targets referenced in the file.
+              They are referenced by <tt>NavigationRegion</tt>s by their
+              index in this array.
+            </p>
+          </field>
+          <field name="files">
+            <list><ref>FilePath</ref></list>
+            <p>
+              The files containing navigation targets referenced in the file.
+              They are referenced by <tt>NavigationTarget</tt>s by their
+              index in this array.
+            </p>
+          </field>
         </params>
       </notification>
       <notification event="occurrences">
@@ -1656,6 +1776,7 @@
         <enum>
           <value><code>FOLDING</code></value>
           <value><code>HIGHLIGHTS</code></value>
+          <value><code>INVALIDATE</code></value>
           <value><code>NAVIGATION</code></value>
           <value><code>OCCURRENCES</code></value>
           <value><code>OUTLINE</code></value>
@@ -1893,7 +2014,7 @@
             <p>
               The element identifier should be inserted at the completion location.
               For example "someMethod" in import 'myLib.dart' show someMethod; .
-              For suggestions of this kind, the element attribute is defined 
+              For suggestions of this kind, the element attribute is defined
               and the completion field is the element's identifier.
             </p>
           </value>
@@ -1902,7 +2023,7 @@
             <p>
               The element is being invoked at the completion location.
               For example, "someMethod" in x.someMethod(); .
-              For suggestions of this kind, the element attribute is defined 
+              For suggestions of this kind, the element attribute is defined
               and the completion field is the element's identifier.
             </p>
           </value>
@@ -1963,8 +2084,9 @@
             <p>
               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 "()".
+              the element doesn't have parameters (e.g. getter), this field
+              will not be defined. If the element has zero parameters, this
+              field will have a value of "()".
             </p>
           </field>
           <field name="returnType" optional="true">
@@ -2384,11 +2506,57 @@
             </p>
           </field>
           <field name="targets">
-            <list><ref>Element</ref></list>
+            <list><ref>int</ref></list>
             <p>
-              The elements to which the given region is bound. By
-              opening the declaration of the elements, clients can
-              implement one form of navigation.
+              The indexes of the targets (in the enclosing navigation response)
+              to which the given region is bound. By opening the target, clients
+              can implement one form of navigation.
+            </p>
+          </field>
+        </object>
+      </type>
+      <type name="NavigationTarget">
+        <p>
+          A description of a target to which the user can navigate.
+        </p>
+        <object>
+          <field name="kind">
+            <ref>ElementKind</ref>
+            <p>
+              The kind of the element.
+            </p>
+          </field>
+          <field name="fileIndex">
+            <ref>int</ref>
+            <p>
+              The index of the file (in the enclosing navigation response) to
+              navigate to.
+            </p>
+          </field>
+          <field name="offset">
+            <ref>int</ref>
+            <p>
+              The offset of the region from which the user can navigate.
+            </p>
+          </field>
+          <field name="length">
+            <ref>int</ref>
+            <p>
+              The length of the region from which the user can navigate.
+            </p>
+          </field>
+          <field name="startLine">
+            <ref>int</ref>
+            <p>
+              The one-based index of the line containing the first
+              character of the region.
+            </p>
+          </field>
+          <field name="startColumn">
+            <ref>int</ref>
+            <p>
+              The one-based index of the column containing the first
+              character of the region.
             </p>
           </field>
         </object>
@@ -2702,6 +2870,14 @@
         </p>
         <enum>
           <value>
+            <code>CONTENT_MODIFIED</code>
+            <p>
+              An "analysis.getErrors" or "analysis.getNavigation" request could
+              not be satisfied because the content of the file changed before
+              the requested results could be computed.
+            </p>
+          </value>
+          <value>
             <code>GET_ERRORS_INVALID_FILE</code>
             <p>
               An "analysis.getErrors" request specified a FilePath
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
new file mode 100644
index 0000000..7557ecd
--- /dev/null
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library instrumentation;
+
+/**
+ * The interface used by client code to communicate with an instrumentation
+ * server.
+ */
+abstract class InstrumentationServer {
+  /**
+   * Pass the given [message] to the instrumentation server so that it will be
+   * logged with other messages.
+   */
+  void log(String message);
+
+  /**
+   * Signal that the client is done communicating with the instrumentation
+   * server. This method should be invoked exactly one time and no other methods
+   * should be invoked on this instance after this method has been invoked.
+   */
+  void shutdown();
+}
+
+/**
+ * An [InstrumentationServer] that ignores all instrumentation requests sent to
+ * it. It can be used when no instrumentation data is to be collected as a way
+ * to avoid needing to check for null values.
+ */
+class NullInstrumentationServer implements InstrumentationServer {
+  /**
+   * Initialize a newly created instance of this class.
+   */
+  const NullInstrumentationServer();
+
+  @override
+  void log(String message) {
+  }
+
+  @override
+  void shutdown() {
+  }
+}
diff --git a/pkg/analyzer/lib/source/pub_package_map_provider.dart b/pkg/analyzer/lib/source/pub_package_map_provider.dart
index c0d3431..a45fc90 100644
--- a/pkg/analyzer/lib/source/pub_package_map_provider.dart
+++ b/pkg/analyzer/lib/source/pub_package_map_provider.dart
@@ -56,8 +56,10 @@
           "Error running pub $PUB_LIST_COMMAND\n$exception\n$stackTrace");
     }
     if (result == null || result.exitCode != 0) {
+      String exitCode =
+          result != null ? 'exit code ${result.exitCode}' : 'null';
       AnalysisEngine.instance.logger.logInformation(
-          "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
+          "pub $PUB_LIST_COMMAND failed: $exitCode");
       return _error(folder);
     }
     try {
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 7eaf916..b756a9d 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -228,9 +228,10 @@
 }
 
 /**
- * Instances of the class `ConstantFinder` are used to traverse the AST structures of all of
- * the compilation units being resolved and build a table mapping constant variable elements to the
- * declarations of those variables.
+ * Instances of the class `ConstantFinder` are used to traverse the AST
+ * structures of all of the compilation units being resolved and build tables
+ * of the constant variables, constant constructors, constant constructor
+ * invocations, and annotations found in those compilation units.
  */
 class ConstantFinder extends RecursiveAstVisitor<Object> {
   /**
@@ -251,6 +252,18 @@
   final List<InstanceCreationExpression> constructorInvocations =
       new List<InstanceCreationExpression>();
 
+  /**
+   * A collection of annotations.
+   */
+  final List<Annotation> annotations = <Annotation>[];
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    super.visitAnnotation(node);
+    annotations.add(node);
+    return null;
+  }
+
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
@@ -357,6 +370,11 @@
   List<InstanceCreationExpression> _constructorInvocations;
 
   /**
+   * A collection of annotations.
+   */
+  List<Annotation> _annotations;
+
+  /**
    * The set of variables declared on the command line using '-D'.
    */
   final DeclaredVariables _declaredVariables;
@@ -410,6 +428,7 @@
     _variableDeclarationMap = _constantFinder.variableMap;
     constructorDeclarationMap = _constantFinder.constructorMap;
     _constructorInvocations = _constantFinder.constructorInvocations;
+    _annotations = _constantFinder.annotations;
     _variableDeclarationMap.values.forEach((VariableDeclaration declaration) {
       ReferenceFinder referenceFinder = new ReferenceFinder(
           declaration,
@@ -498,6 +517,12 @@
         }
       }
     }
+    // Since no constant can depend on an annotation, we don't waste time
+    // including them in the topological sort.  We just process all the
+    // annotations after all other constants are finished.
+    for (Annotation annotation in _annotations) {
+      _computeValueFor(annotation);
+    }
   }
 
   /**
@@ -647,6 +672,44 @@
               new EvaluationResultImpl.con2(dartObject, errorListener.errors);
         }
       }
+    } else if (constNode is Annotation) {
+      ElementAnnotationImpl elementAnnotation = constNode.elementAnnotation;
+      // elementAnnotation is null if the annotation couldn't be resolved, in
+      // which case we skip it.
+      if (elementAnnotation != null) {
+        Element element = elementAnnotation.element;
+        if (element is PropertyAccessorElement &&
+            element.variable is VariableElementImpl) {
+          // The annotation is a reference to a compile-time constant variable.
+          // Just copy the evaluation result.
+          VariableElementImpl variableElement =
+              element.variable as VariableElementImpl;
+          elementAnnotation.evaluationResult = variableElement.evaluationResult;
+        } else if (element is ConstructorElementImpl &&
+            constNode.arguments != null) {
+          RecordingErrorListener errorListener = new RecordingErrorListener();
+          CompilationUnit sourceCompilationUnit =
+              constNode.getAncestor((node) => node is CompilationUnit);
+          ErrorReporter errorReporter =
+              new ErrorReporter(errorListener, sourceCompilationUnit.element.source);
+          ConstantVisitor constantVisitor =
+              createConstantVisitor(errorReporter);
+          DartObjectImpl result = _evaluateConstructorCall(
+              constNode,
+              constNode.arguments.arguments,
+              element,
+              constantVisitor,
+              errorReporter);
+          elementAnnotation.evaluationResult =
+              new EvaluationResultImpl.con2(result, errorListener.errors);
+        } else {
+          // This may happen for invalid code (e.g. failing to pass arguments
+          // to an annotation which references a const constructor).  The error
+          // is detected elsewhere, so just silently ignore it here.
+          elementAnnotation.evaluationResult =
+              new EvaluationResultImpl.con1(null);
+        }
+      }
     } else {
       // Should not happen.
       AnalysisEngine.instance.logger.logError(
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index e3342b7..c4f3470 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -3104,6 +3104,11 @@
   Element get enclosingElement;
 
   /**
+   * The unique integer identifier of this element.
+   */
+  int get id;
+
+  /**
    * Return `true` if this element has an annotation of the form '@deprecated' or
    * '@Deprecated('..')'.
    *
@@ -3224,6 +3229,11 @@
   CompilationUnit get unit;
 
   /**
+   * Identifiers of the elements that use this elements.
+   */
+  IntSet get users;
+
+  /**
    * Use the given visitor to visit this element.
    *
    * @param visitor the visitor that will visit this element
@@ -3232,6 +3242,11 @@
   accept(ElementVisitor visitor);
 
   /**
+   * Remember the given [element] as a user of this element.
+   */
+  void addUser(Element element);
+
+  /**
    * Return the documentation comment for this element as it appears in the original source
    * (complete with the beginning and ending delimiters), or `null` if this element does not
    * have a documentation comment associated with it. This can be a long-running operation if the
@@ -3358,6 +3373,13 @@
   final Element element;
 
   /**
+   * The result of evaluating this annotation as a compile-time constant
+   * expression, or `null` if the compilation unit containing the variable has
+   * not been resolved.
+   */
+  EvaluationResultImpl evaluationResult;
+
+  /**
    * Initialize a newly created annotation.
    *
    * @param element the element representing the field, variable, or constructor being used as an
@@ -3422,6 +3444,10 @@
  * an [Element].
  */
 abstract class ElementImpl implements Element {
+  static int _NEXT_ID = 0;
+
+  final int id = _NEXT_ID++;
+
   /**
    * The enclosing element of this element, or `null` if this element is at the root of the
    * element structure.
@@ -3460,6 +3486,13 @@
   ElementLocation _cachedLocation;
 
   /**
+   * Identifiers of the elements that use this elements.
+   *
+   * TODO(scheglov) consider this field lazily
+   */
+  final IntSet users = new IntSet();
+
+  /**
    * Initialize a newly created element to have the given name.
    *
    * @param name the name of this element
@@ -3499,6 +3532,8 @@
    */
   void set enclosingElement(Element element) {
     _enclosingElement = element as ElementImpl;
+    _cachedLocation = null;
+    _cachedHashCode = null;
   }
 
   @override
@@ -3617,6 +3652,16 @@
   }
 
   /**
+   * Remember the given [element] as a user of this element.
+   */
+  @override
+  void addUser(Element element) {
+    if (element != null) {
+      users.add(element.id);
+    }
+  }
+
+  /**
    * Append a textual representation of this element to the given [buffer].
    */
   void appendTo(StringBuffer buffer) {
@@ -8945,6 +8990,8 @@
   @override
   String get displayName => _baseElement.displayName;
 
+  int get id => _baseElement.id;
+
   @override
   bool get isDeprecated => _baseElement.isDeprecated;
 
@@ -8987,6 +9034,20 @@
   @override
   CompilationUnit get unit => _baseElement.unit;
 
+  /**
+   * Identifiers of the elements that use this elements.
+   */
+  @override
+  IntSet get users => _baseElement.users;
+
+  /**
+   * Remember the given [element] as a user of this element.
+   */
+  @override
+  void addUser(Element element) {
+    _baseElement.addUser(element);
+  }
+
   @override
   String computeDocumentationComment() =>
       _baseElement.computeDocumentationComment();
@@ -9445,6 +9506,11 @@
  */
 class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
   /**
+   * The unique integer identifier of this element.
+   */
+  final int id = ElementImpl._NEXT_ID++;
+
+  /**
    * The analysis context in which the multiply defined elements are defined.
    */
   final AnalysisContext context;
@@ -9526,9 +9592,21 @@
   @override
   CompilationUnit get unit => null;
 
+  /**
+   * Identifiers of the elements that use this elements.
+   */
+  @override
+  IntSet get users => new IntSet();
+
   @override
   accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
 
+  /**
+   * Remember the given [element] as a user of this element.
+   */
+  void addUser(Element element) {
+  }
+
   @override
   String computeDocumentationComment() => null;
 
diff --git a/pkg/analyzer/lib/src/generated/element_handle.dart b/pkg/analyzer/lib/src/generated/element_handle.dart
index 61afb89..5276ce8 100644
--- a/pkg/analyzer/lib/src/generated/element_handle.dart
+++ b/pkg/analyzer/lib/src/generated/element_handle.dart
@@ -7,6 +7,8 @@
 
 library engine.element_handle;
 
+import 'package:analyzer/src/generated/utilities_collection.dart';
+
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart';
@@ -279,6 +281,11 @@
  */
 abstract class ElementHandle implements Element {
   /**
+   * The unique integer identifier of this element.
+   */
+  final int id = 0;
+
+  /**
    * The context in which the element is defined.
    */
   AnalysisContext _context;
@@ -373,6 +380,12 @@
   @override
   CompilationUnit get unit => actualElement.unit;
 
+  /**
+   * Identifiers of the elements that use this elements.
+   */
+  @override
+  IntSet get users => new IntSet();
+
   @override
   bool operator ==(Object object) =>
       object is Element && object.location == _location;
@@ -380,6 +393,13 @@
   @override
   accept(ElementVisitor visitor) => actualElement.accept(visitor);
 
+  /**
+   * Remember the given [element] as a user of this element.
+   */
+  @override
+  void addUser(Element element) {
+  }
+
   @override
   String computeDocumentationComment() =>
       actualElement.computeDocumentationComment();
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index c1cf5b5..4474a33 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -623,6 +623,7 @@
     methodName.propagatedElement = propagatedElement;
     ArgumentList argumentList = node.argumentList;
     if (staticElement != null) {
+      staticElement.addUser(_resolver.enclosingFunction);
       List<ParameterElement> parameters =
           _computeCorrespondingParameters(argumentList, staticElement);
       if (parameters != null) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 7266577..9d50042 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1056,6 +1056,7 @@
     this._options.dart2jsHint = options.dart2jsHint;
     this._options.hint = options.hint;
     this._options.incremental = options.incremental;
+    this._options.incrementalApi = options.incrementalApi;
     this._options.preserveComments = options.preserveComments;
     _generateSdkErrors = options.generateSdkErrors;
     if (needsRecompute) {
@@ -1136,6 +1137,26 @@
     return sources;
   }
 
+  Element findElementById(int id) {
+    _ElementByIdFinder finder = new _ElementByIdFinder(id);
+    try {
+      MapIterator<Source, SourceEntry> iterator = _cache.iterator();
+      while (iterator.moveNext()) {
+        SourceEntry sourceEntry = iterator.value;
+        if (sourceEntry.kind == SourceKind.LIBRARY) {
+          DartEntry dartEntry = sourceEntry;
+          LibraryElement library = dartEntry.getValue(DartEntry.ELEMENT);
+          if (library != null) {
+            library.accept(finder);
+          }
+        }
+      }
+    } on _ElementByIdFinderException catch (e) {
+      return finder.result;
+    }
+    return null;
+  }
+
   @override
   List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
 
@@ -2342,8 +2363,8 @@
           // The source kind is always valid, so the state isn't interesting.
           continue;
         } else if (descriptor == DartEntry.CONTAINING_LIBRARIES) {
-          // The list of containing libraries is always valid, so the state isn't
-          // interesting.
+          // The list of containing libraries is always valid, so the state
+          // isn't interesting.
           continue;
         } else if (descriptor == DartEntry.PUBLIC_NAMESPACE) {
           // The public namespace isn't computed by performAnalysisTask()
@@ -2376,8 +2397,8 @@
             if (descriptor == DartEntry.ANGULAR_ERRORS ||
                 descriptor == DartEntry.BUILT_ELEMENT ||
                 descriptor == DartEntry.BUILT_UNIT) {
-              // These values are not currently being computed, so their state is
-              // not interesting.
+              // These values are not currently being computed, so their state
+              // is not interesting.
               continue;
             } else if (source.isInSystemLibrary &&
                 !_generateSdkErrors &&
@@ -2917,6 +2938,12 @@
               _contentCache.getModificationStamp(source);
           sourceEntry.setValue(SourceEntry.CONTENT, contents);
         }
+      } else {
+        SourceEntry sourceEntry = _cache.get(source);
+        if (sourceEntry != null) {
+          sourceEntry.modificationTime =
+              _contentCache.getModificationStamp(source);
+        }
       }
     } else if (originalContents != null) {
       _incrementalAnalysisCache =
@@ -4936,7 +4963,8 @@
         typeProvider,
         unitSource,
         librarySource,
-        dartEntry);
+        dartEntry,
+        analysisOptions.incrementalApi);
     bool success = resolver.resolve(oldUnit, newCode);
     if (!success) {
       return false;
@@ -5005,6 +5033,25 @@
   }
 }
 
+class _ElementByIdFinder extends GeneralizingElementVisitor {
+  final int _id;
+  Element result;
+
+  _ElementByIdFinder(this._id);
+
+  @override
+  visitElement(Element element) {
+    if (element.id == _id) {
+      result = element;
+      throw new _ElementByIdFinderException();
+    }
+    super.visitElement(element);
+  }
+}
+
+class _ElementByIdFinderException {
+}
+
 /**
  * An `AnalysisTaskResultRecorder` is used by an analysis context to record the
  * results of a task.
@@ -6342,6 +6389,12 @@
   bool get incremental;
 
   /**
+   * A flag indicating whether incremental analysis should be used for API
+   * changes.
+   */
+  bool get incrementalApi;
+
+  /**
    * Return `true` if analysis is to parse comments.
    *
    * @return `true` if analysis is to parse comments
@@ -6432,6 +6485,12 @@
   bool incremental = false;
 
   /**
+   * A flag indicating whether incremental analysis should be used for API
+   * changes.
+   */
+  bool incrementalApi = false;
+
+  /**
    * A flag indicating whether analysis is to parse comments.
    */
   bool preserveComments = true;
@@ -6459,6 +6518,7 @@
     _generateSdkErrors = options.generateSdkErrors;
     hint = options.hint;
     incremental = options.incremental;
+    incrementalApi = options.incrementalApi;
     preserveComments = options.preserveComments;
   }
 
@@ -10507,9 +10567,7 @@
         if (library != null) {
           IncrementalResolver resolver = new IncrementalResolver(
               typeProvider,
-              library,
               element,
-              cache.source,
               cache.offset,
               cache.oldLength,
               cache.newLength);
diff --git a/pkg/analyzer/lib/src/generated/incremental_logger.dart b/pkg/analyzer/lib/src/generated/incremental_logger.dart
new file mode 100644
index 0000000..2c1f3e5
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/incremental_logger.dart
@@ -0,0 +1,196 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.incremental_logger;
+
+
+/**
+ * The shared instance of [Logger] used by several incremental resolution
+ * classes. It is initialized externally by the Analysis Engine client.
+ */
+Logger logger = NULL_LOGGER;
+
+/**
+ * An instance of [Logger] that does not print anything.
+ */
+final Logger NULL_LOGGER = new _NullLogger();
+
+/**
+ * An instance of [Logger] that uses `print` for output.
+ */
+final Logger PRINT_LOGGER = new StringSinkLogger(new _PrintStringSink());
+
+
+/**
+ * A simple hierarchical logger.
+ */
+abstract class Logger {
+  /**
+   * Mark an enter to a new section with the given [name].
+   */
+  void enter(String name);
+
+  /**
+   * Mark an exit from the current sections, logs the duration.
+   */
+  void exit();
+
+  /**
+   * Logs the given [obj].
+   */
+  void log(Object obj);
+
+  /**
+   * Starts a new timer.
+   */
+  LoggingTimer startTimer();
+}
+
+
+/**
+ * The handle of a timer.
+ */
+class LoggingTimer {
+  final Logger _logger;
+  final Stopwatch _stopwatch = new Stopwatch();
+
+  LoggingTimer(this._logger) {
+    _stopwatch.start();
+  }
+
+  /**
+   * This methods stop the timer and logs the elapsed time.
+   */
+  void stop(String message) {
+    _stopwatch.stop();
+    _logger.log('$message in ${_stopwatch.elapsedMilliseconds} ms');
+  }
+}
+
+
+/**
+ * A [Logger] that writes to a [StringSink].
+ */
+class StringSinkLogger implements Logger {
+  static const int _MAX_LINE_LENGTH = 512;
+  final StringSink _sink;
+  final List<_LoggerSection> _sectionStack = <_LoggerSection>[];
+  _LoggerSection _section = new _LoggerSection('', 'ROOT');
+
+  StringSinkLogger(this._sink);
+
+  @override
+  void enter(String name) {
+    log('+++ $name');
+    _sectionStack.add(_section);
+    _section = new _LoggerSection(_section.indent + '\t', name);
+  }
+
+  @override
+  void exit() {
+    DateTime now = new DateTime.now();
+    Duration duration = now.difference(_section.start);
+    String message = '--- ${_section.name} in ${duration.inMilliseconds} ms';
+    _section = _sectionStack.removeLast();
+    log(message);
+  }
+
+  @override
+  void log(Object obj) {
+    DateTime now = new DateTime.now();
+    String indent = _section.indent;
+    String objStr = _getObjectString(obj);
+    String line = '[$now] $indent$objStr';
+    _sink.writeln(line);
+  }
+
+  @override
+  LoggingTimer startTimer() {
+    return new LoggingTimer(this);
+  }
+
+  String _getObjectString(Object obj) {
+    if (obj == null) {
+      return 'null';
+    }
+    if (obj is Function) {
+      obj = obj();
+    }
+    String str = obj.toString();
+    if (str.length < _MAX_LINE_LENGTH) {
+      return str;
+    }
+    return str.split('\n').map((String line) {
+      if (line.length > _MAX_LINE_LENGTH) {
+        line = line.substring(0, _MAX_LINE_LENGTH) + '...';
+      }
+      return line;
+    }).join('\n');
+  }
+}
+
+
+class _LoggerSection {
+  final DateTime start = new DateTime.now();
+  final String indent;
+  final String name;
+  _LoggerSection(this.indent, this.name);
+}
+
+
+/**
+ * A [Logger] that does nothing.
+ */
+class _NullLogger implements Logger {
+  @override
+  void enter(String name) {
+  }
+
+  @override
+  void exit() {
+  }
+
+  @override
+  void log(Object obj) {
+  }
+
+  @override
+  LoggingTimer startTimer() {
+    return new LoggingTimer(this);
+  }
+}
+
+
+/**
+ * A [StringSink] implementation that uses `print`.
+ */
+class _PrintStringSink implements StringSink {
+  String _line = '';
+
+  @override
+  void write(Object obj) {
+    if (obj == null) {
+      _line += 'null';
+    } else {
+      _line += obj.toString();
+    }
+  }
+
+  @override
+  void writeAll(Iterable objects, [String separator = '']) {
+    _line += objects.join(separator);
+  }
+
+  @override
+  void writeCharCode(int charCode) {
+    _line += new String.fromCharCode(charCode);
+  }
+
+  @override
+  void writeln([Object obj = '']) {
+    _line += obj;
+    print(_line);
+    _line = '';
+  }
+}
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 2bb8647..6a559e2 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -7,18 +7,33 @@
 import 'dart:collection';
 import 'dart:math' as math;
 
-import 'package:analyzer/src/generated/error_verifier.dart';
-import 'package:analyzer/src/generated/utilities_dart.dart';
-
 import 'ast.dart';
 import 'element.dart';
 import 'engine.dart';
 import 'error.dart';
+import 'error_verifier.dart';
+import 'incremental_logger.dart' show logger, LoggingTimer;
 import 'java_engine.dart';
 import 'parser.dart';
 import 'resolver.dart';
 import 'scanner.dart';
 import 'source.dart';
+import 'utilities_collection.dart';
+import 'utilities_dart.dart';
+
+
+/**
+ * If `true`, an attempt to resolve API-changing modifications is made.
+ */
+bool _resolveApiChanges = false;
+
+
+/**
+ * This method is used to enable/disable API-changing modifications resolution.
+ */
+void set test_resolveApiChanges(bool value) {
+  _resolveApiChanges = value;
+}
 
 
 /**
@@ -46,7 +61,7 @@
    * The class containing the AST nodes being visited, or `null` if we are not
    * in the scope of a class.
    */
-  ClassElement _enclosingClass;
+  ClassElementImpl _enclosingClass;
 
   /**
    * The parameter containing the AST nodes being visited, or `null` if we are not in the
@@ -69,30 +84,44 @@
   HashSet<Element> _allElements = new HashSet<Element>();
 
   /**
-   * A set containing all of the elements in the element model that were defined by the old AST node
-   * corresponding to the AST node being visited that have not already been matched to nodes in the
-   * AST structure being visited.
+   * A set containing all of the elements were defined in the old element model,
+   * but are not defined in the new element model.
    */
-  HashSet<Element> _unmatchedElements = new HashSet<Element>();
+  HashSet<Element> _removedElements = new HashSet<Element>();
 
   /**
-   * Return `true` if the declarations within the given AST structure define an element model
-   * that is equivalent to the corresponding elements rooted at the given element.
-   *
-   * @param node the AST structure being compared to the element model
-   * @param element the root of the element model being compared to the AST structure
-   * @return `true` if the AST structure defines the same elements as those in the given
-   *         element model
+   * A set containing all of the elements are defined in the new element model,
+   * but were not defined in the old element model.
    */
-  bool matches(AstNode node, Element element) {
-    _captureEnclosingElements(element);
-    _gatherElements(element);
+  HashSet<Element> _addedElements = new HashSet<Element>();
+
+  /**
+   * Determines how elements model corresponding to the given [node] differs
+   * from the [element].
+   */
+  DeclarationMatchKind matches(AstNode node, Element element) {
+    logger.enter('match $element @ ${element.nameOffset}');
     try {
+      _captureEnclosingElements(element);
+      _gatherElements(element);
       node.accept(this);
     } on _DeclarationMismatchException catch (exception) {
-      return false;
+      return DeclarationMatchKind.MISMATCH;
+    } finally {
+      logger.exit();
     }
-    return _unmatchedElements.isEmpty;
+    // no API changes
+    if (_removedElements.isEmpty && _addedElements.isEmpty) {
+      return DeclarationMatchKind.MATCH;
+    }
+    // simple API change
+    if (_removedElements.length <= 1 && _addedElements.length == 1) {
+      return DeclarationMatchKind.MISMATCH_OK;
+    }
+    // something more complex
+    logger.log('_removedElements: $_removedElements');
+    logger.log('_addedElements: $_addedElements');
+    return DeclarationMatchKind.MISMATCH;
   }
 
   @override
@@ -151,12 +180,16 @@
   visitConstructorDeclaration(ConstructorDeclaration node) {
     _hasConstructor = true;
     SimpleIdentifier constructorName = node.name;
-    ConstructorElement element = constructorName == null ?
+    ConstructorElementImpl element = constructorName == null ?
         _enclosingClass.unnamedConstructor :
         _enclosingClass.getNamedConstructor(constructorName.name);
     _processElement(element);
-    node.element = element;
     _assertCompatibleParameters(node.parameters, element.parameters);
+    // matches, update the existing element
+    ExecutableElement newElement = node.element;
+    node.element = element;
+    _setLocalElements(element, newElement);
+    _setParameterElements(node.parameters, element.parameters);
   }
 
   @override
@@ -216,7 +249,7 @@
     }
     // prepare element
     Token property = node.propertyKeyword;
-    ExecutableElement element;
+    ExecutableElementImpl element;
     if (property == null) {
       element = _findElement(_enclosingUnit.functions, name);
     } else {
@@ -224,13 +257,19 @@
     }
     // process element
     _processElement(element);
-    node.name.staticElement = element;
-    node.functionExpression.element = element;
     _assertFalse(element.isSynthetic);
     _assertSameType(node.returnType, element.returnType);
     _assertCompatibleParameters(
         node.functionExpression.parameters,
         element.parameters);
+    // matches, update the existing element
+    ExecutableElement newElement = node.element;
+    node.name.staticElement = element;
+    node.functionExpression.element = element;
+    _setLocalElements(element, newElement);
+    _setParameterElements(
+        node.functionExpression.parameters,
+        element.parameters);
   }
 
   @override
@@ -285,18 +324,43 @@
     }
     // prepare element
     Token property = node.propertyKeyword;
-    ExecutableElement element;
+    ExecutableElementImpl element;
     if (property == null) {
       element = _findElement(_enclosingClass.methods, name);
     } else {
       element = _findElement(_enclosingClass.accessors, name);
     }
     // process element
-    _processElement(element);
-    _assertEquals(node.isStatic, element.isStatic);
-    node.name.staticElement = element;
-    _assertSameType(node.returnType, element.returnType);
-    _assertCompatibleParameters(node.parameters, element.parameters);
+    ExecutableElement newElement = node.element;
+    try {
+      _assertNotNull(element);
+      _assertEquals(node.isStatic, element.isStatic);
+      _assertSameType(node.returnType, element.returnType);
+      _assertCompatibleParameters(node.parameters, element.parameters);
+      _removedElements.remove(element);
+      // matches, update the existing element
+      node.name.staticElement = element;
+      _setLocalElements(element, newElement);
+      _setParameterElements(node.parameters, element.parameters);
+    } on _DeclarationMismatchException catch (e) {
+      _addedElements.add(newElement);
+      // remove old element
+      if (element is MethodElement) {
+        _enclosingClass.methods.remove(element);
+      } else if (element is PropertyAccessorElement) {
+        _enclosingClass.accessors.remove(element);
+      }
+      // add new element
+      if (newElement is MethodElement) {
+        List<MethodElement> methods = _enclosingClass.methods;
+        methods.add(newElement);
+        _enclosingClass.methods = methods;
+      } else {
+        List<PropertyAccessorElement> accessors = _enclosingClass.accessors;
+        accessors.add(newElement);
+        _enclosingClass.accessors = accessors;
+      }
+    }
   }
 
   @override
@@ -341,6 +405,8 @@
     _assertSameType(
         (node.parent as VariableDeclarationList).type,
         element.type);
+    // matches, restore the existing element
+    node.name.staticElement = element;
   }
 
   @override
@@ -403,9 +469,6 @@
       _assertSameType(node.returnType, elementType.returnType);
     } else if (node is SimpleFormalParameter) {
       _assertSameType(node.type, element.type);
-      node.identifier.staticElement = element;
-      (element as ElementImpl).nameOffset = node.identifier.offset;
-      (element as ElementImpl).name = node.identifier.name;
     }
   }
 
@@ -461,7 +524,7 @@
     }
     String nodeName = nameIdentifier.name;
     // check specific type kinds
-    if (type is InterfaceType) {
+    if (type is ParameterizedType) {
       _assertEquals(nodeName, type.name);
       // check arguments
       TypeArgumentList nodeArgumentList = node.typeArguments;
@@ -485,7 +548,7 @@
       _assertEquals(nodeName, 'dynamic');
     } else {
       // TODO(scheglov) support other types
-//      print('node: $node type: $type  type.type: ${type.runtimeType}');
+      logger.log('node: $node type: $type  type.type: ${type.runtimeType}');
       _assertTrue(false);
     }
   }
@@ -566,7 +629,7 @@
     if (!_allElements.contains(element)) {
       throw new _DeclarationMismatchException();
     }
-    _unmatchedElements.remove(element);
+    _removedElements.remove(element);
   }
 
   /**
@@ -605,6 +668,55 @@
     }
     return literal.stringValue;
   }
+
+  static void _setLocalElements(ExecutableElementImpl to,
+      ExecutableElement from) {
+    to.functions = from.functions;
+    to.labels = from.labels;
+    to.localVariables = from.localVariables;
+  }
+
+  static void _setParameterElements(FormalParameterList nodes,
+      List<ParameterElement> elements) {
+    if (nodes != null) {
+      for (int i = 0; i < elements.length; i++) {
+        ParameterElement element = elements[i];
+        FormalParameter node = nodes.parameters[i];
+        ParameterElement newElement = node.element;
+        node.identifier.staticElement = element;
+        (element as ElementImpl).name = newElement.name;
+        (element as ElementImpl).nameOffset = newElement.nameOffset;
+      }
+    }
+  }
+}
+
+
+/**
+ * Describes how declarations match an existing elements model.
+ */
+class DeclarationMatchKind {
+  /**
+   * Complete match, no API changes.
+   */
+  static const MATCH = const DeclarationMatchKind('MATCH');
+
+  /**
+   * Has API changes that we might be able to resolve incrementally.
+   */
+  static const MISMATCH_OK = const DeclarationMatchKind('MISMATCH_OK');
+
+  /**
+   * Has API changes that we cannot resolve incrementally.
+   */
+  static const MISMATCH = const DeclarationMatchKind('MISMATCH');
+
+  final String name;
+
+  const DeclarationMatchKind(this.name);
+
+  @override
+  String toString() => name;
 }
 
 
@@ -619,19 +731,19 @@
   final TypeProvider _typeProvider;
 
   /**
-   * The element for the library containing the compilation unit being resolved.
-   */
-  final LibraryElement _definingLibrary;
-
-  /**
    * The element of the compilation unit being resolved.
    */
   final CompilationUnitElement _definingUnit;
 
   /**
+   * The element for the library containing the compilation unit being resolved.
+   */
+  LibraryElement _definingLibrary;
+
+  /**
    * The source representing the compilation unit being visited.
    */
-  final Source _source;
+  Source _source;
 
   /**
    * The offset of the changed contents.
@@ -648,6 +760,7 @@
    */
   final int _updateNewLength;
 
+  RecordingErrorListener errorListener = new RecordingErrorListener();
   ResolutionContext _resolutionContext;
 
   List<AnalysisError> _resolveErrors = AnalysisError.NO_ERRORS;
@@ -655,34 +768,99 @@
   List<AnalysisError> _hints = AnalysisError.NO_ERRORS;
 
   /**
+   * The elements that should be resolved because of API changes.
+   */
+  HashSet<Element> _resolutionQueue = new HashSet<Element>();
+
+  /**
    * Initialize a newly created incremental resolver to resolve a node in the
    * given source in the given library.
    */
-  IncrementalResolver(this._typeProvider, this._definingLibrary,
-      this._definingUnit, this._source, this._updateOffset, this._updateOldLength,
-      this._updateNewLength);
+  IncrementalResolver(this._typeProvider, this._definingUnit,
+      this._updateOffset, this._updateOldLength, this._updateNewLength) {
+    _definingLibrary = _definingUnit.library;
+    _source = _definingUnit.source;
+  }
 
   /**
    * Resolve [node], reporting any errors or warnings to the given listener.
    *
    * [node] - the root of the AST structure to be resolved.
+   *
+   * Returns `true` if resolution was successful.
    */
-  void resolve(AstNode node) {
-    AstNode rootNode = _findResolutionRoot(node);
-    // update elements
-    _updateElementNameOffsets(
-        _definingUnit,
-        _updateOffset,
-        _updateNewLength - _updateOldLength);
-    if (_elementModelChanged(rootNode)) {
-      throw new AnalysisException("Cannot resolve node: element model changed");
+  bool resolve(AstNode node) {
+    logger.enter('resolve: $_definingUnit');
+    try {
+      logger.log(() => 'node: $node');
+      AstNode rootNode = _findResolutionRoot(node);
+      logger.log(() => 'rootNode: $rootNode');
+      _prepareResolutionContext(rootNode);
+      // update elements
+      _updateElementNameOffsets(
+          _definingUnit,
+          _updateOffset,
+          _updateNewLength - _updateOldLength);
+      _buildElements(rootNode);
+      if (!_canBeIncrementallyResolved(rootNode)) {
+        return false;
+      }
+      // resolve
+      _resolveReferences(rootNode);
+      // verify
+      _verify(rootNode);
+      _generateHints(rootNode);
+      // resolve queue in response of API changes
+      _resolveQueue();
+      // OK
+      return true;
+    } finally {
+      logger.exit();
     }
-    _updateElements(rootNode);
-    // resolve
-    _resolveReferences(rootNode);
-    // verify
-    _verify(rootNode);
-    _generateHints(rootNode);
+  }
+
+  void _buildElements(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
+    try {
+      ElementHolder holder = new ElementHolder();
+      ElementBuilder builder = new ElementBuilder(holder);
+      node.accept(builder);
+    } finally {
+      timer.stop('build elements');
+    }
+  }
+
+  /**
+   * Return `true` if [node] does not have element model changes, or these
+   * changes can be incrementally propagated.
+   */
+  bool _canBeIncrementallyResolved(AstNode node) {
+    // If we are replacing the whole declaration, this means that its signature
+    // is changed. It might be an API change, or not.
+    //
+    // If, for example, a required parameter is changed, it is not an API
+    // change, but we want to find the existing corresponding Element in the
+    // enclosing one, set it for the node and update as needed.
+    //
+    // If, for example, the name of a method is changed, it is an API change,
+    // we need to know the old Element and the new Element. Again, we need to
+    // check the whole enclosing Element.
+    if (node is Declaration) {
+      node = node.parent;
+    }
+    Element element = _getElement(node);
+    DeclarationMatcher matcher = new DeclarationMatcher();
+    DeclarationMatchKind matchKind = matcher.matches(node, element);
+    if (matchKind == DeclarationMatchKind.MATCH) {
+      return true;
+    }
+    // try to resolve a simple API change
+    if (_resolveApiChanges && matchKind == DeclarationMatchKind.MISMATCH_OK) {
+      _fillResolutionQueue(matcher);
+      return true;
+    }
+    // mismatch that cannot be incrementally fixed
+    return false;
   }
 
   /**
@@ -703,31 +881,18 @@
           node is FunctionTypeAlias ||
           node is MethodDeclaration;
 
-  /**
-   * Return `true` if the portion of the element model defined by the given node
-   * has changed.
-   *
-   * [node] - the node defining the portion of the element model being tested.
-   *
-   * Throws [AnalysisException] if the correctness of the element model cannot
-   * be determined.
-   */
-  bool _elementModelChanged(AstNode node) {
-    // If we are replacing the whole declaration (e.g. rename a parameter), we
-    // can try to find the corresponding Element in the enclosing one, see if it
-    // is compatible, and if 'yes', then restore and update it.
-    // TODO(scheglov) This should be rewritten. It causes validating the whole
-    // class, when just one method is changed.
-    if (node is Declaration) {
-      node = node.parent;
+  void _fillResolutionQueue(DeclarationMatcher matcher) {
+    for (Element removedElement in matcher._removedElements) {
+      AnalysisContextImpl context = removedElement.context;
+      IntSet users = removedElement.users;
+      while (!users.isEmpty) {
+        int id = users.remove();
+        Element removedElementUser = context.findElementById(id);
+        _resolutionQueue.add(removedElementUser);
+      }
     }
-    Element element = _getElement(node);
-    if (element == null) {
-      throw new AnalysisException(
-          "Cannot resolve node: a ${node.runtimeType} does not define an element");
-    }
-    DeclarationMatcher matcher = new DeclarationMatcher();
-    return !matcher.matches(node, element);
+    // TODO(scheglov) a method change might also require its class, and
+    // subclasses resolution
   }
 
   /**
@@ -749,13 +914,18 @@
   }
 
   void _generateHints(AstNode node) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
-    AnalysisContext analysisContext = _definingLibrary.context;
-    HintGenerator hintGenerator =
-        new HintGenerator(<CompilationUnit>[unit], analysisContext, errorListener);
-    hintGenerator.generateForLibrary();
-    _hints = errorListener.getErrorsForSource(_source);
+    LoggingTimer timer = logger.startTimer();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
+      AnalysisContext analysisContext = _definingLibrary.context;
+      HintGenerator hintGenerator =
+          new HintGenerator(<CompilationUnit>[unit], analysisContext, errorListener);
+      hintGenerator.generateForLibrary();
+      _hints = errorListener.getErrorsForSource(_source);
+    } finally {
+      timer.stop('generate hints');
+    }
   }
 
   /**
@@ -771,116 +941,112 @@
     return null;
   }
 
-  _resolveReferences(AstNode node) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    // prepare context
-    _resolutionContext =
-        ResolutionContextBuilder.contextFor(node, errorListener);
-    Scope scope = _resolutionContext.scope;
-    // resolve types
-    {
-      TypeResolverVisitor visitor = new TypeResolverVisitor.con3(
-          _definingLibrary,
-          _source,
-          _typeProvider,
-          scope,
-          errorListener);
-      node.accept(visitor);
+  void _prepareResolutionContext(AstNode node) {
+    if (_resolutionContext == null) {
+      _resolutionContext =
+          ResolutionContextBuilder.contextFor(node, errorListener);
     }
-    // resolve variables
-    {
-      VariableResolverVisitor visitor = new VariableResolverVisitor.con2(
-          _definingLibrary,
-          _source,
-          _typeProvider,
-          scope,
-          errorListener);
-      node.accept(visitor);
-    }
-    // resolve references
-    {
-      ResolverVisitor visitor = new ResolverVisitor.con3(
-          _definingLibrary,
-          _source,
-          _typeProvider,
-          _resolutionContext.scope,
-          errorListener);
-      if (_resolutionContext.enclosingClassDeclaration != null) {
-        visitor.visitClassDeclarationIncrementally(
-            _resolutionContext.enclosingClassDeclaration);
-      }
-      node.accept(visitor);
-    }
-    // remember errors
-    _resolveErrors = errorListener.getErrorsForSource(_source);
   }
 
-  void _updateElements(AstNode node) {
-    // build elements in node
-    ElementHolder holder;
-    _ElementsRestorer elementsRestorer = new _ElementsRestorer(node);
+  /**
+   * Resolves elements [_resolutionQueue].
+   *
+   * TODO(scheglov) work in progress
+  *
+  * TODO(scheglov) revisit later. Each task duration should be kept short.
+   */
+  void _resolveQueue() {
+    for (Element element in _resolutionQueue) {
+      // TODO(scheglov) in general, we should not call Element.node, it
+      // might perform complete unit resolution.
+      AstNode node = element.node;
+      CompilationUnitElement unit =
+          element.getAncestor((e) => e is CompilationUnitElement);
+      IncrementalResolver resolver =
+          new IncrementalResolver(_typeProvider, unit, 0, 0, 0);
+      resolver._resolveReferences(node);
+    }
+  }
+
+  _resolveReferences(AstNode node) {
+    LoggingTimer timer = logger.startTimer();
     try {
-      holder = new ElementHolder();
-      ElementBuilder builder = new ElementBuilder(holder);
-      node.accept(builder);
+      _prepareResolutionContext(node);
+      Scope scope = _resolutionContext.scope;
+      // resolve types
+      {
+        TypeResolverVisitor visitor = new TypeResolverVisitor.con3(
+            _definingLibrary,
+            _source,
+            _typeProvider,
+            scope,
+            errorListener);
+        node.accept(visitor);
+      }
+      // resolve variables
+      {
+        VariableResolverVisitor visitor = new VariableResolverVisitor.con2(
+            _definingLibrary,
+            _source,
+            _typeProvider,
+            scope,
+            errorListener);
+        node.accept(visitor);
+      }
+      // resolve references
+      {
+        ResolverVisitor visitor = new ResolverVisitor.con3(
+            _definingLibrary,
+            _source,
+            _typeProvider,
+            scope,
+            errorListener);
+        if (_resolutionContext.enclosingClassDeclaration != null) {
+          visitor.visitClassDeclarationIncrementally(
+              _resolutionContext.enclosingClassDeclaration);
+        }
+        if (node is Comment) {
+          visitor.resolveOnlyCommentInFunctionBody = true;
+          node = node.parent;
+        }
+        visitor.initForIncrementalResolution();
+        node.accept(visitor);
+      }
+      // remember errors
+      _resolveErrors = errorListener.getErrorsForSource(_source);
     } finally {
-      elementsRestorer.restore();
-    }
-    // apply compatible changes to elements
-    if (node is FunctionDeclaration) {
-      ExecutableElementImpl oldElement = node.element;
-      // prepare the new element
-      ExecutableElement newElement;
-      {
-        List<FunctionElement> holderFunctions = holder.functions;
-        List<PropertyAccessorElement> holderAccessors = holder.accessors;
-        if (holderFunctions.isNotEmpty) {
-          newElement = holderFunctions[0];
-        } else if (holderAccessors.isNotEmpty) {
-          newElement = holderAccessors[0];
-        }
-      }
-      // update the old Element
-      oldElement.labels = newElement.labels;
-      oldElement.localVariables = newElement.localVariables;
-    }
-    if (node is MethodDeclaration) {
-      ExecutableElementImpl oldElement = node.element;
-      // prepare the new element
-      ExecutableElement newElement;
-      {
-        List<MethodElement> holderMethods = holder.methods;
-        List<PropertyAccessorElement> holderAccessors = holder.accessors;
-        if (holderMethods.isNotEmpty) {
-          newElement = holderMethods[0];
-        } else if (holderAccessors.isNotEmpty) {
-          newElement = holderAccessors[0];
-        }
-      }
-      // update the old Element
-      oldElement.labels = newElement.labels;
-      oldElement.localVariables = newElement.localVariables;
+      timer.stop('resolve references');
     }
   }
 
   void _verify(AstNode node) {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
-    ErrorVerifier errorVerifier = new ErrorVerifier(
-        errorReporter,
-        _definingLibrary,
-        _typeProvider,
-        new InheritanceManager(_definingLibrary));
-    if (_resolutionContext.enclosingClassDeclaration != null) {
-      errorVerifier.visitClassDeclarationIncrementally(
-          _resolutionContext.enclosingClassDeclaration);
+    LoggingTimer timer = logger.startTimer();
+    try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
+      ErrorVerifier errorVerifier = new ErrorVerifier(
+          errorReporter,
+          _definingLibrary,
+          _typeProvider,
+          new InheritanceManager(_definingLibrary));
+      if (_resolutionContext.enclosingClassDeclaration != null) {
+        errorVerifier.visitClassDeclarationIncrementally(
+            _resolutionContext.enclosingClassDeclaration);
+      }
+      node.accept(errorVerifier);
+      _verifyErrors = errorListener.getErrorsForSource(_source);
+    } finally {
+      timer.stop('verify');
     }
-    node.accept(errorVerifier);
-    _verifyErrors = errorListener.getErrorsForSource(_source);
   }
 
   static void _updateElementNameOffsets(Element root, int offset, int delta) {
-    root.accept(new _ElementNameOffsetUpdater(offset, delta));
+    LoggingTimer timer = logger.startTimer();
+    try {
+      root.accept(new _ElementNameOffsetUpdater(offset, delta));
+    } finally {
+      timer.stop('update element offsets');
+    }
   }
 }
 
@@ -903,7 +1069,9 @@
   List<AnalysisError> _newHints = <AnalysisError>[];
 
   PoorMansIncrementalResolver(this._typeProvider, this._unitSource,
-      this._librarySource, this._entry);
+      this._librarySource, this._entry, bool resolveApiChanges) {
+    _resolveApiChanges = resolveApiChanges;
+  }
 
   /**
    * Attempts to update [oldUnit] to the state corresponding to [newCode].
@@ -911,6 +1079,8 @@
    * The [oldUnit] might be damaged.
    */
   bool resolve(CompilationUnit oldUnit, String newCode) {
+    logger.enter('diff/resolve $_unitSource');
+    logger.log(oldUnit != null ? 'has oldUnit' : 'oldUnit is null');
     try {
       CompilationUnit newUnit = _parseUnit(newCode);
       _TokenPair firstPair =
@@ -932,23 +1102,33 @@
           _updateOffset = beginOffsetOld - 1;
           _updateEndOld = endOffsetOld;
           _updateDelta = newUnit.length - oldUnit.length;
-          _shiftTokens(firstPair.oldToken, _updateDelta);
-          IncrementalResolver._updateElementNameOffsets(
-              oldUnit.element,
-              _updateOffset,
-              _updateDelta);
-          _updateEntry();
-          return true;
+          // A Dart documentation comment change.
+          if (firstPair.kind == _TokenDifferenceKind.COMMENT_DOC) {
+            _resolveComment(oldUnit, newUnit, firstPair);
+            logger.log('Success.');
+            return true;
+          }
+          // A pure whitespace change.
+          if (firstPair.kind == _TokenDifferenceKind.OFFSET) {
+            logger.log('Whitespace change.');
+            _shiftTokens(firstPair.oldToken);
+            IncrementalResolver._updateElementNameOffsets(
+                oldUnit.element,
+                _updateOffset,
+                _updateDelta);
+            _updateEntry();
+            logger.log('Success.');
+            return true;
+          }
+          // fall-through, end-of-line comment
         }
-//        print('beginOffsetOld: $beginOffsetOld endOffsetOld: $endOffsetOld');
-//        print('beginOffsetNew: $beginOffsetNew endOffsetNew: $endOffsetNew');
         // Find nodes covering the "old" and "new" token ranges.
         AstNode oldNode =
             _findNodeCovering(oldUnit, beginOffsetOld, endOffsetOld);
         AstNode newNode =
             _findNodeCovering(newUnit, beginOffsetNew, endOffsetNew);
-//        print('oldNode: $oldNode');
-//        print('newNode: $newNode');
+        logger.log(() => 'oldNode: $oldNode');
+        logger.log(() => 'newNode: $newNode');
         // Try to find the smallest common node, a FunctionBody currently.
         {
           List<AstNode> oldParents = _getParents(oldNode);
@@ -974,11 +1154,12 @@
             }
           }
           if (!found) {
+            logger.log('Failure: no enclosing function body or executable.');
             return false;
           }
         }
-//        print('oldNode: $oldNode');
-//        print('newNode: $newNode');
+        logger.log(() => 'oldNode: $oldNode');
+        logger.log(() => 'newNode: $newNode');
         // prepare update range
         _updateOffset = oldNode.offset;
         _updateEndOld = oldNode.end;
@@ -988,48 +1169,89 @@
         NodeReplacer.replace(oldNode, newNode);
         // update token references
         {
-          Token oldBeginToken = oldNode.beginToken;
+          Token oldBeginToken = _getBeginTokenNotComment(oldNode);
+          Token newBeginToken = _getBeginTokenNotComment(newNode);
           if (oldBeginToken.previous.type == TokenType.EOF) {
-            oldUnit.beginToken = newNode.beginToken;
+            oldUnit.beginToken = newBeginToken;
           } else {
-            oldBeginToken.previous.setNext(newNode.beginToken);
+            oldBeginToken.previous.setNext(newBeginToken);
           }
           newNode.endToken.setNext(oldNode.endToken.next);
-          _shiftTokens(oldNode.endToken.next, _updateDelta);
+          _shiftTokens(oldNode.endToken.next);
         }
         // perform incremental resolution
         CompilationUnitElement oldUnitElement = oldUnit.element;
         IncrementalResolver incrementalResolver = new IncrementalResolver(
             _typeProvider,
-            oldUnitElement.library,
             oldUnitElement,
-            oldUnitElement.source,
             _updateOffset,
             oldNode.length,
             newNode.length);
-        incrementalResolver.resolve(newNode);
+        bool success = incrementalResolver.resolve(newNode);
+        // check if success
+        if (!success) {
+          logger.log('Failure: element model changed.');
+          return false;
+        }
+        // update DartEntry
         _newResolveErrors = incrementalResolver._resolveErrors;
         _newVerifyErrors = incrementalResolver._verifyErrors;
         _newHints = incrementalResolver._hints;
         _updateEntry();
-//        print('Successfully incrementally resolved.');
+        logger.log('Success.');
         return true;
       }
-    } catch (e) {
-      // TODO(scheglov) find a way to log these exceptions
-//      print(e);
-//      print(st);
+    } catch (e, st) {
+      logger.log(e);
+      logger.log(st);
+      logger.log('Failure: exception.');
+    } finally {
+      logger.exit();
     }
     return false;
   }
 
   CompilationUnit _parseUnit(String code) {
-    Token token = _scan(code);
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    Parser parser = new Parser(_unitSource, errorListener);
-    CompilationUnit unit = parser.parseCompilationUnit(token);
-    _newParseErrors = errorListener.errors;
-    return unit;
+    LoggingTimer timer = logger.startTimer();
+    try {
+      Token token = _scan(code);
+      RecordingErrorListener errorListener = new RecordingErrorListener();
+      Parser parser = new Parser(_unitSource, errorListener);
+      CompilationUnit unit = parser.parseCompilationUnit(token);
+      _newParseErrors = errorListener.errors;
+      return unit;
+    } finally {
+      timer.stop('parse');
+    }
+  }
+
+  void _resolveComment(CompilationUnit oldUnit, CompilationUnit newUnit,
+      _TokenPair firstPair) {
+    Token oldToken = firstPair.oldToken;
+    CommentToken precedingComments = oldToken.precedingComments;
+    int offset = precedingComments.offset;
+    logger.log('offset: $offset');
+    Comment oldComment = _findNodeCovering(oldUnit, offset, offset);
+    Comment newComment = _findNodeCovering(newUnit, offset, offset);
+    logger.log('oldComment.beginToken: ${oldComment.beginToken}');
+    logger.log('newComment.beginToken: ${newComment.beginToken}');
+    _updateOffset = oldToken.offset - 1;
+    // update token references
+    _shiftTokens(firstPair.oldToken);
+    _setPrecedingComments(oldToken, newComment.tokens.first);
+    // replace node
+    NodeReplacer.replace(oldComment, newComment);
+    // update elements
+    IncrementalResolver._updateElementNameOffsets(
+        oldUnit.element,
+        _updateOffset,
+        _updateDelta);
+    _updateEntry();
+    // resolve references in the comment
+    CompilationUnitElement oldUnitElement = oldUnit.element;
+    IncrementalResolver incrementalResolver =
+        new IncrementalResolver(_typeProvider, oldUnitElement, _updateOffset, 0, 0);
+    incrementalResolver._resolveReferences(newComment);
   }
 
   Token _scan(String code) {
@@ -1041,6 +1263,26 @@
     return token;
   }
 
+  void _shiftTokens(Token token) {
+    while (token != null) {
+      if (token.offset > _updateOffset) {
+        token.offset += _updateDelta;
+      }
+      // comments
+      _shiftTokens(token.precedingComments);
+      if (token is DocumentationCommentToken) {
+        for (Token reference in token.references) {
+          _shiftTokens(reference);
+        }
+      }
+      // next
+      if (token.type == TokenType.EOF) {
+        break;
+      }
+      token = token.next;
+    }
+  }
+
   void _updateEntry() {
     _entry.setValue(DartEntry.SCAN_ERRORS, _newScanErrors);
     _entry.setValue(DartEntry.PARSE_ERRORS, _newParseErrors);
@@ -1062,12 +1304,7 @@
           _librarySource,
           errors);
     }
-    {
-      List<AnalysisError> oldErrors =
-          _entry.getValueInLibrary(DartEntry.HINTS, _librarySource);
-      List<AnalysisError> errors = _updateErrors(oldErrors, _newHints);
-      _entry.setValueInLibrary(DartEntry.HINTS, _librarySource, errors);
-    }
+    _entry.setValueInLibrary(DartEntry.HINTS, _librarySource, _newHints);
   }
 
   List<AnalysisError> _updateErrors(List<AnalysisError> oldErrors,
@@ -1094,39 +1331,82 @@
     return errors;
   }
 
-  static bool _equalToken(Token oldToken, Token newToken, int delta) {
+  static _TokenDifferenceKind _compareToken(Token oldToken, Token newToken,
+      int delta) {
+    if (oldToken == null && newToken == null) {
+      return null;
+    }
+    if (oldToken == null || newToken == null) {
+      return _TokenDifferenceKind.CONTENT;
+    }
     if (oldToken.type != newToken.type) {
-      return false;
+      return _TokenDifferenceKind.CONTENT;
+    }
+    if (oldToken.lexeme != newToken.lexeme) {
+      return _TokenDifferenceKind.CONTENT;
     }
     if (newToken.offset - oldToken.offset != delta) {
-      return false;
-    }
-    return oldToken.lexeme == newToken.lexeme;
-  }
-
-  static _TokenPair _findFirstDifferentToken(Token oldToken, Token newToken) {
-//    print('first ------------');
-    while (oldToken.type != TokenType.EOF && newToken.type != TokenType.EOF) {
-//      print('old: $oldToken @ ${oldToken.offset}');
-//      print('new: $newToken @ ${newToken.offset}');
-      if (!_equalToken(oldToken, newToken, 0)) {
-        return new _TokenPair(oldToken, newToken);
-      }
-      oldToken = oldToken.next;
-      newToken = newToken.next;
+      return _TokenDifferenceKind.OFFSET;
     }
     return null;
   }
 
+  static _TokenPair _findFirstDifferentToken(Token oldToken, Token newToken) {
+    while (true) {
+      if (oldToken.type == TokenType.EOF && newToken.type == TokenType.EOF) {
+        return null;
+      }
+      if (oldToken.type == TokenType.EOF || newToken.type == TokenType.EOF) {
+        return new _TokenPair(_TokenDifferenceKind.CONTENT, oldToken, newToken);
+      }
+      // compare comments
+      {
+        Token oldComment = oldToken.precedingComments;
+        Token newComment = newToken.precedingComments;
+        if (_compareToken(oldComment, newComment, 0) != null) {
+          _TokenDifferenceKind diffKind = _TokenDifferenceKind.COMMENT;
+          if (oldComment is DocumentationCommentToken ||
+              newComment is DocumentationCommentToken) {
+            diffKind = _TokenDifferenceKind.COMMENT_DOC;
+          }
+          return new _TokenPair(diffKind, oldToken, newToken);
+        }
+      }
+      // compare tokens
+      _TokenDifferenceKind diffKind = _compareToken(oldToken, newToken, 0);
+      if (diffKind != null) {
+        return new _TokenPair(diffKind, oldToken, newToken);
+      }
+      // next tokens
+      oldToken = oldToken.next;
+      newToken = newToken.next;
+    }
+    // no difference
+    return null;
+  }
+
   static _TokenPair _findLastDifferentToken(Token oldToken, Token newToken) {
-//    print('last ------------');
     int delta = newToken.offset - oldToken.offset;
     while (oldToken.previous != oldToken && newToken.previous != newToken) {
-//      print('old: $oldToken @ ${oldToken.offset}');
-//      print('new: $newToken @ ${newToken.offset}');
-      if (!_equalToken(oldToken, newToken, delta)) {
-        return new _TokenPair(oldToken.next, newToken.next);
+      // compare tokens
+      _TokenDifferenceKind diffKind = _compareToken(oldToken, newToken, delta);
+      if (diffKind != null) {
+        return new _TokenPair(diffKind, oldToken.next, newToken.next);
       }
+      // compare comments
+      {
+        Token oldComment = oldToken.precedingComments;
+        Token newComment = newToken.precedingComments;
+        if (_compareToken(oldComment, newComment, delta) != null) {
+          _TokenDifferenceKind diffKind = _TokenDifferenceKind.COMMENT;
+          if (oldComment is DocumentationCommentToken ||
+              newComment is DocumentationCommentToken) {
+            diffKind = _TokenDifferenceKind.COMMENT_DOC;
+          }
+          return new _TokenPair(diffKind, oldToken, newToken);
+        }
+      }
+      // next tokens
       oldToken = oldToken.previous;
       newToken = newToken.previous;
     }
@@ -1138,6 +1418,15 @@
     return nodeLocator.searchWithin(root);
   }
 
+  static Token _getBeginTokenNotComment(AstNode node) {
+    Token oldBeginToken = node.beginToken;
+    if (oldBeginToken is CommentToken) {
+      oldBeginToken = (oldBeginToken as CommentToken).parent;
+    }
+    return oldBeginToken;
+  }
+
+
   static List<AstNode> _getParents(AstNode node) {
     List<AstNode> parents = <AstNode>[];
     while (node != null) {
@@ -1147,13 +1436,21 @@
     return parents;
   }
 
-  static void _shiftTokens(Token token, int delta) {
-    while (true) {
-      token.offset += delta;
-      if (token.type == TokenType.EOF) {
-        break;
-      }
-      token = token.next;
+  /**
+   * Set the given [comment] as a "precedingComments" for [parent].
+   */
+  static void _setPrecedingComments(Token parent, CommentToken comment) {
+    if (parent is BeginTokenWithComment) {
+      parent.precedingComments = comment;
+    } else if (parent is KeywordTokenWithComment) {
+      parent.precedingComments = comment;
+    } else if (parent is StringTokenWithComment) {
+      parent.precedingComments = comment;
+    } else if (parent is TokenWithComment) {
+      parent.precedingComments = comment;
+    } else {
+      Type parentType = parent != null ? parent.runtimeType : null;
+      throw new AnalysisException('Uknown parent token type: $parentType');
     }
   }
 }
@@ -1163,6 +1460,7 @@
  * The context to resolve an [AstNode] in.
  */
 class ResolutionContext {
+  CompilationUnitElement enclosingUnit;
   ClassDeclaration enclosingClassDeclaration;
   ClassElement enclosingClass;
   Scope scope;
@@ -1181,6 +1479,11 @@
   final AnalysisErrorListener _errorListener;
 
   /**
+   * The class containing the enclosing [CompilationUnitElement].
+   */
+  CompilationUnitElement _enclosingUnit;
+
+  /**
    * The class containing the enclosing [ClassDeclaration], or `null` if we are
    * not in the scope of a class.
    */
@@ -1282,12 +1585,12 @@
   }
 
   Scope _scopeForCompilationUnit(CompilationUnit node) {
-    CompilationUnitElement unitElement = node.element;
-    if (unitElement == null) {
+    _enclosingUnit = node.element;
+    if (_enclosingUnit == null) {
       throw new AnalysisException(
           "Cannot create scope: compilation unit is not resolved");
     }
-    LibraryElement libraryElement = unitElement.library;
+    LibraryElement libraryElement = _enclosingUnit.library;
     if (libraryElement == null) {
       throw new AnalysisException(
           "Cannot create scope: compilation unit is not part of a library");
@@ -1316,6 +1619,7 @@
     // prepare context
     ResolutionContext context = new ResolutionContext();
     context.scope = scope;
+    context.enclosingUnit = builder._enclosingUnit;
     context.enclosingClassDeclaration = builder._enclosingClassDeclaration;
     context.enclosingClass = builder._enclosingClass;
     return context;
@@ -1400,65 +1704,33 @@
   void _addElement(Element element) {
     if (element != null) {
       matcher._allElements.add(element);
-      matcher._unmatchedElements.add(element);
+      matcher._removedElements.add(element);
     }
   }
 }
 
 
 /**
- * [ElementBuilder] not just builds elements, it also applies them to nodes.
- * But we want to keep externally visible (and referenced) elements instances.
- * So, we need to remember them and restore.
+ * Describes how two [Token]s are different.
  */
-class _ElementsRestorer extends RecursiveAstVisitor {
-  final Map<AstNode, Element> _elements = <AstNode, Element>{};
+class _TokenDifferenceKind {
+  static const COMMENT = const _TokenDifferenceKind('COMMENT');
+  static const COMMENT_DOC = const _TokenDifferenceKind('COMMENT_DOC');
+  static const CONTENT = const _TokenDifferenceKind('CONTENT');
+  static const OFFSET = const _TokenDifferenceKind('OFFSET');
 
-  _ElementsRestorer(AstNode root) {
-    root.accept(this);
-  }
+  final String name;
 
-  void restore() {
-    _elements.forEach((AstNode node, Element element) {
-      if (node is ConstructorDeclaration) {
-        node.element = element;
-      } else if (node is FunctionExpression) {
-        node.element = element;
-      } else if (node is SimpleIdentifier) {
-        node.staticElement = element;
-      }
-    });
-  }
+  const _TokenDifferenceKind(this.name);
 
   @override
-  visitBlockFunctionBody(BlockFunctionBody node) {
-  }
-
-  @override
-  visitConstructorDeclaration(ConstructorDeclaration node) {
-    _elements[node] = node.element;
-    super.visitConstructorDeclaration(node);
-  }
-
-  @override
-  visitExpressionFunctionBody(ExpressionFunctionBody node) {
-  }
-
-  @override
-  visitFunctionExpression(FunctionExpression node) {
-    _elements[node] = node.element;
-    super.visitFunctionExpression(node);
-  }
-
-  @override
-  visitSimpleIdentifier(SimpleIdentifier node) {
-    _elements[node] = node.staticElement;
-  }
+  String toString() => name;
 }
 
 
 class _TokenPair {
+  final _TokenDifferenceKind kind;
   final Token oldToken;
   final Token newToken;
-  _TokenPair(this.oldToken, this.newToken);
+  _TokenPair(this.kind, this.oldToken, this.newToken);
 }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 9bd6454e..3641626c 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -2328,21 +2328,20 @@
    */
   Parser(this._source, this._errorListener);
 
+  void set currentToken(Token currentToken) {
+    this._currentToken = currentToken;
+  }
+
   /**
-   * Advance to the next token in the token stream, making it the new current token.
-   *
-   * @return the token that was current before this method was invoked
+   * Advance to the next token in the token stream, making it the new current
+   * token and return the token that was current before this method was invoked.
    */
-  Token get andAdvance {
+  Token getAndAdvance() {
     Token token = _currentToken;
     _advance();
     return token;
   }
 
-  void set currentToken(Token currentToken) {
-    this._currentToken = currentToken;
-  }
-
   /**
    * Return `true` if the current token is the first token of a return type that is followed
    * by an identifier, possibly followed by a list of type parameters, followed by a
@@ -2412,7 +2411,7 @@
     Token period = null;
     SimpleIdentifier constructorName = null;
     if (_matches(TokenType.PERIOD)) {
-      period = andAdvance;
+      period = getAndAdvance();
       constructorName = parseSimpleIdentifier();
     }
     ArgumentList arguments = null;
@@ -2466,7 +2465,7 @@
     Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
     List<Expression> arguments = new List<Expression>();
     if (_matches(TokenType.CLOSE_PAREN)) {
-      return new ArgumentList(leftParenthesis, arguments, andAdvance);
+      return new ArgumentList(leftParenthesis, arguments, getAndAdvance());
     }
     //
     // Even though unnamed arguments must all appear before any named arguments,
@@ -2523,12 +2522,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _tokenMatches(_peek(), TokenType.BAR)) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseBitwiseXorExpression();
     }
     while (_matches(TokenType.BAR)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseBitwiseXorExpression());
     }
@@ -2674,7 +2673,22 @@
           modifiers.externalKeyword,
           null);
     } else if (!_matchesIdentifier()) {
-      if (_isOperator(_currentToken)) {
+      //
+      // Recover from an error.
+      //
+      if (_matchesKeyword(Keyword.CLASS)) {
+        _reportErrorForCurrentToken(ParserErrorCode.CLASS_IN_CLASS);
+        // TODO(brianwilkerson) We don't currently have any way to capture the
+        // class that was parsed.
+        _parseClassDeclaration(commentAndMetadata, null);
+        return null;
+      } else if (_matchesKeyword(Keyword.ABSTRACT) && _tokenMatchesKeyword(_peek(), Keyword.CLASS)) {
+        _reportErrorForToken(ParserErrorCode.CLASS_IN_CLASS, _peek());
+        // TODO(brianwilkerson) We don't currently have any way to capture the
+        // class that was parsed.
+        _parseClassDeclaration(commentAndMetadata, getAndAdvance());
+        return null;
+      } else if (_isOperator(_currentToken)) {
         //
         // We appear to have found an operator declaration without the
         // 'operator' keyword.
@@ -2740,7 +2754,7 @@
           _validateModifiersForConstructor(modifiers),
           modifiers.factoryKeyword,
           parseSimpleIdentifier(),
-          andAdvance,
+          getAndAdvance(),
           parseSimpleIdentifier(),
           parseFormalParameterList());
     } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
@@ -2781,6 +2795,12 @@
           modifiers.staticKeyword,
           _validateModifiersForField(modifiers),
           null);
+    } else if (_matchesKeyword(Keyword.TYPEDEF)) {
+      _reportErrorForCurrentToken(ParserErrorCode.TYPEDEF_IN_CLASS);
+      // TODO(brianwilkerson) We don't currently have any way to capture the
+      // function type alias that was parsed.
+      _parseFunctionTypeAlias(commentAndMetadata, getAndAdvance());
+      return null;
     }
     TypeName type = parseTypeName();
     if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) {
@@ -2902,7 +2922,7 @@
    */
   Combinator parseCombinator() {
     if (_matchesString(_SHOW) || _matchesString(_HIDE)) {
-      Token keyword = andAdvance;
+      Token keyword = getAndAdvance();
       List<SimpleIdentifier> names = _parseIdentifierList();
       if (keyword.lexeme == _SHOW) {
         return new ShowCombinator(keyword, names);
@@ -2957,7 +2977,7 @@
     Token firstToken = _currentToken;
     ScriptTag scriptTag = null;
     if (_matches(TokenType.SCRIPT_TAG)) {
-      scriptTag = new ScriptTag(andAdvance);
+      scriptTag = new ScriptTag(getAndAdvance());
     }
     //
     // Even though all directives must appear before declarations and must occur
@@ -3082,7 +3102,7 @@
     if (!_matches(TokenType.QUESTION)) {
       return condition;
     }
-    Token question = andAdvance;
+    Token question = getAndAdvance();
     Expression thenExpression = parseExpressionWithoutCascade();
     Token colon = _expect(TokenType.COLON);
     Expression elseExpression = parseExpressionWithoutCascade();
@@ -3109,7 +3129,7 @@
     Token period = null;
     SimpleIdentifier name = null;
     if (_matches(TokenType.PERIOD)) {
-      period = andAdvance;
+      period = getAndAdvance();
       name = parseSimpleIdentifier();
     }
     return new ConstructorName(type, period, name);
@@ -3192,7 +3212,7 @@
       }
       return new CascadeExpression(expression, cascadeSections);
     } else if (tokenType.isAssignmentOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       _ensureAssignable(expression);
       return new AssignmentExpression(expression, operator, parseExpression2());
     }
@@ -3225,7 +3245,7 @@
     //
     Expression expression = parseConditionalExpression();
     if (_currentToken.type.isAssignmentOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       _ensureAssignable(expression);
       expression = new AssignmentExpression(
           expression,
@@ -3284,7 +3304,7 @@
           null,
           null,
           null,
-          andAdvance);
+          getAndAdvance());
     }
     //
     // Even though it is invalid to have default parameters outside of brackets,
@@ -3340,7 +3360,7 @@
           _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
           reportedMixedGroups = true;
         }
-        leftSquareBracket = andAdvance;
+        leftSquareBracket = getAndAdvance();
         currentParameters = positionalParameters;
         kind = ParameterKind.POSITIONAL;
       } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
@@ -3354,7 +3374,7 @@
           _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS);
           reportedMixedGroups = true;
         }
-        leftCurlyBracket = andAdvance;
+        leftCurlyBracket = getAndAdvance();
         currentParameters = namedParameters;
         kind = ParameterKind.NAMED;
       }
@@ -3375,7 +3395,7 @@
       // TODO(brianwilkerson) Improve the detection and reporting of missing and
       // mismatched delimiters.
       if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
-        rightSquareBracket = andAdvance;
+        rightSquareBracket = getAndAdvance();
         currentParameters = normalParameters;
         if (leftSquareBracket == null) {
           if (leftCurlyBracket != null) {
@@ -3392,7 +3412,7 @@
         }
         kind = ParameterKind.REQUIRED;
       } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
-        rightCurlyBracket = andAdvance;
+        rightCurlyBracket = getAndAdvance();
         currentParameters = normalParameters;
         if (leftCurlyBracket == null) {
           if (leftSquareBracket != null) {
@@ -3529,7 +3549,7 @@
   Expression parseLogicalOrExpression() {
     Expression expression = _parseLogicalAndExpression();
     while (_matches(TokenType.BAR_BAR)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseLogicalAndExpression());
     }
@@ -3580,7 +3600,7 @@
     Token thisKeyword = null;
     Token period = null;
     if (_matchesKeyword(Keyword.THIS)) {
-      thisKeyword = andAdvance;
+      thisKeyword = getAndAdvance();
       period = _expect(TokenType.PERIOD);
     }
     SimpleIdentifier identifier = parseSimpleIdentifier();
@@ -3655,7 +3675,7 @@
     if (!_matches(TokenType.PERIOD)) {
       return qualifier;
     }
-    Token period = andAdvance;
+    Token period = getAndAdvance();
     SimpleIdentifier qualified = parseSimpleIdentifier();
     return new PrefixedIdentifier(qualifier, period, qualified);
   }
@@ -3673,7 +3693,7 @@
    */
   TypeName parseReturnType() {
     if (_matchesKeyword(Keyword.VOID)) {
-      return new TypeName(new SimpleIdentifier(andAdvance), null);
+      return new TypeName(new SimpleIdentifier(getAndAdvance()), null);
     } else {
       return parseTypeName();
     }
@@ -3691,7 +3711,7 @@
    */
   SimpleIdentifier parseSimpleIdentifier() {
     if (_matchesIdentifier()) {
-      return new SimpleIdentifier(andAdvance);
+      return new SimpleIdentifier(getAndAdvance());
     }
     _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
     return _createSyntheticIdentifier();
@@ -3771,7 +3791,7 @@
   StringLiteral parseStringLiteral() {
     List<StringLiteral> strings = new List<StringLiteral>();
     while (_matches(TokenType.STRING)) {
-      Token string = andAdvance;
+      Token string = getAndAdvance();
       if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
           _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER)) {
         strings.add(_parseStringInterpolation(string));
@@ -3830,7 +3850,7 @@
     Identifier typeName;
     if (_matchesKeyword(Keyword.VAR)) {
       _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME);
-      typeName = new SimpleIdentifier(andAdvance);
+      typeName = new SimpleIdentifier(getAndAdvance());
     } else if (_matchesIdentifier()) {
       typeName = parsePrefixedIdentifier();
     } else {
@@ -3858,7 +3878,7 @@
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
     SimpleIdentifier name = parseSimpleIdentifier();
     if (_matchesKeyword(Keyword.EXTENDS)) {
-      Token keyword = andAdvance;
+      Token keyword = getAndAdvance();
       TypeName bound = parseTypeName();
       return new TypeParameter(
           commentAndMetadata.comment,
@@ -4143,20 +4163,29 @@
   }
 
   /**
-   * If the current token has the expected type, return it after advancing to the next token.
-   * Otherwise report an error and return the current token without advancing. Note that the method
-   * [_expectGt] should be used if the argument to this method would be [TokenType.GT].
+   * If the current token has the expected type, return it after advancing to
+   * the next token. Otherwise report an error and return the current token
+   * without advancing.
    *
-   * @param type the type of token that is expected
-   * @return the token that matched the given type
+   * Note that the method [_expectGt] should be used if the argument to this
+   * method would be [TokenType.GT].
+   *
+   * The [type] is the type of token that is expected.
    */
   Token _expect(TokenType type) {
     if (_matches(type)) {
-      return andAdvance;
+      return getAndAdvance();
     }
     // Remove uses of this method in favor of matches?
     // Pass in the error code to use to report the error?
     if (type == TokenType.SEMICOLON) {
+      if (_tokenMatches(_currentToken.next, TokenType.SEMICOLON)) {
+        _reportErrorForCurrentToken(
+            ParserErrorCode.UNEXPECTED_TOKEN,
+            [_currentToken.lexeme]);
+        _advance();
+        return getAndAdvance();
+      }
       _reportErrorForToken(
           ParserErrorCode.EXPECTED_TOKEN,
           _currentToken.previous,
@@ -4177,7 +4206,7 @@
    */
   Token _expectGt() {
     if (_matchesGt()) {
-      return andAdvance;
+      return getAndAdvance();
     }
     _reportErrorForCurrentToken(
         ParserErrorCode.EXPECTED_TOKEN,
@@ -4194,7 +4223,7 @@
    */
   Token _expectKeyword(Keyword keyword) {
     if (_matchesKeyword(keyword)) {
-      return andAdvance;
+      return getAndAdvance();
     }
     // Remove uses of this method in favor of matches?
     // Pass in the error code to use to report the error?
@@ -4212,7 +4241,7 @@
    */
   Token _expectSemicolon() {
     if (_matches(TokenType.SEMICOLON)) {
-      return andAdvance;
+      return getAndAdvance();
     } else {
       _reportErrorForToken(
           ParserErrorCode.EXPECTED_TOKEN,
@@ -4701,12 +4730,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _currentToken.next.type.isAdditiveOperator) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseMultiplicativeExpression();
     }
     while (_currentToken.type.isAdditiveOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseMultiplicativeExpression());
     }
@@ -4770,7 +4799,7 @@
    */
   Expression _parseAssignableExpression(bool primaryAllowed) {
     if (_matchesKeyword(Keyword.SUPER)) {
-      return _parseAssignableSelector(new SuperExpression(andAdvance), false);
+      return _parseAssignableSelector(new SuperExpression(getAndAdvance()), false);
     }
     //
     // A primary expression can start with an identifier. We resolve the
@@ -4841,7 +4870,7 @@
    */
   Expression _parseAssignableSelector(Expression prefix, bool optional) {
     if (_matches(TokenType.OPEN_SQUARE_BRACKET)) {
-      Token leftBracket = andAdvance;
+      Token leftBracket = getAndAdvance();
       bool wasInInitializer = _inInitializer;
       _inInitializer = false;
       try {
@@ -4856,7 +4885,7 @@
         _inInitializer = wasInInitializer;
       }
     } else if (_matches(TokenType.PERIOD)) {
-      Token period = andAdvance;
+      Token period = getAndAdvance();
       return new PropertyAccess(prefix, period, parseSimpleIdentifier());
     } else {
       if (!optional) {
@@ -4879,7 +4908,7 @@
    * @return the await expression that was parsed
    */
   AwaitExpression _parseAwaitExpression() {
-    Token awaitToken = andAdvance;
+    Token awaitToken = getAndAdvance();
     Expression expression = _parseUnaryExpression();
     return new AwaitExpression(awaitToken, expression);
   }
@@ -4899,12 +4928,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _tokenMatches(_peek(), TokenType.AMPERSAND)) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseShiftExpression();
     }
     while (_matches(TokenType.AMPERSAND)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseShiftExpression());
     }
@@ -4926,12 +4955,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _tokenMatches(_peek(), TokenType.CARET)) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseBitwiseAndExpression();
     }
     while (_matches(TokenType.CARET)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseBitwiseAndExpression());
     }
@@ -4985,7 +5014,7 @@
     if (_matchesIdentifier()) {
       functionName = parseSimpleIdentifier();
     } else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) {
-      Token leftBracket = andAdvance;
+      Token leftBracket = getAndAdvance();
       bool wasInInitializer = _inInitializer;
       _inInitializer = false;
       try {
@@ -5053,7 +5082,7 @@
       }
     }
     if (_currentToken.type.isAssignmentOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       _ensureAssignable(expression);
       expression = new AssignmentExpression(
           expression,
@@ -5290,13 +5319,13 @@
     }
     Token semicolon;
     if (_matches(TokenType.SEMICOLON)) {
-      semicolon = andAdvance;
+      semicolon = getAndAdvance();
     } else {
       if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
         _reportErrorForCurrentToken(
             ParserErrorCode.EXPECTED_TOKEN,
             [TokenType.SEMICOLON.lexeme]);
-        Token leftBracket = andAdvance;
+        Token leftBracket = getAndAdvance();
         _parseClassMembers(className.name, _getEndToken(leftBracket));
         _expect(TokenType.CLOSE_CURLY_BRACKET);
       } else {
@@ -5458,9 +5487,10 @@
    * @param tokens the comment tokens representing the documentation comments to be parsed
    * @return the comment references that were parsed
    */
-  List<CommentReference> _parseCommentReferences(List<Token> tokens) {
+  List<CommentReference>
+      _parseCommentReferences(List<DocumentationCommentToken> tokens) {
     List<CommentReference> references = new List<CommentReference>();
-    for (Token token in tokens) {
+    for (DocumentationCommentToken token in tokens) {
       String comment = token.lexeme;
       int length = comment.length;
       List<List<int>> codeBlockRanges = _getCodeBlockRanges(comment);
@@ -5482,6 +5512,7 @@
                     nameOffset);
                 if (reference != null) {
                   references.add(reference);
+                  token.references.add(reference.beginToken);
                 }
               }
             }
@@ -5683,7 +5714,7 @@
       _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken);
       Token semicolon;
       if (_matches(TokenType.SEMICOLON)) {
-        semicolon = andAdvance;
+        semicolon = getAndAdvance();
       } else {
         semicolon = _createSyntheticToken(TokenType.SEMICOLON);
       }
@@ -5746,7 +5777,7 @@
     Token separator = null;
     List<ConstructorInitializer> initializers = null;
     if (_matches(TokenType.COLON)) {
-      separator = andAdvance;
+      separator = getAndAdvance();
       initializers = new List<ConstructorInitializer>();
       do {
         if (_matchesKeyword(Keyword.THIS)) {
@@ -5778,7 +5809,7 @@
     ConstructorName redirectedConstructor = null;
     FunctionBody body;
     if (_matches(TokenType.EQ)) {
-      separator = andAdvance;
+      separator = getAndAdvance();
       redirectedConstructor = parseConstructorName();
       body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON));
       if (factoryKeyword == null) {
@@ -5841,13 +5872,13 @@
     Token keyword = null;
     Token period = null;
     if (_matchesKeyword(Keyword.THIS)) {
-      keyword = andAdvance;
+      keyword = getAndAdvance();
       period = _expect(TokenType.PERIOD);
     }
     SimpleIdentifier fieldName = parseSimpleIdentifier();
     Token equals = null;
     if (_matches(TokenType.EQ)) {
-      equals = andAdvance;
+      equals = getAndAdvance();
     } else if (!_matchesKeyword(Keyword.THIS) &&
         !_matchesKeyword(Keyword.SUPER) &&
         !_matches(TokenType.OPEN_CURLY_BRACKET) &&
@@ -5969,7 +6000,7 @@
     Token firstToken = _currentToken;
     ScriptTag scriptTag = null;
     if (_matches(TokenType.SCRIPT_TAG)) {
-      scriptTag = new ScriptTag(andAdvance);
+      scriptTag = new ScriptTag(getAndAdvance());
     }
     List<Directive> directives = new List<Directive>();
     while (!_matches(TokenType.EOF)) {
@@ -6016,41 +6047,32 @@
    * @return the documentation comment that was parsed, or `null` if there was no comment
    */
   Comment _parseDocumentationComment() {
-    List<Token> commentTokens = new List<Token>();
-    Token commentToken = _currentToken.precedingComments;
+    List<DocumentationCommentToken> documentationTokens =
+        <DocumentationCommentToken>[
+        ];
+    CommentToken commentToken = _currentToken.precedingComments;
     while (commentToken != null) {
-      if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
-        if (StringUtilities.startsWith3(
-            commentToken.lexeme,
-            0,
-            0x2F,
-            0x2F,
-            0x2F)) {
-          if (commentTokens.length == 1 &&
-              StringUtilities.startsWith3(commentTokens[0].lexeme, 0, 0x2F, 0x2A, 0x2A)) {
-            commentTokens.clear();
+      if (commentToken is DocumentationCommentToken) {
+        if (documentationTokens.isNotEmpty) {
+          if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) {
+            if (documentationTokens[0].type != TokenType.SINGLE_LINE_COMMENT) {
+              documentationTokens.clear();
+            }
+          } else {
+            documentationTokens.clear();
           }
-          commentTokens.add(commentToken);
         }
-      } else {
-        if (StringUtilities.startsWith3(
-            commentToken.lexeme,
-            0,
-            0x2F,
-            0x2A,
-            0x2A)) {
-          commentTokens.clear();
-          commentTokens.add(commentToken);
-        }
+        documentationTokens.add(commentToken);
       }
       commentToken = commentToken.next;
     }
-    if (commentTokens.isEmpty) {
+    if (documentationTokens.isEmpty) {
       return null;
     }
-    List<CommentReference> references = _parseCommentReferences(commentTokens);
+    List<CommentReference> references =
+        _parseCommentReferences(documentationTokens);
     return Comment.createDocumentationCommentWithReferences(
-        commentTokens,
+        documentationTokens,
         references);
   }
 
@@ -6098,7 +6120,7 @@
    *
    * @return the empty statement that was parsed
    */
-  Statement _parseEmptyStatement() => new EmptyStatement(andAdvance);
+  Statement _parseEmptyStatement() => new EmptyStatement(getAndAdvance());
 
   EnumConstantDeclaration _parseEnumConstantDeclaration() {
     CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
@@ -6181,13 +6203,13 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _currentToken.next.type.isEqualityOperator) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseRelationalExpression();
     }
     bool leftEqualityExpression = false;
     while (_currentToken.type.isEqualityOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       if (leftEqualityExpression) {
         _reportErrorForNode(
             ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
@@ -6213,7 +6235,7 @@
    */
   ExportDirective _parseExportDirective(CommentAndMetadata commentAndMetadata) {
     Token exportKeyword = _expectKeyword(Keyword.EXPORT);
-    StringLiteral libraryUri = parseStringLiteral();
+    StringLiteral libraryUri = _parseUri();
     List<Combinator> combinators = _parseCombinators();
     Token semicolon = _expectSemicolon();
     return new ExportDirective(
@@ -6262,12 +6284,12 @@
     Token keyword = null;
     TypeName type = null;
     if (_matchesKeyword(Keyword.FINAL) || _matchesKeyword(Keyword.CONST)) {
-      keyword = andAdvance;
+      keyword = getAndAdvance();
       if (_isTypedIdentifier(_currentToken)) {
         type = parseTypeName();
       }
     } else if (_matchesKeyword(Keyword.VAR)) {
-      keyword = andAdvance;
+      keyword = getAndAdvance();
     } else {
       if (_isTypedIdentifier(_currentToken)) {
         type = parseReturnType();
@@ -6298,7 +6320,7 @@
   FormalParameter _parseFormalParameter(ParameterKind kind) {
     NormalFormalParameter parameter = parseNormalFormalParameter();
     if (_matches(TokenType.EQ)) {
-      Token seperator = andAdvance;
+      Token seperator = getAndAdvance();
       Expression defaultValue = parseExpression2();
       if (kind == ParameterKind.NAMED) {
         _reportErrorForToken(
@@ -6315,7 +6337,7 @@
           seperator,
           defaultValue);
     } else if (_matches(TokenType.COLON)) {
-      Token seperator = andAdvance;
+      Token seperator = getAndAdvance();
       Expression defaultValue = parseExpression2();
       if (kind == ParameterKind.POSITIONAL) {
         _reportErrorForToken(
@@ -6362,7 +6384,7 @@
     try {
       Token awaitKeyword = null;
       if (_matchesString(_AWAIT)) {
-        awaitKeyword = andAdvance;
+        awaitKeyword = getAndAdvance();
       }
       Token forKeyword = _expectKeyword(Keyword.FOR);
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
@@ -6370,7 +6392,7 @@
       Expression initialization = null;
       if (!_matches(TokenType.SEMICOLON)) {
         CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
-        if (_matchesIdentifier() && _tokenMatchesKeyword(_peek(), Keyword.IN)) {
+        if (_matchesIdentifier() && (_tokenMatchesKeyword(_peek(), Keyword.IN) || _tokenMatches(_peek(), TokenType.COLON))) {
           List<VariableDeclaration> variables = new List<VariableDeclaration>();
           SimpleIdentifier variableName = parseSimpleIdentifier();
           variables.add(
@@ -6387,7 +6409,10 @@
         } else {
           initialization = parseExpression2();
         }
-        if (_matchesKeyword(Keyword.IN)) {
+        if (_matchesKeyword(Keyword.IN) || _matches(TokenType.COLON)) {
+          if (_matches(TokenType.COLON)) {
+            _reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN);
+          }
           DeclaredIdentifier loopVariable = null;
           SimpleIdentifier identifier = null;
           if (variableList == null) {
@@ -6424,7 +6449,7 @@
               identifier = variable.name;
             }
           }
-          Token inKeyword = _expectKeyword(Keyword.IN);
+          Token inKeyword = getAndAdvance();
           Expression iterator = parseExpression2();
           Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
           Statement body = parseStatement2();
@@ -6517,9 +6542,9 @@
         if (!mayBeEmpty) {
           _reportErrorForCurrentToken(emptyErrorCode);
         }
-        return new EmptyFunctionBody(andAdvance);
+        return new EmptyFunctionBody(getAndAdvance());
       } else if (_matchesString(_NATIVE)) {
-        Token nativeToken = andAdvance;
+        Token nativeToken = getAndAdvance();
         StringLiteral stringLiteral = null;
         if (_matches(TokenType.STRING)) {
           stringLiteral = parseStringLiteral();
@@ -6533,16 +6558,16 @@
       Token star = null;
       if (_parseAsync) {
         if (_matchesString(ASYNC)) {
-          keyword = andAdvance;
+          keyword = getAndAdvance();
           if (_matches(TokenType.STAR)) {
-            star = andAdvance;
+            star = getAndAdvance();
             _inGenerator = true;
           }
           _inAsync = true;
         } else if (_matchesString(SYNC)) {
-          keyword = andAdvance;
+          keyword = getAndAdvance();
           if (_matches(TokenType.STAR)) {
-            star = andAdvance;
+            star = getAndAdvance();
             _inGenerator = true;
           }
         }
@@ -6558,7 +6583,12 @@
                 star);
           }
         }
-        Token functionDefinition = andAdvance;
+        Token functionDefinition = getAndAdvance();
+        if (_matchesKeyword(Keyword.RETURN)) {
+          _reportErrorForToken(
+              ParserErrorCode.UNEXPECTED_TOKEN,
+              getAndAdvance());
+        }
         Expression expression = parseExpression2();
         Token semicolon = null;
         if (!inExpression) {
@@ -6624,11 +6654,11 @@
     bool isGetter = false;
     if (_matchesKeyword(Keyword.GET) &&
         !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      keyword = andAdvance;
+      keyword = getAndAdvance();
       isGetter = true;
     } else if (_matchesKeyword(Keyword.SET) &&
         !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
-      keyword = andAdvance;
+      keyword = getAndAdvance();
     }
     SimpleIdentifier name = parseSimpleIdentifier();
     FormalParameterList parameters = null;
@@ -6884,7 +6914,7 @@
     Token elseKeyword = null;
     Statement elseStatement = null;
     if (_matchesKeyword(Keyword.ELSE)) {
-      elseKeyword = andAdvance;
+      elseKeyword = getAndAdvance();
       elseStatement = parseStatement2();
     }
     return new IfStatement(
@@ -6910,13 +6940,13 @@
    */
   ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) {
     Token importKeyword = _expectKeyword(Keyword.IMPORT);
-    StringLiteral libraryUri = parseStringLiteral();
+    StringLiteral libraryUri = _parseUri();
     Token deferredToken = null;
     Token asToken = null;
     SimpleIdentifier prefix = null;
     if (_matchesKeyword(Keyword.DEFERRED)) {
       if (_parseDeferredLibraries) {
-        deferredToken = andAdvance;
+        deferredToken = getAndAdvance();
       } else {
         _reportErrorForCurrentToken(
             ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED);
@@ -6924,7 +6954,7 @@
       }
     }
     if (_matchesKeyword(Keyword.AS)) {
-      asToken = andAdvance;
+      asToken = getAndAdvance();
       prefix = parseSimpleIdentifier();
     } else if (deferredToken != null) {
       _reportErrorForCurrentToken(
@@ -7098,7 +7128,7 @@
           typeArguments,
           leftBracket,
           null,
-          andAdvance);
+          getAndAdvance());
     }
     bool wasInInitializer = _inInitializer;
     _inInitializer = false;
@@ -7112,7 +7142,7 @@
               typeArguments,
               leftBracket,
               elements,
-              andAdvance);
+              getAndAdvance());
         }
         elements.add(parseExpression2());
       }
@@ -7174,7 +7204,7 @@
   Expression _parseLogicalAndExpression() {
     Expression expression = _parseEqualityExpression();
     while (_matches(TokenType.AMPERSAND_AMPERSAND)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseEqualityExpression());
     }
@@ -7204,7 +7234,7 @@
           typeArguments,
           leftBracket,
           entries,
-          andAdvance);
+          getAndAdvance());
     }
     bool wasInInitializer = _inInitializer;
     _inInitializer = false;
@@ -7217,7 +7247,7 @@
               typeArguments,
               leftBracket,
               entries,
-              andAdvance);
+              getAndAdvance());
         }
         entries.add(parseMapLiteralEntry());
       }
@@ -7301,7 +7331,21 @@
       _parseMethodDeclarationAfterReturnType(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeName returnType) {
     SimpleIdentifier methodName = parseSimpleIdentifier();
-    FormalParameterList parameters = parseFormalParameterList();
+    FormalParameterList parameters;
+    if (!_matches(TokenType.OPEN_PAREN) &&
+        (_matches(TokenType.OPEN_CURLY_BRACKET) || _matches(TokenType.FUNCTION))) {
+      _reportErrorForToken(
+          ParserErrorCode.MISSING_METHOD_PARAMETERS,
+          _currentToken.previous);
+      parameters = new FormalParameterList(
+          _createSyntheticToken(TokenType.OPEN_PAREN),
+          null,
+          null,
+          null,
+          _createSyntheticToken(TokenType.CLOSE_PAREN));
+    } else {
+      parameters = parseFormalParameterList();
+    }
     _validateFormalParameterList(parameters);
     return _parseMethodDeclarationAfterParameters(
         commentAndMetadata,
@@ -7341,7 +7385,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.abstractKeyword = andAdvance;
+          modifiers.abstractKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.CONST)) {
         if (modifiers.constKeyword != null) {
@@ -7350,7 +7394,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.constKeyword = andAdvance;
+          modifiers.constKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.EXTERNAL) &&
           !_tokenMatches(_peek(), TokenType.PERIOD) &&
@@ -7361,7 +7405,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.externalKeyword = andAdvance;
+          modifiers.externalKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.FACTORY) &&
           !_tokenMatches(_peek(), TokenType.PERIOD) &&
@@ -7372,7 +7416,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.factoryKeyword = andAdvance;
+          modifiers.factoryKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.FINAL)) {
         if (modifiers.finalKeyword != null) {
@@ -7381,7 +7425,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.finalKeyword = andAdvance;
+          modifiers.finalKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.STATIC) &&
           !_tokenMatches(_peek(), TokenType.PERIOD) &&
@@ -7392,7 +7436,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.staticKeyword = andAdvance;
+          modifiers.staticKeyword = getAndAdvance();
         }
       } else if (_matchesKeyword(Keyword.VAR)) {
         if (modifiers.varKeyword != null) {
@@ -7401,7 +7445,7 @@
               [_currentToken.lexeme]);
           _advance();
         } else {
-          modifiers.varKeyword = andAdvance;
+          modifiers.varKeyword = getAndAdvance();
         }
       } else {
         progress = false;
@@ -7425,12 +7469,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _currentToken.next.type.isMultiplicativeOperator) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseUnaryExpression();
     }
     while (_currentToken.type.isMultiplicativeOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseUnaryExpression());
     }
@@ -7448,7 +7492,7 @@
    * @return the class native clause that was parsed
    */
   NativeClause _parseNativeClause() {
-    Token keyword = andAdvance;
+    Token keyword = getAndAdvance();
     StringLiteral name = parseStringLiteral();
     return new NativeClause(keyword, name);
   }
@@ -7673,7 +7717,7 @@
       Token externalKeyword, TypeName returnType) {
     Token operatorKeyword;
     if (_matchesKeyword(Keyword.OPERATOR)) {
-      operatorKeyword = andAdvance;
+      operatorKeyword = getAndAdvance();
     } else {
       _reportErrorForToken(
           ParserErrorCode.MISSING_KEYWORD_OPERATOR,
@@ -7685,7 +7729,7 @@
           ParserErrorCode.NON_USER_DEFINABLE_OPERATOR,
           [_currentToken.lexeme]);
     }
-    SimpleIdentifier name = new SimpleIdentifier(andAdvance);
+    SimpleIdentifier name = new SimpleIdentifier(getAndAdvance());
     if (_matches(TokenType.EQ)) {
       Token previous = _currentToken.previous;
       if ((_tokenMatches(previous, TokenType.EQ_EQ) ||
@@ -7758,7 +7802,7 @@
   Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
     Token partKeyword = _expectKeyword(Keyword.PART);
     if (_matchesString(_OF)) {
-      Token ofKeyword = andAdvance;
+      Token ofKeyword = getAndAdvance();
       LibraryIdentifier libraryName = _parseLibraryName(
           ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
           ofKeyword);
@@ -7771,7 +7815,7 @@
           libraryName,
           semicolon);
     }
-    StringLiteral partUri = parseStringLiteral();
+    StringLiteral partUri = _parseUri();
     Token semicolon = _expect(TokenType.SEMICOLON);
     return new PartDirective(
         commentAndMetadata.comment,
@@ -7826,7 +7870,7 @@
       return operand;
     }
     _ensureAssignable(operand);
-    Token operator = andAdvance;
+    Token operator = getAndAdvance();
     return new PostfixExpression(operand, operator);
   }
 
@@ -7859,17 +7903,17 @@
    */
   Expression _parsePrimaryExpression() {
     if (_matchesKeyword(Keyword.THIS)) {
-      return new ThisExpression(andAdvance);
+      return new ThisExpression(getAndAdvance());
     } else if (_matchesKeyword(Keyword.SUPER)) {
-      return _parseAssignableSelector(new SuperExpression(andAdvance), false);
+      return _parseAssignableSelector(new SuperExpression(getAndAdvance()), false);
     } else if (_matchesKeyword(Keyword.NULL)) {
-      return new NullLiteral(andAdvance);
+      return new NullLiteral(getAndAdvance());
     } else if (_matchesKeyword(Keyword.FALSE)) {
-      return new BooleanLiteral(andAdvance, false);
+      return new BooleanLiteral(getAndAdvance(), false);
     } else if (_matchesKeyword(Keyword.TRUE)) {
-      return new BooleanLiteral(andAdvance, true);
+      return new BooleanLiteral(getAndAdvance(), true);
     } else if (_matches(TokenType.DOUBLE)) {
-      Token token = andAdvance;
+      Token token = getAndAdvance();
       double value = 0.0;
       try {
         value = double.parse(token.lexeme);
@@ -7878,7 +7922,7 @@
       }
       return new DoubleLiteral(token, value);
     } else if (_matches(TokenType.HEXADECIMAL)) {
-      Token token = andAdvance;
+      Token token = getAndAdvance();
       int value = null;
       try {
         value = int.parse(token.lexeme.substring(2), radix: 16);
@@ -7887,7 +7931,7 @@
       }
       return new IntegerLiteral(token, value);
     } else if (_matches(TokenType.INT)) {
-      Token token = andAdvance;
+      Token token = getAndAdvance();
       int value = null;
       try {
         value = int.parse(token.lexeme);
@@ -7923,7 +7967,7 @@
       if (_isFunctionExpression(_currentToken)) {
         return parseFunctionExpression();
       }
-      Token leftParenthesis = andAdvance;
+      Token leftParenthesis = getAndAdvance();
       bool wasInInitializer = _inInitializer;
       _inInitializer = false;
       try {
@@ -7979,7 +8023,7 @@
     Token period = null;
     SimpleIdentifier constructorName = null;
     if (_matches(TokenType.PERIOD)) {
-      period = andAdvance;
+      period = getAndAdvance();
       constructorName = parseSimpleIdentifier();
     }
     ArgumentList argumentList = parseArgumentList();
@@ -8004,26 +8048,26 @@
   Expression _parseRelationalExpression() {
     if (_matchesKeyword(Keyword.SUPER) &&
         _currentToken.next.type.isRelationalOperator) {
-      Expression expression = new SuperExpression(andAdvance);
-      Token operator = andAdvance;
+      Expression expression = new SuperExpression(getAndAdvance());
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, parseBitwiseOrExpression());
       return expression;
     }
     Expression expression = parseBitwiseOrExpression();
     if (_matchesKeyword(Keyword.AS)) {
-      Token asOperator = andAdvance;
+      Token asOperator = getAndAdvance();
       expression = new AsExpression(expression, asOperator, parseTypeName());
     } else if (_matchesKeyword(Keyword.IS)) {
-      Token isOperator = andAdvance;
+      Token isOperator = getAndAdvance();
       Token notOperator = null;
       if (_matches(TokenType.BANG)) {
-        notOperator = andAdvance;
+        notOperator = getAndAdvance();
       }
       expression =
           new IsExpression(expression, isOperator, notOperator, parseTypeName());
     } else if (_currentToken.type.isRelationalOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, parseBitwiseOrExpression());
     }
@@ -8056,7 +8100,7 @@
   Statement _parseReturnStatement() {
     Token returnKeyword = _expectKeyword(Keyword.RETURN);
     if (_matches(TokenType.SEMICOLON)) {
-      return new ReturnStatement(returnKeyword, null, andAdvance);
+      return new ReturnStatement(returnKeyword, null, getAndAdvance());
     }
     Expression expression = parseExpression2();
     Token semicolon = _expect(TokenType.SEMICOLON);
@@ -8123,12 +8167,12 @@
     Expression expression;
     if (_matchesKeyword(Keyword.SUPER) &&
         _currentToken.next.type.isShiftOperator) {
-      expression = new SuperExpression(andAdvance);
+      expression = new SuperExpression(getAndAdvance());
     } else {
       expression = _parseAdditiveExpression();
     }
     while (_currentToken.type.isShiftOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       expression =
           new BinaryExpression(expression, operator, _parseAdditiveExpression());
     }
@@ -8180,7 +8224,7 @@
             _computeStringValue(string.lexeme, true, !hasMore)));
     while (hasMore) {
       if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION)) {
-        Token openToken = andAdvance;
+        Token openToken = getAndAdvance();
         bool wasInInitializer = _inInitializer;
         _inInitializer = false;
         try {
@@ -8192,17 +8236,17 @@
           _inInitializer = wasInInitializer;
         }
       } else {
-        Token openToken = andAdvance;
+        Token openToken = getAndAdvance();
         Expression expression = null;
         if (_matchesKeyword(Keyword.THIS)) {
-          expression = new ThisExpression(andAdvance);
+          expression = new ThisExpression(getAndAdvance());
         } else {
           expression = parseSimpleIdentifier();
         }
         elements.add(new InterpolationExpression(openToken, expression, null));
       }
       if (_matches(TokenType.STRING)) {
-        string = andAdvance;
+        string = getAndAdvance();
         hasMore = _matches(TokenType.STRING_INTERPOLATION_EXPRESSION) ||
             _matches(TokenType.STRING_INTERPOLATION_IDENTIFIER);
         elements.add(
@@ -8231,7 +8275,7 @@
     Token period = null;
     SimpleIdentifier constructorName = null;
     if (_matches(TokenType.PERIOD)) {
-      period = andAdvance;
+      period = getAndAdvance();
       constructorName = parseSimpleIdentifier();
     }
     ArgumentList argumentList = parseArgumentList();
@@ -8289,7 +8333,7 @@
           labels.add(new Label(identifier, colon));
         }
         if (_matchesKeyword(Keyword.CASE)) {
-          Token caseKeyword = andAdvance;
+          Token caseKeyword = getAndAdvance();
           Expression caseExpression = parseExpression2();
           Token colon = _expect(TokenType.COLON);
           members.add(
@@ -8310,7 +8354,7 @@
                 ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CASES,
                 _peek());
           }
-          defaultKeyword = andAdvance;
+          defaultKeyword = getAndAdvance();
           Token colon = _expect(TokenType.COLON);
           members.add(
               new SwitchDefault(labels, defaultKeyword, colon, _parseStatementList()));
@@ -8351,14 +8395,14 @@
    * @return the symbol literal that was parsed
    */
   SymbolLiteral _parseSymbolLiteral() {
-    Token poundSign = andAdvance;
+    Token poundSign = getAndAdvance();
     List<Token> components = new List<Token>();
     if (_matchesIdentifier()) {
-      components.add(andAdvance);
+      components.add(getAndAdvance());
       while (_matches(TokenType.PERIOD)) {
         _advance();
         if (_matchesIdentifier()) {
-          components.add(andAdvance);
+          components.add(getAndAdvance());
         } else {
           _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
           components.add(_createSyntheticToken(TokenType.IDENTIFIER));
@@ -8366,9 +8410,9 @@
         }
       }
     } else if (_currentToken.isOperator) {
-      components.add(andAdvance);
+      components.add(getAndAdvance());
     } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) {
-      components.add(andAdvance);
+      components.add(getAndAdvance());
     } else {
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
       components.add(_createSyntheticToken(TokenType.IDENTIFIER));
@@ -8449,7 +8493,7 @@
       Token onKeyword = null;
       TypeName exceptionType = null;
       if (_matchesString(_ON)) {
-        onKeyword = andAdvance;
+        onKeyword = getAndAdvance();
         exceptionType = parseTypeName();
       }
       Token catchKeyword = null;
@@ -8459,11 +8503,11 @@
       SimpleIdentifier stackTraceParameter = null;
       Token rightParenthesis = null;
       if (_matchesKeyword(Keyword.CATCH)) {
-        catchKeyword = andAdvance;
+        catchKeyword = getAndAdvance();
         leftParenthesis = _expect(TokenType.OPEN_PAREN);
         exceptionParameter = parseSimpleIdentifier();
         if (_matches(TokenType.COMMA)) {
-          comma = andAdvance;
+          comma = getAndAdvance();
           stackTraceParameter = parseSimpleIdentifier();
         }
         rightParenthesis = _expect(TokenType.CLOSE_PAREN);
@@ -8483,7 +8527,7 @@
     }
     Token finallyKeyword = null;
     if (_matchesKeyword(Keyword.FINALLY)) {
-      finallyKeyword = andAdvance;
+      finallyKeyword = getAndAdvance();
       finallyClause = parseBlock();
     } else {
       if (catchClauses.isEmpty) {
@@ -8570,7 +8614,7 @@
     if (_matches(TokenType.MINUS) ||
         _matches(TokenType.BANG) ||
         _matches(TokenType.TILDE)) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       if (_matchesKeyword(Keyword.SUPER)) {
         if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
             _tokenMatches(_peek(), TokenType.PERIOD)) {
@@ -8580,11 +8624,11 @@
           // --> "prefixOperator 'super' assignableSelector selector*"
           return new PrefixExpression(operator, _parseUnaryExpression());
         }
-        return new PrefixExpression(operator, new SuperExpression(andAdvance));
+        return new PrefixExpression(operator, new SuperExpression(getAndAdvance()));
       }
       return new PrefixExpression(operator, _parseUnaryExpression());
     } else if (_currentToken.type.isIncrementOperator) {
-      Token operator = andAdvance;
+      Token operator = getAndAdvance();
       if (_matchesKeyword(Keyword.SUPER)) {
         if (_tokenMatches(_peek(), TokenType.OPEN_SQUARE_BRACKET) ||
             _tokenMatches(_peek(), TokenType.PERIOD)) {
@@ -8607,7 +8651,7 @@
           operator.previous.setNext(firstOperator);
           return new PrefixExpression(
               firstOperator,
-              new PrefixExpression(secondOperator, new SuperExpression(andAdvance)));
+              new PrefixExpression(secondOperator, new SuperExpression(getAndAdvance())));
         } else {
           // Invalid operator before 'super'
           _reportErrorForCurrentToken(
@@ -8615,7 +8659,7 @@
               [operator.lexeme]);
           return new PrefixExpression(
               operator,
-              new SuperExpression(andAdvance));
+              new SuperExpression(getAndAdvance()));
         }
       }
       return new PrefixExpression(operator, _parseAssignableExpression(false));
@@ -8629,6 +8673,58 @@
   }
 
   /**
+   * Parse a string literal representing a URI.
+   */
+  StringLiteral _parseUri() {
+    bool iskeywordAfterUri(Token token) =>
+        token.lexeme == Keyword.AS.syntax ||
+            token.lexeme == _HIDE ||
+            token.lexeme == _SHOW;
+    if (!_matches(TokenType.STRING) &&
+        !_matches(TokenType.SEMICOLON) &&
+        !iskeywordAfterUri(_currentToken)) {
+      // Attempt to recover in the case where the URI was not enclosed in
+      // quotes.
+      Token token = _currentToken;
+      while ((_tokenMatchesIdentifier(token) && !iskeywordAfterUri(token)) ||
+          _tokenMatches(token, TokenType.COLON) ||
+          _tokenMatches(token, TokenType.SLASH) ||
+          _tokenMatches(token, TokenType.PERIOD) ||
+          _tokenMatches(token, TokenType.PERIOD_PERIOD) ||
+          _tokenMatches(token, TokenType.PERIOD_PERIOD_PERIOD) ||
+          _tokenMatches(token, TokenType.INT) ||
+          _tokenMatches(token, TokenType.DOUBLE)) {
+        token = token.next;
+      }
+      if (_tokenMatches(token, TokenType.SEMICOLON) ||
+          iskeywordAfterUri(token)) {
+        Token endToken = token.previous;
+        token = _currentToken;
+        int endOffset = token.end;
+        StringBuffer buffer = new StringBuffer();
+        buffer.write(token.lexeme);
+        while (token != endToken) {
+          token = token.next;
+          if (token.offset != endOffset || token.precedingComments != null) {
+            return parseStringLiteral();
+          }
+          buffer.write(token.lexeme);
+          endOffset = token.end;
+        }
+        String value = buffer.toString();
+        Token newToken =
+            new StringToken(TokenType.STRING, "'$value'", _currentToken.offset);
+        _reportErrorForToken(
+            ParserErrorCode.NON_STRING_LITERAL_AS_URI,
+            newToken);
+        _currentToken = endToken.next;
+        return new SimpleStringLiteral(newToken, value);
+      }
+    }
+    return parseStringLiteral();
+  }
+
+  /**
    * Parse a variable declaration.
    *
    * <pre>
@@ -8644,7 +8740,7 @@
     Token equals = null;
     Expression initializer = null;
     if (_matches(TokenType.EQ)) {
-      equals = andAdvance;
+      equals = getAndAdvance();
       initializer = parseExpression2();
     }
     return new VariableDeclaration(
@@ -8804,10 +8900,10 @@
    * @return the yield statement that was parsed
    */
   YieldStatement _parseYieldStatement() {
-    Token yieldToken = andAdvance;
+    Token yieldToken = getAndAdvance();
     Token star = null;
     if (_matches(TokenType.STAR)) {
-      star = andAdvance;
+      star = getAndAdvance();
     }
     Expression expression = parseExpression2();
     Token semicolon = _expect(TokenType.SEMICOLON);
@@ -10012,6 +10108,14 @@
       'BREAK_OUTSIDE_OF_LOOP',
       "A break statement cannot be used outside of a loop or switch statement");
 
+  static const ParserErrorCode CLASS_IN_CLASS = const ParserErrorCode(
+      'CLASS_IN_CLASS',
+      "Classes cannot be declared inside other classes");
+
+  static const ParserErrorCode COLON_IN_PLACE_OF_IN = const ParserErrorCode(
+      'COLON_IN_PLACE_OF_IN',
+      "For-in loops use 'in' rather than a colon");
+
   static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode(
       'CONST_AND_FINAL',
       "Members cannot be declared to be both 'const' and 'final'");
@@ -10357,6 +10461,11 @@
           'MISSING_FUNCTION_PARAMETERS',
           "Functions must have an explicit list of parameters");
 
+  static const ParserErrorCode MISSING_METHOD_PARAMETERS =
+      const ParserErrorCode(
+          'MISSING_METHOD_PARAMETERS',
+          "Methods must have an explicit list of parameters");
+
   static const ParserErrorCode MISSING_GET = const ParserErrorCode(
       'MISSING_GET',
       "Getters must have the keyword 'get' before the getter name");
@@ -10485,6 +10594,12 @@
           'NON_PART_OF_DIRECTIVE_IN_PART',
           "The part-of directive must be the only directive in a part");
 
+  static const ParserErrorCode NON_STRING_LITERAL_AS_URI =
+      const ParserErrorCode(
+          'NON_STRING_LITERAL_AS_URI',
+          "The URI must be a string literal",
+          "Enclose the URI in either single or double quotes.");
+
   static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR =
       const ParserErrorCode(
           'NON_USER_DEFINABLE_OPERATOR',
@@ -10561,6 +10676,10 @@
       'TOP_LEVEL_OPERATOR',
       "Operators must be declared within a class");
 
+  static const ParserErrorCode TYPEDEF_IN_CLASS = const ParserErrorCode(
+      'TYPEDEF_IN_CLASS',
+      "Function type aliases cannot be declared inside classes");
+
   static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP =
       const ParserErrorCode(
           'UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP',
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index bc8654a..8584a6f 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -7,6 +7,8 @@
 import "dart:math" as math;
 import 'dart:collection';
 
+import 'package:analyzer/src/generated/utilities_collection.dart';
+
 import 'ast.dart';
 import 'constant.dart';
 import 'element.dart';
@@ -26,6 +28,18 @@
 import 'utilities_general.dart';
 
 /**
+ * Callback signature used by ImplicitConstructorBuilder to register
+ * computations to be performed, and their dependencies.  A call to this
+ * callback indicates that [computation] may be used to compute implicit
+ * constructors for [classElement], but that the computation may not be invoked
+ * until after implicit constructors have been built for [superclassElement].
+ */
+typedef void ImplicitConstructorBuilderCallback(ClassElement classElement,
+    ClassElement superclassElement, void computation());
+
+typedef void VoidFunction();
+
+/**
  * Instances of the class `AngularCompilationUnitBuilder` build an Angular specific element
  * model for a single compilation unit.
  */
@@ -5539,35 +5553,38 @@
 }
 
 /**
- * Instances of the class `SecondTypeResolverVisitor` are used to finish any resolve steps
- * after the [TypeResolverVisitor] that cannot happen in the [TypeResolverVisitor], but
- * should happen before the next tasks.
+ * Instances of the class `ImplicitConstructorBuilder` are used to build
+ * implicit constructors for mixin applications, and to check for errors
+ * related to super constructor calls in class declarations with mixins.
  *
- * Currently this visitor only finishes the resolution of [ClassTypeAlias]s, thus the scopes
- * of other top level AST nodes do not currently have to be built.
+ * The visitor methods don't directly build the implicit constructors or check
+ * for errors, since they don't in general visit the classes in the proper
+ * order to do so correctly.  Instead, they pass closures to
+ * ImplicitConstructorBuilderCallback to inform it of the computations to be
+ * done and their ordering dependencies.
  */
 class ImplicitConstructorBuilder extends ScopedVisitor {
   /**
-   * Initialize a newly created visitor to finish resolution in the nodes in a compilation unit.
-   *
-   * @param library the library containing the compilation unit being resolved
-   * @param source the source representing the compilation unit being visited
-   * @param typeProvider the object used to access the types from the core library
+   * Callback to receive the computations to be performed.
    */
-  ImplicitConstructorBuilder.con1(Library library, Source source,
-      TypeProvider typeProvider)
-      : super.con1(library, source, typeProvider);
+  final ImplicitConstructorBuilderCallback _callback;
 
   /**
-   * Initialize a newly created visitor to finish resolution in the nodes in a compilation unit.
+   * Initialize a newly created visitor to build implicit constructors for file
+   * [source], in library [libraryElement], which has scope [libraryScope]. Use
+   * [typeProvider] to access types from the core library.
    *
-   * @param library the library containing the compilation unit being resolved
-   * @param source the source representing the compilation unit being visited
-   * @param typeProvider the object used to access the types from the core library
+   * The visit methods will pass closures to [_callback] to indicate what
+   * computation needs to be performed, and its dependency order.
    */
-  ImplicitConstructorBuilder.con2(ResolvableLibrary library, Source source,
-      TypeProvider typeProvider)
-      : super.con4(library, source, typeProvider);
+  ImplicitConstructorBuilder(Source source, LibraryElement libraryElement,
+      LibraryScope libraryScope, TypeProvider typeProvider, this._callback)
+      : super.con3(
+          libraryElement,
+          source,
+          typeProvider,
+          libraryScope,
+          libraryScope.errorListener);
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
@@ -5587,23 +5604,25 @@
       }
       ClassElement superclassElement = classElement.supertype.element;
       if (superclassElement != null) {
-        bool constructorFound = false;
-        void callback(ConstructorElement explicitConstructor,
-            List<DartType> parameterTypes, List<DartType> argumentTypes) {
-          constructorFound = true;
-        }
-        if (_findForwardedConstructors(
-            classElement,
-            superclassName,
-            superclassType,
-            callback) &&
-            !constructorFound) {
-          reportErrorForNode(
-              CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
-              node.withClause,
-              [superclassType.element.name]);
-          classElement.mixinErrorsReported = true;
-        }
+        _callback(classElement, superclassElement, () {
+          bool constructorFound = false;
+          void callback(ConstructorElement explicitConstructor,
+              List<DartType> parameterTypes, List<DartType> argumentTypes) {
+            constructorFound = true;
+          }
+          if (_findForwardedConstructors(
+              classElement,
+              superclassName,
+              superclassType,
+              callback) &&
+              !constructorFound) {
+            reportErrorForNode(
+                CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
+                node.withClause,
+                [superclassType.element.name]);
+            classElement.mixinErrorsReported = true;
+          }
+        });
       }
     }
     return null;
@@ -5622,32 +5641,35 @@
     }
     ClassElementImpl classElement = node.element as ClassElementImpl;
     if (classElement != null) {
-      if (superclassType.element != null) {
-        List<ConstructorElement> implicitConstructors =
-            new List<ConstructorElement>();
-        void callback(ConstructorElement explicitConstructor,
-            List<DartType> parameterTypes, List<DartType> argumentTypes) {
-          implicitConstructors.add(
-              _createImplicitContructor(
-                  classElement.type,
-                  explicitConstructor,
-                  parameterTypes,
-                  argumentTypes));
-        }
-        if (_findForwardedConstructors(
-            classElement,
-            superclassName,
-            superclassType,
-            callback)) {
-          if (implicitConstructors.isEmpty) {
-            reportErrorForNode(
-                CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
-                node,
-                [superclassType.element.name]);
-          } else {
-            classElement.constructors = implicitConstructors;
+      ClassElement superclassElement = superclassType.element;
+      if (superclassElement != null) {
+        _callback(classElement, superclassElement, () {
+          List<ConstructorElement> implicitConstructors =
+              new List<ConstructorElement>();
+          void callback(ConstructorElement explicitConstructor,
+              List<DartType> parameterTypes, List<DartType> argumentTypes) {
+            implicitConstructors.add(
+                _createImplicitContructor(
+                    classElement.type,
+                    explicitConstructor,
+                    parameterTypes,
+                    argumentTypes));
           }
-        }
+          if (_findForwardedConstructors(
+              classElement,
+              superclassName,
+              superclassType,
+              callback)) {
+            if (implicitConstructors.isEmpty) {
+              reportErrorForNode(
+                  CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS,
+                  node,
+                  [superclassElement.name]);
+            } else {
+              classElement.constructors = implicitConstructors;
+            }
+          }
+        });
       }
     }
     return null;
@@ -5773,6 +5795,88 @@
 }
 
 /**
+ * An instance of this class is capable of running ImplicitConstructorBuilder
+ * over all classes in a library cycle.
+ */
+class ImplicitConstructorComputer {
+  /**
+   * The object used to access the types from the core library.
+   */
+  final TypeProvider typeProvider;
+
+  /**
+   * Directed graph of dependencies between classes that need to have their
+   * implicit constructors computed.  Each edge in the graph points from a
+   * derived class to its superclass.  Implicit constructors will be computed
+   * for the superclass before they are compute for the derived class.
+   */
+  DirectedGraph<ClassElement> _dependencies = new DirectedGraph<ClassElement>();
+
+  /**
+   * Map from ClassElement to the function which will compute the class's
+   * implicit constructors.
+   */
+  Map<ClassElement, VoidFunction> _computations =
+      new HashMap<ClassElement, VoidFunction>();
+
+  /**
+   * Create an ImplicitConstructorComputer which will use [typeProvider] to
+   * access types from the core library.
+   */
+  ImplicitConstructorComputer(this.typeProvider);
+
+  /**
+   * Add the given [unit] to the list of units which need to have implicit
+   * constructors built for them.  [source] is the source file corresponding to
+   * the compilation unit, [libraryElement] is the library element containing
+   * that source, and [libraryScope] is the scope for the library element.
+   */
+  void add(CompilationUnit unit, Source source, LibraryElement libraryElement,
+      LibraryScope libraryScope) {
+    unit.accept(
+        new ImplicitConstructorBuilder(
+            source,
+            libraryElement,
+            libraryScope,
+            typeProvider,
+            _defer));
+  }
+
+  /**
+   * Compute the implicit constructors for all compilation units that have been
+   * passed to [add].
+   */
+  void compute() {
+    List<List<ClassElement>> topologicalSort =
+        _dependencies.computeTopologicalSort();
+    for (List<ClassElement> classesInCycle in topologicalSort) {
+      // Note: a cycle could occur if there is a loop in the inheritance graph.
+      // Such loops are forbidden by Dart but could occur in the analysis of
+      // incorrect code.  If this happens, we simply visit the classes
+      // constituting the loop in any order.
+      for (ClassElement classElement in classesInCycle) {
+        VoidFunction computation = _computations[classElement];
+        if (computation != null) {
+          computation();
+        }
+      }
+    }
+  }
+
+  /**
+   * Defer execution of [computation], which builds implicit constructors for
+   * [classElement], until after implicit constructors have been built for
+   * [superclassElement].
+   */
+  void _defer(ClassElement classElement, ClassElement superclassElement, void
+      computation()) {
+    assert(!_computations.containsKey(classElement));
+    _computations[classElement] = computation;
+    _dependencies.addEdge(classElement, superclassElement);
+  }
+}
+
+/**
  * Instances of the class `ImplicitLabelScope` represent the scope statements
  * that can be the target of unlabeled break and continue statements.
  */
@@ -8737,13 +8841,18 @@
     TimeCounter_TimeCounterHandle timeCounter =
         PerformanceStatistics.resolve.start();
     try {
+      ImplicitConstructorComputer computer =
+          new ImplicitConstructorComputer(_typeProvider);
       for (Library library in _librariesInCycles) {
         for (Source source in library.compilationUnitSources) {
-          ImplicitConstructorBuilder visitor =
-              new ImplicitConstructorBuilder.con1(library, source, _typeProvider);
-          library.getAST(source).accept(visitor);
+          computer.add(
+              library.getAST(source),
+              source,
+              library.libraryElement,
+              library.libraryScope);
         }
       }
+      computer.compute();
     } finally {
       timeCounter.stop();
     }
@@ -9477,16 +9586,21 @@
     TimeCounter_TimeCounterHandle timeCounter =
         PerformanceStatistics.resolve.start();
     try {
+      ImplicitConstructorComputer computer =
+          new ImplicitConstructorComputer(_typeProvider);
       for (ResolvableLibrary library in _librariesInCycle) {
         for (ResolvableCompilationUnit unit in
             library.resolvableCompilationUnits) {
           Source source = unit.source;
           CompilationUnit ast = unit.compilationUnit;
-          ImplicitConstructorBuilder visitor =
-              new ImplicitConstructorBuilder.con2(library, source, _typeProvider);
-          ast.accept(visitor);
+          computer.add(
+              ast,
+              source,
+              library.libraryElement,
+              library.libraryScope);
         }
       }
+      computer.compute();
     } finally {
       timeCounter.stop();
     }
@@ -11077,6 +11191,16 @@
   TypePromotionManager _promoteManager = new TypePromotionManager();
 
   /**
+   * A comment before a function should be resolved in the context of the
+   * function. But when we incrementally resolve a comment, we don't want to
+   * resolve the whole function.
+   *
+   * So, this flag is set to `true`, when just context of the function should
+   * be built and the comment resolved.
+   */
+  bool resolveOnlyCommentInFunctionBody = false;
+
+  /**
    * Initialize a newly created visitor to resolve the nodes in a compilation unit.
    *
    * @param library the library containing the compilation unit being resolved
@@ -11506,6 +11630,13 @@
     return null;
   }
 
+  /**
+   * Prepares this [ResolverVisitor] to using it for incremental resolution.
+   */
+  void initForIncrementalResolution() {
+    _overrideManager.enterScope();
+  }
+
   @override
   Object visitCompilationUnit(CompilationUnit node) {
     //
@@ -11659,6 +11790,9 @@
   @override
   Object visitEmptyFunctionBody(EmptyFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
+    if (resolveOnlyCommentInFunctionBody) {
+      return null;
+    }
     return super.visitEmptyFunctionBody(node);
   }
 
@@ -11680,6 +11814,9 @@
   @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
+    if (resolveOnlyCommentInFunctionBody) {
+      return null;
+    }
     _overrideManager.enterScope();
     try {
       super.visitExpressionFunctionBody(node);
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 13808d5..893ab39 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -43,7 +43,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  final Token _precedingComment;
+  CommentToken _precedingComment;
 
   /**
    * Initialize a newly created token to have the given [type] at the given
@@ -51,15 +51,21 @@
    * [comment].
    */
   BeginTokenWithComment(TokenType type, int offset, this._precedingComment)
-      : super(type, offset);
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
 
-  @override
-  Token get precedingComments => _precedingComment;
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
 
   @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
-    Token token = _precedingComment;
+    Token token = precedingComments;
     while (token != null) {
       token.applyDelta(delta);
       token = token.next;
@@ -68,65 +74,7 @@
 
   @override
   Token copy() =>
-      new BeginTokenWithComment(type, offset, copyComments(_precedingComment));
-}
-
-/**
- * A `CharSequenceReader` is a [CharacterReader] that reads characters from a
- * character sequence.
- */
-class CharSequenceReader implements CharacterReader {
-  /**
-   * The sequence from which characters will be read.
-   */
-  final String _sequence;
-
-  /**
-   * The number of characters in the string.
-   */
-  int _stringLength = 0;
-
-  /**
-   * The index, relative to the string, of the last character that was read.
-   */
-  int _charOffset = 0;
-
-  /**
-   * Initialize a newly created reader to read the characters in the given
-   * [_sequence].
-   */
-  CharSequenceReader(this._sequence) {
-    this._stringLength = _sequence.length;
-    this._charOffset = -1;
-  }
-
-  @override
-  int get offset => _charOffset;
-
-  @override
-  void set offset(int offset) {
-    _charOffset = offset;
-  }
-
-  @override
-  int advance() {
-    if (_charOffset + 1 >= _stringLength) {
-      return -1;
-    }
-    return _sequence.codeUnitAt(++_charOffset);
-  }
-
-  @override
-  String getString(int start, int endDelta) =>
-      _sequence.substring(start, _charOffset + 1 + endDelta).toString();
-
-  @override
-  int peek() {
-    if (_charOffset + 1 >= _stringLength) {
-      return -1;
-    }
-    return _sequence.codeUnitAt(_charOffset + 1);
-  }
+      new BeginTokenWithComment(type, offset, copyComments(precedingComments));
 }
 
 /**
@@ -224,6 +172,106 @@
 }
 
 /**
+ * A `CharSequenceReader` is a [CharacterReader] that reads characters from a
+ * character sequence.
+ */
+class CharSequenceReader implements CharacterReader {
+  /**
+   * The sequence from which characters will be read.
+   */
+  final String _sequence;
+
+  /**
+   * The number of characters in the string.
+   */
+  int _stringLength = 0;
+
+  /**
+   * The index, relative to the string, of the last character that was read.
+   */
+  int _charOffset = 0;
+
+  /**
+   * Initialize a newly created reader to read the characters in the given
+   * [_sequence].
+   */
+  CharSequenceReader(this._sequence) {
+    this._stringLength = _sequence.length;
+    this._charOffset = -1;
+  }
+
+  @override
+  int get offset => _charOffset;
+
+  @override
+  void set offset(int offset) {
+    _charOffset = offset;
+  }
+
+  @override
+  int advance() {
+    if (_charOffset + 1 >= _stringLength) {
+      return -1;
+    }
+    return _sequence.codeUnitAt(++_charOffset);
+  }
+
+  @override
+  String getString(int start, int endDelta) =>
+      _sequence.substring(start, _charOffset + 1 + endDelta).toString();
+
+  @override
+  int peek() {
+    if (_charOffset + 1 >= _stringLength) {
+      return -1;
+    }
+    return _sequence.codeUnitAt(_charOffset + 1);
+  }
+}
+
+/**
+ * A `CommentToken` is a token representing a comment.
+ */
+class CommentToken extends StringToken {
+  /**
+   * The [Token] that contains this comment.
+   */
+  Token parent;
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  CommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() => new CommentToken(type, _value, offset);
+}
+
+/**
+ * A documentation comment token.
+ */
+class DocumentationCommentToken extends CommentToken {
+  /**
+   * The references embedded within the documentation comment.
+   * This list will be empty unless this is a documentation comment that has
+   * references embedded within it.
+   */
+  final List<Token> references = <Token>[];
+
+  /**
+   * Initialize a newly created token to represent a token of the given [type]
+   * with the given [value] at the given [offset].
+   */
+  DocumentationCommentToken(TokenType type, String value, int offset)
+      : super(type, value, offset);
+
+  @override
+  CommentToken copy() => new DocumentationCommentToken(type, _value, offset);
+}
+
+/**
  * The enumeration `Keyword` defines the keywords in the Dart programming
  * language.
  */
@@ -574,7 +622,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  final Token _precedingComment;
+  CommentToken _precedingComment;
 
   /**
    * Initialize a newly created token to to represent the given [keyword] at the
@@ -582,15 +630,21 @@
    * [comment].
    */
   KeywordTokenWithComment(Keyword keyword, int offset, this._precedingComment)
-      : super(keyword, offset);
+      : super(keyword, offset) {
+    _setCommentParent(_precedingComment);
+  }
 
-  @override
-  Token get precedingComments => _precedingComment;
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
 
   @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
-    Token token = _precedingComment;
+    Token token = precedingComments;
     while (token != null) {
       token.applyDelta(delta);
       token = token.next;
@@ -599,7 +653,7 @@
 
   @override
   Token copy() =>
-      new KeywordTokenWithComment(keyword, offset, copyComments(_precedingComment));
+      new KeywordTokenWithComment(keyword, offset, copyComments(precedingComments));
 }
 
 /**
@@ -957,12 +1011,17 @@
       return;
     }
     // OK, remember comment tokens.
+    CommentToken token;
+    if (_isDocumentationComment(value)) {
+      token = new DocumentationCommentToken(type, value, _tokenStart);
+    } else {
+      token = new CommentToken(type, value, _tokenStart);
+    }
     if (_firstComment == null) {
-      _firstComment = new StringToken(type, value, _tokenStart);
+      _firstComment = token;
       _lastComment = _firstComment;
     } else {
-      _lastComment =
-          _lastComment.setNext(new StringToken(type, value, _tokenStart));
+      _lastComment = _lastComment.setNext(token);
     }
   }
 
@@ -1741,6 +1800,14 @@
       return next;
     }
   }
+
+  /**
+   * Checks if [value] is a single-line or multi-line comment.
+   */
+  static bool _isDocumentationComment(String value) {
+    return StringUtilities.startsWith3(value, 0, 0x2F, 0x2F, 0x2F) ||
+        StringUtilities.startsWith3(value, 0, 0x2F, 0x2A, 0x2A);
+  }
 }
 
 /**
@@ -1820,7 +1887,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  final Token _precedingComment;
+  CommentToken _precedingComment;
 
   /**
    * Initialize a newly created token to have the given [type] at the given
@@ -1829,15 +1896,21 @@
    */
   StringTokenWithComment(TokenType type, String value, int offset,
       this._precedingComment)
-      : super(type, value, offset);
+      : super(type, value, offset) {
+    _setCommentParent(_precedingComment);
+  }
 
-  @override
-  Token get precedingComments => _precedingComment;
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
 
   @override
   void applyDelta(int delta) {
     super.applyDelta(delta);
-    Token token = _precedingComment;
+    Token token = precedingComments;
     while (token != null) {
       token.applyDelta(delta);
       token = token.next;
@@ -1850,7 +1923,7 @@
           type,
           lexeme,
           offset,
-          copyComments(_precedingComment));
+          copyComments(precedingComments));
 }
 
 /**
@@ -1981,10 +2054,10 @@
    * `null` is returned.
    *
    * For example, if the original contents were "/* one */ /* two */ id", then
-   * the first precceding comment token will have a lexeme of "/* one */" and
+   * the first preceding comment token will have a lexeme of "/* one */" and
    * the next comment token will have a lexeme of "/* two */".
    */
-  Token get precedingComments => null;
+  CommentToken get precedingComments => null;
 
   /**
    * Apply (add) the given [delta] to this token's offset.
@@ -2060,6 +2133,17 @@
   Object value() => type.lexeme;
 
   /**
+   * Sets the `parent` property to `this` for the given [comment] and all the
+   * next tokens.
+   */
+  void _setCommentParent(CommentToken comment) {
+    while (comment != null) {
+      comment.parent = this;
+      comment = comment.next;
+    }
+  }
+
+  /**
    * Compare the given [tokens] to find the token that appears first in the
    * source being parsed. That is, return the left-most of all of the tokens.
    * The list must be non-`null`, but the elements of the list are allowed to be
@@ -2549,7 +2633,7 @@
   /**
    * The first comment in the list of comments that precede this token.
    */
-  final Token _precedingComment;
+  CommentToken _precedingComment;
 
   /**
    * Initialize a newly created token to have the given [type] at the given
@@ -2557,11 +2641,17 @@
    * [comment].
    */
   TokenWithComment(TokenType type, int offset, this._precedingComment)
-      : super(type, offset);
+      : super(type, offset) {
+    _setCommentParent(_precedingComment);
+  }
+
+  CommentToken get precedingComments => _precedingComment;
+
+  void set precedingComments(CommentToken comment) {
+    _precedingComment = comment;
+    _setCommentParent(_precedingComment);
+  }
 
   @override
-  Token get precedingComments => _precedingComment;
-
-  @override
-  Token copy() => new TokenWithComment(type, offset, _precedingComment);
+  Token copy() => new TokenWithComment(type, offset, precedingComments);
 }
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 4e92f02..cbbb2bb 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -7,6 +7,8 @@
 
 library engine.sdk.io;
 
+import 'dart:io';
+
 import 'package:analyzer/src/generated/java_engine.dart';
 
 import 'ast.dart';
@@ -401,7 +403,7 @@
         if (revision != null) {
           _sdkVersion = revision.trim();
         }
-      } on JavaIOException catch (exception) {
+      } on FileSystemException catch (exception) {
         // Fall through to return the default.
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 47dd4f6..22012ff 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -469,6 +469,33 @@
 }
 
 /**
+ * An efficient [int] set.
+ * Currently not really efficient.
+ */
+class IntSet {
+  HashSet<int> _set = new HashSet<int>();
+
+  bool get isEmpty {
+    return _set.isEmpty;
+  }
+
+  void add(int value) {
+    _set.add(value);
+  }
+
+  int remove() {
+    int value = _set.first;
+    _set.remove(value);
+    return value;
+  }
+
+  @override
+  String toString() {
+    return _set.toString();
+  }
+}
+
+/**
  * The class `ListUtilities` defines utility methods useful for working with [List
  ].
  */
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 4bb0356..6dab3e8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.23.0-dev.13
+version: 0.23.0-dev.14
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/all_the_rest.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
similarity index 97%
rename from pkg/analyzer/test/generated/all_the_rest.dart
rename to pkg/analyzer/test/generated/all_the_rest_test.dart
index a99cf0e..ecd06ad 100644
--- a/pkg/analyzer/test/generated/all_the_rest.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -452,6 +452,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AngularCompilationUnitBuilderTest extends AngularTest {
   void test_bad_notConstructorAnnotation() {
     String mainContent = r'''
@@ -1445,6 +1446,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AngularHtmlUnitResolverTest extends AngularTest {
   void fail_analysisContext_changeDart_invalidateApplication() {
     addMainSource(r'''
@@ -2352,6 +2354,7 @@
 /**
  * Tests for [HtmlUnitUtils] for Angular HTMLs.
  */
+@ReflectiveTestCase()
 class AngularHtmlUnitUtilsTest extends AngularTest {
   void test_getElement_forExpression() {
     addMyController();
@@ -2992,6 +2995,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ConstantEvaluatorTest extends ResolverTestCase {
   void fail_constructor() {
     EvaluationResult result = _getExpressionValue("?");
@@ -3376,9 +3380,31 @@
 }
 
 
+@ReflectiveTestCase()
 class ConstantFinderTest extends EngineTestCase {
   AstNode _node;
 
+  /**
+   * Test an annotation that consists solely of an identifier (and hence
+   * represents a reference to a compile-time constant variable).
+   */
+  void test_visitAnnotation_constantVariable() {
+    _node = AstFactory.annotation(AstFactory.identifier3('x'));
+    expect(_findAnnotations(), contains(_node));
+  }
+
+  /**
+   * Test an annotation that represents the invocation of a constant
+   * constructor.
+   */
+  void test_visitAnnotation_invocation() {
+    _node = AstFactory.annotation2(
+        AstFactory.identifier3('A'),
+        null,
+        AstFactory.argumentList());
+    expect(_findAnnotations(), contains(_node));
+  }
+
   void test_visitConstructorDeclaration_const() {
     ConstructorElement element = _setupConstructorDeclaration("A", true);
     expect(_findConstantDeclarations()[element], same(_node));
@@ -3414,6 +3440,14 @@
     expect(_findVariableDeclarations().isEmpty, isTrue);
   }
 
+  List<Annotation> _findAnnotations() {
+    ConstantFinder finder = new ConstantFinder();
+    _node.accept(finder);
+    List<Annotation> annotations = finder.annotations;
+    expect(annotations, isNotNull);
+    return annotations;
+  }
+
   Map<ConstructorElement, ConstructorDeclaration> _findConstantDeclarations() {
     ConstantFinder finder = new ConstantFinder();
     _node.accept(finder);
@@ -3482,7 +3516,181 @@
 }
 
 
+@ReflectiveTestCase()
 class ConstantValueComputerTest extends ResolverTestCase {
+  void test_annotation_constConstructor() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A(this.i);
+}
+
+class C {
+  @A(5)
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
+    _assertIntField(annotationFields, 'i', 5);
+  }
+
+  void test_annotation_constConstructor_named() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A.named(this.i);
+}
+
+class C {
+  @A.named(5)
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    Map<String, DartObjectImpl> annotationFields = _assertType(result, 'A');
+    _assertIntField(annotationFields, 'i', 5);
+  }
+
+  void test_annotation_constConstructor_noArgs() {
+    // Failing to pass arguments to an annotation which is a constant
+    // constructor is illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A(this.i);
+}
+
+class C {
+  @A
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_constConstructor_noArgs_named() {
+    // Failing to pass arguments to an annotation which is a constant
+    // constructor is illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  const A.named(this.i);
+}
+
+class C {
+  @A.named
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_nonConstConstructor() {
+    // Calling a non-const constructor from an annotation that is illegal, but
+    // shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  final int i;
+  A(this.i);
+}
+
+class C {
+  @A(5)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_staticConst() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C {
+  static const int i = 5;
+
+  @i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_staticConst_args() {
+    // Applying arguments to an annotation that is a static const is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C {
+  static const int i = 5;
+
+  @i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_staticConst_otherClass() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  static const int i = 5;
+}
+
+class C {
+  @A.i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_staticConst_otherClass_args() {
+    // Applying arguments to an annotation that is a static const is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  static const int i = 5;
+}
+
+class C {
+  @A.i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
+  void test_annotation_toplevelVariable() {
+    CompilationUnit compilationUnit = resolveSource(r'''
+const int i = 5;
+class C {
+  @i
+  f() {}
+}
+''');
+    EvaluationResultImpl result =
+        _evaluateAnnotation(compilationUnit, "C", "f");
+    expect(_assertValidInt(result), 5);
+  }
+
+  void test_annotation_toplevelVariable_args() {
+    // Applying arguments to an annotation that is a toplevel variable is
+    // illegal, but shouldn't crash analysis.
+    CompilationUnit compilationUnit = resolveSource(r'''
+const int i = 5;
+class C {
+  @i(1)
+  f() {}
+}
+''');
+    _evaluateAnnotation(compilationUnit, "C", "f");
+  }
+
   void test_computeValues_cycle() {
     TestLogger logger = new TestLogger();
     AnalysisEngine.instance.logger = logger;
@@ -4468,6 +4676,30 @@
     _assertIntField(fieldsOfY, fieldName, 10);
   }
 
+  /**
+   * Search [compilationUnit] for a class named [className], containing a
+   * method [methodName], with exactly one annotation.  Return the constant
+   * value of the annotation.
+   */
+  EvaluationResultImpl _evaluateAnnotation(CompilationUnit compilationUnit,
+      String className, String memberName) {
+    for (CompilationUnitMember member in compilationUnit.declarations) {
+      if (member is ClassDeclaration && member.name.name == className) {
+        for (ClassMember classMember in member.members) {
+          if (classMember is MethodDeclaration &&
+              classMember.name.name == memberName) {
+            expect(classMember.metadata, hasLength(1));
+            ElementAnnotationImpl elementAnnotation =
+                classMember.metadata[0].elementAnnotation;
+            return elementAnnotation.evaluationResult;
+          }
+        }
+      }
+    }
+    fail('Class member not found');
+    return null;
+  }
+
   EvaluationResultImpl
       _evaluateInstanceCreationExpression(CompilationUnit compilationUnit,
       String name) {
@@ -4518,6 +4750,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ConstantVisitorTest extends ResolverTestCase {
   void test_visitConditionalExpression_false() {
     Expression thenExpression = AstFactory.integer(1);
@@ -4689,6 +4922,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ContentCacheTest {
   void test_setContents() {
     Source source = new TestSource();
@@ -4708,6 +4942,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DartObjectImplTest extends EngineTestCase {
   TypeProvider _typeProvider = new TestTypeProvider();
 
@@ -6956,6 +7191,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DartUriResolverTest {
   void test_creation() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
@@ -7001,6 +7237,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DeclaredVariablesTest extends EngineTestCase {
   void test_getBool_false() {
     TestTypeProvider typeProvider = new TestTypeProvider();
@@ -7102,6 +7339,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DirectoryBasedDartSdkTest {
   void fail_getDocFileFor() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
@@ -7214,6 +7452,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DirectoryBasedSourceContainerTest {
   void test_contains() {
     JavaFile dir = FileUtilities2.createFile("/does/not/exist");
@@ -7233,6 +7472,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ElementBuilderTest extends EngineTestCase {
   void test_visitCatchClause() {
     ElementHolder holder = new ElementHolder();
@@ -8489,6 +8729,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ElementLocatorTest extends ResolverTestCase {
   void fail_locate_ExportDirective() {
     AstNode id = _findNodeIn("export", "export 'dart:core';");
@@ -8959,6 +9200,7 @@
 }
 
 
+@ReflectiveTestCase()
 class EnumMemberBuilderTest extends EngineTestCase {
   void test_visitEnumDeclaration_multiple() {
     String firstName = "ONE";
@@ -9041,6 +9283,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ErrorReporterTest extends EngineTestCase {
   /**
    * Create a type with the given name in a compilation unit with the given name.
@@ -9093,6 +9336,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ErrorSeverityTest extends EngineTestCase {
   void test_max_error_error() {
     expect(
@@ -9150,6 +9394,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ExitDetectorTest extends ParserTestCase {
   void fail_doStatement_continue_with_label() {
     _assertFalse("{ x: do { continue x; } while(true); }");
@@ -9651,6 +9896,7 @@
 }
 
 
+@ReflectiveTestCase()
 class FileBasedSourceTest {
   void test_equals_false_differentFiles() {
     JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
@@ -9867,6 +10113,7 @@
 }
 
 
+@ReflectiveTestCase()
 class FileUriResolverTest {
   void test_creation() {
     expect(new FileUriResolver(), isNotNull);
@@ -9891,6 +10138,7 @@
 }
 
 
+@ReflectiveTestCase()
 class HtmlParserTest extends EngineTestCase {
   /**
    * The name of the 'script' tag in an HTML file.
@@ -10074,6 +10322,7 @@
 }
 
 
+@ReflectiveTestCase()
 class HtmlTagInfoBuilderTest extends HtmlParserTest {
   void test_builder() {
     HtmlTagInfoBuilder builder = new HtmlTagInfoBuilder();
@@ -10097,6 +10346,7 @@
 }
 
 
+@ReflectiveTestCase()
 class HtmlUnitBuilderTest extends EngineTestCase {
   AnalysisContextImpl _context;
   @override
@@ -10234,6 +10484,7 @@
 /**
  * Instances of the class `HtmlWarningCodeTest` test the generation of HTML warning codes.
  */
+@ReflectiveTestCase()
 class HtmlWarningCodeTest extends EngineTestCase {
   /**
    * The source factory used to create the sources to be resolved.
@@ -10344,6 +10595,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ReferenceFinderTest extends EngineTestCase {
   DirectedGraph<AstNode> _referenceGraph;
   Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
@@ -10506,6 +10758,7 @@
 }
 
 
+@ReflectiveTestCase()
 class SDKLibrariesReaderTest extends EngineTestCase {
   void test_readFrom_dart2js() {
     LibraryMap libraryMap = new SdkLibrariesReader(
@@ -10577,6 +10830,7 @@
 }
 
 
+@ReflectiveTestCase()
 class SourceFactoryTest {
   void test_creation() {
     expect(new SourceFactory([]), isNotNull);
@@ -10644,6 +10898,7 @@
 }
 
 
+@ReflectiveTestCase()
 class StringScannerTest extends AbstractScannerTest {
   @override
   ht.AbstractScanner newScanner(String input) {
@@ -10655,6 +10910,7 @@
 /**
  * Instances of the class `ToSourceVisitorTest`
  */
+@ReflectiveTestCase()
 class ToSourceVisitorTest extends EngineTestCase {
   void fail_visitHtmlScriptTagNode_attributes_content() {
     _assertSource(
@@ -10709,6 +10965,7 @@
 }
 
 
+@ReflectiveTestCase()
 class UriKindTest {
   void test_fromEncoding() {
     expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 7ab90f2..6e5127e 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -95,6 +95,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class BreadthFirstVisitorTest extends ParserTestCase {
   void test_it() {
     String source = r'''
@@ -146,6 +147,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ClassDeclarationTest extends ParserTestCase {
   void test_getConstructor() {
     List<ConstructorInitializer> initializers =
@@ -244,6 +246,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ClassTypeAliasTest extends ParserTestCase {
   void test_isAbstract() {
     expect(
@@ -261,6 +264,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
     Object value = _getConstantValue("?");
@@ -578,6 +582,7 @@
       ParserTestCase.parseExpression(source).accept(new ConstantEvaluator());
 }
 
+@ReflectiveTestCase()
 class ConstructorDeclarationTest extends EngineTestCase {
   void test_firstTokenAfterCommentAndMetadata_all_inverted() {
     Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
@@ -657,6 +662,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class IndexExpressionTest extends EngineTestCase {
   void test_inGetterContext_assignment_compound_left() {
     IndexExpression expression = AstFactory.indexExpression(
@@ -791,6 +797,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class NodeListTest extends EngineTestCase {
   void test_add() {
     AstNode parent = AstFactory.argumentList();
@@ -1018,6 +1025,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class NodeLocatorTest extends ParserTestCase {
   void test_range() {
     CompilationUnit unit =
@@ -1079,6 +1087,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class SimpleIdentifierTest extends ParserTestCase {
   void test_inDeclarationContext_catch_exception() {
     SimpleIdentifier identifier =
@@ -1397,6 +1406,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class SimpleStringLiteralTest extends ParserTestCase {
   void test_contentsEnd() {
     expect(
@@ -1610,6 +1620,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class StringInterpolationTest extends ParserTestCase {
   void test_contentsOffsetEnd() {
     AstFactory.interpolationExpression(AstFactory.identifier3('bb'));
@@ -1739,6 +1750,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ToSourceVisitorTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
     _assertSource(
@@ -4032,6 +4044,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class VariableDeclarationTest extends ParserTestCase {
   void test_getDocumentationComment_onGrandParent() {
     VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 353a98a..aad83d3 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -18,6 +18,7 @@
   runReflectiveTests(CompileTimeErrorCodeTest);
 }
 
+@ReflectiveTestCase()
 class CompileTimeErrorCodeTest extends ResolverTestCase {
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(r'''
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 2d8d933..61633db 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -40,6 +40,7 @@
   runReflectiveTests(MultiplyDefinedElementImplTest);
 }
 
+@ReflectiveTestCase()
 class AngularPropertyKindTest extends EngineTestCase {
   void test_ATTR() {
     AngularPropertyKind kind = AngularPropertyKind.ATTR;
@@ -72,6 +73,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ClassElementImplTest extends EngineTestCase {
   void test_getAllSupertypes_interface() {
     ClassElement classA = ElementFactory.classElement2("A");
@@ -909,6 +911,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class CompilationUnitElementImplTest extends EngineTestCase {
   void test_getEnum_declared() {
     TestTypeProvider typeProvider = new TestTypeProvider();
@@ -951,6 +954,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ElementImplTest extends EngineTestCase {
   void test_equals() {
     LibraryElementImpl library =
@@ -1046,6 +1050,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ElementKindTest extends EngineTestCase {
   void test_of_nonNull() {
     expect(
@@ -1058,6 +1063,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ElementLocationImplTest extends EngineTestCase {
   void test_create_encoding() {
     String encoding = "a;b;c";
@@ -1122,6 +1128,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class FunctionTypeImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -1720,6 +1727,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class HtmlElementImplTest extends EngineTestCase {
   void test_equals_differentSource() {
     AnalysisContextImpl context = createAnalysisContext();
@@ -1748,6 +1756,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class InterfaceTypeImplTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
@@ -3369,6 +3378,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryElementImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -3538,6 +3548,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class MultiplyDefinedElementImplTest extends EngineTestCase {
   void test_fromElements_conflicting() {
     Element firstElement = ElementFactory.localVariableElement2("xx");
@@ -3590,6 +3601,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class TypeParameterTypeImplTest extends EngineTestCase {
   void test_creation() {
     expect(
@@ -3718,6 +3730,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class UnionTypeImplTest extends EngineTestCase {
   ClassElement _classA;
 
@@ -3916,6 +3929,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class VoidTypeImplTest extends EngineTestCase {
   /**
    * Reference {code VoidTypeImpl.getInstance()}.
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index c18b03d..ad8a21d 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -35,7 +35,7 @@
 import 'package:watcher/src/utils.dart';
 
 import '../reflective_tests.dart';
-import 'all_the_rest.dart';
+import 'all_the_rest_test.dart';
 import 'resolver_test.dart';
 import 'test_support.dart';
 
@@ -68,6 +68,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AnalysisCacheTest extends EngineTestCase {
   void test_creation() {
     expect(new AnalysisCache(new List<CachePartition>(0)), isNotNull);
@@ -150,6 +151,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AnalysisContextImplTest extends EngineTestCase {
   /**
    * An analysis context whose source factory is [sourceFactory].
@@ -1885,6 +1887,23 @@
     expect(_getIncrementalAnalysisCache(_context), isNull);
   }
 
+  void test_setContents_unchanged_consistentModificationTime() {
+    String contents = "// foo";
+    Source source = _addSource("/test.dart", contents);
+    // do all, no tasks
+    _analyzeAll_assertFinished();
+    {
+      AnalysisResult result = _context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+    // set the same contents, still no tasks
+    _context.setContents(source, contents);
+    {
+      AnalysisResult result = _context.performAnalysisTask();
+      expect(result.changeNotices, isNull);
+    }
+  }
+
   void test_setSourceFactory() {
     expect(_context.sourceFactory, _sourceFactory);
     SourceFactory factory = new SourceFactory([]);
@@ -2084,6 +2103,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AnalysisOptionsImplTest extends EngineTestCase {
   void test_AnalysisOptionsImpl_copy() {
     bool booleanValue = true;
@@ -2224,6 +2244,7 @@
 }
 
 
+@ReflectiveTestCase()
 class AnalysisTaskTest extends EngineTestCase {
   void test_perform_exception() {
     InternalAnalysisContext context = new AnalysisContextImpl();
@@ -2239,6 +2260,7 @@
 }
 
 
+@ReflectiveTestCase()
 class DartEntryTest extends EngineTestCase {
   void test_allErrors() {
     Source source = new TestSource();
@@ -3743,6 +3765,7 @@
 }
 
 
+@ReflectiveTestCase()
 class GenerateDartErrorsTaskTest extends EngineTestCase {
   void test_accept() {
     GenerateDartErrorsTask task =
@@ -3870,6 +3893,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class GenerateDartHintsTaskTest extends EngineTestCase {
   void test_accept() {
     GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
@@ -3952,6 +3976,7 @@
 }
 
 
+@ReflectiveTestCase()
 class GetContentTaskTest extends EngineTestCase {
   void test_accept() {
     Source source = new TestSource('/test.dart', '');
@@ -4028,6 +4053,7 @@
 }
 
 
+@ReflectiveTestCase()
 class HtmlEntryTest extends EngineTestCase {
   void set state(DataDescriptor descriptor) {
     HtmlEntry entry = new HtmlEntry();
@@ -4277,6 +4303,7 @@
 }
 
 
+@ReflectiveTestCase()
 class IncrementalAnalysisCacheTest {
   Source _source = new TestSource();
   DartEntry _entry = new DartEntry();
@@ -4802,6 +4829,7 @@
 
 
 
+@ReflectiveTestCase()
 class IncrementalAnalysisTaskTest extends EngineTestCase {
   void test_accept() {
     IncrementalAnalysisTask task = new IncrementalAnalysisTask(null, null);
@@ -4877,6 +4905,7 @@
 }
 
 
+@ReflectiveTestCase()
 class InstrumentedAnalysisContextImplTest extends EngineTestCase {
   void test_addSourceInfo() {
     TestAnalysisContext_test_addSourceInfo innerContext =
@@ -5387,6 +5416,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ParseDartTaskTest extends EngineTestCase {
   void test_accept() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
@@ -5584,6 +5614,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ParseHtmlTaskTest extends EngineTestCase {
   ParseHtmlTask parseContents(String contents, TestLogger testLogger) {
     return parseSource(
@@ -5767,6 +5798,7 @@
 }
 
 
+@ReflectiveTestCase()
 class PartitionManagerTest extends EngineTestCase {
   void test_clearCache() {
     PartitionManager manager = new PartitionManager();
@@ -5796,6 +5828,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ResolveDartLibraryTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
@@ -5876,6 +5909,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ResolveDartUnitTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
@@ -5976,6 +6010,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ResolveHtmlTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
@@ -6074,6 +6109,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ScanDartTaskTest extends EngineTestCase {
   void test_accept() {
     ScanDartTask task = new ScanDartTask(null, null, null);
@@ -6137,6 +6173,7 @@
 }
 
 
+@ReflectiveTestCase()
 class SdkCachePartitionTest extends EngineTestCase {
   void test_contains_false() {
     SdkCachePartition partition = new SdkCachePartition(null, 8);
@@ -6158,6 +6195,7 @@
 }
 
 
+@ReflectiveTestCase()
 class SourcesChangedEventTest {
 
   void test_added() {
@@ -6192,8 +6230,8 @@
 
   void test_changedRange2() {
     var source = new StringSource('', '/test.dart');
-    var event = new SourcesChangedEvent.changedRange(
-        source, 'library A;', 0, 0, 13);
+    var event =
+        new SourcesChangedEvent.changedRange(source, 'library A;', 0, 0, 13);
     assertEvent(event, changedSources: [source]);
   }
 
@@ -6227,9 +6265,9 @@
     assertEvent(event, wereSourcesRemovedOrDeleted: true);
   }
 
-  static void assertEvent(SourcesChangedEvent event, {bool wereSourcesAdded: false,
-    List<Source> changedSources: Source.EMPTY_ARRAY,
-    bool wereSourcesRemovedOrDeleted: false}) {
+  static void assertEvent(SourcesChangedEvent event, {bool wereSourcesAdded:
+      false, List<Source> changedSources: Source.EMPTY_ARRAY,
+      bool wereSourcesRemovedOrDeleted: false}) {
     expect(event.wereSourcesAdded, wereSourcesAdded);
     expect(event.changedSources, changedSources);
     expect(event.wereSourcesRemovedOrDeleted, wereSourcesRemovedOrDeleted);
@@ -6240,9 +6278,8 @@
 class SourcesChangedListener {
   List<SourcesChangedEvent> actualEvents = [];
 
-  void assertEvent({bool wereSourcesAdded: false,
-      List<Source> changedSources: Source.EMPTY_ARRAY,
-      bool wereSourcesRemovedOrDeleted: false}) {
+  void assertEvent({bool wereSourcesAdded: false, List<Source> changedSources:
+      Source.EMPTY_ARRAY, bool wereSourcesRemovedOrDeleted: false}) {
     if (actualEvents.isEmpty) {
       fail('Expected event but found none');
     }
@@ -7297,6 +7334,7 @@
 }
 
 
+@ReflectiveTestCase()
 class UniversalCachePartitionTest extends EngineTestCase {
   void test_contains() {
     UniversalCachePartition partition =
@@ -7386,6 +7424,7 @@
 }
 
 
+@ReflectiveTestCase()
 class WorkManagerTest extends EngineTestCase {
   void test_addFirst() {
     TestSource source1 = new TestSource("/f1.dart");
diff --git a/pkg/analyzer/test/generated/incremental_resolver_test.dart b/pkg/analyzer/test/generated/incremental_resolver_test.dart
index 6398504..fe62b17 100644
--- a/pkg/analyzer/test/generated/incremental_resolver_test.dart
+++ b/pkg/analyzer/test/generated/incremental_resolver_test.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/incremental_logger.dart' as log;
 import 'package:analyzer/src/generated/incremental_resolver.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
@@ -33,9 +34,15 @@
 }
 
 
+@ReflectiveTestCase()
 class DeclarationMatcherTest extends ResolverTestCase {
+  void setUp() {
+    super.setUp();
+    test_resolveApiChanges = true;
+  }
+
   void test_false_class_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 ''', r'''
@@ -46,7 +53,7 @@
   }
 
   void test_false_class_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 class C {}
@@ -57,7 +64,7 @@
   }
 
   void test_false_class_typeParameters_bounds_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B<T> {
   T f;
@@ -71,7 +78,7 @@
   }
 
   void test_false_class_typeParameters_bounds_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B<T extends A> {
   T f;
@@ -85,7 +92,7 @@
   }
 
   void test_false_classMemberAccessor_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   get a => 1;
   get b => 2;
@@ -100,7 +107,7 @@
   }
 
   void test_false_classMemberAccessor_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   get a => 1;
   get b => 2;
@@ -115,7 +122,7 @@
   }
 
   void test_false_classMemberAccessor_wasGetter() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   get a => 1;
 }
@@ -127,7 +134,7 @@
   }
 
   void test_false_classMemberAccessor_wasInstance() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   get a => 1;
 }
@@ -139,7 +146,7 @@
   }
 
   void test_false_classMemberAccessor_wasSetter() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   set a(x) {}
 }
@@ -151,7 +158,7 @@
   }
 
   void test_false_classMemberAccessor_wasStatic() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   static get a => 1;
 }
@@ -163,7 +170,7 @@
   }
 
   void test_false_classTypeAlias_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class M {}
 class A = Object with M;
 ''', r'''
@@ -174,7 +181,7 @@
   }
 
   void test_false_classTypeAlias_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class M {}
 class A = Object with M;
 class B = Object with M;
@@ -185,7 +192,7 @@
   }
 
   void test_false_classTypeAlias_typeParameters_bounds_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class M<T> {}
 class A {}
 class B<T> = Object with M<T>;
@@ -197,7 +204,7 @@
   }
 
   void test_false_classTypeAlias_typeParameters_bounds_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class M<T> {}
 class A {}
 class B<T extends A> = Object with M<T>;
@@ -209,7 +216,7 @@
   }
 
   void test_false_constructor_parameters_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   A();
 }
@@ -221,7 +228,7 @@
   }
 
   void test_false_constructor_parameters_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   A(int p);
 }
@@ -233,7 +240,7 @@
   }
 
   void test_false_constructor_parameters_type_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   A(int p);
 }
@@ -245,7 +252,7 @@
   }
 
   void test_false_constructor_unnamed_add_hadParameters() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
 }
 ''', r'''
@@ -256,7 +263,7 @@
   }
 
   void test_false_constructor_unnamed_remove_hadParameters() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   A(int p) {}
 }
@@ -267,7 +274,7 @@
   }
 
   void test_false_defaultFieldFormalParameterElement_wasSimple() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   int field;
   A(int field);
@@ -282,7 +289,7 @@
 
   void test_false_enum_constants_add() {
     resetWithEnum();
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 enum E {A, B}
 ''', r'''
 enum E {A, B, C}
@@ -291,7 +298,7 @@
 
   void test_false_enum_constants_remove() {
     resetWithEnum();
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 enum E {A, B, C}
 ''', r'''
 enum E {A, B}
@@ -299,7 +306,7 @@
   }
 
   void test_false_export_hide_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async' hide Future;
 ''', r'''
 export 'dart:async' hide Future, Stream;
@@ -307,7 +314,7 @@
   }
 
   void test_false_export_hide_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async' hide Future, Stream;
 ''', r'''
 export 'dart:async' hide Future;
@@ -315,7 +322,7 @@
   }
 
   void test_false_export_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async';
 ''', r'''
 export 'dart:async';
@@ -324,7 +331,7 @@
   }
 
   void test_false_export_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async';
 export 'dart:math';
 ''', r'''
@@ -333,7 +340,7 @@
   }
 
   void test_false_export_show_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async' show Future;
 ''', r'''
 export 'dart:async' show Future, Stream;
@@ -341,7 +348,7 @@
   }
 
   void test_false_export_show_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 export 'dart:async' show Future, Stream;
 ''', r'''
 export 'dart:async' show Future;
@@ -349,7 +356,7 @@
   }
 
   void test_false_extendsClause_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 ''', r'''
@@ -359,7 +366,7 @@
   }
 
   void test_false_extendsClause_different() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 class C extends A {}
@@ -371,7 +378,7 @@
   }
 
   void test_false_extendsClause_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B extends A{}
 ''', r'''
@@ -381,7 +388,7 @@
   }
 
   void test_false_field_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   int A = 1;
   int C = 3;
@@ -396,7 +403,7 @@
   }
 
   void test_false_field_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   int A = 1;
   int B = 2;
@@ -411,7 +418,7 @@
   }
 
   void test_false_field_modifier_isConst() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   static final A = 1;
 }
@@ -423,7 +430,7 @@
   }
 
   void test_false_field_modifier_isFinal() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   int A = 1;
 }
@@ -435,7 +442,7 @@
   }
 
   void test_false_field_modifier_isStatic() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   int A = 1;
 }
@@ -447,7 +454,7 @@
   }
 
   void test_false_field_modifier_wasConst() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   static const A = 1;
 }
@@ -459,7 +466,7 @@
   }
 
   void test_false_field_modifier_wasFinal() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   final int A = 1;
 }
@@ -471,7 +478,7 @@
   }
 
   void test_false_field_modifier_wasStatic() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   static int A = 1;
 }
@@ -483,7 +490,7 @@
   }
 
   void test_false_field_type_differentArgs() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   List<int> A;
 }
@@ -495,7 +502,7 @@
   }
 
   void test_false_fieldFormalParameterElement_wasSimple() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   int field;
   A(int field);
@@ -509,7 +516,7 @@
   }
 
   void test_false_final_type_different() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class T {
   int A;
 }
@@ -521,7 +528,7 @@
   }
 
   void test_false_functionTypeAlias_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef A(int pa);
 typedef B(String pb);
 ''', r'''
@@ -532,7 +539,7 @@
   }
 
   void test_false_functionTypeAlias_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef A(int pa);
 typedef B(String pb);
 typedef C(pc);
@@ -543,7 +550,7 @@
   }
 
   void test_false_functionTypeAlias_parameters_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef A(a);
 ''', r'''
 typedef A(a, b);
@@ -551,7 +558,7 @@
   }
 
   void test_false_functionTypeAlias_parameters_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef A(a, b);
 ''', r'''
 typedef A(a);
@@ -559,7 +566,7 @@
   }
 
   void test_false_functionTypeAlias_parameters_type_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef A(int p);
 ''', r'''
 typedef A(String p);
@@ -567,7 +574,7 @@
   }
 
   void test_false_functionTypeAlias_returnType_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef int A();
 ''', r'''
 typedef String A();
@@ -575,7 +582,7 @@
   }
 
   void test_false_functionTypeAlias_typeParameters_bounds_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 typedef F<T>();
 ''', r'''
@@ -585,7 +592,7 @@
   }
 
   void test_false_functionTypeAlias_typeParameters_bounds_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 typedef F<T extends A>();
@@ -596,7 +603,7 @@
   }
 
   void test_false_functionTypeAlias_typeParameters_bounds_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 typedef F<T extends A>();
 ''', r'''
@@ -606,7 +613,7 @@
   }
 
   void test_false_functionTypeAlias_typeParameters_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef F<A>();
 ''', r'''
 typedef F<A, B>();
@@ -614,7 +621,7 @@
   }
 
   void test_false_functionTypeAlias_typeParameters_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 typedef F<A, B>();
 ''', r'''
 typedef F<A>();
@@ -622,7 +629,7 @@
   }
 
   void test_false_FunctionTypedFormalParameter_parameters_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int callback(int a)) {
 }
 ''', r'''
@@ -632,7 +639,7 @@
   }
 
   void test_false_FunctionTypedFormalParameter_parameters_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int callback(int a, String b)) {
 }
 ''', r'''
@@ -642,7 +649,7 @@
   }
 
   void test_false_FunctionTypedFormalParameter_parameterType() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int callback(int p)) {
 }
 ''', r'''
@@ -652,7 +659,7 @@
   }
 
   void test_false_FunctionTypedFormalParameter_returnType() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int callback()) {
 }
 ''', r'''
@@ -662,7 +669,7 @@
   }
 
   void test_false_FunctionTypedFormalParameter_wasSimple() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int callback) {
 }
 ''', r'''
@@ -672,7 +679,7 @@
   }
 
   void test_false_implementsClause_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 ''', r'''
@@ -682,7 +689,7 @@
   }
 
   void test_false_implementsClause_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B implements A {}
 ''', r'''
@@ -692,7 +699,7 @@
   }
 
   void test_false_implementsClause_reorder() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 class C implements A, B {}
@@ -704,7 +711,7 @@
   }
 
   void test_false_import_hide_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' hide Future;
 ''', r'''
 import 'dart:async' hide Future, Stream;
@@ -712,7 +719,7 @@
   }
 
   void test_false_import_hide_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' hide Future, Stream;
 ''', r'''
 import 'dart:async' hide Future;
@@ -720,7 +727,7 @@
   }
 
   void test_false_import_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async';
 ''', r'''
 import 'dart:async';
@@ -729,7 +736,7 @@
   }
 
   void test_false_import_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async';
 import 'dart:math';
 ''', r'''
@@ -738,7 +745,7 @@
   }
 
   void test_false_import_prefix_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async';
 ''', r'''
 import 'dart:async' as async;
@@ -746,7 +753,7 @@
   }
 
   void test_false_import_prefix_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' as oldPrefix;
 ''', r'''
 import 'dart:async' as newPrefix;
@@ -754,7 +761,7 @@
   }
 
   void test_false_import_prefix_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' as async;
 ''', r'''
 import 'dart:async';
@@ -762,7 +769,7 @@
   }
 
   void test_false_import_show_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' show Future;
 ''', r'''
 import 'dart:async' show Future, Stream;
@@ -770,7 +777,7 @@
   }
 
   void test_false_import_show_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 import 'dart:async' show Future, Stream;
 ''', r'''
 import 'dart:async' show Future;
@@ -778,7 +785,7 @@
   }
 
   void test_false_method_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   a() {}
   b() {}
@@ -793,7 +800,7 @@
   }
 
   void test_false_method_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {
   a() {}
   b() {}
@@ -807,8 +814,23 @@
 ''');
   }
 
+  void test_false_method_parameters_type_edit() {
+    // TODO
+    _assertDoesNotMatchOK(r'''
+class A {
+  m(int p) {
+  }
+}
+''', r'''
+class A {
+  m(String p) {
+  }
+}
+''');
+  }
+
   void test_false_method_returnType_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatchOK(r'''
 class A {
   int m() {}
 }
@@ -822,7 +844,7 @@
   void test_false_part_list_add() {
     addNamedSource('/unitA.dart', 'part of lib; class A {}');
     addNamedSource('/unitB.dart', 'part of lib; class B {}');
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 library lib;
 part 'unitA.dart';
 ''', r'''
@@ -835,7 +857,7 @@
   void test_false_part_list_remove() {
     addNamedSource('/unitA.dart', 'part of lib; class A {}');
     addNamedSource('/unitB.dart', 'part of lib; class B {}');
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 library lib;
 part 'unitA.dart';
 part 'unitB.dart';
@@ -846,7 +868,7 @@
   }
 
   void test_false_SimpleFormalParameter_named_differentName() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main({int oldName}) {
 }
 ''', r'''
@@ -856,7 +878,7 @@
   }
 
   void test_false_SimpleFormalParameter_namedDefault_addValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main({int p}) {
 }
 ''', r'''
@@ -866,7 +888,7 @@
   }
 
   void test_false_SimpleFormalParameter_namedDefault_differentValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main({int p: 1}) {
 }
 ''', r'''
@@ -876,7 +898,7 @@
   }
 
   void test_false_SimpleFormalParameter_namedDefault_removeValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main({int p: 1}) {
 }
 ''', r'''
@@ -886,7 +908,7 @@
   }
 
   void test_false_SimpleFormalParameter_optionalDefault_addValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main([int p]) {
 }
 ''', r'''
@@ -896,7 +918,7 @@
   }
 
   void test_false_SimpleFormalParameter_optionalDefault_differentValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main([int p = 1]) {
 }
 ''', r'''
@@ -906,7 +928,7 @@
   }
 
   void test_false_SimpleFormalParameter_optionalDefault_removeValue() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main([int p = 1]) {
 }
 ''', r'''
@@ -916,7 +938,7 @@
   }
 
   void test_false_topLevelAccessor_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 get a => 1;
 get b => 2;
 ''', r'''
@@ -927,7 +949,7 @@
   }
 
   void test_false_topLevelAccessor_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 get a => 1;
 get b => 2;
 get c => 3;
@@ -938,7 +960,7 @@
   }
 
   void test_false_topLevelAccessor_wasGetter() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 get a => 1;
 ''', r'''
 set a(x) {}
@@ -946,7 +968,7 @@
   }
 
   void test_false_topLevelAccessor_wasSetter() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 set a(x) {}
 ''', r'''
 get a => 1;
@@ -954,7 +976,7 @@
   }
 
   void test_false_topLevelFunction_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 a() {}
 b() {}
 ''', r'''
@@ -965,7 +987,7 @@
   }
 
   void test_false_topLevelFunction_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 a() {}
 b() {}
 c() {}
@@ -976,7 +998,7 @@
   }
 
   void test_false_topLevelFunction_parameters_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int a, int b) {
 }
 ''', r'''
@@ -986,7 +1008,7 @@
   }
 
   void test_false_topLevelFunction_parameters_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int a, int b, int c) {
 }
 ''', r'''
@@ -996,7 +1018,7 @@
   }
 
   void test_false_topLevelFunction_parameters_type_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 main(int a, int b, int c) {
 }
 ''', r'''
@@ -1006,7 +1028,7 @@
   }
 
   void test_false_topLevelFunction_returnType_edit() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 int a() {}
 ''', r'''
 String a() {}
@@ -1014,7 +1036,7 @@
   }
 
   void test_false_topLevelVariable_list_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 const int A = 1;
 const int C = 3;
 ''', r'''
@@ -1025,7 +1047,7 @@
   }
 
   void test_false_topLevelVariable_list_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 const int A = 1;
 const int B = 2;
 const int C = 3;
@@ -1036,7 +1058,7 @@
   }
 
   void test_false_topLevelVariable_modifier_isConst() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 final int A = 1;
 ''', r'''
 const int A = 1;
@@ -1044,7 +1066,7 @@
   }
 
   void test_false_topLevelVariable_modifier_isFinal() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 int A = 1;
 ''', r'''
 final int A = 1;
@@ -1052,7 +1074,7 @@
   }
 
   void test_false_topLevelVariable_modifier_wasConst() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 const int A = 1;
 ''', r'''
 final int A = 1;
@@ -1060,7 +1082,7 @@
   }
 
   void test_false_topLevelVariable_modifier_wasFinal() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 final int A = 1;
 ''', r'''
 int A = 1;
@@ -1068,7 +1090,7 @@
   }
 
   void test_false_topLevelVariable_synthetic_wasGetter() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 int get A => 1;
 ''', r'''
 final int A = 1;
@@ -1076,7 +1098,7 @@
   }
 
   void test_false_topLevelVariable_type_different() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 int A;
 ''', r'''
 String A;
@@ -1084,7 +1106,7 @@
   }
 
   void test_false_topLevelVariable_type_differentArgs() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 List<int> A;
 ''', r'''
 List<String> A;
@@ -1092,7 +1114,7 @@
   }
 
   void test_false_type_noTypeArguments_hadTypeArguments() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A<T> {}
 A<int> main() {
 }
@@ -1104,7 +1126,7 @@
   }
 
   void test_false_withClause_add() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 ''', r'''
@@ -1114,7 +1136,7 @@
   }
 
   void test_false_withClause_remove() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B extends Object with A {}
 ''', r'''
@@ -1124,7 +1146,7 @@
   }
 
   void test_false_withClause_reorder() {
-    _assertCompilationUnitMatches(false, r'''
+    _assertDoesNotMatch(r'''
 class A {}
 class B {}
 class C extends Object with A, B {}
@@ -1136,7 +1158,7 @@
   }
 
   void test_true_class_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {}
 class B {}
 class C {}
@@ -1148,7 +1170,7 @@
   }
 
   void test_true_class_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {}
 class B {}
 class C {}
@@ -1160,7 +1182,7 @@
   }
 
   void test_true_class_typeParameters_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A<T> {}
 ''', r'''
 class A<T> {}
@@ -1168,7 +1190,7 @@
   }
 
   void test_true_classMemberAccessor_getterSetter() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   int _test;
   get test => _test;
@@ -1188,7 +1210,7 @@
   }
 
   void test_true_classMemberAccessor_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   get a => 1;
   get b => 2;
@@ -1204,7 +1226,7 @@
   }
 
   void test_true_classMemberAccessor_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   get a => 1;
   get b => 2;
@@ -1220,7 +1242,7 @@
   }
 
   void test_true_classTypeAlias_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class M {}
 class A = Object with M;
 class B = Object with M;
@@ -1234,7 +1256,7 @@
   }
 
   void test_true_classTypeAlias_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class M {}
 class A = Object with M;
 class B = Object with M;
@@ -1248,7 +1270,7 @@
   }
 
   void test_true_classTypeAlias_typeParameters_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class M<T> {}
 class A<T> {}
 class B<T> = A<T> with M<T>;
@@ -1260,7 +1282,7 @@
   }
 
   void test_true_constructor_named_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   A.name(int p);
 }
@@ -1272,7 +1294,7 @@
   }
 
   void test_true_constructor_unnamed_add_noParameters() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
 }
 ''', r'''
@@ -1283,7 +1305,7 @@
   }
 
   void test_true_constructor_unnamed_remove_noParameters() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   A() {}
 }
@@ -1294,7 +1316,7 @@
   }
 
   void test_true_constructor_unnamed_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   A(int p);
 }
@@ -1306,7 +1328,7 @@
   }
 
   void test_true_defaultFieldFormalParameterElement() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   int field;
   A([this.field = 0]);
@@ -1321,7 +1343,7 @@
 
   void test_true_enum_constants_reorder() {
     resetWithEnum();
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 enum E {A, B, C}
 ''', r'''
 enum E {C, A, B}
@@ -1330,7 +1352,7 @@
 
   void test_true_enum_list_reorder() {
     resetWithEnum();
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 enum A {A1, A2, A3}
 enum B {B1, B2, B3}
 enum C {C1, C2, C3}
@@ -1343,7 +1365,7 @@
 
   void test_true_enum_list_same() {
     resetWithEnum();
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 enum A {A1, A2, A3}
 enum B {B1, B2, B3}
 enum C {C1, C2, C3}
@@ -1355,7 +1377,7 @@
   }
 
   void test_true_executable_same_hasLabel() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main() {
   label: return 42;
 }
@@ -1367,7 +1389,7 @@
   }
 
   void test_true_executable_same_hasLocalVariable() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main() {
   int a = 42;
 }
@@ -1379,7 +1401,7 @@
   }
 
   void test_true_export_hide_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 export 'dart:async' hide Future, Stream;
 ''', r'''
 export 'dart:async' hide Stream, Future;
@@ -1387,7 +1409,7 @@
   }
 
   void test_true_export_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 export 'dart:async';
 export 'dart:math';
 ''', r'''
@@ -1397,7 +1419,7 @@
   }
 
   void test_true_export_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 export 'dart:async';
 export 'dart:math';
 ''', r'''
@@ -1407,7 +1429,7 @@
   }
 
   void test_true_export_show_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 export 'dart:async' show Future, Stream;
 ''', r'''
 export 'dart:async' show Stream, Future;
@@ -1415,7 +1437,7 @@
   }
 
   void test_true_extendsClause_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {}
 class B extends A {}
 ''', r'''
@@ -1425,7 +1447,7 @@
   }
 
   void test_true_field_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class T {
   int A = 1;
   int B = 2;
@@ -1441,7 +1463,7 @@
   }
 
   void test_true_field_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class T {
   int A = 1;
   int B = 2;
@@ -1457,7 +1479,7 @@
   }
 
   void test_true_fieldFormalParameter() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   int field;
   A(this.field);
@@ -1471,7 +1493,7 @@
   }
 
   void test_true_functionTypeAlias_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 typedef A(int pa);
 typedef B(String pb);
 typedef C(pc);
@@ -1483,7 +1505,7 @@
   }
 
   void test_true_functionTypeAlias_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 typedef String A(int pa);
 typedef int B(String pb);
 typedef C(pc);
@@ -1495,7 +1517,7 @@
   }
 
   void test_true_functionTypeAlias_typeParameters_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 typedef F<A, B, C>();
 ''', r'''
 typedef F<A, B, C>();
@@ -1503,7 +1525,7 @@
   }
 
   void test_true_FunctionTypedFormalParameter() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main(int callback(int a, String b)) {
 }
 ''', r'''
@@ -1513,7 +1535,7 @@
   }
 
   void test_true_implementsClause_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {}
 class B implements A {}
 ''', r'''
@@ -1523,7 +1545,7 @@
   }
 
   void test_true_import_hide_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async' hide Future, Stream;
 ''', r'''
 import 'dart:async' hide Stream, Future;
@@ -1531,7 +1553,7 @@
   }
 
   void test_true_import_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async';
 import 'dart:math';
 ''', r'''
@@ -1541,7 +1563,7 @@
   }
 
   void test_true_import_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async';
 import 'dart:math';
 ''', r'''
@@ -1551,7 +1573,7 @@
   }
 
   void test_true_import_prefix() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async' as async;
 ''', r'''
 import 'dart:async' as async;
@@ -1559,7 +1581,7 @@
   }
 
   void test_true_import_show_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async' show Future, Stream;
 ''', r'''
 import 'dart:async' show Stream, Future;
@@ -1567,7 +1589,7 @@
   }
 
   void test_true_method_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   a() {}
   b() {}
@@ -1583,7 +1605,7 @@
   }
 
   void test_true_method_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   a() {}
   b() {}
@@ -1599,7 +1621,7 @@
   }
 
   void test_true_method_operator_minus() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   operator -(other) {}
 }
@@ -1611,7 +1633,7 @@
   }
 
   void test_true_method_operator_minusUnary() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   operator -() {}
 }
@@ -1623,7 +1645,7 @@
   }
 
   void test_true_method_operator_plus() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {
   operator +(other) {}
 }
@@ -1634,10 +1656,24 @@
 ''');
   }
 
+  void test_true_method_parameters_type_functionType() {
+    _assertMatches(r'''
+typedef F();
+class A {
+  m(F p) {}
+}
+''', r'''
+typedef F();
+class A {
+  m(F p) {}
+}
+''');
+  }
+
   void test_true_part_list_reorder() {
     addNamedSource('/unitA.dart', 'part of lib; class A {}');
     addNamedSource('/unitB.dart', 'part of lib; class B {}');
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 library lib;
 part 'unitA.dart';
 part 'unitB.dart';
@@ -1651,7 +1687,7 @@
   void test_true_part_list_same() {
     addNamedSource('/unitA.dart', 'part of lib; class A {}');
     addNamedSource('/unitB.dart', 'part of lib; class B {}');
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 library lib;
 part 'unitA.dart';
 part 'unitB.dart';
@@ -1663,7 +1699,7 @@
   }
 
   void test_true_SimpleFormalParameter_optional_differentName() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main([int oldName]) {
 }
 ''', r'''
@@ -1673,7 +1709,7 @@
   }
 
   void test_true_SimpleFormalParameter_optionalDefault_differentName() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main([int oldName = 1]) {
 }
 ''', r'''
@@ -1683,7 +1719,7 @@
   }
 
   void test_true_SimpleFormalParameter_required_differentName() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 main(int oldName) {
 }
 ''', r'''
@@ -1693,7 +1729,7 @@
   }
 
   void test_true_topLevelAccessor_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 set a(x) {}
 set b(x) {}
 set c(x) {}
@@ -1705,7 +1741,7 @@
   }
 
   void test_true_topLevelAccessor_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 get a => 1;
 get b => 2;
 get c => 3;
@@ -1717,7 +1753,7 @@
   }
 
   void test_true_topLevelFunction_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 a() {}
 b() {}
 c() {}
@@ -1729,7 +1765,7 @@
   }
 
   void test_true_topLevelFunction_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 a() {}
 b() {}
 c() {}
@@ -1741,7 +1777,7 @@
   }
 
   void test_true_topLevelVariable_list_reorder() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 const int A = 1;
 const int B = 2;
 const int C = 3;
@@ -1753,7 +1789,7 @@
   }
 
   void test_true_topLevelVariable_list_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 const int A = 1;
 const int B = 2;
 const int C = 3;
@@ -1765,7 +1801,7 @@
   }
 
   void test_true_topLevelVariable_type_sameArgs() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 Map<int, String> A;
 ''', r'''
 Map<int, String> A;
@@ -1773,7 +1809,7 @@
   }
 
   void test_true_type_dynamic() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 dynamic a() {}
 ''', r'''
 dynamic a() {}
@@ -1781,7 +1817,7 @@
   }
 
   void test_true_type_hasImportPrefix() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 import 'dart:async' as async;
 async.Future F;
 ''', r'''
@@ -1791,7 +1827,7 @@
   }
 
   void test_true_type_noTypeArguments_implyAllDynamic() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A<T> {}
 A main() {
 }
@@ -1803,7 +1839,7 @@
   }
 
   void test_true_type_void() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 void a() {}
 ''', r'''
 void a() {}
@@ -1811,7 +1847,7 @@
   }
 
   void test_true_withClause_same() {
-    _assertCompilationUnitMatches(true, r'''
+    _assertMatches(r'''
 class A {}
 class B extends Object with A {}
 ''', r'''
@@ -1820,24 +1856,68 @@
 ''');
   }
 
-  void _assertCompilationUnitMatches(bool expectMatch, String oldContent,
+  void _assertDoesNotMatch(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MISMATCH, oldContent, newContent);
+  }
+
+  void _assertDoesNotMatchOK(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MISMATCH_OK, oldContent, newContent);
+  }
+
+  void _assertMatches(String oldContent, String newContent) {
+    _assertMatchKind(DeclarationMatchKind.MATCH, oldContent, newContent);
+  }
+
+  void _assertMatchKind(DeclarationMatchKind expectMatch, String oldContent,
       String newContent) {
     Source source = addSource(oldContent);
     LibraryElement library = resolve(source);
     CompilationUnit oldUnit = resolveCompilationUnit(source, library);
+    // parse
     CompilationUnit newUnit = ParserTestCase.parseCompilationUnit(newContent);
+    // build elements
+    {
+      ElementHolder holder = new ElementHolder();
+      ElementBuilder builder = new ElementBuilder(holder);
+      newUnit.accept(builder);
+    }
+    // match
     DeclarationMatcher matcher = new DeclarationMatcher();
-    expect(matcher.matches(newUnit, oldUnit.element), expectMatch);
+    DeclarationMatchKind matchKind = matcher.matches(newUnit, oldUnit.element);
+    expect(matchKind, same(expectMatch));
   }
 }
 
 
+@ReflectiveTestCase()
 class IncrementalResolverTest extends ResolverTestCase {
   Source source;
   String code;
   LibraryElement library;
   CompilationUnit unit;
 
+  void setUp() {
+    super.setUp();
+    test_resolveApiChanges = true;
+  }
+
+  void test_api_method_edit_returnType() {
+    _resolveUnit(r'''
+class A {
+  int m() {
+    return null;
+  }
+}
+main() {
+  A a = new A();
+  var v = a.m();
+}
+''');
+    _resolve(_editString('int m', 'String m'), _isDeclaration);
+    // We don't add or fix an error, but we verify that type of "v"
+    // is updated from "int" to "String".
+  }
+
   void test_classMemberAccessor_body() {
     _resolveUnit(r'''
 class A {
@@ -1879,6 +1959,28 @@
     _resolve(_editString('+', '*'), _isExpression);
   }
 
+  void test_constructor_label_add() {
+    _resolveUnit(r'''
+class A {
+  A() {
+    return 42;
+  }
+}
+''');
+    _resolve(_editString('return', 'label: return'), _isBlock);
+  }
+
+  void test_constructor_localVariable_add() {
+    _resolveUnit(r'''
+class A {
+  A() {
+    42;
+  }
+}
+''');
+    _resolve(_editString('42;', 'var res = 42;'), _isBlock);
+  }
+
   void test_constructor_superConstructorInvocation() {
     _resolveUnit(r'''
 class A {
@@ -1891,6 +1993,16 @@
     _resolve(_editString('+', '*'), _isExpression);
   }
 
+  void test_function_localFunction_add() {
+    _resolveUnit(r'''
+int main() {
+  return 0;
+}
+callIt(f) {}
+''');
+    _resolve(_editString('return 0;', 'callIt((p) {});'), _isBlock);
+  }
+
   void test_functionBody_body() {
     _resolveUnit(r'''
 main(int a, int b) {
@@ -1935,6 +2047,18 @@
     _resolve(_editString('return', 'label: return'), _isBlock);
   }
 
+  void test_method_localFunction_add() {
+    _resolveUnit(r'''
+class A {
+  int m() {
+    return 0;
+  }
+}
+callIt(f) {}
+''');
+    _resolve(_editString('return 0;', 'callIt((p) {});'), _isBlock);
+  }
+
   void test_method_localVariable_add() {
     _resolveUnit(r'''
 class A {
@@ -2086,26 +2210,27 @@
         edit.replacement +
         code.substring(offset + edit.length);
     CompilationUnit newUnit = _parseUnit(newCode);
+    // replace the node
+    AstNode oldNode = _findNodeAt(unit, offset, predicate);
+    AstNode newNode = _findNodeAt(newUnit, offset, predicate);
+    {
+      bool success = NodeReplacer.replace(oldNode, newNode);
+      expect(success, isTrue);
+    }
     // update tokens
     {
       int delta = edit.replacement.length - edit.length;
       _shiftTokens(unit.beginToken, offset, delta);
     }
-    // replace the node
-    AstNode oldNode = _findNodeAt(unit, offset, predicate);
-    AstNode newNode = _findNodeAt(newUnit, offset, predicate);
-    bool success = NodeReplacer.replace(oldNode, newNode);
-    expect(success, isTrue);
     // do incremental resolution
     IncrementalResolver resolver = new IncrementalResolver(
         typeProvider,
-        library,
         unit.element,
-        source,
         edit.offset,
         edit.length,
         edit.replacement.length);
-    resolver.resolve(newNode);
+    bool success = resolver.resolve(newNode);
+    expect(success, isTrue);
     // resolve "newCode" from scratch
     CompilationUnit fullNewUnit;
     {
@@ -2166,6 +2291,7 @@
  * The test for [poorMansIncrementalResolution] function and its integration
  * into [AnalysisContext].
  */
+@ReflectiveTestCase()
 class PoorMansIncrementalResolutionTest extends ResolverTestCase {
   Source source;
   String code;
@@ -2178,6 +2304,217 @@
     _resetWithIncremental(true);
   }
 
+  void test_dartDoc_beforeField() {
+    _resolveUnit(r'''
+class A {
+  /**
+   * A field [field] of type [int] in class [A].
+   */
+  int field;
+}
+''');
+    _updateAndValidate(r'''
+class A {
+  /**
+   * A field [field] of the type [int] in the class [A].
+   * Updated, with a reference to the [String] type.
+   */
+  int field;
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_addReference() {
+    _resolveUnit(r'''
+/**
+ * aaa bbbb
+ */
+main() {
+}
+''');
+    _updateAndValidate(r'''
+/**
+ * aaa [main] bbbb
+ */
+main() {
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_removeReference() {
+    _resolveUnit(r'''
+/**
+ * aaa [main] bbbb
+ */
+main() {
+}
+''');
+    _updateAndValidate(r'''
+/**
+ * aaa bbbb
+ */
+main() {
+}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_beforeKeywordToken() {
+    _resolveUnit(r'''
+/**
+ * A comment with the [int] type reference.
+ */
+class A {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A comment with the [int] type reference.
+ * Plus reference to [A] itself.
+ */
+class A {}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_insert() {
+    _resolveUnit(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ * Inserted text with [String] reference.
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+  }
+
+  void test_dartDoc_clumsy_updateText_remove() {
+    _resolveUnit(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ * Some text with [String] reference to remove.
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+    _updateAndValidate(r'''
+/**
+ * A function [main] with a parameter [p] of type [int].
+ */
+main(int p) {
+}
+/**
+ * Other comment with [int] reference.
+ */
+foo() {}
+''');
+  }
+
+  void test_dartDoc_elegant_addReference() {
+    _resolveUnit(r'''
+/// aaa bbb
+main() {
+  return 1;
+}
+''');
+    _updateAndValidate(r'''
+/// aaa [main] bbb
+/// ccc [int] ddd
+main() {
+  return 2;
+}
+''');
+  }
+
+  void test_dartDoc_elegant_removeReference() {
+    _resolveUnit(r'''
+/// aaa [main] bbb
+/// ccc [int] ddd
+main() {
+  return 1;
+}
+''');
+    _updateAndValidate(r'''
+/// aaa bbb
+main() {
+  return 2;
+}
+''');
+  }
+
+  void test_endOfLineComment_add_beforeKeywordToken() {
+    _resolveUnit(r'''
+main() {
+  var v = 42;
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // some comment
+  var v = 42;
+}
+''');
+  }
+
+  void test_endOfLineComment_add_beforeStringToken() {
+    _resolveUnit(r'''
+main() {
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+  }
+
+  void test_endOfLineComment_edit() {
+    _resolveUnit(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  // edited comment text
+  print(0);
+}
+''');
+  }
+
+  void test_endOfLineComment_remove() {
+    _resolveUnit(r'''
+main() {
+  // some comment
+  print(0);
+}
+''');
+    _updateAndValidate(r'''
+main() {
+  print(0);
+}
+''');
+  }
+
   void test_false_topLevelFunction_name() {
     _resolveUnit(r'''
 a() {}
@@ -2425,6 +2762,18 @@
 ''');
   }
 
+  void test_updateErrors_addNew_hint() {
+    _resolveUnit(r'''
+int main() {
+  return 42;
+}
+''');
+    _updateAndValidate(r'''
+int main() {
+}
+''');
+  }
+
   void test_updateErrors_addNew_hints() {
     _resolveUnit(r'''
 main() {
@@ -2495,7 +2844,19 @@
 ''');
   }
 
-  void test_updateErrors_removeExisting() {
+  void test_updateErrors_removeExisting_hint() {
+    _resolveUnit(r'''
+int main() {
+}
+''');
+    _updateAndValidate(r'''
+int main() {
+  return 42;
+}
+''');
+  }
+
+  void test_updateErrors_removeExisting_verify() {
     _resolveUnit(r'''
 f1() {
   print(1)
@@ -2552,6 +2913,8 @@
   void _resetWithIncremental(bool enable) {
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.incremental = enable;
+//    log.logger = log.PRINT_LOGGER;
+    log.logger = log.NULL_LOGGER;
     analysisContext2.analysisOptions = analysisOptions;
   }
 
@@ -2650,6 +3013,22 @@
 //      print('$incrToken @ ${incrToken.offset}');
 //      print('$fullToken @ ${fullToken.offset}');
       _assertEqualToken(incrToken, fullToken);
+      // comments
+      {
+        Token incrComment = incrToken.precedingComments;
+        Token fullComment = fullToken.precedingComments;
+        while (true) {
+          if (fullComment == null) {
+            expect(incrComment, isNull);
+            break;
+          }
+          expect(incrComment, isNotNull);
+          _assertEqualToken(incrComment, fullComment);
+          incrComment = incrComment.next;
+          fullComment = fullComment.next;
+        }
+      }
+      // next tokens
       incrToken = incrToken.next;
       fullToken = fullToken.next;
     }
@@ -2657,6 +3036,7 @@
 }
 
 
+@ReflectiveTestCase()
 class ResolutionContextBuilderTest extends EngineTestCase {
   GatheringErrorListener listener = new GatheringErrorListener();
 
@@ -3667,7 +4047,9 @@
   }
 
   void _verifyType(DartType a, DartType b) {
-    expect(a, equals(b));
+    if (a != b) {
+      fail('Expected: $b\n  Actual: $a');
+    }
   }
 
   void _visitAnnotatedNode(AnnotatedNode node, AnnotatedNode other) {
@@ -3705,6 +4087,8 @@
       expect(other, isNull);
     } else {
       this.other = other;
+      expect(node.offset, other.offset);
+      expect(node.length, other.length);
       node.accept(this);
     }
   }
diff --git a/pkg/analyzer/test/generated/incremental_scanner_test.dart b/pkg/analyzer/test/generated/incremental_scanner_test.dart
index 37cd800..36a84f8 100644
--- a/pkg/analyzer/test/generated/incremental_scanner_test.dart
+++ b/pkg/analyzer/test/generated/incremental_scanner_test.dart
@@ -17,6 +17,7 @@
   runReflectiveTests(IncrementalScannerTest);
 }
 
+@ReflectiveTestCase()
 class IncrementalScannerTest extends EngineTestCase {
   /**
    * The first token from the token stream resulting from parsing the original
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 3a4fc78..0d8debe 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -22,6 +22,7 @@
   runReflectiveTests(NonErrorResolverTest);
 }
 
+@ReflectiveTestCase()
 class NonErrorResolverTest extends ResolverTestCase {
   void fail_undefinedEnumConstant() {
     Source source = addSource(r'''
@@ -1401,6 +1402,29 @@
     verify([source]);
   }
 
+  void test_implicitConstructorDependencies() {
+    // No warning should be generated for the code below; this requires that
+    // implicit constructors are generated for C1 before C2, even though C1
+    // follows C2 in the file.  See dartbug.com/21600.
+    Source source = addSource(r'''
+class B {
+  B(int i);
+}
+class M1 {}
+class M2 {}
+
+class C2 = C1 with M2;
+class C1 = B with M1;
+
+main() {
+  new C2(5);
+}
+''');
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_implicitThisReferenceInInitializer_constructorName() {
     Source source = addSource(r'''
 class A {
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 89a8213..361bbb0 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -123,6 +123,7 @@
  *
  * Simpler tests should be defined in the class [SimpleParserTest].
  */
+@ReflectiveTestCase()
 class ComplexParserTest extends ParserTestCase {
   void test_additiveExpression_normal() {
     BinaryExpression expression = ParserTestCase.parseExpression("x + y - z");
@@ -583,6 +584,7 @@
  * The class `ErrorParserTest` defines parser tests that test the parsing of code to ensure
  * that errors are correctly reported, and in some cases, not reported.
  */
+@ReflectiveTestCase()
 class ErrorParserTest extends ParserTestCase {
   void fail_expectedListOrMapLiteral() {
     // It isn't clear that this test can ever pass. The parser is currently
@@ -840,6 +842,18 @@
     ParserTestCase.parseStatement("() {for (; x;) {break;}};");
   }
 
+  void test_classInClass_abstract() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { abstract class B {} }",
+        [ParserErrorCode.CLASS_IN_CLASS]);
+  }
+
+  void test_classInClass_nonAbstract() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { class B {} }",
+        [ParserErrorCode.CLASS_IN_CLASS]);
+  }
+
   void test_classTypeAlias_abstractAfterEq() {
     // This syntax has been removed from the language in favor of
     // "abstract class A = B with C;" (issue 18098).
@@ -850,6 +864,12 @@
         [ParserErrorCode.EXPECTED_TOKEN, ParserErrorCode.EXPECTED_TOKEN]);
   }
 
+  void test_colonInPlaceOfIn() {
+    ParserTestCase.parseStatement(
+        "for (var x : list) {}",
+        [ParserErrorCode.COLON_IN_PLACE_OF_IN]);
+  }
+
   void test_constAndFinal() {
     ParserTestCase.parse3(
         "parseClassMember",
@@ -1921,6 +1941,22 @@
         [ParserErrorCode.MISSING_KEYWORD_OPERATOR]);
   }
 
+  void test_missingMethodParameters_void_block() {
+    ParserTestCase.parse3(
+        "parseClassMember",
+        <Object>["C"],
+        "void m {} }",
+        [ParserErrorCode.MISSING_METHOD_PARAMETERS]);
+  }
+
+  void test_missingMethodParameters_void_expression() {
+    ParserTestCase.parse3(
+        "parseClassMember",
+        <Object>["C"],
+        "void m => null; }",
+        [ParserErrorCode.MISSING_METHOD_PARAMETERS]);
+  }
+
   void test_missingNameInLibraryDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(
         "library;",
@@ -2324,6 +2360,18 @@
         [ParserErrorCode.TOP_LEVEL_OPERATOR]);
   }
 
+  void test_typedefInClass_withoutReturnType() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { typedef F(x); }",
+        [ParserErrorCode.TYPEDEF_IN_CLASS]);
+  }
+
+  void test_typedefInClass_withReturnType() {
+    ParserTestCase.parseCompilationUnit(
+        "class C { typedef int F(int x); }",
+        [ParserErrorCode.TYPEDEF_IN_CLASS]);
+  }
+
   void test_unexpectedTerminatorForParameterGroup_named() {
     ParserTestCase.parse4(
         "parseFormalParameterList",
@@ -2338,6 +2386,18 @@
         [ParserErrorCode.UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP]);
   }
 
+  void test_unexpectedToken_endOfFieldDeclarationStatement() {
+    ParserTestCase.parseStatement(
+        "String s = (null));",
+        [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
+  void test_unexpectedToken_returnInExpressionFuntionBody() {
+    ParserTestCase.parseCompilationUnit(
+        "f() => return null;",
+        [ParserErrorCode.UNEXPECTED_TOKEN]);
+  }
+
   void test_unexpectedToken_semicolonBetweenClassMembers() {
     ParserTestCase.parse3(
         "parseClassDeclaration",
@@ -2518,6 +2578,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class IncrementalParserTest extends EngineTestCase {
   void fail_replace_identifier_with_functionLiteral_in_initializer_interp() {
     // TODO(paulberry, brianwilkerson): broken due to incremental scanning bugs
@@ -2908,6 +2969,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class NonErrorParserTest extends ParserTestCase {
   void test_constFactory_external() {
     ParserTestCase.parse(
@@ -3211,6 +3273,7 @@
  * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
  */
+@ReflectiveTestCase()
 class RecoveryParserTest extends ParserTestCase {
   void fail_incomplete_returnType() {
     ParserTestCase.parseCompilationUnit(r'''
@@ -4278,6 +4341,12 @@
         expression.leftOperand);
   }
 
+  void test_nonStringLiteralUri_import() {
+    ParserTestCase.parseCompilationUnit(
+        "import dart:io; class C {}",
+        [ParserErrorCode.NON_STRING_LITERAL_AS_URI]);
+  }
+
   void test_prefixExpression_missing_operand_minus() {
     PrefixExpression expression =
         ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
@@ -4450,6 +4519,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ResolutionCopierTest extends EngineTestCase {
   void test_visitAnnotation() {
     String annotationName = "proxy";
@@ -5099,6 +5169,7 @@
  *
  * More complex tests should be defined in the class [ComplexParserTest].
  */
+@ReflectiveTestCase()
 class SimpleParserTest extends ParserTestCase {
   void fail_parseCommentReference_this() {
     // This fails because we are returning null from the method and asserting
@@ -6742,24 +6813,44 @@
   }
 
   void test_parseCommentReferences_multiLine() {
-    List<Token> tokens = <Token>[
-        new StringToken(TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [b] zzz */", 3)];
+    DocumentationCommentToken token = new DocumentationCommentToken(
+        TokenType.MULTI_LINE_COMMENT,
+        "/** xxx [a] yyy [bb] zzz */",
+        3);
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[token];
     List<CommentReference> references =
         ParserTestCase.parse("parseCommentReferences", <Object>[tokens], "");
+    List<Token> tokenReferences = token.references;
     expect(references, hasLength(2));
-    CommentReference reference = references[0];
-    expect(reference, isNotNull);
-    expect(reference.identifier, isNotNull);
-    expect(reference.offset, 12);
-    reference = references[1];
-    expect(reference, isNotNull);
-    expect(reference.identifier, isNotNull);
-    expect(reference.offset, 20);
+    expect(tokenReferences, hasLength(2));
+    {
+      CommentReference reference = references[0];
+      expect(reference, isNotNull);
+      expect(reference.identifier, isNotNull);
+      expect(reference.offset, 12);
+      // the reference is recorded in the comment token
+      Token referenceToken = tokenReferences[0];
+      expect(referenceToken.offset, 12);
+      expect(referenceToken.lexeme, 'a');
+    }
+    {
+      CommentReference reference = references[1];
+      expect(reference, isNotNull);
+      expect(reference.identifier, isNotNull);
+      expect(reference.offset, 20);
+      // the reference is recorded in the comment token
+      Token referenceToken = tokenReferences[1];
+      expect(referenceToken.offset, 20);
+      expect(referenceToken.lexeme, 'bb');
+    }
   }
 
   void test_parseCommentReferences_notClosed_noIdentifier() {
-    List<Token> tokens = <Token>[
-        new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5)];
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
+            TokenType.MULTI_LINE_COMMENT,
+            "/** [ some text",
+            5)];
     List<CommentReference> references =
         ParserTestCase.parse("parseCommentReferences", <Object>[tokens], "");
     expect(references, hasLength(1));
@@ -6771,8 +6862,11 @@
   }
 
   void test_parseCommentReferences_notClosed_withIdentifier() {
-    List<Token> tokens = <Token>[
-        new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5)];
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
+            TokenType.MULTI_LINE_COMMENT,
+            "/** [namePrefix some text",
+            5)];
     List<CommentReference> references =
         ParserTestCase.parse("parseCommentReferences", <Object>[tokens], "");
     expect(references, hasLength(1));
@@ -6784,9 +6878,12 @@
   }
 
   void test_parseCommentReferences_singleLine() {
-    List<Token> tokens = <Token>[
-        new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
-        new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)];
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
+            TokenType.SINGLE_LINE_COMMENT,
+            "/// xxx [a] yyy [b] zzz",
+            3),
+        new DocumentationCommentToken(TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)];
     List<CommentReference> references =
         ParserTestCase.parse("parseCommentReferences", <Object>[tokens], "");
     expect(references, hasLength(3));
@@ -6805,8 +6902,8 @@
   }
 
   void test_parseCommentReferences_skipCodeBlock_bracketed() {
-    List<Token> tokens = <Token>[
-        new StringToken(
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
             TokenType.MULTI_LINE_COMMENT,
             "/** [:xxx [a] yyy:] [b] zzz */",
             3)];
@@ -6820,8 +6917,8 @@
   }
 
   void test_parseCommentReferences_skipCodeBlock_spaces() {
-    List<Token> tokens = <Token>[
-        new StringToken(
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
             TokenType.MULTI_LINE_COMMENT,
             "/**\n *     a[i]\n * xxx [i] zzz\n */",
             3)];
@@ -6835,8 +6932,8 @@
   }
 
   void test_parseCommentReferences_skipLinkDefinition() {
-    List<Token> tokens = <Token>[
-        new StringToken(
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
             TokenType.MULTI_LINE_COMMENT,
             "/** [a]: http://www.google.com (Google) [b] zzz */",
             3)];
@@ -6850,8 +6947,8 @@
   }
 
   void test_parseCommentReferences_skipLinked() {
-    List<Token> tokens = <Token>[
-        new StringToken(
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
             TokenType.MULTI_LINE_COMMENT,
             "/** [a](http://www.google.com) [b] zzz */",
             3)];
@@ -6865,8 +6962,11 @@
   }
 
   void test_parseCommentReferences_skipReferenceLink() {
-    List<Token> tokens = <Token>[
-        new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)];
+    List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[
+        new DocumentationCommentToken(
+            TokenType.MULTI_LINE_COMMENT,
+            "/** [a][c] [b] zzz */",
+            3)];
     List<CommentReference> references =
         ParserTestCase.parse("parseCommentReferences", <Object>[tokens], "");
     expect(references, hasLength(1));
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 586a823..01f5197 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -466,6 +466,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class AnalysisDeltaTest extends EngineTestCase {
   TestSource source1 = new TestSource('/1.dart');
   TestSource source2 = new TestSource('/2.dart');
@@ -505,6 +506,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ChangeSetTest extends EngineTestCase {
   void test_changedContent() {
     TestSource source = new TestSource();
@@ -557,6 +559,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class CheckedModeCompileTimeErrorCodeTest extends ResolverTestCase {
   void test_fieldFormalParameterAssignableToField_extends() {
     // According to checked-mode type checking rules, a value of type B is
@@ -1142,6 +1145,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ElementResolverTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -2075,6 +2079,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class EnclosedScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener listener = new GatheringErrorListener();
@@ -2105,6 +2110,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ErrorResolverTest extends ResolverTestCase {
   void test_breakLabelOnSwitchMember() {
     Source source = addSource(r'''
@@ -2167,6 +2173,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class HintCodeTest extends ResolverTestCase {
   void fail_deadCode_statementAfterRehrow() {
     Source source = addSource(r'''
@@ -4437,6 +4444,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class InheritanceManagerTest extends EngineTestCase {
   /**
    * The type provider used to access the types.
@@ -5654,6 +5662,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryElementBuilderTest extends EngineTestCase {
   /**
    * The analysis context used to analyze sources.
@@ -5837,6 +5846,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryImportScopeTest extends ResolverTestCase {
   void test_conflictingImports() {
     AnalysisContext context = new AnalysisContextImpl();
@@ -6032,6 +6042,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryResolver2Test extends ResolverTestCase {
   LibraryResolver2 _resolver;
 
@@ -6078,6 +6089,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryResolverTest extends ResolverTestCase {
   LibraryResolver _resolver;
 
@@ -6118,6 +6130,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryScopeTest extends ResolverTestCase {
   void test_creation_empty() {
     LibraryElement definingLibrary = createDefaultTestLibrary();
@@ -6154,6 +6167,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class LibraryTest extends EngineTestCase {
   /**
    * The error listener to which all errors will be reported.
@@ -6270,6 +6284,7 @@
               FileUtilities2.createFile(definingCompilationUnitPath)));
 }
 
+@ReflectiveTestCase()
 class MemberMapTest {
   /**
    * The null type.
@@ -6315,6 +6330,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class NonHintCodeTest extends ResolverTestCase {
   void test_deadCode_deadBlock_conditionalElse_debugConst() {
     Source source = addSource(r'''
@@ -7963,6 +7979,7 @@
       null;
 }
 
+@ReflectiveTestCase()
 class ScopeTest extends ResolverTestCase {
   void test_define_duplicate() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
@@ -8020,6 +8037,7 @@
       localLookup(name, referencingLibrary);
 }
 
+@ReflectiveTestCase()
 class SimpleResolverTest extends ResolverTestCase {
   void fail_staticInvocation() {
     Source source = addSource(r'''
@@ -9347,6 +9365,7 @@
 /**
  * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
  */
+@ReflectiveTestCase()
 class StaticTypeAnalyzer2Test extends ResolverTestCase {
   String testCode;
   Source testSource;
@@ -9419,6 +9438,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class StaticTypeAnalyzerTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -10837,6 +10857,7 @@
  * The class `StrictModeTest` contains tests to ensure that the correct errors and warnings
  * are reported when the analysis engine is run in strict mode.
  */
+@ReflectiveTestCase()
 class StrictModeTest extends ResolverTestCase {
   void fail_for() {
     Source source = addSource(r'''
@@ -10988,6 +11009,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class SubtypeManagerTest extends EngineTestCase {
   /**
    * The inheritance manager being tested.
@@ -11553,6 +11575,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class TypeOverrideManagerTest extends EngineTestCase {
   void test_exitScope_noScopes() {
     TypeOverrideManager manager = new TypeOverrideManager();
@@ -11623,6 +11646,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class TypePropagationTest extends ResolverTestCase {
   void fail_mergePropagatedTypesAtJoinPoint_1() {
     // https://code.google.com/p/dart/issues/detail?id=19929
@@ -13098,6 +13122,7 @@
 }
 
 
+@ReflectiveTestCase()
 class TypeProviderImplTest extends EngineTestCase {
   void test_creation() {
     //
@@ -13184,6 +13209,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class TypeResolverVisitorTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -13264,8 +13290,18 @@
     _typeProvider = new TestTypeProvider();
     _visitor =
         new TypeResolverVisitor.con1(_library, librarySource, _typeProvider);
-    _implicitConstructorBuilder =
-        new ImplicitConstructorBuilder.con1(_library, librarySource, _typeProvider);
+    _implicitConstructorBuilder = new ImplicitConstructorBuilder(
+        librarySource,
+        _library.libraryElement,
+        _library.libraryScope,
+        _typeProvider,
+        (ClassElement classElement, ClassElement superclassElement, void computation())
+            {
+      // For these tests, we assume the classes for which implicit
+      // constructors need to be built are visited in proper dependency order,
+      // so we just invoke the computation immediately.
+      computation();
+    });
   }
 
   void test_visitCatchClause_exception() {
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 6ae9341..05cf061 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -20,6 +20,7 @@
   runReflectiveTests(TokenTypeTest);
 }
 
+@ReflectiveTestCase()
 class CharSequenceReaderTest {
   void test_advance() {
     CharSequenceReader reader = new CharSequenceReader("x");
@@ -123,6 +124,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class KeywordStateTest {
   void test_KeywordState() {
     //
@@ -166,6 +168,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class ScannerTest {
   void fail_incomplete_string_interpolation() {
     // https://code.google.com/p/dart/issues/detail?id=18073
@@ -1338,6 +1341,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class TokenTypeTest extends EngineTestCase {
   void test_isOperator() {
     expect(TokenType.AMPERSAND.isOperator, isTrue);
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index 815a8f4..e694c14 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -17,6 +17,7 @@
   runReflectiveTests(StaticTypeWarningCodeTest);
 }
 
+@ReflectiveTestCase()
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
     Source source = addSource(r'''
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 769cebb..44cc510 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -18,6 +18,7 @@
   runReflectiveTests(StaticWarningCodeTest);
 }
 
+@ReflectiveTestCase()
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_undefinedGetter() {
     Source source = addSource(r'''
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 5c33174..b632b51 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -6,7 +6,7 @@
 
 import 'package:unittest/unittest.dart';
 
-import 'all_the_rest.dart' as all_the_rest;
+import 'all_the_rest_test.dart' as all_the_rest;
 import 'ast_test.dart' as ast_test;
 import 'compile_time_error_code_test.dart' as compile_time_error_code_test;
 import 'element_test.dart' as element_test;
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index 2435eee..15d39b9 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -61,6 +61,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class AstClonerTest extends EngineTestCase {
   void test_visitAdjacentStrings() {
     _assertClone(
@@ -2052,6 +2053,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class BooleanArrayTest {
   void test_get_negative() {
     try {
@@ -2111,6 +2113,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class DirectedGraphTest extends EngineTestCase {
   void test_addEdge() {
     DirectedGraph<DirectedGraphTest_Node> graph =
@@ -3248,6 +3251,7 @@
   StringLiteral get(UriBasedDirective node) => node.uri;
 }
 
+@ReflectiveTestCase()
 class LineInfoTest {
   void test_creation() {
     expect(new LineInfo(<int>[0]), isNotNull);
@@ -3559,6 +3563,7 @@
   NodeList<Statement> getList(SwitchMember node) => node.statements;
 }
 
+@ReflectiveTestCase()
 class ListUtilitiesTest {
   void test_addAll_emptyToEmpty() {
     List<String> list = new List<String>();
@@ -3591,6 +3596,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class MultipleMapIteratorTest extends EngineTestCase {
   void test_multipleMaps_firstEmpty() {
     Map<String, String> map1 = new HashMap<String, String>();
@@ -3708,6 +3714,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class NodeReplacerTest extends EngineTestCase {
   /**
    * An empty list of tokens.
@@ -4757,6 +4764,7 @@
   NodeList<C> getList(P parent);
 }
 
+@ReflectiveTestCase()
 class SingleMapIteratorTest extends EngineTestCase {
   void test_empty() {
     Map<String, String> map = new HashMap<String, String>();
@@ -4814,6 +4822,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class SourceRangeTest {
   void test_access() {
     SourceRange r = new SourceRange(10, 1);
@@ -4963,6 +4972,7 @@
   }
 }
 
+@ReflectiveTestCase()
 class StringUtilitiesTest {
   void test_EMPTY() {
     expect(StringUtilities.EMPTY, "");
@@ -5219,6 +5229,7 @@
 }
 
 
+@ReflectiveTestCase()
 class TokenMapTest {
   void test_creation() {
     expect(new TokenMap(), isNotNull);
diff --git a/pkg/analyzer/test/reflective_tests.dart b/pkg/analyzer/test/reflective_tests.dart
index f2f05af..2730680 100644
--- a/pkg/analyzer/test/reflective_tests.dart
+++ b/pkg/analyzer/test/reflective_tests.dart
@@ -4,8 +4,9 @@
 
 library reflective_tests;
 
-import 'dart:async';
+@MirrorsUsed(metaTargets: 'ReflectiveTestCase')
 import 'dart:mirrors';
+import 'dart:async';
 
 import 'package:unittest/unittest.dart';
 
@@ -28,6 +29,14 @@
  */
 void runReflectiveTests(Type type) {
   ClassMirror classMirror = reflectClass(type);
+  if (!classMirror.metadata.any(
+      (InstanceMirror annotation) =>
+          annotation.type.reflectedType == ReflectiveTestCase)) {
+    String name = MirrorSystem.getName(classMirror.qualifiedName);
+    throw new Exception(
+        'Class $name must have annotation "@ReflectiveTestCase()" '
+            'in order to be run by runReflectiveTests.');
+  }
   String className = MirrorSystem.getName(classMirror.simpleName);
   group(className, () {
     classMirror.instanceMembers.forEach((symbol, memberMirror) {
@@ -38,19 +47,29 @@
       String memberName = MirrorSystem.getName(symbol);
       // test_
       if (memberName.startsWith('test_')) {
-        String testName = memberName.substring('test_'.length);
-        test(testName, () {
+        test(memberName, () {
           return _runTest(classMirror, symbol);
         });
         return;
       }
       // solo_test_
       if (memberName.startsWith('solo_test_')) {
-        String testName = memberName.substring('solo_test_'.length);
-        solo_test(testName, () {
+        solo_test(memberName, () {
           return _runTest(classMirror, symbol);
         });
       }
+      // fail_test_
+      if (memberName.startsWith('fail_')) {
+        test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
+      // solo_fail_test_
+      if (memberName.startsWith('solo_fail_')) {
+        solo_test(memberName, () {
+          return _runFailingTest(classMirror, symbol);
+        });
+      }
     });
   });
 }
@@ -70,6 +89,23 @@
 }
 
 
+/**
+ * Run a test that is expected to fail, and confirm that it fails.
+ *
+ * This properly handles the following cases:
+ * - The test fails by throwing an exception
+ * - The test returns a future which completes with an error.
+ *
+ * However, it does not handle the case where the test creates an asynchronous
+ * callback using expectAsync(), and that callback generates a failure.
+ */
+Future _runFailingTest(ClassMirror classMirror, Symbol symbol) {
+  return new Future(() => _runTest(classMirror, symbol)).then((_) {
+    fail('Test passed - expected to fail.');
+  }, onError: (_) {});
+}
+
+
 _runTest(ClassMirror classMirror, Symbol symbol) {
   InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
   return _invokeSymbolIfExists(
diff --git a/pkg/analyzer2dart/lib/src/converted_world.dart b/pkg/analyzer2dart/lib/src/converted_world.dart
index ba6d8ce..65a8c63 100644
--- a/pkg/analyzer2dart/lib/src/converted_world.dart
+++ b/pkg/analyzer2dart/lib/src/converted_world.dart
@@ -14,6 +14,7 @@
 import 'closed_world.dart';
 import 'element_converter.dart';
 import 'cps_generator.dart';
+import 'util.dart';
 
 /// A [ClosedWorld] converted to the dart2js element model.
 abstract class ConvertedWorld {
@@ -55,14 +56,15 @@
 
     dart2js.AstElement dart2jsElement =
         converter.convertElement(analyzerElement);
-    CpsGeneratingVisitor visitor =
-        new CpsGeneratingVisitor(converter, analyzerElement);
-    ir.Node cpsNode = node.accept(visitor);
+    CpsElementVisitor visitor = new CpsElementVisitor(converter, node);
+    ir.Node cpsNode = analyzerElement.accept(visitor);
     if (cpsNode != null) {
       convertedWorld.executableElements[dart2jsElement] = cpsNode;
     } else {
-      visitor.giveUp(node,
-          'No CPS node generated for $analyzerElement (${node.runtimeType}).');
+      String message =
+         'No CPS node generated for $analyzerElement (${node.runtimeType}).';
+      reportSourceMessage(analyzerElement.source, node, message);
+      throw new UnimplementedError(message);
     }
   }
 
@@ -72,4 +74,3 @@
 
   return convertedWorld;
 }
-
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index a27b429..7efa423 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -22,6 +22,32 @@
 import 'util.dart';

 import 'identifier_semantics.dart';

 

+/// Visitor that converts the AST node of an analyzer element into a CPS ir

+/// node.

+class CpsElementVisitor extends analyzer.SimpleElementVisitor<ir.Node> {

+  final ElementConverter converter;

+  final AstNode node;

+

+  CpsElementVisitor(this.converter, this.node);

+

+  @override

+  ir.FunctionDefinition visitFunctionElement(analyzer.FunctionElement element) {

+    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);

+    FunctionDeclaration functionDeclaration = node;

+    return visitor.handleFunctionDeclaration(

+        element, functionDeclaration.functionExpression);

+  }

+

+  @override

+  ir.FieldDefinition visitTopLevelVariableElement(

+      analyzer.TopLevelVariableElement element) {

+    CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);

+    VariableDeclaration variableDeclaration = node;

+    return visitor.handleFieldDeclaration(element, variableDeclaration);

+  }

+}

+

+/// Visitor that converts analyzer AST nodes into CPS ir nodes.

 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>

     with IrBuilderMixin<AstNode> {

   final analyzer.Element element;

@@ -35,10 +61,18 @@
 

   ir.Node visit(AstNode node) => node.accept(this);

 

-  @override

-  ir.Primitive visitFunctionExpression(FunctionExpression node) {

-    return irBuilder.buildFunctionExpression(

-        handleFunctionDeclaration(node.element, node));

+  ir.FieldDefinition handleFieldDeclaration(

+      analyzer.PropertyInducingElement field, VariableDeclaration node) {

+    dart2js.FieldElement element = converter.convertElement(field);

+    return withBuilder(

+        new IrBuilder(DART_CONSTANT_SYSTEM,

+                      element,

+                      // TODO(johnniwinther): Supported closure variables.

+                      const <dart2js.Local>[]),

+        () {

+      ir.Primitive initializer = build(node.initializer);

+      return irBuilder.makeFieldDefinition(initializer);

+    });

   }

 

   ir.FunctionDefinition handleFunctionDeclaration(

@@ -53,16 +87,22 @@
       function.parameters.forEach((analyzer.ParameterElement parameter) {

         // TODO(johnniwinther): Support "closure variables", that is variables

         // accessed from an inner function.

-        irBuilder.createParameter(converter.convertElement(parameter));

+        irBuilder.createFunctionParameter(converter.convertElement(parameter));

       });

       // Visit the body directly to avoid processing the signature as

       // expressions.

       visit(node.body);

-      return irBuilder.buildFunctionDefinition(const []);

+      return irBuilder.makeFunctionDefinition(const []);

     });

   }

 

   @override

+  ir.Primitive visitFunctionExpression(FunctionExpression node) {

+    return irBuilder.buildFunctionExpression(

+        handleFunctionDeclaration(node.element, node));

+  }

+

+  @override

   ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {

     return handleFunctionDeclaration(node.element, node.functionExpression);

   }

@@ -292,6 +332,24 @@
   }

 

   @override

+  ir.Node visitStaticFieldAssignment(AssignmentExpression node,

+                                     AccessSemantics semantics) {

+    if (node.operator.lexeme != '=') {

+      return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');

+    }

+    analyzer.Element element = semantics.element;

+    dart2js.Element target = converter.convertElement(element);

+    // TODO(johnniwinther): Selector information should be computed in the

+    // [TreeShaker] and shared with the [CpsGeneratingVisitor].

+    assert(invariant(node, target.isTopLevel || target.isStatic,

+                     '$target expected to be top-level or static.'));

+    return irBuilder.buildStaticSet(

+        target,

+        new Selector.setter(target.name, target.library),

+        build(node.rightHandSide));

+  }

+

+  @override

   ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) {

     // TODO(johnniwinther): Handle implicit `this`.

     ir.Primitive receiver = build(semantics.target);

diff --git a/pkg/analyzer2dart/lib/src/modely.dart b/pkg/analyzer2dart/lib/src/modely.dart
index 69c5fc7..fd14425 100644
--- a/pkg/analyzer2dart/lib/src/modely.dart
+++ b/pkg/analyzer2dart/lib/src/modely.dart
@@ -700,6 +700,12 @@
   @override
   dart2js.DartType get type => converter.convertType(element.type);
 
+  @override
+  bool get isFinal => element.isFinal;
+
+  @override
+  bool get isConst => element.isConst;
+
   TopLevelVariableElementY(ElementConverter converter,
                            analyzer.TopLevelVariableElement element)
       : super(converter, element);
diff --git a/pkg/analyzer2dart/test/end2end_data.dart b/pkg/analyzer2dart/test/end2end_data.dart
index 0d380d1..9904703 100644
--- a/pkg/analyzer2dart/test/end2end_data.dart
+++ b/pkg/analyzer2dart/test/end2end_data.dart
@@ -5,12 +5,14 @@
 /// Test data for the end2end test.
 library test.end2end.data;
 
-import 'test_helper.dart' show Group;
-import 'test_helper.dart' as base show TestSpec;
+import 'test_helper.dart';
 
-class TestSpec extends base.TestSpec {
+class TestSpec extends TestSpecBase {
+  final String output;
+
   const TestSpec(String input, [String output])
-      : super(input, output != null ? output : input);
+      : this.output = output != null ? output : input,
+        super(input);
 }
 
 const List<Group> TEST_DATA = const <Group>[
@@ -161,12 +163,42 @@
 '''),
   ]),
 
-  const Group('Top level field access', const <TestSpec>[
+  const Group('Top level field', const <TestSpec>[
     const TestSpec('''
 main(args) {
   return deprecated;
 }
 '''),
+
+    const TestSpec('''
+var field;
+main(args) {
+  return field;
+}
+'''),
+
+    // TODO(johnniwinther): Eliminate unneeded `null` initializers.
+    const TestSpec('''
+var field = null;
+main(args) {
+  return field;
+}
+'''),
+
+    const TestSpec('''
+var field = 0;
+main(args) {
+  return field;
+}
+'''),
+
+    const TestSpec('''
+var field;
+main(args) {
+  field = args.length;
+  return field;
+}
+'''),
   ]),
 
   const Group('Local variables', const <TestSpec>[
@@ -773,7 +805,7 @@
 
   const TestSpec('''
 main(a) {
-  var c = a ? () { return 0; } : () { return 1; }
+  var c = a ? () { return 0; } : () { return 1; };
   return c();
 }
 ''', '''
diff --git a/pkg/analyzer2dart/test/sexpr_data.dart b/pkg/analyzer2dart/test/sexpr_data.dart
index 963b781..d6117c1 100644
--- a/pkg/analyzer2dart/test/sexpr_data.dart
+++ b/pkg/analyzer2dart/test/sexpr_data.dart
@@ -7,6 +7,17 @@
 
 import 'test_helper.dart';
 
+class TestSpec extends TestSpecBase {
+  // A [String] or a [Map<String, String>].
+  final output;
+
+  /// True if the test should be skipped when testing analyzer2dart.
+  final bool skipInAnalyzerFrontend;
+
+  const TestSpec(String input, this.output,
+                 {this.skipInAnalyzerFrontend: false}) : super(input);
+}
+
 const List<Group> TEST_DATA = const [
   const Group('Empty main', const [
     const TestSpec('''
@@ -1277,4 +1288,99 @@
   (Branch (IsTrue a) k2 k3))
 '''),
   ]),
+
+  const Group('Top level field', const <TestSpec>[
+    const TestSpec('''
+var field;
+main(args) {
+  return field;
+}
+''', const {
+      'main': '''
+(FunctionDefinition main (args return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (InvokeStatic field  k0))
+''',
+      'field': '''
+(FieldDefinition field)
+'''}),
+
+    const TestSpec('''
+var field = null;
+main(args) {
+  return field;
+}
+''', const {
+      'main': '''
+(FunctionDefinition main (args return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (InvokeStatic field  k0))
+''',
+      'field': '''
+(FieldDefinition field (return)
+  (LetPrim v0 (Constant NullConstant))
+  (InvokeContinuation return v0))
+'''}),
+
+    const TestSpec('''
+var field = 0;
+main(args) {
+  return field;
+}
+''', const {
+      'main': '''
+(FunctionDefinition main (args return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (InvokeStatic field  k0))
+''',
+      'field': '''
+(FieldDefinition field (return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (InvokeContinuation return v0))
+'''}),
+
+    const TestSpec('''
+var field;
+main(args) {
+  field = args.length;
+  return field;
+}
+''', '''
+(FunctionDefinition main (args return)
+  (LetCont (k0 v0)
+    (LetCont (k1 v1)
+      (LetCont (k2 v2)
+        (InvokeContinuation return v2))
+      (InvokeStatic field  k2))
+    (InvokeStatic field v0 k1))
+  (InvokeMethod args length  k0))
+'''),
+  ]),
+
+  const Group('Closure variables', const <TestSpec>[
+    const TestSpec('''
+main(x,foo) {
+  print(x);
+  getFoo() => foo;
+  print(getFoo());
+}
+''', '''
+(FunctionDefinition main {foo} (x foo return)
+  (LetCont (k0 v0)
+    (LetPrim v1 (CreateFunction
+      (FunctionDefinition getFoo ( return)
+        (LetPrim v2 (GetClosureVariable foo))
+        (InvokeContinuation return v2))))
+    (LetCont (k1 v3)
+      (LetCont (k2 v4)
+        (LetPrim v5 (Constant NullConstant))
+        (InvokeContinuation return v5))
+      (InvokeStatic print v3 k2))
+    (InvokeMethod v1 call  k1))
+  (InvokeStatic print x k0))
+''', skipInAnalyzerFrontend: true)
+  ]),
 ];
diff --git a/pkg/analyzer2dart/test/sexpr_test.dart b/pkg/analyzer2dart/test/sexpr_test.dart
index 74dd8ac..9a1790d 100644
--- a/pkg/analyzer2dart/test/sexpr_test.dart
+++ b/pkg/analyzer2dart/test/sexpr_test.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart';
+import 'package:compiler/src/elements/elements.dart' as dart2js;
 import 'package:unittest/unittest.dart';
 
 import '../lib/src/closed_world.dart';
@@ -24,8 +25,8 @@
 }
 
 checkResult(TestSpec result) {
+  if (result.skipInAnalyzerFrontend) return;
   String input = result.input.trim();
-  String expectedOutput = result.output.trim();
   CollectingOutputProvider outputProvider = new CollectingOutputProvider();
   MemoryResourceProvider provider = new MemoryResourceProvider();
   DartSdk sdk = new MockSdk();
@@ -36,11 +37,30 @@
   FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
   ClosedWorld world = driver.computeWorld(entryPoint);
   ConvertedWorld convertedWorld = convertWorld(world);
-  String output = convertedWorld.getIr(convertedWorld.mainFunction)
-      .accept(new SExpressionStringifier());
-  expect(output, equals(expectedOutput),
-      reason: 'Input:\n$input\n'
-              'Expected:\n$expectedOutput\n'
-              'Actual:\n$output');
+
+  void checkOutput(dart2js.Element element, String expectedOutput) {
+    expectedOutput = expectedOutput.trim();
+    String output = convertedWorld.getIr(element)
+        .accept(new SExpressionStringifier());
+    expect(output, equals(expectedOutput),
+        reason: 'Input:\n$input\n'
+                'Expected:\n$expectedOutput\n'
+                'Actual:\n$output');
+  }
+
+  if (result.output is String) {
+    checkOutput(convertedWorld.mainFunction, result.output);
+  } else {
+    assert(result.output is Map<String, String>);
+    dart2js.LibraryElement mainLibrary = convertedWorld.mainFunction.library;
+    result.output.forEach((String elementName, String output) {
+      convertedWorld.resolvedElements.forEach((dart2js.Element element) {
+        if (element.name == elementName &&
+            element.library == mainLibrary) {
+          checkOutput(element, output);
+        }
+      });
+    });
+  }
 }
 
diff --git a/pkg/analyzer2dart/test/test_helper.dart b/pkg/analyzer2dart/test/test_helper.dart
index e8e5a92..9bb0b4a 100644
--- a/pkg/analyzer2dart/test/test_helper.dart
+++ b/pkg/analyzer2dart/test/test_helper.dart
@@ -9,22 +9,20 @@
 /// A unittest group with a name and a list of input/output results.
 class Group {
   final String name;
-  final List<TestSpec> results;
+  final List<TestSpecBase> results;
 
   const Group(this.name, this.results);
 }
 
-/// A input/output pair that defines the expected [output] of when processing
-/// the [input].
-class TestSpec {
+/// A [input] for which a certain processing result is expected.
+class TestSpecBase {
   final String input;
-  final String output;
 
-  const TestSpec(this.input, this.output);
+  const TestSpecBase(this.input);
 }
 
 typedef TestGroup(Group group, RunTest check);
-typedef RunTest(TestSpec result);
+typedef RunTest(TestSpecBase result);
 
 /// Test [data] using [testGroup] and [check].
 void performTests(List<Group> data, TestGroup testGroup, RunTest runTest) {
@@ -36,7 +34,7 @@
 /// Test group using unittest.
 unittester(Group group, RunTest runTest) {
   test(group.name, () {
-    for (TestSpec result in group.results) {
+    for (TestSpecBase result in group.results) {
       runTest(result);
     }
   });
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index ac763bb..fe1357d 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -256,22 +256,22 @@
 abstract class ConstantExpressionVisitor<C, R> {
   const ConstantExpressionVisitor();
 
-  R visit(ConstantExpression constant, [C context]) {
+  R visit(ConstantExpression constant, C context) {
     return constant.accept(this, context);
   }
 
-  R visitPrimitive(PrimitiveConstantExpression exp, [C context]);
-  R visitList(ListConstantExpression exp, [C context]);
-  R visitMap(MapConstantExpression exp, [C context]);
-  R visitConstructed(ConstructedConstantExpresssion exp, [C context]);
-  R visitConcatenate(ConcatenateConstantExpression exp, [C context]);
-  R visitSymbol(SymbolConstantExpression exp, [C context]);
-  R visitType(TypeConstantExpression exp, [C context]);
-  R visitVariable(VariableConstantExpression exp, [C context]);
-  R visitFunction(FunctionConstantExpression exp, [C context]);
-  R visitBinary(BinaryConstantExpression exp, [C context]);
-  R visitUnary(UnaryConstantExpression exp, [C context]);
-  R visitConditional(ConditionalConstantExpression exp, [C context]);
+  R visitPrimitive(PrimitiveConstantExpression exp, C context);
+  R visitList(ListConstantExpression exp, C context);
+  R visitMap(MapConstantExpression exp, C context);
+  R visitConstructed(ConstructedConstantExpresssion exp, C context);
+  R visitConcatenate(ConcatenateConstantExpression exp, C context);
+  R visitSymbol(SymbolConstantExpression exp, C context);
+  R visitType(TypeConstantExpression exp, C context);
+  R visitVariable(VariableConstantExpression exp, C context);
+  R visitFunction(FunctionConstantExpression exp, C context);
+  R visitBinary(BinaryConstantExpression exp, C context);
+  R visitUnary(UnaryConstantExpression exp, C context);
+  R visitConditional(ConditionalConstantExpression exp, C context);
 }
 
 /// Represents the declaration of a constant [element] with value [expression].
@@ -286,7 +286,7 @@
 class ConstExpPrinter extends ConstantExpressionVisitor {
   final StringBuffer sb = new StringBuffer();
 
-  write(ConstantExpression parent,
+  void write(ConstantExpression parent,
         ConstantExpression child,
         {bool leftAssociative: true}) {
     if (child.precedence < parent.precedence ||
@@ -299,7 +299,7 @@
     }
   }
 
-  writeTypeArguments(InterfaceType type) {
+  void writeTypeArguments(InterfaceType type) {
     if (type.treatAsRaw) return;
     sb.write('<');
     bool needsComma = false;
@@ -313,11 +313,18 @@
     sb.write('>');
   }
 
-  visitPrimitive(PrimitiveConstantExpression exp, [_]) {
+  @override
+  void visit(ConstantExpression constant, [_]) {
+    return constant.accept(this, null);
+  }
+
+  @override
+  void visitPrimitive(PrimitiveConstantExpression exp, [_]) {
     sb.write(exp.value.unparse());
   }
 
-  visitList(ListConstantExpression exp, [_]) {
+  @override
+  void visitList(ListConstantExpression exp, [_]) {
     sb.write('const ');
     writeTypeArguments(exp.type);
     sb.write('[');
@@ -332,7 +339,8 @@
     sb.write(']');
   }
 
-  visitMap(MapConstantExpression exp, [_]) {
+  @override
+  void visitMap(MapConstantExpression exp, [_]) {
     sb.write('const ');
     writeTypeArguments(exp.type);
     sb.write('{');
@@ -347,7 +355,8 @@
     sb.write('}');
   }
 
-  visitConstructed(ConstructedConstantExpresssion exp, [_]) {
+  @override
+  void visitConstructed(ConstructedConstantExpresssion exp, [_]) {
     sb.write('const ');
     sb.write(exp.target.enclosingClass.name);
     if (exp.target.name != '') {
@@ -378,20 +387,24 @@
     sb.write(')');
   }
 
-  visitConcatenate(ConcatenateConstantExpression exp, [_]) {
+  @override
+  void visitConcatenate(ConcatenateConstantExpression exp, [_]) {
     sb.write(exp.value.unparse());
   }
 
-  visitSymbol(SymbolConstantExpression exp, [_]) {
+  @override
+  void visitSymbol(SymbolConstantExpression exp, [_]) {
     sb.write('#');
     sb.write(exp.name);
   }
 
-  visitType(TypeConstantExpression exp, [_]) {
+  @override
+  void visitType(TypeConstantExpression exp, [_]) {
     sb.write(exp.type.name);
   }
 
-  visitVariable(VariableConstantExpression exp, [_]) {
+  @override
+  void visitVariable(VariableConstantExpression exp, [_]) {
     if (exp.element.isStatic) {
       sb.write(exp.element.enclosingClass.name);
       sb.write('.');
@@ -399,7 +412,8 @@
     sb.write(exp.element.name);
   }
 
-  visitFunction(FunctionConstantExpression exp, [_]) {
+  @override
+  void visitFunction(FunctionConstantExpression exp, [_]) {
     if (exp.element.isStatic) {
       sb.write(exp.element.enclosingClass.name);
       sb.write('.');
@@ -407,7 +421,8 @@
     sb.write(exp.element.name);
   }
 
-  visitBinary(BinaryConstantExpression exp, [_]) {
+  @override
+  void visitBinary(BinaryConstantExpression exp, [_]) {
     if (exp.operator == 'identical') {
       sb.write('identical(');
       visit(exp.left);
@@ -423,12 +438,14 @@
     }
   }
 
-  visitUnary(UnaryConstantExpression exp, [_]) {
+  @override
+  void visitUnary(UnaryConstantExpression exp, [_]) {
     sb.write(exp.operator);
     write(exp, exp.expression);
   }
 
-  visitConditional(ConditionalConstantExpression exp, [_]) {
+  @override
+  void visitConditional(ConditionalConstantExpression exp, [_]) {
     write(exp, exp.condition, leftAssociative: false);
     sb.write(' ? ');
     write(exp, exp.trueExp);
diff --git a/pkg/compiler/lib/src/cps_ir/constant_propagation.dart b/pkg/compiler/lib/src/cps_ir/constant_propagation.dart
index a6da66b..c9adf08 100644
--- a/pkg/compiler/lib/src/cps_ir/constant_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/constant_propagation.dart
@@ -49,6 +49,7 @@
   }
 
   void rewriteFieldDefinition(FieldDefinition root) {
+    if (!root.hasInitializer) return;
     _rewriteExecutableDefinition(root);
   }
 
@@ -307,12 +308,14 @@
   }
 
   void visitFunctionDefinition(FunctionDefinition node) {
-    node.parameters.forEach(visitParameter);
+    node.parameters.forEach(visit);
     setReachable(node.body);
   }
 
   void visitFieldDefinition(FieldDefinition node) {
-    setReachable(node.body);
+    if (node.hasInitializer) {
+      setReachable(node.body);
+    }
   }
 
   // Expressions.
@@ -583,6 +586,9 @@
     setValue(node, _ConstnessLattice.NonConst);
   }
 
+  void visitClosureVariable(ClosureVariable node) {
+  }
+
   void visitParameter(Parameter node) {
     if (node.parent is FunctionDefinition) {
       // Functions may escape and thus their parameters must be initialized to
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index d5bad5d..73d4afa 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -177,7 +177,34 @@
   }
 }
 
-/// Shared state between nested builders.
+/// Shared state between IrBuilders of nested functions.
+class IrBuilderClosureState {
+  final Iterable<Entity> closureLocals;
+
+  /// Maps local variables to their corresponding [ClosureVariable] object.
+  final Map<Local, ir.ClosureVariable> local2closure =
+      <Local, ir.ClosureVariable>{};
+
+  /// Maps functions to the list of closure variables declared in that function.
+  final Map<ExecutableElement, List<ir.ClosureVariable>> function2closures =
+      <ExecutableElement, List<ir.ClosureVariable>>{};
+
+  /// Returns the closure variables declared in the given function.
+  List<ir.ClosureVariable> getClosureList(ExecutableElement element) {
+    return function2closures.putIfAbsent(element, () => <ir.ClosureVariable>[]);
+  }
+
+  IrBuilderClosureState(this.closureLocals) {
+    for (Local local in closureLocals) {
+      ExecutableElement context = local.executableContext;
+      ir.ClosureVariable variable = new ir.ClosureVariable(context, local);
+      local2closure[local] = variable;
+      getClosureList(context).add(variable);
+    }
+  }
+}
+
+/// Shared state between delimited IrBuilders within the same function.
 class IrBuilderSharedState {
   final ConstantSystem constantSystem;
 
@@ -189,15 +216,13 @@
 
   final List<ConstDeclaration> localConstants = <ConstDeclaration>[];
 
-  final Iterable<Entity> closureLocals;
-
   final ExecutableElement currentElement;
 
   final ir.Continuation returnContinuation = new ir.Continuation.retrn();
 
-  IrBuilderSharedState(this.constantSystem,
-                       this.currentElement,
-                       this.closureLocals);
+  final List<ir.Definition> functionParameters = <ir.Definition>[];
+
+  IrBuilderSharedState(this.constantSystem, this.currentElement);
 }
 
 /// A factory for building the cps IR.
@@ -209,6 +234,8 @@
 
   final IrBuilderSharedState state;
 
+  final IrBuilderClosureState closure;
+
   /// A map from variable indexes to their values.
   Environment environment;
 
@@ -242,8 +269,8 @@
   IrBuilder(ConstantSystem constantSystem,
             ExecutableElement currentElement,
             Iterable<Entity> closureLocals)
-      : this.state = new IrBuilderSharedState(
-            constantSystem, currentElement, closureLocals),
+      : this.state = new IrBuilderSharedState(constantSystem, currentElement),
+        this.closure = new IrBuilderClosureState(closureLocals),
         this.environment = new Environment.empty();
 
   /// Construct a delimited visitor for visiting a subtree.
@@ -254,6 +281,7 @@
   /// the built expression is not plugged into the parent's context.
   IrBuilder.delimited(IrBuilder parent)
       : this.state = parent.state,
+        this.closure = parent.closure,
         this.environment = new Environment.from(parent.environment);
 
   /// Construct a visitor for a recursive continuation.
@@ -266,10 +294,19 @@
   /// the same value at all invocation sites.
   IrBuilder.recursive(IrBuilder parent)
       : this.state = parent.state,
+        this.closure = parent.closure,
         this.environment = new Environment.empty() {
-    parent.environment.index2variable.forEach(createParameter);
+    parent.environment.index2variable.forEach(createLocalParameter);
   }
 
+  /// Construct a builder for an inner function.
+  IrBuilder.innerFunction(IrBuilder parent,
+                          ExecutableElement currentElement)
+      : this.state = new IrBuilderSharedState(parent.state.constantSystem,
+                                              currentElement),
+        this.closure = parent.closure,
+        this.environment = new Environment.empty();
+
 
   bool get isOpen => _root == null || _current != null;
 
@@ -279,22 +316,31 @@
   ///
   /// If `true`, [element] is a [LocalElement].
   bool isClosureVariable(Element element) {
-    return state.closureLocals.contains(element);
+    return closure.closureLocals.contains(element);
+  }
+
+  /// Returns the [ClosureVariable] corresponding to the given variable.
+  /// Returns `null` for non-closure variables.
+  ir.ClosureVariable getClosureVariable(LocalElement element) {
+    return closure.local2closure[element];
+  }
+
+  /// Adds the given parameter to the function currently being built.
+  void createFunctionParameter(ParameterElement parameterElement) {
+    if (isClosureVariable(parameterElement)) {
+      state.functionParameters.add(getClosureVariable(parameterElement));
+    } else {
+      state.functionParameters.add(createLocalParameter(parameterElement));
+    }
   }
 
   /// Create a parameter for [parameterElement] and add it to the current
   /// environment.
-  ///
-  /// [isClosureVariable] marks whether [parameterElement] is accessed from an
-  /// inner function.
-  void createParameter(LocalElement parameterElement) {
+  ir.Parameter createLocalParameter(LocalElement parameterElement) {
     ir.Parameter parameter = new ir.Parameter(parameterElement);
     _parameters.add(parameter);
-    if (isClosureVariable(parameterElement)) {
-      add(new ir.SetClosureVariable(parameterElement, parameter));
-    } else {
-      environment.extend(parameterElement, parameter);
-    }
+    environment.extend(parameterElement, parameter);
+    return parameter;
   }
 
   /// Add the constant [variableElement] to the environment with [value] as its
@@ -315,7 +361,7 @@
       initialValue = buildNullLiteral();
     }
     if (isClosureVariable(variableElement)) {
-      add(new ir.SetClosureVariable(variableElement,
+      add(new ir.SetClosureVariable(getClosureVariable(variableElement),
                                     initialValue,
                                     isDeclaration: true));
     } else {
@@ -331,7 +377,8 @@
                             ir.FunctionDefinition definition) {
     assert(isOpen);
     if (isClosureVariable(functionElement)) {
-      add(new ir.DeclareFunction(functionElement, definition));
+      ir.ClosureVariable variable = getClosureVariable(functionElement);
+      add(new ir.DeclareFunction(variable, definition));
     } else {
       ir.CreateFunction prim = new ir.CreateFunction(definition);
       add(new ir.LetPrim(prim));
@@ -534,18 +581,23 @@
   }
 
   /// Create a [ir.FieldDefinition] for the current [Element] using [_root] as
-  /// the body.
-  ir.FieldDefinition makeFieldDefinition() {
-    return new ir.FieldDefinition(state.currentElement,
-                                  state.returnContinuation,
-                                  _root);
+  /// the body using [initializer] as the initial value.
+  ir.FieldDefinition makeFieldDefinition(ir.Primitive initializer) {
+    if (initializer == null) {
+      return new ir.FieldDefinition.withoutInitializer(state.currentElement);
+    } else {
+      buildReturn(initializer);
+      return new ir.FieldDefinition(state.currentElement,
+                                    state.returnContinuation,
+                                    _root);
+    }
   }
 
   /// Create a [ir.FunctionDefinition] for [element] using [_root] as the body.
   ///
   /// Parameters must be created before the construction of the body using
-  /// [createParameter].
-  ir.FunctionDefinition buildFunctionDefinition(
+  /// [createFunctionParameter].
+  ir.FunctionDefinition makeFunctionDefinition(
       List<ConstantExpression> defaults) {
     FunctionElement element = state.currentElement;
     if (element.isAbstract || element.isExternal) {
@@ -555,12 +607,12 @@
           message: "Local constants for abstract method $element: "
                    "${state.localConstants}"));
       return new ir.FunctionDefinition.abstract(
-                element, _parameters, defaults);
+                element, state.functionParameters, defaults);
     } else {
       _ensureReturn();
       return new ir.FunctionDefinition(
-          element, state.returnContinuation, _parameters, _root,
-          state.localConstants, defaults);
+          element, state.returnContinuation, state.functionParameters, _root,
+          state.localConstants, defaults, closure.getClosureList(element));
     }
   }
 
@@ -679,7 +731,8 @@
   ir.Primitive buildLocalGet(LocalElement local) {
     assert(isOpen);
     if (isClosureVariable(local)) {
-      ir.Primitive result = new ir.GetClosureVariable(local);
+      ir.Primitive result =
+          new ir.GetClosureVariable(getClosureVariable(local));
       add(new ir.LetPrim(result));
       return result;
     } else {
@@ -691,7 +744,7 @@
   ir.Primitive buildLocalSet(LocalElement local, ir.Primitive value) {
     assert(isOpen);
     if (isClosureVariable(local)) {
-      add(new ir.SetClosureVariable(local, value));
+      add(new ir.SetClosureVariable(getClosureVariable(local), value));
     } else {
       value.useElementAsHint(local);
       environment.update(local, value);
@@ -706,7 +759,7 @@
                                     List<ir.Definition> arguments) {
     ir.Primitive receiver;
     if (isClosureVariable(local)) {
-      receiver = new ir.GetClosureVariable(local);
+      receiver = new ir.GetClosureVariable(getClosureVariable(local));
       add(new ir.LetPrim(receiver));
     } else {
       receiver = environment.lookup(local);
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
index c6f8d16..e800a5c 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
@@ -158,10 +158,6 @@
     }
     assert(fieldDefinition != null);
     assert(elements[fieldDefinition] != null);
-    // This means there is no initializer.
-    // TODO(sigurdm): Avoid ever getting here. Abstract functions and fields
-    // with no initializer should not have a representation in the IR.
-    if (fieldDefinition is! ast.SendSet) return null;
     DetectClosureVariables closureLocals =
     new DetectClosureVariables(elements);
         closureLocals.visit(fieldDefinition);
@@ -170,39 +166,46 @@
         element,
         closureLocals.usedFromClosure);
     return withBuilder(builder, () {
-      ast.SendSet sendSet = fieldDefinition;
-      ir.Primitive result = visit(sendSet.arguments.first);
-      builder.buildReturn(result);
-      return builder.makeFieldDefinition();
+      ir.Primitive initializer;
+      if (fieldDefinition is ast.SendSet) {
+        ast.SendSet sendSet = fieldDefinition;
+        initializer = visit(sendSet.arguments.first);
+      }
+      return builder.makeFieldDefinition(initializer);
     });
   }
 
+  ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
+                                          ast.FunctionExpression node) {
+    FunctionSignature signature = element.functionSignature;
+    signature.orderedForEachParameter((ParameterElement parameterElement) {
+      irBuilder.createFunctionParameter(parameterElement);
+    });
+
+    List<ConstantExpression> defaults = new List<ConstantExpression>();
+    signature.orderedOptionalParameters.forEach((ParameterElement element) {
+      defaults.add(getConstantForVariable(element));
+    });
+
+    visit(node.body);
+
+    return irBuilder.makeFunctionDefinition(defaults);
+  }
+
   ir.FunctionDefinition buildFunction(FunctionElement element) {
     assert(invariant(element, element.isImplementation));
-    ast.FunctionExpression function = element.node;
-    assert(function != null);
-    assert(elements[function] != null);
+    ast.FunctionExpression node = element.node;
+    assert(node != null);
+    assert(elements[node] != null);
 
     DetectClosureVariables closureLocals = new DetectClosureVariables(elements);
-    closureLocals.visit(function);
+    closureLocals.visit(node);
 
-    return withBuilder(
-        new IrBuilder(compiler.backend.constantSystem,
-                      element, closureLocals.usedFromClosure),
-        () {
-      FunctionSignature signature = element.functionSignature;
-      signature.orderedForEachParameter((ParameterElement parameterElement) {
-        irBuilder.createParameter(parameterElement);
-      });
+    IrBuilder builder = new IrBuilder(compiler.backend.constantSystem,
+                                      element,
+                                      closureLocals.usedFromClosure);
 
-      List<ConstantExpression> defaults = new List<ConstantExpression>();
-      signature.orderedOptionalParameters.forEach((ParameterElement element) {
-        defaults.add(getConstantForVariable(element));
-      });
-
-      visit(function.body);
-      return irBuilder.buildFunctionDefinition(defaults);
-    });
+    return withBuilder(builder, () => _makeFunctionBody(element, node));
   }
 
   ir.Primitive visit(ast.Node node) => node.accept(this);
@@ -846,7 +849,12 @@
   }
 
   ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
-    return buildFunction(elements[node]);
+    FunctionElement element = elements[node];
+    assert(invariant(element, element.isImplementation));
+
+    IrBuilder builder = new IrBuilder.innerFunction(irBuilder, element);
+
+    return withBuilder(builder, () => _makeFunctionBody(element, node));
   }
 
   ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index a4e07f7..b4f111a 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -310,8 +310,7 @@
   accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
 }
 
-/// Gets the value from a closure variable. The identity of the variable is
-/// determined by a [Local].
+/// Gets the value from a closure variable.
 ///
 /// Closure variables can be seen as ref cells that are not first-class values.
 /// A [LetPrim] with a [GetClosureVariable] can then be seen as:
@@ -319,17 +318,15 @@
 ///   let prim p = ![variable] in [body]
 ///
 class GetClosureVariable extends Primitive {
-  final Local variable;
+  final Reference<ClosureVariable> variable;
 
-  GetClosureVariable(this.variable) {
-    assert(variable != null);
-  }
+  GetClosureVariable(ClosureVariable variable)
+      : this.variable = new Reference<ClosureVariable>(variable);
 
   accept(Visitor visitor) => visitor.visitGetClosureVariable(this);
 }
 
-/// Assign or declare a closure variable. The identity of the variable is
-/// determined by a [Local].
+/// Assign or declare a closure variable.
 ///
 /// Closure variables can be seen as ref cells that are not first-class values.
 /// If [isDeclaration], this can seen as a let binding:
@@ -343,7 +340,7 @@
 /// Closure variables without a declaring [SetClosureVariable] are implicitly
 /// declared at the entry to the [variable]'s enclosing function.
 class SetClosureVariable extends Expression implements InteriorNode {
-  final Local variable;
+  final Reference<ClosureVariable> variable;
   final Reference<Primitive> value;
   Expression body;
 
@@ -355,11 +352,10 @@
   /// avoid declaring closure variables if it is not necessary.
   final bool isDeclaration;
 
-  SetClosureVariable(this.variable, Primitive value,
+  SetClosureVariable(ClosureVariable variable, Primitive value,
                      {this.isDeclaration : false })
-      : this.value = new Reference<Primitive>(value) {
-    assert(variable != null);
-  }
+      : this.value = new Reference<Primitive>(value),
+        this.variable = new Reference<ClosureVariable>(variable);
 
   accept(Visitor visitor) => visitor.visitSetClosureVariable(this);
 
@@ -378,11 +374,12 @@
 ///   let rec [variable] = [definition] in [body]
 ///
 class DeclareFunction extends Expression implements InteriorNode {
-  final Local variable;
+  final Reference<ClosureVariable> variable;
   final FunctionDefinition definition;
   Expression body;
 
-  DeclareFunction(this.variable, this.definition);
+  DeclareFunction(ClosureVariable variable, this.definition)
+      : this.variable = new Reference<ClosureVariable>(variable);
 
   Expression plug(Expression expr) {
     assert(body == null);
@@ -567,8 +564,42 @@
   Expression body;
 
   FieldDefinition(this.element, this.returnContinuation, this.body);
+
+  FieldDefinition.withoutInitializer(this.element)
+      : this.returnContinuation = null;
+
   accept(Visitor visitor) => visitor.visitFieldDefinition(this);
   applyPass(Pass pass) => pass.rewriteFieldDefinition(this);
+
+  /// `true` if this field has no initializer.
+  ///
+  /// If `true` [body] and [returnContinuation] are `null`.
+  ///
+  /// This is different from a initializer that is `null`. Consider this class:
+  ///
+  ///     class Class {
+  ///       final field;
+  ///       Class.a(this.field);
+  ///       Class.b() : this.field = null;
+  ///       Class.c();
+  ///     }
+  ///
+  /// If `field` had an initializer, possibly `null`, constructors `Class.a` and
+  /// `Class.b` would be invalid, and since `field` has no initializer
+  /// constructor `Class.c` is invalid. We therefore need to distinguish the two
+  /// cases.
+  bool get hasInitializer => body != null;
+}
+
+/// Identifies a closure variable.
+class ClosureVariable extends Definition {
+  /// Body of code that declares this closure variable.
+  ExecutableElement host;
+  Entity hint;
+
+  ClosureVariable(this.host, this.hint);
+
+  accept(Visitor v) => v.visitClosureVariable(this);
 }
 
 /// A function definition, consisting of parameters and a body.  The parameters
@@ -577,22 +608,27 @@
     implements InteriorNode, ExecutableDefinition {
   final FunctionElement element;
   final Continuation returnContinuation;
-  final List<Parameter> parameters;
+  /// Mixed list of [Parameter]s and [ClosureVariable]s.
+  final List<Definition> parameters;
   Expression body;
   final List<ConstDeclaration> localConstants;
 
   /// Values for optional parameters.
   final List<ConstantExpression> defaultParameterValues;
 
+  /// Closure variables declared by this function.
+  final List<ClosureVariable> closureVariables;
+
   FunctionDefinition(this.element, this.returnContinuation,
       this.parameters, this.body, this.localConstants,
-      this.defaultParameterValues);
+      this.defaultParameterValues, this.closureVariables);
 
   FunctionDefinition.abstract(this.element,
                               this.parameters,
                               this.defaultParameterValues)
       : this.returnContinuation = null,
-        this.localConstants = const <ConstDeclaration>[];
+        this.localConstants = const <ConstDeclaration>[],
+        this.closureVariables = const <ClosureVariable>[];
 
   accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
   applyPass(Pass pass) => pass.rewriteFunctionDefinition(this);
@@ -647,6 +683,7 @@
   T visitGetClosureVariable(GetClosureVariable node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
+  T visitClosureVariable(ClosureVariable node) => visitDefinition(node);
 
   // Conditions.
   T visitIsTrue(IsTrue node) => visitCondition(node);
@@ -673,14 +710,18 @@
   processFieldDefinition(FieldDefinition node) {}
   visitFieldDefinition(FieldDefinition node) {
     processFieldDefinition(node);
-    visit(node.body);
+    if (node.hasInitializer) {
+      visit(node.body);
+    }
   }
 
   processFunctionDefinition(FunctionDefinition node) {}
   visitFunctionDefinition(FunctionDefinition node) {
     processFunctionDefinition(node);
-    node.parameters.forEach(visitParameter);
-    visit(node.body);
+    node.parameters.forEach(visit);
+    if (!node.isAbstract) {
+      visit(node.body);
+    }
   }
 
   // Expressions.
@@ -803,9 +844,15 @@
     visit(node.definition);
   }
 
+  processClosureVariable(node) {}
+  visitClosureVariable(ClosureVariable node) {
+    processClosureVariable(node);
+  }
+
   processGetClosureVariable(GetClosureVariable node) {}
-  visitGetClosureVariable(GetClosureVariable node) =>
-      processGetClosureVariable(node);
+  visitGetClosureVariable(GetClosureVariable node) {
+    processGetClosureVariable(node);
+  }
 
   processParameter(Parameter node) {}
   visitParameter(Parameter node) => processParameter(node);
@@ -893,14 +940,21 @@
   }
 
   void visitFieldDefinition(FieldDefinition node) {
-    visit(node.body);
+    if (node.hasInitializer) {
+      visit(node.body);
+    }
   }
 
   void visitFunctionDefinition(FunctionDefinition node) {
     if (!node.isAbstract) {
       visit(node.body);
     }
-    node.parameters.forEach(allocate); // Assign indices to unused parameters.
+    // Assign indices to unused parameters.
+    for (Definition param in node.parameters) {
+      if (param is Primitive) {
+        allocate(param);
+      }
+    }
   }
 
   void visitLetPrim(LetPrim node) {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
index 121cccc..d7ec6a95 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
@@ -27,6 +27,10 @@
     return namer.useElementName(node);
   }
 
+  String visitClosureVariable(ClosureVariable node) {
+    return namer.getName(node);
+  }
+
   /// Main entry point for creating a [String] from a [Node].  All recursive
   /// calls must go through this method.
   String visit(Node node) {
@@ -37,18 +41,25 @@
   String visitFunctionDefinition(FunctionDefinition node) {
     String name = node.element.name;
     namer.useReturnName(node.returnContinuation);
+    String closureVariables = node.closureVariables.isEmpty
+        ? ''
+        : '{${node.closureVariables.map(namer.defineClosureName).join(' ')}} ';
     String parameters = node.parameters.map(visit).join(' ');
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(FunctionDefinition $name ($parameters return)\n'
-           '$body)';
+    return '$indentation(FunctionDefinition $name $closureVariables'
+           '($parameters return)\n$body)';
   }
 
   String visitFieldDefinition(FieldDefinition node) {
     String name = node.element.name;
-    namer.useReturnName(node.returnContinuation);
-    String body = indentBlock(() => visit(node.body));
-    return '$indentation(FieldDefinition $name (return)\n'
-           '$body)';
+    if (node.hasInitializer) {
+      namer.useReturnName(node.returnContinuation);
+      String body = indentBlock(() => visit(node.body));
+      return '$indentation(FieldDefinition $name (return)\n'
+             '$body)';
+    } else {
+      return '$indentation(FieldDefinition $name)';
+    }
   }
 
   String visitLetPrim(LetPrim node) {
@@ -165,14 +176,14 @@
   }
 
   String visitGetClosureVariable(GetClosureVariable node) {
-    return '(GetClosureVariable ${node.variable.name})';
+    return '(GetClosureVariable ${visit(node.variable.definition)})';
   }
 
   String visitSetClosureVariable(SetClosureVariable node) {
     String value = access(node.value);
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(SetClosureVariable ${node.variable.name} $value\n'
-           '$body)';
+    return '$indentation(SetClosureVariable ${visit(node.variable.definition)} '
+           '$value\n$body)';
   }
 
   String visitTypeOperator(TypeOperator node) {
@@ -196,7 +207,8 @@
   String visitDeclareFunction(DeclareFunction node) {
     String function = indentBlock(() => visit(node.definition));
     String body = indentBlock(() => visit(node.body));
-    return '$indentation(DeclareFunction ${node.variable.name} =\n'
+    String name = namer.getName(node.variable.definition);
+    return '$indentation(DeclareFunction $name =\n'
            '$function in\n'
            '$body)';
   }
@@ -223,6 +235,11 @@
     return _names[parameter] = parameter.hint.name;
   }
 
+  String defineClosureName(ClosureVariable variable) {
+    assert(!_names.containsKey(variable));
+    return _names[variable] = variable.hint.name;
+  }
+
   String defineContinuationName(Node node) {
     assert(!_names.containsKey(node));
     return _names[node] = 'k${_continuationCounter++}';
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index 5a6431a..d9efa83 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -44,7 +44,9 @@
   }
 
   visitFieldDefinition(cps_ir.FieldDefinition node) {
-    visitExecutableDefinition(node);
+    if (node.hasInitializer) {
+      visitExecutableDefinition(node);
+    }
   }
 
   visitFunctionDefinition(cps_ir.FunctionDefinition node) {
@@ -197,7 +199,7 @@
 
   visitSetClosureVariable(cps_ir.SetClosureVariable node) {
     String dummy = names.name(node);
-    String variable = node.variable.name;
+    String variable = names.name(node.variable.definition);
     String value = formatReference(node.value);
     printStmt(dummy, 'SetClosureVariable $variable = $value');
     visit(node.body);
@@ -205,7 +207,7 @@
 
   visitDeclareFunction(cps_ir.DeclareFunction node) {
     String dummy = names.name(node);
-    String variable = node.variable.name;
+    String variable = names.name(node.variable.definition);
     printStmt(dummy, 'DeclareFunction $variable');
     visit(node.body);
   }
@@ -229,6 +231,10 @@
     return "Parameter ${names.name(node)}";
   }
 
+  visitClosureVariable(cps_ir.ClosureVariable node) {
+    return "ClosureVariable ${names.name(node)}";
+  }
+
   visitContinuation(cps_ir.Continuation node) {
     return "Continuation ${names.name(node)}";
   }
@@ -256,7 +262,7 @@
   }
 
   visitGetClosureVariable(cps_ir.GetClosureVariable node) {
-    String variable = node.variable.name;
+    String variable = names.name(node.variable.definition);
     return 'GetClosureVariable $variable';
   }
 
@@ -280,13 +286,15 @@
     'r': 0,
     'B': 0,
     'v': 0,
-    'x': 0
+    'x': 0,
+    'c': 0
   };
 
   String prefix(x) {
     if (x is cps_ir.Parameter) return 'r';
     if (x is cps_ir.Continuation || x is cps_ir.FunctionDefinition) return 'B';
     if (x is cps_ir.Primitive) return 'v';
+    if (x is cps_ir.ClosureVariable) return 'c';
     return 'x';
   }
 
@@ -343,7 +351,9 @@
   }
 
   visitFieldDefinition(cps_ir.FieldDefinition node) {
-    visitExecutableDefinition(node);
+    if (node.hasInitializer) {
+      visitExecutableDefinition(node);
+    }
   }
 
   visitFunctionDefinition(cps_ir.FunctionDefinition node) {
diff --git a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
index 25f4cef..e2f4ba9 100644
--- a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
+++ b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
@@ -23,6 +23,7 @@
   }
 
   void rewriteFieldDefinition(final FieldDefinition root) {
+    if (!root.hasInitializer) return;
     rewriteExecutableDefinition(root);
   }
 
diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
index 46b6437..81e1137 100644
--- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
+++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
@@ -34,6 +34,7 @@
 
   /// Applies shrinking reductions to root, mutating root in the process.
   void rewriteFieldDefinition(FieldDefinition root) {
+    if (!root.hasInitializer) return;
     rewriteExecutableDefinition(root);
   }
 
@@ -309,7 +310,7 @@
 
   processFunctionDefinition(FunctionDefinition node) {
     node.body.parent = node;
-    node.parameters.forEach((Parameter p) => p.parent = node);
+    node.parameters.forEach((Definition p) => p.parent = node);
   }
 
   // Expressions.
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
index 8a86eda..5a0a277 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
@@ -16,36 +16,39 @@
 
 /// Translates the dart_tree IR to Dart backend AST.
 ExecutableDefinition emit(tree.ExecutableDefinition definition) {
-  return new ASTEmitter().emit(definition);
+  return new ASTEmitter().emit(definition, new BuilderContext<Statement>());
 }
 
-/// Translates the dart_tree IR to Dart backend AST.
-/// An instance of this class should only be used once; a fresh emitter
-/// must be created for each function to be emitted.
-class ASTEmitter extends tree.Visitor<dynamic, Expression> {
+// TODO(johnniwinther): Split into function/block state.
+class BuilderContext<T> {
+  /// Builder context for the enclosing function, or null if the current
+  /// function is not a local function.
+  BuilderContext<T> _parent;
+
   /// Variables to be hoisted at the top of the current function.
-  List<VariableDeclaration> variables = <VariableDeclaration>[];
+  final List<VariableDeclaration> variables = <VariableDeclaration>[];
 
   /// Maps variables to their name.
-  Map<tree.Variable, String> variableNames = <tree.Variable, String>{};
+  final Map<tree.Variable, String> variableNames = <tree.Variable, String>{};
 
   /// Maps local constants to their name.
-  Map<VariableElement, String> constantNames = <VariableElement, String>{};
+  final Map<VariableElement, String> constantNames =
+      <VariableElement, String>{};
 
   /// Variables that have had their declaration created.
-  Set<tree.Variable> declaredVariables = new Set<tree.Variable>();
+  final Set<tree.Variable> declaredVariables = new Set<tree.Variable>();
 
   /// Variable names that have already been used. Used to avoid name clashes.
-  Set<String> usedVariableNames;
+  final Set<String> usedVariableNames;
 
   /// Statements emitted by the most recent call to [visitStatement].
-  List<Statement> statementBuffer = <Statement>[];
+  List<T> _statementBuffer = <T>[];
 
   /// The element currently being emitted.
   ExecutableElement currentElement;
 
   /// Bookkeeping object needed to synthesize a variable declaration.
-  modelx.VariableList variableList
+  final modelx.VariableList variableList
       = new modelx.VariableList(tree.Modifiers.EMPTY);
 
   /// Input to [visitStatement]. Denotes the statement that will execute next
@@ -54,48 +57,169 @@
   tree.Statement fallthrough = null;
 
   /// Labels that could not be eliminated using fallthrough.
-  Set<tree.Label> usedLabels = new Set<tree.Label>();
+  final Set<tree.Label> _usedLabels = new Set<tree.Label>();
 
   /// The first dart_tree statement that is not converted to a variable
   /// initializer.
   tree.Statement firstStatement;
 
-  /// Emitter for the enclosing function, or null if the current function is
-  /// not a local function.
-  ASTEmitter parent;
+  BuilderContext() : usedVariableNames = new Set<String>();
 
-  ASTEmitter() : usedVariableNames = new Set<String>();
-
-  ASTEmitter.inner(ASTEmitter parent)
-      : this.parent = parent,
+  BuilderContext.inner(BuilderContext<T> parent)
+      : this._parent = parent,
         usedVariableNames = parent.usedVariableNames;
 
-  ExecutableDefinition emit(tree.ExecutableDefinition definition) {
-    if (definition is tree.FieldDefinition) {
-      return emitField(definition);
-    }
-    assert(definition is tree.FunctionDefinition);
-    return emitFunction(definition);
+  // TODO(johnniwinther): Fully encapsulate handling of parameter, variable
+  // and local funciton declarations.
+  void addDeclaration(tree.Variable variable, [Expression initializer]) {
+    assert(!declaredVariables.contains(variable));
+    String name = getVariableName(variable);
+    VariableDeclaration decl = new VariableDeclaration(name, initializer);
+    decl.element = variable.element;
+    declaredVariables.add(variable);
+    variables.add(decl);
   }
 
-  FieldDefinition emitField(tree.FieldDefinition definition) {
-    currentElement = definition.element;
-    visitStatement(definition.body);
-    List<Statement> bodyParts;
-    for (tree.Variable variable in variableNames.keys) {
-      if (!declaredVariables.contains(variable)) {
-        addDeclaration(variable);
-      }
-    }
-    if (variables.length > 0) {
-      bodyParts = new List<Statement>();
-      bodyParts.add(new VariableDeclarations(variables));
-      bodyParts.addAll(statementBuffer);
-    } else {
-      bodyParts = statementBuffer;
+  /// Generates a name for the given variable and synthesizes an element for it,
+  /// if necessary.
+  String getVariableName(tree.Variable variable) {
+    // If the variable belongs to an enclosing function, ask the parent emitter
+    // for the variable name.
+    if (variable.host != currentElement) {
+      return _parent.getVariableName(variable);
     }
 
-    return new FieldDefinition(definition.element, ensureExpression(bodyParts));
+    // Get the name if we already have one.
+    String name = variableNames[variable];
+    if (name != null) {
+      return name;
+    }
+
+    // Synthesize a variable name that isn't used elsewhere.
+    // The [usedVariableNames] set is shared between nested emitters,
+    // so this also prevents clash with variables in an enclosing/inner scope.
+    // The renaming phase after codegen will further prefix local variables
+    // so they cannot clash with top-level variables or fields.
+    String prefix = variable.element == null ? 'v' : variable.element.name;
+    int counter = 0;
+    name = variable.element == null ? '$prefix$counter' : variable.element.name;
+    while (!usedVariableNames.add(name)) {
+      ++counter;
+      name = '$prefix$counter';
+    }
+    variableNames[variable] = name;
+
+    // Synthesize an element for the variable
+    if (variable.element == null || name != variable.element.name) {
+      // TODO(johnniwinther): Replace by synthetic [Entity].
+      variable.element = new _SyntheticLocalVariableElement(
+          name,
+          currentElement,
+          variableList);
+    }
+    return name;
+  }
+
+  String getConstantName(VariableElement element) {
+    assert(element.kind == ElementKind.VARIABLE);
+    if (element.enclosingElement != currentElement) {
+      return _parent.getConstantName(element);
+    }
+    String name = constantNames[element];
+    if (name != null) {
+      return name;
+    }
+    String prefix = element.name;
+    int counter = 0;
+    name = element.name;
+    while (!usedVariableNames.add(name)) {
+      ++counter;
+      name = '$prefix$counter';
+    }
+    constantNames[element] = name;
+    return name;
+  }
+
+  List<T> inSubcontext(f(BuilderContext<T> subcontext),
+                       {tree.Statement fallthrough}) {
+    List<T> savedBuffer = this._statementBuffer;
+    tree.Statement savedFallthrough = this.fallthrough;
+    List<T> buffer = this._statementBuffer = <T>[];
+    if (fallthrough != null) {
+      this.fallthrough = fallthrough;
+    }
+    f(this);
+    this.fallthrough = savedFallthrough;
+    this._statementBuffer = savedBuffer;
+    return buffer;
+  }
+
+  /// Removes a trailing "return null" from the current block.
+  void removeTrailingReturn(bool isReturnNull(T statement)) {
+    if (_statementBuffer.isEmpty) return;
+    if (isReturnNull(_statementBuffer.last)) {
+      _statementBuffer.removeLast();
+    }
+  }
+
+  /// Register [label] as used.
+  void useLabel(tree.Label label) {
+    _usedLabels.add(label);
+  }
+
+  /// Remove [label] and return `true` if it was used.
+  bool removeUsedLabel(tree.Label label) {
+    return _usedLabels.remove(label);
+  }
+
+  /// Add [statement] to the current block.
+  void addStatement(T statement) {
+    _statementBuffer.add(statement);
+  }
+
+  /// The statements in the current block.
+  Iterable<T> get statements => _statementBuffer;
+}
+
+
+/// Translates the dart_tree IR to Dart backend AST.
+/// An instance of this class should only be used once; a fresh emitter
+/// must be created for each function to be emitted.
+class ASTEmitter
+    extends tree.Visitor1<dynamic, Expression, BuilderContext<Statement>> {
+
+  ExecutableDefinition emit(tree.ExecutableDefinition definition,
+                            BuilderContext<Statement> context) {
+    if (definition is tree.FieldDefinition) {
+      return emitField(definition, context);
+    }
+    assert(definition is tree.FunctionDefinition);
+    return emitFunction(definition, context);
+  }
+
+  FieldDefinition emitField(tree.FieldDefinition definition,
+                            BuilderContext<Statement> context) {
+    context.currentElement = definition.element;
+    Expression initializer;
+    if (definition.hasInitializer) {
+      visitStatement(definition.body, context);
+      List<Statement> bodyParts;
+      for (tree.Variable variable in context.variableNames.keys) {
+        if (!context.declaredVariables.contains(variable)) {
+          context.addDeclaration(variable);
+        }
+      }
+      if (context.variables.length > 0) {
+        bodyParts = new List<Statement>();
+        bodyParts.add(new VariableDeclarations(context.variables));
+        bodyParts.addAll(context.statements);
+      } else {
+        bodyParts = context.statements;
+      }
+      initializer = ensureExpression(bodyParts);
+    }
+
+    return new FieldDefinition(definition.element, initializer);
   }
 
   /// Returns an expression that will evaluate all of [bodyParts].
@@ -115,42 +239,52 @@
     return new CallFunction(function, []);
   }
 
-  FunctionExpression emitFunction(tree.FunctionDefinition definition) {
-    currentElement = definition.element;
+  FunctionExpression emitFunction(tree.FunctionDefinition definition,
+                                  BuilderContext<Statement> context) {
+    context.currentElement = definition.element;
 
-    Parameters parameters = emitRootParameters(definition);
+    Parameters parameters = emitRootParameters(definition, context);
 
     // Declare parameters.
     for (tree.Variable param in definition.parameters) {
-      variableNames[param] = param.element.name;
-      usedVariableNames.add(param.element.name);
-      declaredVariables.add(param);
+      context.variableNames[param] = param.element.name;
+      context.usedVariableNames.add(param.element.name);
+      context.declaredVariables.add(param);
     }
 
     Statement body;
     if (definition.isAbstract) {
       body = new EmptyStatement();
     } else {
-      firstStatement = definition.body;
-      visitStatement(definition.body);
-      removeTrailingReturn();
+      context.firstStatement = definition.body;
+      visitStatement(definition.body, context);
+      context.removeTrailingReturn((Statement statement) {
+        if (statement is Return) {
+          Expression expr = statement.expression;
+          if (expr is Literal && expr.value.isNull) {
+            return true;
+          }
+        }
+        return false;
+      });
 
       // Some of the variable declarations have already been added
       // if their first assignment could be pulled into the initializer.
       // Add the remaining variable declarations now.
-      for (tree.Variable variable in variableNames.keys) {
-        if (!declaredVariables.contains(variable)) {
-          addDeclaration(variable);
+      for (tree.Variable variable in context.variableNames.keys) {
+        if (!context.declaredVariables.contains(variable)) {
+          context.addDeclaration(variable);
         }
       }
 
       // Add constant declarations.
       List<VariableDeclaration> constants = <VariableDeclaration>[];
       for (ConstDeclaration constDecl in definition.localConstants) {
-        if (!constantNames.containsKey(constDecl.element))
+        if (!context.constantNames.containsKey(constDecl.element)) {
           continue; // Discard unused constants declarations.
-        String name = getConstantName(constDecl.element);
-        Expression value = emitConstant(constDecl.expression);
+        }
+        String name = context.getConstantName(constDecl.element);
+        Expression value = emitConstant(constDecl.expression, context);
         VariableDeclaration decl = new VariableDeclaration(name, value);
         decl.element = constDecl.element;
         constants.add(decl);
@@ -160,49 +294,30 @@
       if (constants.length > 0) {
         bodyParts.add(new VariableDeclarations(constants, isConst: true));
       }
-      if (variables.length > 0) {
-        bodyParts.add(new VariableDeclarations(variables));
+      if (context.variables.length > 0) {
+        bodyParts.add(new VariableDeclarations(context.variables));
       }
-      bodyParts.addAll(statementBuffer);
+      bodyParts.addAll(context.statements);
 
       body = new Block(bodyParts);
     }
-    FunctionType functionType = currentElement.type;
+    FunctionType functionType = context.currentElement.type;
 
     return new FunctionExpression(
         parameters,
         body,
-        name: currentElement.name,
+        name: context.currentElement.name,
         returnType: emitOptionalType(functionType.returnType),
-        isGetter: currentElement.isGetter,
-        isSetter: currentElement.isSetter)
-        ..element = currentElement;
-  }
-
-  void addDeclaration(tree.Variable variable, [Expression initializer]) {
-    assert(!declaredVariables.contains(variable));
-    String name = getVariableName(variable);
-    VariableDeclaration decl = new VariableDeclaration(name, initializer);
-    decl.element = variable.element;
-    declaredVariables.add(variable);
-    variables.add(decl);
-  }
-
-  /// Removes a trailing "return null" from [statementBuffer].
-  void removeTrailingReturn() {
-    if (statementBuffer.isEmpty) return;
-    if (statementBuffer.last is! Return) return;
-    Return ret = statementBuffer.last;
-    Expression expr = ret.expression;
-    if (expr is Literal && expr.value.isNull) {
-      statementBuffer.removeLast();
-    }
+        isGetter: context.currentElement.isGetter,
+        isSetter: context.currentElement.isSetter)
+        ..element = context.currentElement;
   }
 
   /// TODO(johnniwinther): Remove this when issue 21283 has been resolved.
   int pseudoNameCounter = 0;
 
   Parameter emitParameter(DartType type,
+                          BuilderContext<Statement> context,
                           {String name,
                            Element element,
                            ConstantExpression defaultValue}) {
@@ -216,7 +331,8 @@
     if (type.isFunctionType) {
       FunctionType functionType = type;
       TypeAnnotation returnType = emitOptionalType(functionType.returnType);
-      Parameters innerParameters = emitParametersFromType(functionType);
+      Parameters innerParameters =
+          emitParametersFromType(functionType, context);
       parameter = new Parameter.function(name, returnType, innerParameters);
     } else {
       TypeAnnotation typeAnnotation = emitOptionalType(type);
@@ -224,21 +340,22 @@
     }
     parameter.element = element;
     if (defaultValue != null && !defaultValue.value.isNull) {
-      parameter.defaultValue = emitConstant(defaultValue);
+      parameter.defaultValue = emitConstant(defaultValue, context);
     }
     return parameter;
   }
 
-  Parameters emitParametersFromType(FunctionType functionType) {
+  Parameters emitParametersFromType(FunctionType functionType,
+                                    BuilderContext<Statement> context) {
     if (functionType.namedParameters.isEmpty) {
       return new Parameters(
-          emitParameters(functionType.parameterTypes),
-          emitParameters(functionType.optionalParameterTypes),
+          emitParameters(functionType.parameterTypes, context),
+          emitParameters(functionType.optionalParameterTypes, context),
           false);
     } else {
       return new Parameters(
-          emitParameters(functionType.parameterTypes),
-          emitParameters(functionType.namedParameterTypes,
+          emitParameters(functionType.parameterTypes, context),
+          emitParameters(functionType.namedParameterTypes, context,
                          names: functionType.namedParameters),
           true);
     }
@@ -246,6 +363,7 @@
 
   List<Parameter> emitParameters(
       Iterable<DartType> parameterTypes,
+      BuilderContext<Statement> context,
       {Iterable<String> names: const <String>[],
        Iterable<ConstantExpression> defaultValues: const <ConstantExpression>[],
        Iterable<Element> elements: const <Element>[]}) {
@@ -256,7 +374,7 @@
       name.moveNext();
       defaultValue.moveNext();
       element.moveNext();
-      return emitParameter(type,
+      return emitParameter(type, context,
                            name: name.current,
                            defaultValue: defaultValue.current,
                            element: element.current);
@@ -265,16 +383,18 @@
 
   /// Emits parameters that are not nested inside other parameters.
   /// Root parameters can have default values, while inner parameters cannot.
-  Parameters emitRootParameters(tree.FunctionDefinition function) {
+  Parameters emitRootParameters(tree.FunctionDefinition function,
+                                BuilderContext<Statement> context) {
     FunctionType functionType = function.element.type;
     List<Parameter> required = emitParameters(
-        functionType.parameterTypes,
+        functionType.parameterTypes, context,
         elements: function.parameters.map((p) => p.element));
     bool optionalParametersAreNamed = !functionType.namedParameters.isEmpty;
     List<Parameter> optional = emitParameters(
         optionalParametersAreNamed
             ? functionType.namedParameterTypes
             : functionType.optionalParameterTypes,
+        context,
         defaultValues: function.defaultParameterValues,
         elements: function.parameters.skip(required.length)
             .map((p) => p.element));
@@ -321,117 +441,75 @@
     return new Assignment(target, '=', value);
   }
 
-  void visitExpressionStatement(tree.ExpressionStatement stmt) {
-    Expression e = visitExpression(stmt.expression);
-    statementBuffer.add(new ExpressionStatement(e));
-    visitStatement(stmt.next);
+  Block visitInSubContext(tree.Statement statement,
+                          BuilderContext<Statement> context,
+                          {tree.Statement fallthrough}) {
+    return new Block(context.inSubcontext(
+        (BuilderContext<Statement> subcontext) {
+      visitStatement(statement, subcontext);
+    }, fallthrough: fallthrough));
   }
 
-  void visitLabeledStatement(tree.LabeledStatement stmt) {
-    List<Statement> savedBuffer = statementBuffer;
-    tree.Statement savedFallthrough = fallthrough;
-    statementBuffer = <Statement>[];
-    fallthrough = stmt.next;
-    visitStatement(stmt.body);
-    if (usedLabels.remove(stmt.label)) {
-      savedBuffer.add(new LabeledStatement(stmt.label.name,
-                                           new Block(statementBuffer)));
+  void addLabeledStatement(tree.Label label,
+                           Statement statement,
+                           BuilderContext<Statement> context) {
+    if (context.removeUsedLabel(label)) {
+      context.addStatement(new LabeledStatement(label.name, statement));
     } else {
-      savedBuffer.add(new Block(statementBuffer));
+      context.addStatement(statement);
     }
-    fallthrough = savedFallthrough;
-    statementBuffer = savedBuffer;
-    visitStatement(stmt.next);
   }
 
-  /// Generates a name for the given variable and synthesizes an element for it,
-  /// if necessary.
-  String getVariableName(tree.Variable variable) {
-    // If the variable belongs to an enclosing function, ask the parent emitter
-    // for the variable name.
-    if (variable.host != currentElement) {
-      return parent.getVariableName(variable);
-    }
+  @override
+  void visitExpressionStatement(tree.ExpressionStatement stmt,
+                                BuilderContext<Statement> context) {
+    Expression e = visitExpression(stmt.expression, context);
+    context.addStatement(new ExpressionStatement(e));
 
-    // Get the name if we already have one.
-    String name = variableNames[variable];
-    if (name != null) {
-      return name;
-    }
-
-    // Synthesize a variable name that isn't used elsewhere.
-    // The [usedVariableNames] set is shared between nested emitters,
-    // so this also prevents clash with variables in an enclosing/inner scope.
-    // The renaming phase after codegen will further prefix local variables
-    // so they cannot clash with top-level variables or fields.
-    String prefix = variable.element == null ? 'v' : variable.element.name;
-    int counter = 0;
-    name = variable.element == null ? '$prefix$counter' : variable.element.name;
-    while (!usedVariableNames.add(name)) {
-      ++counter;
-      name = '$prefix$counter';
-    }
-    variableNames[variable] = name;
-
-    // Synthesize an element for the variable
-    if (variable.element == null || name != variable.element.name) {
-      // TODO(johnniwinther): Replace by synthetic [Entity].
-      variable.element = new _SyntheticLocalVariableElement(
-          name,
-          currentElement,
-          variableList);
-    }
-    return name;
+    visitStatement(stmt.next, context);
   }
 
-  String getConstantName(VariableElement element) {
-    assert(element.kind == ElementKind.VARIABLE);
-    if (element.enclosingElement != currentElement) {
-      return parent.getConstantName(element);
-    }
-    String name = constantNames[element];
-    if (name != null) {
-      return name;
-    }
-    String prefix = element.name;
-    int counter = 0;
-    name = element.name;
-    while (!usedVariableNames.add(name)) {
-      ++counter;
-      name = '$prefix$counter';
-    }
-    constantNames[element] = name;
-    return name;
+  @override
+  void visitLabeledStatement(tree.LabeledStatement stmt,
+                             BuilderContext<Statement> context) {
+    Block block = visitInSubContext(stmt.body, context, fallthrough: stmt.next);
+    addLabeledStatement(stmt.label, block, context);
+
+    visitStatement(stmt.next, context);
   }
 
   bool isNullLiteral(Expression exp) => exp is Literal && exp.value.isNull;
 
-  void visitAssign(tree.Assign stmt) {
+  @override
+  void visitAssign(tree.Assign stmt,
+                   BuilderContext<Statement> context) {
     // Try to emit a local function declaration. This is useful for functions
     // that may occur in expression context, but could not be inlined anywhere.
     if (stmt.variable.element is FunctionElement &&
         stmt.definition is tree.FunctionExpression &&
-        !declaredVariables.contains(stmt.variable)) {
+        !context.declaredVariables.contains(stmt.variable)) {
       tree.FunctionExpression functionExp = stmt.definition;
-      FunctionExpression function = makeSubFunction(functionExp.definition);
+      FunctionExpression function =
+          makeSubFunction(functionExp.definition, context);
       FunctionDeclaration decl = new FunctionDeclaration(function);
-      statementBuffer.add(decl);
-      declaredVariables.add(stmt.variable);
-      visitStatement(stmt.next);
+      context.addStatement(decl);
+      context.declaredVariables.add(stmt.variable);
+
+      visitStatement(stmt.next, context);
       return;
     }
 
-    bool isFirstOccurrence = (variableNames[stmt.variable] == null);
-    bool isDeclaredHere = stmt.variable.host == currentElement;
-    String name = getVariableName(stmt.variable);
-    Expression definition = visitExpression(stmt.definition);
+    bool isFirstOccurrence = (context.variableNames[stmt.variable] == null);
+    bool isDeclaredHere = stmt.variable.host == context.currentElement;
+    String name = context.getVariableName(stmt.variable);
+    Expression definition = visitExpression(stmt.definition, context);
 
     // Try to pull into initializer.
-    if (firstStatement == stmt && isFirstOccurrence && isDeclaredHere) {
+    if (context.firstStatement == stmt && isFirstOccurrence && isDeclaredHere) {
       if (isNullLiteral(definition)) definition = null;
-      addDeclaration(stmt.variable, definition);
-      firstStatement = stmt.next;
-      visitStatement(stmt.next);
+      context.addDeclaration(stmt.variable, definition);
+      context.firstStatement = stmt.next;
+      visitStatement(stmt.next, context);
       return;
     }
 
@@ -443,125 +521,121 @@
       if (isNullLiteral(definition)) definition = null;
       VariableDeclaration decl = new VariableDeclaration(name, definition)
                                      ..element = stmt.variable.element;
-      declaredVariables.add(stmt.variable);
-      statementBuffer.add(new VariableDeclarations([decl]));
-      visitStatement(stmt.next);
+      context.declaredVariables.add(stmt.variable);
+      context.addStatement(new VariableDeclarations([decl]));
+      visitStatement(stmt.next, context);
       return;
     }
 
-    statementBuffer.add(new ExpressionStatement(makeAssignment(
-        visitVariable(stmt.variable),
+    context.addStatement(new ExpressionStatement(makeAssignment(
+        visitVariable(stmt.variable, context),
         definition)));
-    visitStatement(stmt.next);
+    visitStatement(stmt.next, context);
   }
 
-  void visitReturn(tree.Return stmt) {
-    Expression inner = visitExpression(stmt.value);
-    statementBuffer.add(new Return(inner));
+  @override
+  void visitReturn(tree.Return stmt,
+                   BuilderContext<Statement> context) {
+    Expression inner = visitExpression(stmt.value, context);
+    context.addStatement(new Return(inner));
   }
 
-  void visitBreak(tree.Break stmt) {
-    tree.Statement fall = fallthrough;
+  @override
+  void visitBreak(tree.Break stmt,
+                  BuilderContext<Statement> context) {
+    tree.Statement fall = context.fallthrough;
     if (stmt.target.binding.next == fall) {
       // Fall through to break target
     } else if (fall is tree.Break && fall.target == stmt.target) {
       // Fall through to equivalent break
     } else {
-      usedLabels.add(stmt.target);
-      statementBuffer.add(new Break(stmt.target.name));
+      context.useLabel(stmt.target);
+      context.addStatement(new Break(stmt.target.name));
     }
   }
 
-  void visitContinue(tree.Continue stmt) {
-    tree.Statement fall = fallthrough;
+  @override
+  void visitContinue(tree.Continue stmt,
+                     BuilderContext<Statement> context) {
+    tree.Statement fall = context.fallthrough;
     if (stmt.target.binding == fall) {
       // Fall through to continue target
     } else if (fall is tree.Continue && fall.target == stmt.target) {
       // Fall through to equivalent continue
     } else {
-      usedLabels.add(stmt.target);
-      statementBuffer.add(new Continue(stmt.target.name));
+      context.useLabel(stmt.target);
+      context.addStatement(new Continue(stmt.target.name));
     }
   }
 
-  void visitIf(tree.If stmt) {
-    Expression condition = visitExpression(stmt.condition);
-    List<Statement> savedBuffer = statementBuffer;
-    List<Statement> thenBuffer = statementBuffer = <Statement>[];
-    visitStatement(stmt.thenStatement);
-    List<Statement> elseBuffer = statementBuffer = <Statement>[];
-    visitStatement(stmt.elseStatement);
-    savedBuffer.add(
-        new If(condition, new Block(thenBuffer), new Block(elseBuffer)));
-    statementBuffer = savedBuffer;
+  @override
+  void visitIf(tree.If stmt,
+               BuilderContext<Statement> context) {
+    Expression condition = visitExpression(stmt.condition, context);
+    Block thenBlock = visitInSubContext(stmt.thenStatement, context);
+    Block elseBlock= visitInSubContext(stmt.elseStatement, context);
+    context.addStatement(new If(condition, thenBlock, elseBlock));
   }
 
-  void visitWhileTrue(tree.WhileTrue stmt) {
-    List<Statement> savedBuffer = statementBuffer;
-    tree.Statement savedFallthrough = fallthrough;
-    statementBuffer = <Statement>[];
-    fallthrough = stmt;
-
-    visitStatement(stmt.body);
-    Statement body = new Block(statementBuffer);
-    Statement statement = new While(new Literal(new TrueConstantValue()),
-                                    body);
-    if (usedLabels.remove(stmt.label)) {
-      statement = new LabeledStatement(stmt.label.name, statement);
-    }
-    savedBuffer.add(statement);
-
-    statementBuffer = savedBuffer;
-    fallthrough = savedFallthrough;
+  @override
+  void visitWhileTrue(tree.WhileTrue stmt,
+                      BuilderContext<Statement> context) {
+    Block body = visitInSubContext(stmt.body, context, fallthrough: stmt);
+    Statement statement =
+        new While(new Literal(new TrueConstantValue()), body);
+    addLabeledStatement(stmt.label, statement, context);
   }
 
-  void visitWhileCondition(tree.WhileCondition stmt) {
-    Expression condition = visitExpression(stmt.condition);
+  @override
+  void visitWhileCondition(tree.WhileCondition stmt,
+                           BuilderContext<Statement> context) {
+    Expression condition = visitExpression(stmt.condition, context);
+    Block body = visitInSubContext(stmt.body, context, fallthrough: stmt);
+    Statement statement = new While(condition, body);
+    addLabeledStatement(stmt.label, statement, context);
 
-    List<Statement> savedBuffer = statementBuffer;
-    tree.Statement savedFallthrough = fallthrough;
-    statementBuffer = <Statement>[];
-    fallthrough = stmt;
-
-    visitStatement(stmt.body);
-    Statement body = new Block(statementBuffer);
-    Statement statement;
-    statement = new While(condition, body);
-    if (usedLabels.remove(stmt.label)) {
-      statement = new LabeledStatement(stmt.label.name, statement);
-    }
-    savedBuffer.add(statement);
-
-    statementBuffer = savedBuffer;
-    fallthrough = savedFallthrough;
-
-    visitStatement(stmt.next);
+    visitStatement(stmt.next, context);
   }
 
-  Expression visitConstant(tree.Constant exp) {
-    return emitConstant(exp.expression);
+  @override
+  Expression visitConstant(tree.Constant exp,
+                           BuilderContext<Statement> context) {
+    return emitConstant(exp.expression, context);
   }
 
-  Expression visitThis(tree.This exp) {
+  @override
+  Expression visitThis(tree.This exp,
+                       BuilderContext<Statement> context) {
     return new This();
   }
 
-  Expression visitReifyTypeVar(tree.ReifyTypeVar exp) {
+  @override
+  Expression visitReifyTypeVar(tree.ReifyTypeVar exp,
+                               BuilderContext<Statement> context) {
     return new ReifyTypeVar(exp.typeVariable.name)
                ..element = exp.typeVariable;
   }
 
-  Expression visitLiteralList(tree.LiteralList exp) {
-    return new LiteralList(
-        exp.values.map(visitExpression).toList(growable: false),
+  List<Expression> visitExpressions(List<tree.Expression> expressions,
+                                    BuilderContext<Statement> context) {
+    return expressions.map((expression) => visitExpression(expression, context))
+        .toList(growable: false);
+  }
+
+  @override
+  Expression visitLiteralList(tree.LiteralList exp,
+                              BuilderContext<Statement> context) {
+    return new LiteralList(visitExpressions(exp.values, context),
         typeArgument: emitOptionalType(exp.type.typeArguments.single));
   }
 
-  Expression visitLiteralMap(tree.LiteralMap exp) {
+  @override
+  Expression visitLiteralMap(tree.LiteralMap exp,
+                             BuilderContext<Statement> context) {
     List<LiteralMapEntry> entries = new List<LiteralMapEntry>.generate(
         exp.entries.length,
-        (i) => new LiteralMapEntry(visitExpression(exp.entries[i].key),
-                                   visitExpression(exp.entries[i].value)));
+        (i) => new LiteralMapEntry(visitExpression(exp.entries[i].key, context),
+                                   visitExpression(exp.entries[i].value, context)));
     List<TypeAnnotation> typeArguments = exp.type.treatAsRaw
         ? null
         : exp.type.typeArguments.map(createTypeAnnotation)
@@ -569,25 +643,30 @@
     return new LiteralMap(entries, typeArguments: typeArguments);
   }
 
-  Expression visitTypeOperator(tree.TypeOperator exp) {
-    return new TypeOperator(visitExpression(exp.receiver),
+  @override
+  Expression visitTypeOperator(tree.TypeOperator exp,
+                               BuilderContext<Statement> context) {
+    return new TypeOperator(visitExpression(exp.receiver, context),
                             exp.operator,
                             createTypeAnnotation(exp.type));
   }
 
-  List<Argument> emitArguments(tree.Invoke exp) {
+  List<Argument> emitArguments(tree.Invoke exp,
+                               BuilderContext<Statement> context) {
     List<tree.Expression> args = exp.arguments;
     int positionalArgumentCount = exp.selector.positionalArgumentCount;
     List<Argument> result = new List<Argument>.generate(positionalArgumentCount,
-        (i) => visitExpression(exp.arguments[i]));
+        (i) => visitExpression(exp.arguments[i], context));
     for (int i = 0; i < exp.selector.namedArgumentCount; ++i) {
       result.add(new NamedArgument(exp.selector.namedArguments[i],
-          visitExpression(exp.arguments[positionalArgumentCount + i])));
+          visitExpression(exp.arguments[positionalArgumentCount + i], context)));
     }
     return result;
   }
 
-  Expression visitInvokeStatic(tree.InvokeStatic exp) {
+  @override
+  Expression visitInvokeStatic(tree.InvokeStatic exp,
+                               BuilderContext<Statement> context) {
     switch (exp.selector.kind) {
       case SelectorKind.GETTER:
         return new Identifier(exp.target.name)..element = exp.target;
@@ -596,10 +675,11 @@
         return new Assignment(
             new Identifier(exp.target.name)..element = exp.target,
             '=',
-            visitExpression(exp.arguments[0]));
+            visitExpression(exp.arguments[0], context));
 
       case SelectorKind.CALL:
-        return new CallStatic(null, exp.target.name, emitArguments(exp))
+        return new CallStatic(
+            null, exp.target.name, emitArguments(exp, context))
                    ..element = exp.target;
 
       default:
@@ -607,8 +687,9 @@
     }
   }
 
-  Expression emitMethodCall(tree.Invoke exp, Receiver receiver) {
-    List<Argument> args = emitArguments(exp);
+  Expression emitMethodCall(tree.Invoke exp, Receiver receiver,
+                            BuilderContext<Statement> context) {
+    List<Argument> args = emitArguments(exp, context);
     switch (exp.selector.kind) {
       case SelectorKind.CALL:
         if (exp.selector.name == "call") {
@@ -646,17 +727,23 @@
     }
   }
 
-  Expression visitInvokeMethod(tree.InvokeMethod exp) {
-    Expression receiver = visitExpression(exp.receiver);
-    return emitMethodCall(exp, receiver);
+  @override
+  Expression visitInvokeMethod(tree.InvokeMethod exp,
+                               BuilderContext<Statement> context) {
+    Expression receiver = visitExpression(exp.receiver, context);
+    return emitMethodCall(exp, receiver, context);
   }
 
-  Expression visitInvokeSuperMethod(tree.InvokeSuperMethod exp) {
-    return emitMethodCall(exp, new SuperReceiver());
+  @override
+  Expression visitInvokeSuperMethod(tree.InvokeSuperMethod exp,
+                                    BuilderContext<Statement> context) {
+    return emitMethodCall(exp, new SuperReceiver(), context);
   }
 
-  Expression visitInvokeConstructor(tree.InvokeConstructor exp) {
-    List args = emitArguments(exp);
+  @override
+  Expression visitInvokeConstructor(tree.InvokeConstructor exp,
+                                    BuilderContext<Statement> context) {
+    List args = emitArguments(exp, context);
     FunctionElement constructor = exp.target;
     String name = constructor.name.isEmpty ? null : constructor.name;
     return new CallNew(createTypeAnnotation(exp.type),
@@ -667,63 +754,78 @@
                ..dartType = exp.type;
   }
 
-  Expression visitConcatenateStrings(tree.ConcatenateStrings exp) {
-    List args = exp.arguments.map(visitExpression).toList(growable:false);
-    return new StringConcat(args);
+  @override
+  Expression visitConcatenateStrings(tree.ConcatenateStrings exp,
+                                     BuilderContext<Statement> context) {
+    return new StringConcat(visitExpressions(exp.arguments, context));
   }
 
-  Expression visitConditional(tree.Conditional exp) {
+  @override
+  Expression visitConditional(tree.Conditional exp,
+                              BuilderContext<Statement> context) {
     return new Conditional(
-        visitExpression(exp.condition),
-        visitExpression(exp.thenExpression),
-        visitExpression(exp.elseExpression));
+        visitExpression(exp.condition, context),
+        visitExpression(exp.thenExpression, context),
+        visitExpression(exp.elseExpression, context));
   }
 
-  Expression visitLogicalOperator(tree.LogicalOperator exp) {
-    return new BinaryOperator(visitExpression(exp.left),
+  @override
+  Expression visitLogicalOperator(tree.LogicalOperator exp,
+                                  BuilderContext<Statement> context) {
+    return new BinaryOperator(visitExpression(exp.left, context),
                               exp.operator,
-                              visitExpression(exp.right));
+                              visitExpression(exp.right, context));
   }
 
-  Expression visitNot(tree.Not exp) {
-    return new UnaryOperator('!', visitExpression(exp.operand));
+  @override
+  Expression visitNot(tree.Not exp,
+                      BuilderContext<Statement> context) {
+    return new UnaryOperator('!', visitExpression(exp.operand, context));
   }
 
-  Expression visitVariable(tree.Variable exp) {
-    return new Identifier(getVariableName(exp))
+  @override
+  Expression visitVariable(tree.Variable exp,
+                           BuilderContext<Statement> context) {
+    return new Identifier(context.getVariableName(exp))
                ..element = exp.element;
   }
 
-  FunctionExpression makeSubFunction(tree.FunctionDefinition function) {
-    return new ASTEmitter.inner(this).emit(function);
+  FunctionExpression makeSubFunction(tree.FunctionDefinition function,
+                                     BuilderContext<Statement> context) {
+    return emit(function, new BuilderContext<Statement>.inner(context));
   }
 
-  Expression visitFunctionExpression(tree.FunctionExpression exp) {
-    return makeSubFunction(exp.definition)..name = null;
+  @override
+  Expression visitFunctionExpression(tree.FunctionExpression exp,
+                                     BuilderContext<Statement> context) {
+    return makeSubFunction(exp.definition, context)..name = null;
   }
 
-  void visitFunctionDeclaration(tree.FunctionDeclaration node) {
-    assert(variableNames[node.variable] == null);
-    String name = getVariableName(node.variable);
-    FunctionExpression inner = makeSubFunction(node.definition);
+  @override
+  void visitFunctionDeclaration(tree.FunctionDeclaration node,
+                                BuilderContext<Statement> context) {
+    assert(context.variableNames[node.variable] == null);
+    String name = context.getVariableName(node.variable);
+    FunctionExpression inner = makeSubFunction(node.definition, context);
     inner.name = name;
     FunctionDeclaration decl = new FunctionDeclaration(inner);
-    declaredVariables.add(node.variable);
-    statementBuffer.add(decl);
-    visitStatement(node.next);
+    context.declaredVariables.add(node.variable);
+    context.addStatement(decl);
+    visitStatement(node.next, context);
   }
 
-  /// Like [createTypeAnnotation] except the dynamic type is converted to null.
-  TypeAnnotation emitOptionalType(DartType type) {
-    if (type.treatAsDynamic) {
-      return null;
-    } else {
-      return createTypeAnnotation(type);
-    }
+  Expression emitConstant(ConstantExpression exp,
+                          BuilderContext<Statement> context) {
+    return const ConstantEmitter().visit(exp, context);
   }
+}
 
-  Expression emitConstant(ConstantExpression exp) {
-    return new ConstantEmitter(this).visit(exp);
+/// Like [createTypeAnnotation] except the dynamic type is converted to null.
+TypeAnnotation emitOptionalType(DartType type) {
+  if (type.treatAsDynamic) {
+    return null;
+  } else {
+    return createTypeAnnotation(type);
   }
 }
 
@@ -753,9 +855,9 @@
   }
 }
 
-class ConstantEmitter extends ConstantExpressionVisitor<Null, Expression> {
-  ASTEmitter parent;
-  ConstantEmitter(this.parent);
+class ConstantEmitter
+    extends ConstantExpressionVisitor<BuilderContext<Statement>, Expression> {
+  const ConstantEmitter();
 
   Expression handlePrimitiveConstant(PrimitiveConstantValue value) {
     // Num constants may be negative, while literals must be non-negative:
@@ -774,14 +876,21 @@
     return new Literal(value);
   }
 
+  List<Expression> visitExpressions(List<ConstantExpression> expressions,
+                                    BuilderContext<Statement> context) {
+    return expressions.map((expression) => visit(expression, context))
+        .toList(growable: false);
+  }
+
   @override
-  Expression visitPrimitive(PrimitiveConstantExpression exp, [_]) {
+  Expression visitPrimitive(PrimitiveConstantExpression exp,
+                            BuilderContext<Statement> context) {
     return handlePrimitiveConstant(exp.value);
   }
 
   /// Given a negative num constant, returns the corresponding positive
   /// literal wrapped by a unary minus operator.
-  Expression negatedLiteral(NumConstantValue constant, [_]) {
+  Expression negatedLiteral(NumConstantValue constant) {
     assert(constant.primitiveValue.isNegative);
     NumConstantValue positiveConstant;
     if (constant.isInt) {
@@ -795,19 +904,21 @@
   }
 
   @override
-  Expression visitList(ListConstantExpression exp, [_]) {
+  Expression visitList(ListConstantExpression exp,
+                       BuilderContext<Statement> context) {
     return new LiteralList(
-        exp.values.map(visit).toList(growable: false),
+        visitExpressions(exp.values, context),
         isConst: true,
-        typeArgument: parent.emitOptionalType(exp.type.typeArguments.single));
+        typeArgument: emitOptionalType(exp.type.typeArguments.single));
   }
 
   @override
-  Expression visitMap(MapConstantExpression exp, [_]) {
+  Expression visitMap(MapConstantExpression exp,
+                      BuilderContext<Statement> context) {
     List<LiteralMapEntry> entries = new List<LiteralMapEntry>.generate(
         exp.values.length,
-        (i) => new LiteralMapEntry(visit(exp.keys[i]),
-                                   visit(exp.values[i])));
+        (i) => new LiteralMapEntry(visit(exp.keys[i], context),
+                                   visit(exp.values[i], context)));
     List<TypeAnnotation> typeArguments = exp.type.treatAsRaw
         ? null
         : exp.type.typeArguments.map(createTypeAnnotation).toList();
@@ -815,14 +926,15 @@
   }
 
   @override
-  Expression visitConstructed(ConstructedConstantExpresssion exp, [_]) {
+  Expression visitConstructed(ConstructedConstantExpresssion exp,
+                              BuilderContext<Statement> context) {
     int positionalArgumentCount = exp.selector.positionalArgumentCount;
     List<Argument> args = new List<Argument>.generate(
         positionalArgumentCount,
-        (i) => visit(exp.arguments[i]));
+        (i) => visit(exp.arguments[i], context));
     for (int i = 0; i < exp.selector.namedArgumentCount; ++i) {
       args.add(new NamedArgument(exp.selector.namedArguments[i],
-          visit(exp.arguments[positionalArgumentCount + i])));
+          visit(exp.arguments[positionalArgumentCount + i], context)));
     }
 
     FunctionElement constructor = exp.target;
@@ -836,46 +948,54 @@
   }
 
   @override
-  Expression visitConcatenate(ConcatenateConstantExpression exp, [_]) {
-    return new StringConcat(exp.arguments.map(visit).toList(growable: false));
+  Expression visitConcatenate(ConcatenateConstantExpression exp,
+                              BuilderContext<Statement> context) {
+
+    return new StringConcat(visitExpressions(exp.arguments, context));
   }
 
   @override
-  Expression visitSymbol(SymbolConstantExpression exp, [_]) {
+  Expression visitSymbol(SymbolConstantExpression exp,
+                         BuilderContext<Statement> context) {
     return new LiteralSymbol(exp.name);
   }
 
   @override
-  Expression visitType(TypeConstantExpression exp, [_]) {
+  Expression visitType(TypeConstantExpression exp,
+                       BuilderContext<Statement> context) {
     DartType type = exp.type;
     return new LiteralType(type.name)
                ..type = type;
   }
 
   @override
-  Expression visitVariable(VariableConstantExpression exp, [_]) {
+  Expression visitVariable(VariableConstantExpression exp,
+                           BuilderContext<Statement> context) {
     Element element = exp.element;
     if (element.kind != ElementKind.VARIABLE) {
       return new Identifier(element.name)..element = element;
     }
-    String name = parent.getConstantName(element);
+    String name = context.getConstantName(element);
     return new Identifier(name)
                ..element = element;
   }
 
   @override
-  Expression visitFunction(FunctionConstantExpression exp, [_]) {
+  Expression visitFunction(FunctionConstantExpression exp,
+                           BuilderContext<Statement> context) {
     return new Identifier(exp.element.name)
                ..element = exp.element;
   }
 
   @override
-  Expression visitBinary(BinaryConstantExpression exp, [_]) {
+  Expression visitBinary(BinaryConstantExpression exp,
+                         BuilderContext<Statement> context) {
     return handlePrimitiveConstant(exp.value);
   }
 
   @override
-  Expression visitConditional(ConditionalConstantExpression exp, [_]) {
+  Expression visitConditional(ConditionalConstantExpression exp,
+                              BuilderContext<Statement> context) {
     if (exp.condition.value.isTrue) {
       return exp.trueExp.accept(this);
     } else {
@@ -884,7 +1004,8 @@
   }
 
   @override
-  Expression visitUnary(UnaryConstantExpression exp, [_]) {
+  Expression visitUnary(UnaryConstantExpression exp,
+                        BuilderContext<Statement> context) {
     return handlePrimitiveConstant(exp.value);
   }
 }
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index fb8c2cf..c2638b4 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -812,10 +812,13 @@
 
   final Set<Element> newlyEnqueuedElements;
 
+  final Set<Selector> newlySeenSelectors;
+
   CodegenEnqueuer(Compiler compiler,
                   ItemCompilationContext itemCompilationContextCreator())
       : queue = new Queue<CodegenWorkItem>(),
         newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
+        newlySeenSelectors = compiler.cacheStrategy.newSet(),
         super('codegen enqueuer', compiler, itemCompilationContextCreator);
 
   bool isProcessed(Element member) =>
@@ -875,6 +878,13 @@
       }
     }
   }
+
+  void handleUnseenSelector(String methodName, Selector selector) {
+    if (compiler.hasIncrementalSupport) {
+      newlySeenSelectors.add(selector);
+    }
+    super.handleUnseenSelector(methodName, selector);
+  }
 }
 
 /// Parameterizes filtering of which work items are enqueued.
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index f06b1cc..7c7b867 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -1143,6 +1143,7 @@
     Selector selector = elements.getSelector(node);
     if (element != null && element.isFunction) {
       assert(element.isLocal);
+      if (!selector.applies(element, compiler.world)) return types.dynamicType;
       // This only works for function statements. We need a
       // more sophisticated type system with function types to support
       // more.
diff --git a/pkg/compiler/lib/src/js/builder.dart b/pkg/compiler/lib/src/js/builder.dart
index ac63a56..cb002da 100644
--- a/pkg/compiler/lib/src/js/builder.dart
+++ b/pkg/compiler/lib/src/js/builder.dart
@@ -328,10 +328,10 @@
   LiteralNumber number(num value) => new LiteralNumber('$value');
 
   ArrayInitializer numArray(Iterable<int> list) =>
-      new ArrayInitializer.from(list.map(number));
+      new ArrayInitializer(list.map(number).toList());
 
   ArrayInitializer stringArray(Iterable<String> list) =>
-      new ArrayInitializer.from(list.map(string));
+      new ArrayInitializer(list.map(string).toList());
 
   Comment comment(String text) => new Comment(text);
 
@@ -727,14 +727,19 @@
     } else if (acceptCategory(LBRACE)) {
       return parseObjectInitializer();
     } else if (acceptCategory(LSQUARE)) {
-      var values = <ArrayElement>[];
-      if (!acceptCategory(RSQUARE)) {
-        do {
-          values.add(new ArrayElement(values.length, parseAssignment()));
-        } while (acceptCategory(COMMA));
-        expectCategory(RSQUARE);
+      var values = <Expression>[];
+
+      while (true) {
+        if (acceptCategory(COMMA)) {
+          values.add(new ArrayHole());
+          continue;
+        }
+        if (acceptCategory(RSQUARE)) break;
+        values.add(parseAssignment());
+        if (acceptCategory(RSQUARE)) break;
+        expectCategory(COMMA);
       }
-      return new ArrayInitializer(values.length, values);
+      return new ArrayInitializer(values);
     } else if (last != null && last.startsWith("/")) {
       String regexp = getDelimited(lastPosition);
       getToken();
diff --git a/pkg/compiler/lib/src/js/nodes.dart b/pkg/compiler/lib/src/js/nodes.dart
index 8d4f35c..42c7513 100644
--- a/pkg/compiler/lib/src/js/nodes.dart
+++ b/pkg/compiler/lib/src/js/nodes.dart
@@ -55,7 +55,7 @@
   T visitLiteralNull(LiteralNull node);
 
   T visitArrayInitializer(ArrayInitializer node);
-  T visitArrayElement(ArrayElement node);
+  T visitArrayHole(ArrayHole node);
   T visitObjectInitializer(ObjectInitializer node);
   T visitProperty(Property node);
   T visitRegExpLiteral(RegExpLiteral node);
@@ -145,7 +145,7 @@
   T visitLiteralNull(LiteralNull node) => visitLiteral(node);
 
   T visitArrayInitializer(ArrayInitializer node) => visitExpression(node);
-  T visitArrayElement(ArrayElement node) => visitNode(node);
+  T visitArrayHole(ArrayHole node) => visitExpression(node);
   T visitObjectInitializer(ObjectInitializer node) => visitExpression(node);
   T visitProperty(Property node) => visitNode(node);
   T visitRegExpLiteral(RegExpLiteral node) => visitExpression(node);
@@ -934,53 +934,33 @@
 }
 
 class ArrayInitializer extends Expression {
-  final int length;
-  // We represent the array as sparse list of elements. Each element knows its
-  // position in the array.
-  final List<ArrayElement> elements;
+  final List<Expression> elements;
 
-  ArrayInitializer(this.length, this.elements);
-
-  factory ArrayInitializer.from(Iterable<Expression> expressions) {
-    List<ArrayElement> elements = _convert(expressions);
-    return new ArrayInitializer(elements.length, elements);
-  }
+  ArrayInitializer(this.elements);
 
   accept(NodeVisitor visitor) => visitor.visitArrayInitializer(this);
 
   void visitChildren(NodeVisitor visitor) {
-    for (ArrayElement element in elements) element.accept(visitor);
+    for (Expression element in elements) element.accept(visitor);
   }
 
-  ArrayInitializer _clone() => new ArrayInitializer(length, elements);
+  ArrayInitializer _clone() => new ArrayInitializer(elements);
 
   int get precedenceLevel => PRIMARY;
-
-  static List<ArrayElement> _convert(Iterable<Expression> expressions) {
-    int index = 0;
-    return expressions.map(
-        (expression) => new ArrayElement(index++, expression))
-        .toList();
-  }
 }
 
 /**
- * An expression inside an [ArrayInitializer]. An [ArrayElement] knows
- * its position in the containing [ArrayInitializer].
+ * An empty place in an [ArrayInitializer].
+ * For example the list [1, , , 2] would contain two holes.
  */
-class ArrayElement extends Node {
-  final int index;
-  final Expression value;
+class ArrayHole extends Expression {
+  accept(NodeVisitor visitor) => visitor.visitArrayHole(this);
 
-  ArrayElement(this.index, this.value);
+  void visitChildren(NodeVisitor visitor) {}
 
-  accept(NodeVisitor visitor) => visitor.visitArrayElement(this);
+  ArrayHole _clone() => new ArrayHole();
 
-  void visitChildren(NodeVisitor visitor) {
-    value.accept(visitor);
-  }
-
-  ArrayElement _clone() => new ArrayElement(index, value);
+  int get precedenceLevel => PRIMARY;
 }
 
 class ObjectInitializer extends Expression {
diff --git a/pkg/compiler/lib/src/js/printer.dart b/pkg/compiler/lib/src/js/printer.dart
index f64bdfb..11c39cb 100644
--- a/pkg/compiler/lib/src/js/printer.dart
+++ b/pkg/compiler/lib/src/js/printer.dart
@@ -774,28 +774,28 @@
 
   visitArrayInitializer(ArrayInitializer node) {
     out("[");
-    List<ArrayElement> elements = node.elements;
-    int elementIndex = 0;
-    for (int i = 0; i < node.length; i++) {
-      if (elementIndex < elements.length &&
-          elements[elementIndex].index == i) {
-        visitNestedExpression(elements[elementIndex].value, ASSIGNMENT,
-                              newInForInit: false, newAtStatementBegin: false);
-        elementIndex++;
-        // We can avoid a trailing "," if there was an element just before. So
-        // `[1]` and `[1,]` are the same, but `[,]` and `[]` are not.
-        if (i != node.length - 1) {
-          out(",");
-          spaceOut();
-        }
-      } else {
+    List<Expression> elements = node.elements;
+    for (int i = 0; i < elements.length; i++) {
+      Expression element = elements[i];
+      if (element is ArrayHole) {
+        // Note that array holes must have a trailing "," even if they are
+        // in last position. Otherwise `[,]` (having length 1) would become
+        // equal to `[]` (the empty array)
+        // and [1,,] (array with 1 and a hole) would become [1,] = [1].
         out(",");
+        continue;
       }
+      if (i != 0) spaceOut();
+      visitNestedExpression(element, ASSIGNMENT,
+                            newInForInit: false, newAtStatementBegin: false);
+      // We can skip the trailing "," for the last element (since it's not
+      // an array hole).
+      if (i != elements.length - 1) out(",");
     }
     out("]");
   }
 
-  visitArrayElement(ArrayElement node) {
+  visitArrayHole(ArrayHole node) {
     throw "Unreachable";
   }
 
diff --git a/pkg/compiler/lib/src/js/template.dart b/pkg/compiler/lib/src/js/template.dart
index 03b956e..6237adc 100644
--- a/pkg/compiler/lib/src/js/template.dart
+++ b/pkg/compiler/lib/src/js/template.dart
@@ -612,26 +612,20 @@
       (arguments) => new LiteralNull();
 
   Instantiator visitArrayInitializer(ArrayInitializer node) {
-    // Assume array has no missing elements.
     // TODO(sra): Implement splicing?
     List<Instantiator> elementMakers = node.elements
-        .map((ArrayElement element) => visit(element.value))
-        .toList();
+        .map(visit)
+        .toList(growable: false);
     return (arguments) {
-      List<ArrayElement> elements = <ArrayElement>[];
-      void add(Expression value) {
-        elements.add(new ArrayElement(elements.length, value));
-      }
-      for (Instantiator instantiator in elementMakers) {
-        var result = instantiator(arguments);
-        add(result);
-      }
-      return new ArrayInitializer(elements.length, elements);
+      List<Expression> elements = elementMakers
+          .map((Instantiator instantiator) => instantiator(arguments))
+          .toList(growable: false);
+      return new ArrayInitializer(elements);
     };
   }
 
-  Instantiator visitArrayElement(ArrayElement node) {
-    throw 'Should not get here'; // Handled in visitArrayInitializer.
+  Instantiator visitArrayHole(ArrayHole node) {
+    return (arguments) => new ArrayHole();
   }
 
   Instantiator visitObjectInitializer(ObjectInitializer node) {
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 75238e4..d6932e5 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -557,8 +557,17 @@
   /**
    * Record that [method] is called from a subclass via `super`.
    */
-  void registerAliasedSuperMember(FunctionElement method) {
-    aliasedSuperMembers.add(method);
+  bool maybeRegisterAliasedSuperMember(Element member, Selector selector) {
+    if (selector.isGetter || compiler.hasIncrementalSupport) {
+      // Invoking a super getter isn't supported, this would require changes to
+      // compact field descriptors in the emitter.
+      // We also turn off this optimization in incremental compilation, to
+      // avoid having to regenerate a method just because someone started
+      // calling it through super.
+      return false;
+    }
+    aliasedSuperMembers.add(member);
+    return true;
   }
 
   /**
@@ -2112,7 +2121,7 @@
 
     List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record];
     FunctionElement helper = findHelper('isJsIndexable');
-    jsAst.Expression helperExpression = namer.elementAccess(helper);
+    jsAst.Expression helperExpression = emitter.staticFunctionAccess(helper);
     return new jsAst.Call(helperExpression, arguments);
   }
 
@@ -2175,6 +2184,15 @@
     customElementsAnalysis.onQueueEmpty(enqueuer);
     if (!enqueuer.queueIsEmpty) return false;
 
+    if (compiler.hasIncrementalSupport) {
+      // Always enable tear-off closures during incremental compilation.
+      Element e = findHelper('closureFromTearOff');
+      if (e != null && !enqueuer.isProcessed(e)) {
+        registerBackendUse(e);
+        enqueuer.addToWorkList(e);
+      }
+    }
+
     if (!enqueuer.isResolutionQueue && preMirrorsMethodCount == 0) {
       preMirrorsMethodCount = generatedCode.length;
     }
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
index 39b1d5a..a781ceb 100644
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
@@ -22,7 +22,8 @@
     codegen.use(node.checkedInput);
     arguments.add(codegen.pop());
     generateAdditionalArguments(codegen, node, arguments);
-    jsAst.Expression helper = codegen.backend.namer.elementAccess(helperElement);
+    jsAst.Expression helper =
+        codegen.backend.emitter.staticFunctionAccess(helperElement);
     return new jsAst.Call(helper, arguments);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 308e1af..26fa923 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -171,7 +171,7 @@
                                   List<js.Expression> arguments) {
     registry.registerStaticInvocation(target.declaration);
 
-    js.Expression elementAccess = glue.elementAccess(target);
+    js.Expression elementAccess = glue.staticFunctionAccess(target);
     List<js.Expression> compiledArguments =
         selector.makeArgumentsList(target.implementation,
                                    arguments,
@@ -226,9 +226,8 @@
   js.Expression visitLiteralList(tree_ir.LiteralList node) {
     registry.registerInstantiatedClass(glue.listClass);
     int length = node.values.length;
-    List<js.ArrayElement> entries = new List<js.ArrayElement>.generate(length,
-        (int i) => new js.ArrayElement(i, visitExpression(node.values[i])));
-    return new js.ArrayInitializer(length, entries);
+    List<js.Expression> entries = node.values.map(visitExpression).toList();
+    return new js.ArrayInitializer(entries);
   }
 
   @override
@@ -239,17 +238,14 @@
     } else {
       constructor = glue.mapLiteralConstructor;
     }
-    List<js.ArrayElement> entries =
-        new List<js.ArrayElement>(2 * node.entries.length);
+    List<js.Expression> entries =
+        new List<js.Expression>(2 * node.entries.length);
     for (int i = 0; i < node.entries.length; i++) {
-      js.Expression key = visitExpression(node.entries[i].key);
-      js.Expression value = visitExpression(node.entries[i].value);
-      entries[2 * i] = new js.ArrayElement(2 * i, key);
-      entries[2 * i + 1] = new js.ArrayElement(2 * i + 1, value);
+      entries[2 * i] = visitExpression(node.entries[i].key);
+      entries[2 * i + 1] = visitExpression(node.entries[i].value);
     }
     List<js.Expression> args =
-        <js.Expression>[new js.ArrayInitializer(node.entries.length * 2,
-                                                entries)];
+        <js.Expression>[new js.ArrayInitializer(entries)];
     return buildStaticInvoke(
         new Selector.call(constructor.name, constructor.library, 2),
         constructor,
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index fb73773..2bdc115 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -38,8 +38,8 @@
     return _backend.constants.getConstantForVariable(variable);
   }
 
-  js.Expression elementAccess(Element element) {
-    return _namer.elementAccess(element);
+  js.Expression staticFunctionAccess(Element element) {
+    return _backend.emitter.staticFunctionAccess(element);
   }
 
   String safeVariableName(String name) {
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 015d6df..5f1cdc4 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -63,6 +63,8 @@
 
   ConstantReferenceEmitter(this.compiler, this.namer, this.constantEmitter);
 
+  JavaScriptBackend get backend => compiler.backend;
+  
   jsAst.Expression generate(ConstantValue constant) {
     return _visit(constant);
   }
@@ -82,7 +84,7 @@
   }
 
   jsAst.Expression visitFunction(FunctionConstantValue constant) {
-    return namer.isolateStaticClosureAccess(constant.element);
+    return backend.emitter.isolateStaticClosureAccess(constant.element);
   }
 
   jsAst.Expression visitNull(NullConstantValue constant) {
@@ -234,13 +236,13 @@
 
   jsAst.Expression visitList(ListConstantValue constant) {
     List<jsAst.Expression> elements = _array(constant.entries);
-    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer.from(elements);
+    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(elements);
     jsAst.Expression value = makeConstantListTemplate.instantiate([array]);
     return maybeAddTypeArguments(constant.type, value);
   }
 
   jsAst.Expression getJsConstructor(ClassElement element) {
-    return namer.elementAccess(element);
+    return backend.emitter.classAccess(element);
   }
 
   jsAst.Expression visitMap(JavaScriptMapConstant constant) {
@@ -271,7 +273,7 @@
         data.add(keyExpression);
         data.add(valueExpression);
       }
-      return new jsAst.ArrayInitializer.from(data);
+      return new jsAst.ArrayInitializer(data);
     }
 
     ClassElement classElement = constant.type.element;
@@ -322,7 +324,7 @@
   JavaScriptBackend get backend => compiler.backend;
 
   jsAst.PropertyAccess getHelperProperty(Element helper) {
-    return backend.namer.elementAccess(helper);
+    return backend.emitter.staticFunctionAccess(helper);
   }
 
   jsAst.Expression visitType(TypeConstantValue constant) {
@@ -362,11 +364,7 @@
   }
 
   List<jsAst.Expression> _array(List<ConstantValue> values) {
-    List<jsAst.Expression> valueList = <jsAst.Expression>[];
-    for (int i = 0; i < values.length; i++) {
-      valueList.add(constantEmitter.reference(values[i]));
-    }
-    return valueList;
+    return values.map(constantEmitter.reference).toList(growable: false);
   }
 
   jsAst.Expression maybeAddTypeArguments(InterfaceType type,
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index a4a158f..2675aa8 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -856,13 +856,6 @@
         library.getLibraryOrScriptName().hashCode % userGlobalObjects.length];
   }
 
-  jsAst.PropertyAccess elementAccess(Element element) {
-    String name = getNameX(element);
-    return new jsAst.PropertyAccess.field(
-        new jsAst.VariableUse(globalObjectFor(element)),
-        name);
-  }
-
   String getLazyInitializerName(Element element) {
     assert(Elements.isStaticOrTopLevelField(element));
     return getMappedGlobalName("$getterPrefix${getNameX(element)}");
@@ -873,16 +866,6 @@
     return getMappedGlobalName("${getNameX(element)}\$closure");
   }
 
-  jsAst.Expression isolateLazyInitializerAccess(Element element) {
-    return js('#.#',
-        [globalObjectFor(element), getLazyInitializerName(element)]);
-  }
-
-  jsAst.Expression isolateStaticClosureAccess(Element element) {
-    return js('#.#()',
-        [globalObjectFor(element), getStaticClosureName(element)]);
-  }
-
   // This name is used as part of the name of a TypeConstant
   String uniqueNameForTypeConstantElement(Element element) {
     // TODO(sra): If we replace the period with an identifier character,
diff --git a/pkg/compiler/lib/src/js_backend/native_emitter.dart b/pkg/compiler/lib/src/js_backend/native_emitter.dart
index 3c12682..fe81f43 100644
--- a/pkg/compiler/lib/src/js_backend/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/native_emitter.dart
@@ -41,7 +41,7 @@
 
   jsAst.Expression get defPropFunction {
     Element element = backend.findHelper('defineProperty');
-    return backend.namer.elementAccess(element);
+    return emitterTask.staticFunctionAccess(element);
   }
 
   /**
@@ -336,7 +336,8 @@
       List<jsAst.Parameter> stubParameters) {
     FunctionSignature parameters = member.functionSignature;
     Element converter = backend.findHelper('convertDartClosureToJS');
-    jsAst.Expression closureConverter = backend.namer.elementAccess(converter);
+    jsAst.Expression closureConverter =
+        emitterTask.staticFunctionAccess(converter);
     parameters.forEachParameter((ParameterElement parameter) {
       String name = parameter.name;
       // If [name] is not in [stubParameters], then the parameter is an optional
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index f32d77f..a4c1775 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -453,7 +453,7 @@
    * for type arguments in a subtype test.
    *
    * The result can be:
-   *  1) [:null:], if no substituted check is necessary, because the
+   *  1) `null`, if no substituted check is necessary, because the
    *     type variables are the same or there are no type variables in the class
    *     that is checked for.
    *  2) A list expression describing the type arguments to be used in the
@@ -464,11 +464,10 @@
    */
   jsAst.Expression getSupertypeSubstitution(
        ClassElement cls,
-       ClassElement check,
-       {bool alwaysGenerateFunction: false}) {
+       ClassElement check) {
     Substitution substitution = getSubstitution(cls, check);
     if (substitution != null) {
-      return substitution.getCode(this, alwaysGenerateFunction);
+      return substitution.getCode(this);
     } else {
       return null;
     }
@@ -506,13 +505,10 @@
   jsAst.Expression getSubstitutionRepresentation(
       List<DartType> types,
       OnVariableCallback onVariable) {
-    List<jsAst.ArrayElement> elements = <jsAst.ArrayElement>[];
-    int index = 0;
-    for (DartType type in types) {
-      jsAst.Expression representation = getTypeRepresentation(type, onVariable);
-      elements.add(new jsAst.ArrayElement(index++, representation));
-    }
-    return new jsAst.ArrayInitializer(index, elements);
+    List<jsAst.Expression> elements = types
+        .map((DartType type) => getTypeRepresentation(type, onVariable))
+        .toList(growable: false);
+    return new jsAst.ArrayInitializer(elements);
   }
 
   jsAst.Expression getTypeEncoding(DartType type,
@@ -543,7 +539,7 @@
       JavaScriptBackend backend = compiler.backend;
       String contextName = backend.namer.getNameOfClass(contextClass);
       return js('function () { return #(#, #, #); }',
-          [ backend.namer.elementAccess(backend.getComputeSignature()),
+          [ backend.emitter.staticFunctionAccess(backend.getComputeSignature()),
               encoding, this_, js.string(contextName) ]);
     } else {
       return encoding;
@@ -635,7 +631,11 @@
   }
 
   jsAst.Expression getJavaScriptClassName(Element element) {
-    return namer.elementAccess(element);
+    if (element.isTypedef) {
+      return backend.emitter.typedefAccess(element);
+    } else {
+      return backend.emitter.classAccess(element);  
+    }
   }
 
   visit(DartType type) {
@@ -657,15 +657,15 @@
 
   jsAst.Expression visitList(List<DartType> types, {jsAst.Expression head}) {
     int index = 0;
-    List<jsAst.ArrayElement> elements = <jsAst.ArrayElement>[];
+    List<jsAst.Expression> elements = <jsAst.Expression>[];
     if (head != null) {
-      elements.add(new jsAst.ArrayElement(0, head));
+      elements.add(head);
       index++;
     }
     for (DartType type in types) {
-      elements.add(new jsAst.ArrayElement(index++, visit(type)));
+      elements.add(visit(type));
     }
-    return new jsAst.ArrayInitializer(elements.length, elements);
+    return new jsAst.ArrayInitializer(elements);
   }
 
   visitFunctionType(FunctionType type, _) {
@@ -871,7 +871,7 @@
   Substitution.function(this.arguments, this.parameters)
       : isFunction = true;
 
-  jsAst.Expression getCode(RuntimeTypes rti, bool ensureIsFunction) {
+  jsAst.Expression getCode(RuntimeTypes rti) {
     jsAst.Expression declaration(TypeVariableType variable) {
       return new jsAst.Parameter(
           rti.backend.namer.safeVariableName(variable.name));
@@ -887,10 +887,8 @@
     if (isFunction) {
       Iterable<jsAst.Expression> formals = parameters.map(declaration);
       return js('function(#) { return # }', [formals, value]);
-    } else if (ensureIsFunction) {
-      return js('function() { return # }', value);
     } else {
-      return value;
+      return js('function() { return # }', value);
     }
   }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 3cecbec..0aaf241 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -56,7 +56,14 @@
     nativeEmitter = new NativeEmitter(this);
   }
 
-
+  jsAst.Expression isolateStaticClosureAccess(Element element) {
+    return emitter.isolateStaticClosureAccess(element);
+  }
+  
+  jsAst.Expression isolateLazyInitializerAccess(Element element) {
+    return emitter.isolateLazyInitializerAccess(element);
+  }
+  
   jsAst.Expression generateEmbeddedGlobalAccess(String global) {
     return emitter.generateEmbeddedGlobalAccess(global);
   }
@@ -65,6 +72,22 @@
     return emitter.constantReference(value);
   }
 
+  jsAst.Expression staticFieldAccess(Element e) {
+    return emitter.staticFunctionAccess(e);
+  }
+  
+  jsAst.Expression staticFunctionAccess(Element e) {
+    return emitter.staticFunctionAccess(e);
+  }
+  
+  jsAst.Expression classAccess(Element e) {
+    return emitter.classAccess(e);
+  }
+  
+  jsAst.Expression typedefAccess(Element e) {
+    return emitter.typedefAccess(e);
+  }
+
   void registerReadTypeVariable(TypeVariableElement element) {
     readTypeVariables.add(element);
   }
@@ -352,8 +375,19 @@
 abstract class Emitter {
   void emitProgram(Program program);
 
+  jsAst.Expression isolateLazyInitializerAccess(Element element);
+  jsAst.Expression isolateStaticClosureAccess(Element element);
   jsAst.Expression generateEmbeddedGlobalAccess(String global);
   jsAst.Expression constantReference(ConstantValue value);
+  jsAst.PropertyAccess staticFunctionAccess(Element element);
+  
+  // TODO(zarah): Split into more fine-grained accesses.
+  /// Generates access to the js constructor of the class represented by 
+  /// [element]
+  jsAst.PropertyAccess classAccess(Element element);
+  jsAst.PropertyAccess typedefAccess(Element element);
+  jsAst.PropertyAccess staticFieldAccess(Element element);
+  
 
   int compareConstants(ConstantValue a, ConstantValue b);
   bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant);
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 6007dba..a705ef2 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -13,7 +13,7 @@
 
   jsAst.Expression generateGetInterceptorMethod(Set<ClassElement> classes) {
     jsAst.Expression interceptorFor(ClassElement cls) {
-      return js('#.prototype', namer.elementAccess(cls));
+      return js('#.prototype', backend.emitter.classAccess(cls));
     }
 
     /**
@@ -142,8 +142,9 @@
           if (receiver instanceof #) return receiver;
           return #(receiver);
       }''', [
-          namer.elementAccess(compiler.objectClass),
-          namer.elementAccess(backend.getNativeInterceptorMethod)]));
+          backend.emitter.classAccess(compiler.objectClass),
+          backend.emitter
+              .staticFunctionAccess(backend.getNativeInterceptorMethod)]));
 
     } else {
       ClassElement jsUnknown = backend.jsUnknownJavaScriptObjectClass;
@@ -151,7 +152,7 @@
               .directlyInstantiatedClasses.contains(jsUnknown)) {
         statements.add(
             js.statement('if (!(receiver instanceof #)) return #;',
-                [namer.elementAccess(compiler.objectClass),
+                [backend.emitter.classAccess(compiler.objectClass),
                  interceptorFor(jsUnknown)]));
       }
 
diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
index 91b4a39..dead0f4 100644
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart
@@ -72,5 +72,39 @@
     return _emitter.constantEmitter.reference(value);
   }
 
+  js.Expression isolateLazyInitializerAccess(Element element) {
+    return js.js('#.#', [namer.globalObjectFor(element), 
+                         namer.getLazyInitializerName(element)]);
+  }
+
+  js.Expression isolateStaticClosureAccess(Element element) {
+    return js.js('#.#()',
+        [namer.globalObjectFor(element), namer.getStaticClosureName(element)]);
+  }
+  
+  js.PropertyAccess globalPropertyAccess(Element element) {
+     String name = namer.getNameX(element);
+     js.PropertyAccess pa = new js.PropertyAccess.field(
+         new js.VariableUse(namer.globalObjectFor(element)),
+         name);
+     return pa;
+   }
+
+  js.PropertyAccess staticFieldAccess(Element element) {
+    return globalPropertyAccess(element);
+  }
+  
+  js.PropertyAccess staticFunctionAccess(Element element) {
+    return globalPropertyAccess(element);
+  }
+  
+  js.PropertyAccess classAccess(Element element) {
+      return globalPropertyAccess(element);
+  }
+  
+  js.PropertyAccess typedefAccess(Element element) {
+      return globalPropertyAccess(element);
+  }
+  
   void invalidateCaches() {}
 }
diff --git a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
index 3a6604c..6e7d350 100644
--- a/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart
@@ -75,12 +75,13 @@
     List<js.Expression> elements = unit.libraries.map(emitLibrary).toList();
     elements.add(
         emitLazilyInitializedStatics(unit.staticLazilyInitializedFields));
-    js.Expression code = new js.ArrayInitializer.from(elements);
+    js.Expression code = new js.ArrayInitializer(elements);
     return js.js.statement(
         boilerplate,
         {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap),
          'holders': emitHolders(unit.holders),
-         'cyclicThrow': namer.elementAccess(backend.getCyclicThrowHelper()),
+         'cyclicThrow':
+           backend.emitter.staticFunctionAccess(backend.getCyclicThrowHelper()),
          'outputContainsConstantList': program.outputContainsConstantList,
          'embeddedGlobals': emitEmbeddedGlobals(program.loadMap),
          'constants': emitConstants(unit.constants),
@@ -107,8 +108,9 @@
                 new js.VariableInitialization(
                     new js.VariableDeclaration(e.name, allowRename: false),
                     new js.ObjectInitializer(const []))).toList())),
-        js.js.statement('var holders = #', new js.ArrayInitializer.from(
-            holders.map((e) => new js.VariableUse(e.name))))
+        js.js.statement('var holders = #', new js.ArrayInitializer(
+            holders.map((e) => new js.VariableUse(e.name))
+                   .toList(growable: false)))
     ];
     return new js.Block(statements);
   }
@@ -198,7 +200,8 @@
       throw new UnimplementedError("constants in deferred units");
     }
     js.ArrayInitializer content =
-        new js.ArrayInitializer.from(unit.libraries.map(emitLibrary));
+        new js.ArrayInitializer(unit.libraries.map(emitLibrary)
+                                              .toList(growable: false));
     return js.js("$deferredInitializersGlobal[$hash] = #", content);
   }
 
@@ -226,7 +229,7 @@
           js.string("${namer.getterPrefix}${field.name}"),
           js.number(field.holder.index),
           emitLazyInitializer(field) ]);
-    return new js.ArrayInitializer.from(fieldDescriptors);
+    return new js.ArrayInitializer(fieldDescriptors.toList(growable: false));
   }
 
   js.Block emitEagerClassInitializations(List<Library> libraries) {
@@ -248,10 +251,12 @@
     Iterable classDescriptors = library.classes.expand((e) =>
         [ js.string(e.name), js.number(e.holder.index), emitClass(e) ]);
 
-    js.Expression staticArray = new js.ArrayInitializer.from(staticDescriptors);
-    js.Expression classArray = new js.ArrayInitializer.from(classDescriptors);
+    js.Expression staticArray =
+        new js.ArrayInitializer(staticDescriptors.toList(growable: false));
+    js.Expression classArray =
+        new js.ArrayInitializer(classDescriptors.toList(growable: false));
 
-    return new js.ArrayInitializer.from([staticArray, classArray]);
+    return new js.ArrayInitializer([staticArray, classArray]);
   }
 
   js.Expression _generateConstructor(Class cls) {
@@ -334,7 +339,7 @@
     Iterable<Method> gettersSetters = _generateGettersSetters(cls);
     Iterable<Method> allMethods = [methods, gettersSetters].expand((x) => x);
     elements.addAll(allMethods.expand((e) => [js.string(e.name), e.code]));
-    return unparse(compiler, new js.ArrayInitializer.from(elements));
+    return unparse(compiler, new js.ArrayInitializer(elements));
   }
 
   // This string should be referenced wherever JavaScript code makes assumptions
@@ -347,7 +352,7 @@
                      js.number(cls.superclassHolderIndex),
                      js.string(cls.mixinClass.name),
                      js.number(cls.mixinClass.holder.index)];
-    return unparse(compiler, new js.ArrayInitializer.from(elements));
+    return unparse(compiler, new js.ArrayInitializer(elements));
   }
 
   js.Expression emitLazyInitializer(StaticField field) {
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
index deb4fc4..db06675 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart
@@ -34,7 +34,8 @@
     fields.add(field);
   }
 
-  jsAst.ObjectInitializer toObjectInitializer() {
+  jsAst.ObjectInitializer toObjectInitializer(
+      {bool omitClassDescriptor: false}) {
     StringBuffer buffer = new StringBuffer();
     if (superName != null) {
       buffer.write('$superName');
@@ -50,13 +51,19 @@
       // and the field metadata is appended. So if classData is just a string,
       // there is no field metadata.
       classData =
-          new jsAst.ArrayInitializer.from([classData]..addAll(fieldMetadata));
+          new jsAst.ArrayInitializer([classData]..addAll(fieldMetadata));
     }
-    var fieldsAndProperties =
-        [new jsAst.Property(js.string(namer.classDescriptorProperty),
-                            classData)]
-        ..addAll(properties);
+    List<jsAst.Property> fieldsAndProperties;
+    if (!omitClassDescriptor) {
+      fieldsAndProperties = <jsAst.Property>[];
+      fieldsAndProperties.add(
+          new jsAst.Property(
+              js.string(namer.classDescriptorProperty), classData));
+      fieldsAndProperties
+          ..addAll(properties);
+    } else {
+      fieldsAndProperties = properties;
+    }
     return new jsAst.ObjectInitializer(fieldsAndProperties, isOneLiner: false);
   }
-
 }
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
index 35133e5..5461648 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart
@@ -85,7 +85,7 @@
     OutputUnit outputUnit =
         compiler.deferredLoadTask.outputUnitForElement(classElement);
     emitter.emitPrecompiledConstructor(
-        outputUnit, constructorName, constructorAst);
+        outputUnit, constructorName, constructorAst, fields);
   }
 
   /// Returns `true` if fields added.
@@ -305,7 +305,7 @@
       if ((!typeVariableProperties.isEmpty && !hasSuper) ||
           (hasSuper && !equalElements(superclass.typeVariables, typeVars))) {
         classBuilder.addProperty('<>',
-            new jsAst.ArrayInitializer.from(typeVariableProperties));
+            new jsAst.ArrayInitializer(typeVariableProperties.toList()));
       }
     }
 
@@ -349,7 +349,7 @@
           types.add(emitter.metadataEmitter.reifyType(interface));
         }
         enclosingBuilder.addProperty("+$reflectionName",
-            new jsAst.ArrayInitializer.from(types.map(js.number)));
+            new jsAst.ArrayInitializer(types.map(js.number).toList()));
       }
     }
   }
@@ -592,15 +592,15 @@
     if (substitution != null) {
       jsAst.Expression typeArguments =
           js(r'#.apply(null, this.$builtinTypeInfo)',
-              substitution.getCode(backend.rti, true));
+             substitution.getCode(backend.rti));
       computeTypeVariable = js('#[#]', [typeArguments, index]);
     } else {
       // TODO(ahe): These can be generated dynamically.
       computeTypeVariable =
           js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index);
     }
-    jsAst.Expression convertRtiToRuntimeType =
-        namer.elementAccess(backend.findHelper('convertRtiToRuntimeType'));
+    jsAst.Expression convertRtiToRuntimeType = emitter
+        .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType'));
     compiler.dumpInfoTask.registerElementAst(element,
         builder.addProperty(name,
             js('function () { return #(#) }',
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
index 4d6709b..5039711 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/container_builder.dart
@@ -126,7 +126,7 @@
         //   `<class>.prototype.bar$1.call(this, argument0, ...)`.
         body = js.statement(
             'return #.prototype.#.call(this, #);',
-            [backend.namer.elementAccess(superClass), methodName,
+            [backend.emitter.classAccess(superClass), methodName,
              argumentsBuffer]);
       } else {
         body = js.statement(
@@ -135,7 +135,7 @@
       }
     } else {
       body = js.statement('return #(#)',
-          [namer.elementAccess(member), argumentsBuffer]);
+          [emitter.staticFunctionAccess(member), argumentsBuffer]);
     }
 
     jsAst.Fun function = js('function(#) { #; }', [parametersBuffer, body]);
@@ -363,7 +363,11 @@
                             member.isAccessor;
     String tearOffName;
 
-    final bool canBeReflected = backend.isAccessibleByReflection(member);
+
+    final bool canBeReflected = backend.isAccessibleByReflection(member) ||
+        // During incremental compilation, we have to assume that reflection
+        // *might* get enabled.
+        compiler.hasIncrementalSupport;
 
     if (isNotApplyTarget) {
       canTearOff = false;
@@ -491,7 +495,7 @@
 
     if (onlyNeedsSuperAlias) {
       jsAst.ArrayInitializer arrayInit =
-            new jsAst.ArrayInitializer.from(expressions);
+            new jsAst.ArrayInitializer(expressions);
           compiler.dumpInfoTask.registerElementAst(member,
               builder.addProperty(name, arrayInit));
       return;
@@ -581,8 +585,8 @@
             backend.constants.addCompileTimeConstantForEmission(constant);
             return emitter.metadataEmitter.reifyMetadata(annotation);
           });
-          expressions.add(
-              new jsAst.ArrayInitializer.from(metadataIndices.map(js.number)));
+          expressions.add(new jsAst.ArrayInitializer(
+              metadataIndices.map(js.number).toList()));
         }
       });
     }
@@ -607,7 +611,7 @@
     }
 
     jsAst.ArrayInitializer arrayInit =
-      new jsAst.ArrayInitializer.from(expressions);
+      new jsAst.ArrayInitializer(expressions.toList());
     compiler.dumpInfoTask.registerElementAst(member,
         builder.addProperty(name, arrayInit));
   }
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
index 062c62f..09e1d7e 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
@@ -74,9 +74,8 @@
    * precompiled function.
    *
    * To save space, dart2js normally generates constructors and accessors
-   * dynamically. This doesn't work in CSP mode, and may impact startup time
-   * negatively. So dart2js will emit these functions to a separate file that
-   * can be optionally included to support CSP mode or for faster startup.
+   * dynamically. This doesn't work in CSP mode, so dart2js emits them directly
+   * when in CSP mode.
    */
   Map<OutputUnit, List<jsAst.Node>> _cspPrecompiledFunctions =
       new Map<OutputUnit, List<jsAst.Node>>();
@@ -166,6 +165,11 @@
   String get makeConstListProperty
       => namer.getMappedInstanceName('makeConstantList');
 
+  /// The name of the property that contains all field names.
+  ///
+  /// This property is added to constructors when isolate support is enabled.
+  static const String FIELD_NAMES_PROPERTY_NAME = r"$__fields__";
+
   /// For deferred loading we communicate the initializers via this global var.
   final String deferredInitializers = r"$dart_deferred_initializers";
 
@@ -181,6 +185,40 @@
     return '$initName.$global';
   }
 
+  jsAst.Expression isolateLazyInitializerAccess(Element element) {
+     return jsAst.js('#.#', [namer.globalObjectFor(element),
+                             namer.getLazyInitializerName(element)]);
+   }
+
+  jsAst.Expression isolateStaticClosureAccess(Element element) {
+     return jsAst.js('#.#()',
+         [namer.globalObjectFor(element), namer.getStaticClosureName(element)]);
+   }
+
+  jsAst.PropertyAccess globalPropertyAccess(Element element) {
+    String name = namer.getNameX(element);
+    jsAst.PropertyAccess pa = new jsAst.PropertyAccess.field(
+        new jsAst.VariableUse(namer.globalObjectFor(element)),
+        name);
+    return pa;
+  }
+
+  jsAst.PropertyAccess staticFieldAccess(Element element) {
+      return globalPropertyAccess(element);
+  }
+
+  jsAst.PropertyAccess staticFunctionAccess(Element element) {
+      return globalPropertyAccess(element);
+  }
+
+  jsAst.PropertyAccess classAccess(Element element) {
+        return globalPropertyAccess(element);
+  }
+
+  jsAst.PropertyAccess typedefAccess(Element element) {
+       return globalPropertyAccess(element);
+  }
+
   jsAst.FunctionDeclaration get generateAccessorFunction {
     const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
     const RANGE2_SIZE = RANGE2_LAST - RANGE2_FIRST + 1;
@@ -254,7 +292,7 @@
       }''');
   }
 
-  List get defineClassFunction {
+  List<jsAst.Node> get defineClassFunction {
     // First the class name, then the field names in an array and the members
     // (inside an Object literal).
     // The caller can also pass in the constructor as a function if needed.
@@ -269,45 +307,99 @@
     //  },
     // });
 
-    var defineClass = js('''function(name, fields) {
-      var accessors = [];
+    bool hasIsolateSupport = compiler.hasIsolateSupport;
+    String fieldNamesProperty = FIELD_NAMES_PROPERTY_NAME;
 
-      var str = "function " + name + "(";
-      var body = "";
+    jsAst.Expression defineClass = js('''
+        function(name, fields) {
+          var accessors = [];
+    
+          var str = "function " + name + "(";
+          var body = "";
+          if (#hasIsolateSupport) { var fieldNames = ""; }
+    
+          for (var i = 0; i < fields.length; i++) {
+            if(i != 0) str += ", ";
+    
+            var field = generateAccessor(fields[i], accessors, name);
+            if (#hasIsolateSupport) { fieldNames += "'" + field + "',"; }
+            var parameter = "parameter_" + field;
+            str += parameter;
+            body += ("this." + field + " = " + parameter + ";\\n");
+          }
+          str += ") {\\n" + body + "}\\n";
+          str += name + ".builtin\$cls=\\"" + name + "\\";\\n";
+          str += "\$desc=\$collectedClasses." + name + ";\\n";
+          str += "if(\$desc instanceof Array) \$desc = \$desc[1];\\n";
+          str += name + ".prototype = \$desc;\\n";
+          if (typeof defineClass.name != "string") {
+            str += name + ".name=\\"" + name + "\\";\\n";
+          }
+          if (#hasIsolateSupport) {
+            str += name + ".$fieldNamesProperty=[" + fieldNames + "];\\n";
+          }
+          str += accessors.join("");
+    
+          return str;
+        }''', { 'hasIsolateSupport': hasIsolateSupport });
 
-      for (var i = 0; i < fields.length; i++) {
-        if(i != 0) str += ", ";
-
-        var field = generateAccessor(fields[i], accessors, name);
-        var parameter = "parameter_" + field;
-        str += parameter;
-        body += ("this." + field + " = " + parameter + ";\\n");
-      }
-      str += ") {\\n" + body + "}\\n";
-      str += name + ".builtin\$cls=\\"" + name + "\\";\\n";
-      str += "\$desc=\$collectedClasses." + name + ";\\n";
-      str += "if(\$desc instanceof Array) \$desc = \$desc[1];\\n";
-      str += name + ".prototype = \$desc;\\n";
-      if (typeof defineClass.name != "string") {
-        str += name + ".name=\\"" + name + "\\";\\n";
-      }
-      str += accessors.join("");
-
-      return str;
-    }''');
     // Declare a function called "generateAccessor".  This is used in
     // defineClassFunction (it's a local declaration in init()).
-    List<jsAst.Node> saveDefineClass = [];
-    if (compiler.hasIncrementalSupport) {
-      saveDefineClass.add(
-          js(r'self.$dart_unsafe_eval.defineClass = defineClass'));
-    }
-    return [
+    List result = <jsAst.Node>[
         generateAccessorFunction,
         js('$generateAccessorHolder = generateAccessor'),
         new jsAst.FunctionDeclaration(
-            new jsAst.VariableDeclaration('defineClass'), defineClass) ]
-        ..addAll(saveDefineClass);
+            new jsAst.VariableDeclaration('defineClass'), defineClass) ];
+
+    if (compiler.hasIncrementalSupport) {
+      result.add(
+          js(r'self.$dart_unsafe_eval.defineClass = defineClass'));
+    }
+
+    if (hasIsolateSupport) {
+      jsAst.Expression classIdExtractorAccess =
+          generateEmbeddedGlobalAccess(embeddedNames.CLASS_ID_EXTRACTOR);
+      var classIdExtractorAssignment =
+          js('# = function(o) { return o.constructor.name; }',
+              classIdExtractorAccess);
+
+      jsAst.Expression classFieldsExtractorAccess =
+          generateEmbeddedGlobalAccess(embeddedNames.CLASS_FIELDS_EXTRACTOR);
+      var classFieldsExtractorAssignment = js('''
+      # = function(o) {
+        var fieldNames = o.constructor.$fieldNamesProperty;
+        if (!fieldNames) return [];  // TODO(floitsch): do something else here.
+        var result = [];
+        result.length = fieldNames.length;
+        for (var i = 0; i < fieldNames.length; i++) {
+          result[i] = o[fieldNames[i]];
+        }
+        return result;
+      }''', classFieldsExtractorAccess);
+
+      jsAst.Expression instanceFromClassIdAccess =
+          generateEmbeddedGlobalAccess(embeddedNames.INSTANCE_FROM_CLASS_ID);
+      jsAst.Expression allClassesAccess =
+          generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
+      var instanceFromClassIdAssignment =
+          js('# = function(name) { return new #[name](); }',
+             [instanceFromClassIdAccess, allClassesAccess]);
+
+      jsAst.Expression initializeEmptyInstanceAccess =
+          generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_EMPTY_INSTANCE);
+      var initializeEmptyInstanceAssignment = js('''
+      # = function(name, o, fields) {
+        #[name].apply(o, fields);
+        return o;
+      }''', [ initializeEmptyInstanceAccess, allClassesAccess ]);
+
+      result.addAll([classIdExtractorAssignment,
+                     classFieldsExtractorAssignment,
+                     instanceFromClassIdAssignment,
+                     initializeEmptyInstanceAssignment]);
+    }
+
+    return result;
   }
 
   /** Needs defineClass to be defined. */
@@ -646,7 +738,7 @@
   jsAst.Fun get lazyInitializerFunction {
     String isolate = namer.currentIsolate;
     jsAst.Expression cyclicThrow =
-        namer.elementAccess(backend.getCyclicThrowHelper());
+        staticFunctionAccess(backend.getCyclicThrowHelper());
     jsAst.Expression laziesAccess =
         generateEmbeddedGlobalAccess(embeddedNames.LAZIES);
 
@@ -857,7 +949,7 @@
         return #;
       }''',
         [cspPrecompiledFunctionFor(outputUnit),
-         new jsAst.ArrayInitializer.from(
+         new jsAst.ArrayInitializer(
              cspPrecompiledConstructorNamesFor(outputUnit))]);
   }
 
@@ -1039,11 +1131,11 @@
   ///   `function(args) { $.startRootIsolate(X.main$closure(), args); }`
   jsAst.Expression buildIsolateSetupClosure(Element appMain,
                                             Element isolateMain) {
-    jsAst.Expression mainAccess = namer.isolateStaticClosureAccess(appMain);
+    jsAst.Expression mainAccess = isolateStaticClosureAccess(appMain);
     // Since we pass the closurized version of the main method to
     // the isolate method, we must make sure that it exists.
     return js('function(a){ #(#, a); }',
-        [namer.elementAccess(isolateMain), mainAccess]);
+        [backend.emitter.staticFunctionAccess(isolateMain), mainAccess]);
   }
 
   /**
@@ -1115,10 +1207,11 @@
         backend.isolateHelperLibrary.find(JavaScriptBackend.START_ROOT_ISOLATE);
       mainCallClosure = buildIsolateSetupClosure(main, isolateMain);
     } else if (compiler.hasIncrementalSupport) {
-      mainCallClosure =
-          js('function() { return #(); }', namer.elementAccess(main));
+      mainCallClosure = js(
+          'function() { return #(); }',
+          backend.emitter.staticFunctionAccess(main));
     } else {
-      mainCallClosure = namer.elementAccess(main);
+      mainCallClosure = backend.emitter.staticFunctionAccess(main);
     }
 
     if (backend.needToInitializeIsolateAffinityTag) {
@@ -1275,25 +1368,34 @@
 
   void emitPrecompiledConstructor(OutputUnit outputUnit,
                                   String constructorName,
-                                  jsAst.Expression constructorAst) {
+                                  jsAst.Expression constructorAst,
+                                  List<String> fields) {
     cspPrecompiledFunctionFor(outputUnit).add(
         new jsAst.FunctionDeclaration(
             new jsAst.VariableDeclaration(constructorName), constructorAst));
-    cspPrecompiledFunctionFor(outputUnit).add(
-    js.statement(r'''{
-          #.builtin$cls = #;
-          if (!"name" in #)
-              #.name = #;
-          $desc=$collectedClasses.#;
+
+    String fieldNamesProperty = FIELD_NAMES_PROPERTY_NAME;
+    bool hasIsolateSupport = compiler.hasIsolateSupport;
+    jsAst.Node fieldNamesArray =
+        hasIsolateSupport ? js.stringArray(fields) : new jsAst.LiteralNull();
+
+    cspPrecompiledFunctionFor(outputUnit).add(js.statement(r'''
+        {
+          #constructorName.builtin$cls = #constructorNameString;
+          if (!"name" in #constructorName)
+              #constructorName.name = #constructorNameString;
+          $desc = $collectedClasses.#constructorName;
           if ($desc instanceof Array) $desc = $desc[1];
-          #.prototype = $desc;
+          #constructorName.prototype = $desc;
+          ''' /* next string is not a raw string */ '''
+          if (#hasIsolateSupport) {
+            #constructorName.$fieldNamesProperty = #fieldNamesArray;
+          } 
         }''',
-        [   constructorName, js.string(constructorName),
-            constructorName,
-            constructorName, js.string(constructorName),
-            constructorName,
-            constructorName
-         ]));
+        {"constructorName": constructorName,
+         "constructorNameString": js.string(constructorName),
+         "hasIsolateSupport": hasIsolateSupport,
+         "fieldNamesArray": fieldNamesArray}));
 
     cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
   }
@@ -1356,9 +1458,11 @@
       // Also emit a trivial constructor for CSP mode.
       String constructorName = mangledName;
       jsAst.Expression constructorAst = js('function() {}');
+      List<String> fieldNames = [];
       emitPrecompiledConstructor(mainOutputUnit,
                                  constructorName,
-                                 constructorAst);
+                                 constructorAst,
+                                 fieldNames);
     }
   }
 
@@ -1452,8 +1556,12 @@
           'this.\$dart_unsafe_eval.patch = function(a) { eval(a) }$N');
       String schemaChange =
           jsAst.prettyPrint(buildSchemaChangeFunction(), compiler).getText();
+      String addMethod =
+          jsAst.prettyPrint(buildIncrementalAddMethod(), compiler).getText();
       mainBuffer.add(
           'this.\$dart_unsafe_eval.schemaChange$_=$_$schemaChange$N');
+      mainBuffer.add(
+          'this.\$dart_unsafe_eval.addMethod$_=$_$addMethod$N');
     }
     if (isProgramSplit) {
       /// We collect all the global state of the, so it can be passed to the
@@ -1682,6 +1790,82 @@
 }''');
   }
 
+  /// Used by incremental compilation to patch up an object ([holder]) with a
+  /// new (or updated) method.  [arrayOrFunction] is either the new method, or
+  /// an array containing the method (see
+  /// [ContainerBuilder.addMemberMethodFromInfo]). [name] is the name of the
+  /// new method. [isStatic] tells if method is static (or
+  /// top-level). [globalFunctionsAccess] is a reference to
+  /// [embeddedNames.GLOBAL_FUNCTIONS].
+  jsAst.Fun buildIncrementalAddMethod() {
+    return js(r"""
+function(originalDescriptor, name, holder, isStatic, globalFunctionsAccess) {
+  var arrayOrFunction = originalDescriptor[name];
+  var method;
+  if (arrayOrFunction.constructor === Array) {
+    var existing = holder[name];
+    var array = arrayOrFunction;
+    var descriptor = Object.create(null);
+    this.addStubs(
+        descriptor, arrayOrFunction, name, isStatic, originalDescriptor, []);
+    method = descriptor[name];
+    for (var property in descriptor) {
+      if (!Object.prototype.hasOwnProperty.call(descriptor, property)) continue;
+      var stub = descriptor[property];
+      var existingStub = holder[property];
+      if (stub === method || !existingStub || !stub.$getterStub) {
+        // Not replacing an existing getter stub.
+        holder[property] = stub;
+        continue;
+      }
+      if (!stub.$getterStub) {
+        var error = new Error('Unexpected stub.');
+        error.stub = stub;
+        throw error;
+      }
+
+      // Existing getter stubs need special treatment as they may already have
+      // been called and produced a closure.
+      this.pendingStubs = this.pendingStubs || [];
+      // It isn't safe to invoke the stub yet.
+      this.pendingStubs.push((function(holder, stub, existingStub, existing,
+                                       method) {
+        return function() {
+          var receiver = isStatic ? holder : new holder.constructor();
+          // Invoke the existing stub to obtain the tear-off closure.
+          existingStub = existingStub.call(receiver);
+          // Invoke the new stub to create a tear-off closure we can use as a
+          // prototype.
+          stub = stub.call(receiver);
+
+          var newProto = stub.constructor.prototype;
+          var existingProto = existingStub.constructor.prototype;
+          for (var stubProperty in newProto) {
+            if (!Object.prototype.hasOwnProperty.call(newProto, stubProperty))
+              continue;
+            existingProto[stubProperty] = newProto[stubProperty];
+          }
+
+          // Update all the existing stub's references to [existing] to
+          // [method]. Instance tear-offs are call-by-name, so this isn't
+          // necessary for those.
+          if (!isStatic) return;
+          for (var reference in existingStub) {
+            if (existingStub[reference] === existing) {
+              existingStub[reference] = method;
+            }
+          }
+        }
+      })(holder, stub, existingStub, existing, method));
+    }
+  } else {
+    method = arrayOrFunction;
+    holder[name] = method;
+  }
+  if (isStatic) globalFunctionsAccess[name] = method;
+}""");
+  }
+
   /// Returns a 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
@@ -1842,8 +2026,8 @@
       List<jsAst.Property> properties = new List<jsAst.Property>();
       mapping.forEach((String key, List<String> values) {
         properties.add(new jsAst.Property(js.escapedString(key),
-            new jsAst.ArrayInitializer.from(
-                values.map(js.escapedString))));
+            new jsAst.ArrayInitializer(
+                values.map(js.escapedString).toList())));
       });
       jsAst.Node initializer =
           new jsAst.ObjectInitializer(properties, isOneLiner: true);
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
index 8b24a7e..2065c45 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/interceptor_emitter.dart
@@ -78,13 +78,9 @@
 
     int index = 0;
     var invocationNames = interceptorInvocationNames.toList()..sort();
-    List<jsAst.ArrayElement> elements = invocationNames.map(
-      (String invocationName) {
-        jsAst.Literal str = js.string(invocationName);
-        return new jsAst.ArrayElement(index++, str);
-      }).toList();
+    List<jsAst.Expression> elements = invocationNames.map(js.string).toList();
     jsAst.ArrayInitializer array =
-        new jsAst.ArrayInitializer(invocationNames.length, elements);
+        new jsAst.ArrayInitializer(elements);
 
     jsAst.Expression assignment =
         js('${emitter.isolateProperties}.# = #', [name, array]);
@@ -116,7 +112,7 @@
           if (!analysis.needsClass(classElement)) continue;
 
           elements.add(emitter.constantReference(constant));
-          elements.add(namer.elementAccess(classElement));
+          elements.add(backend.emitter.classAccess(classElement));
 
           // Create JavaScript Object map for by-name lookup of generative
           // constructors.  For example, the class A has three generative
@@ -138,7 +134,7 @@
             properties.add(
                 new jsAst.Property(
                     js.string(member.name),
-                    backend.namer.elementAccess(member)));
+                    backend.emitter.classAccess(member)));
           }
 
           var map = new jsAst.ObjectInitializer(properties);
@@ -147,7 +143,7 @@
       }
     }
 
-    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer.from(elements);
+    jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(elements);
     String name =
         backend.namer.getNameOfGlobalField(backend.mapTypeToInterceptor);
     jsAst.Expression assignment =
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
index de1838b..4814889 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/metadata_emitter.dart
@@ -26,7 +26,7 @@
   jsAst.Fun buildMetadataFunction(Element element) {
     if (!mustEmitMetadataFor(element)) return null;
     return compiler.withCurrentElement(element, () {
-      var metadata = [];
+      List<jsAst.Expression> metadata = <jsAst.Expression>[];
       Link link = element.metadata;
       // TODO(ahe): Why is metadata sometimes null?
       if (link != null) {
@@ -43,7 +43,7 @@
       }
       if (metadata.isEmpty) return null;
       return js('function() { return # }',
-          new jsAst.ArrayInitializer.from(metadata));
+          new jsAst.ArrayInitializer(metadata));
     });
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
index 3635175..6b48c7a 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
@@ -83,13 +83,14 @@
       assert(backend.isInterceptedName(Compiler.NO_SUCH_METHOD));
       jsAst.Expression expression = js('this.#(this, #(#, #, #, #, #))', [
           noSuchMethodName,
-          namer.elementAccess(backend.getCreateInvocationMirror()),
+          backend.emitter.staticFunctionAccess(
+              backend.getCreateInvocationMirror()),
           js.string(compiler.enableMinification ?
               internalName : methodName),
           js.string(internalName),
           js.number(type),
-          new jsAst.ArrayInitializer.from(parameterNames.map(js)),
-          new jsAst.ArrayInitializer.from(argNames)]);
+          new jsAst.ArrayInitializer(parameterNames.map(js).toList()),
+          new jsAst.ArrayInitializer(argNames)]);
 
       if (backend.isInterceptedName(selector.name)) {
         return js(r'function($receiver, #) { return # }',
@@ -269,8 +270,8 @@
     // Startup code that loops over the method names and puts handlers on the
     // Object class to catch noSuchMethod invocations.
     ClassElement objectClass = compiler.objectClass;
-    jsAst.Expression createInvocationMirror = namer.elementAccess(
-        backend.getCreateInvocationMirror());
+    jsAst.Expression createInvocationMirror = backend.emitter
+        .staticFunctionAccess(backend.getCreateInvocationMirror());
     String noSuchMethodName = namer.publicInstanceMethodNameByArity(
         Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT);
     var type = 0;
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
index b75c82e..62841e6b 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/reflection_data_parser.dart
@@ -280,15 +280,29 @@
        mangledNamesAccess,
        mangledGlobalNamesAccess]);
 
+  List<jsAst.Statement> incrementalSupport = <jsAst.Statement>[];
+  if (compiler.hasIncrementalSupport) {
+    incrementalSupport.add(
+        js.statement(
+            r'self.$dart_unsafe_eval.addStubs = addStubs;'));
+  }
+
   return js('''
 (function (reflectionData) {
   "use strict";
-  #; // header
-  #; // processStatics
-  #; // addStubs
-  #; // tearOffCode
-  #; // init
-})''', [header, processStatics, addStubs, tearOffCode, init]);
+  #header;
+  #processStatics;
+  #addStubs;
+  #tearOffCode;
+  #incrementalSupport;
+  #init;
+})''', {
+      'header': header,
+      'processStatics': processStatics,
+      'incrementalSupport': incrementalSupport,
+      'addStubs': addStubs,
+      'tearOffCode': tearOffCode,
+      'init': init});
 }
 
 
@@ -304,7 +318,8 @@
   if (closureFromTearOff != null) {
     // We need both the AST that references [closureFromTearOff] and a string
     // for the NoCsp version that constructs a function.
-    tearOffAccessExpression = namer.elementAccess(closureFromTearOff);
+    tearOffAccessExpression =
+        backend.emitter.staticFunctionAccess(closureFromTearOff);
     tearOffAccessText =
         jsAst.prettyPrint(tearOffAccessExpression, compiler).getText();
     tearOffGlobalObjectName = tearOffGlobalObject =
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart
index 273984b..aba512b 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/type_test_emitter.dart
@@ -55,8 +55,7 @@
       RuntimeTypes rti = backend.rti;
       jsAst.Expression expression;
       bool needsNativeCheck = emitter.nativeEmitter.requiresNativeIsCheck(cls);
-      expression = rti.getSupertypeSubstitution(
-          classElement, cls, alwaysGenerateFunction: true);
+      expression = rti.getSupertypeSubstitution(classElement, cls);
       if (expression == null && (emitNull || needsNativeCheck)) {
         expression = new jsAst.LiteralNull();
       }
@@ -220,12 +219,12 @@
         properties.add([namer.operatorIs(checkedClass), js('TRUE')]);
         Substitution substitution = check.substitution;
         if (substitution != null) {
-          jsAst.Expression body = substitution.getCode(rti, false);
+          jsAst.Expression body = substitution.getCode(rti);
           properties.add([namer.substitutionName(checkedClass), body]);
         }
       }
 
-      jsAst.Expression holder = namer.elementAccess(cls);
+      jsAst.Expression holder = backend.emitter.classAccess(cls);
       if (properties.length > 1) {
         // Use temporary shortened reference.
         statements.add(js.statement('_ = #;', holder));
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
index d1800f7..ea6dab8 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
@@ -116,7 +116,7 @@
     // Construct the main output from the libraries and the registered holders.
     MainOutput result = new MainOutput(
         "",  // The empty string is the name for the main output file.
-        namer.elementAccess(_compiler.mainFunction),
+        backend.emitter.staticFunctionAccess(_compiler.mainFunction),
         _buildLibraries(fragment),
         _buildStaticNonFinalFields(fragment),
         _buildStaticLazilyInitializedFields(fragment),
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index aa1ddfd..137126a 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -2746,8 +2746,10 @@
            'name': compiler.mirrorSystemGetNameFunction.name});
     }
 
-    if (!Elements.isUnresolved(target)) {
-      if (target.isAbstractField) {
+    if (target != null) {
+      if (target.isErroneous) {
+        registry.registerThrowNoSuchMethod();
+      } else if (target.isAbstractField) {
         AbstractFieldElement field = target;
         target = field.getter;
         if (target == null && !inInstanceContext) {
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 865e32c..239aea9 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -3759,7 +3759,7 @@
 
     registry.registerStaticUse(element);
     push(new HForeign(js.js.expressionTemplateYielding(
-                          backend.namer.elementAccess(element)),
+                          backend.emitter.staticFunctionAccess(element)),
                       backend.dynamicType,
                       <HInstruction>[]));
     return params;
@@ -3802,7 +3802,8 @@
       compiler.internalError(node.argumentsNode, 'Too many arguments.');
     }
     push(new HForeign(js.js.expressionTemplateYielding(
-                          backend.namer.elementAccess(compiler.objectClass)),
+                          backend.emitter.classAccess(
+                              compiler.objectClass)),
                       backend.dynamicType,
                       <HInstruction>[]));
   }
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index fa1ea1f..7207d681 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1641,7 +1641,7 @@
       });
     }
 
-    push(backend.namer.elementAccess(node.element));
+    push(backend.emitter.staticFunctionAccess(node.element));
     push(new js.Call(pop(), visitArguments(node.inputs, start: 0)), node);
   }
 
@@ -1662,36 +1662,37 @@
       }
     } else {
       Selector selector = node.selector;
-      String methodName;
-      if (selector.isGetter) {
-        // If the selector we need to register a typed getter to the
-        // [world]. The emitter needs to know if it needs to emit a
-        // bound closure for a method.
-        TypeMask receiverType =
-            new TypeMask.nonNullExact(superClass, compiler.world);
-        selector = new TypedSelector(receiverType, selector, compiler.world);
-        // TODO(floitsch): we know the target. We shouldn't register a
-        // dynamic getter.
-        registry.registerDynamicGetter(selector);
-        registry.registerGetterForSuperMethod(node.element);
-        methodName = backend.namer.invocationName(selector);
-        push(
-          js.js('#.prototype.#.call(#)', [
-            backend.namer.elementAccess(superClass),
-            methodName, visitArguments(node.inputs, start: 0)]),
-          node);
+
+      if (!backend.maybeRegisterAliasedSuperMember(superMethod, selector)) {
+        String methodName;
+        if (selector.isGetter) {
+          // If the selector we need to register a typed getter to the
+          // [world]. The emitter needs to know if it needs to emit a
+          // bound closure for a method.
+          TypeMask receiverType =
+              new TypeMask.nonNullExact(superClass, compiler.world);
+          selector = new TypedSelector(receiverType, selector, compiler.world);
+          // TODO(floitsch): we know the target. We shouldn't register a
+          // dynamic getter.
+          registry.registerDynamicGetter(selector);
+          registry.registerGetterForSuperMethod(node.element);
+          methodName = backend.namer.invocationName(selector);
+        } else {
+          assert(invariant(node, compiler.hasIncrementalSupport));
+          methodName = backend.namer.getNameOfInstanceMember(superMethod);
+        }
+        push(js.js('#.prototype.#.call(#)',
+                   [backend.emitter.classAccess(superClass),
+                    methodName, visitArguments(node.inputs, start: 0)]),
+             node);
       } else {
-        methodName =
-            backend.namer.getNameOfAliasedSuperMember(superMethod);
-        backend.registerAliasedSuperMember(superMethod);
         use(node.receiver);
         push(
           js.js('#.#(#)', [
-            pop(), methodName,
+            pop(), backend.namer.getNameOfAliasedSuperMember(superMethod),
             visitArguments(node.inputs, start: 1)]), // Skip receiver argument.
           node);
       }
-
     }
   }
 
@@ -1784,7 +1785,8 @@
   }
 
   visitForeignNew(HForeignNew node) {
-    js.Expression jsClassReference = backend.namer.elementAccess(node.element);
+    js.Expression jsClassReference =
+        backend.emitter.classAccess(node.element);
     List<js.Expression> arguments = visitArguments(node.inputs, start: 0);
     push(new js.New(jsClassReference, arguments), node);
     registerForeignTypes(node);
@@ -2022,7 +2024,7 @@
   void generateThrowWithHelper(String helperName, argument) {
     Element helper = backend.findHelper(helperName);
     registry.registerStaticUse(helper);
-    js.Expression jsHelper = backend.namer.elementAccess(helper);
+    js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper);
     List arguments = [];
     var location;
     if (argument is List) {
@@ -2055,7 +2057,7 @@
     Element helper = backend.findHelper("throwExpression");
     registry.registerStaticUse(helper);
 
-    js.Expression jsHelper = backend.namer.elementAccess(helper);
+    js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper);
     js.Call value = new js.Call(jsHelper, [pop()]);
     value = attachLocation(value, argument);
     push(value, node);
@@ -2067,10 +2069,11 @@
 
   void visitStatic(HStatic node) {
     Element element = node.element;
+    assert(element.isFunction || element.isField);
     if (element.isFunction) {
-      push(backend.namer.isolateStaticClosureAccess(node.element));
+      push(backend.emitter.isolateStaticClosureAccess(node.element));
     } else {
-      push(backend.namer.elementAccess(node.element));
+      push(backend.emitter.staticFieldAccess(node.element));
     }
     registry.registerStaticUse(element);
   }
@@ -2079,14 +2082,14 @@
     Element element = node.element;
     registry.registerStaticUse(element);
     js.Expression lazyGetter =
-        backend.namer.isolateLazyInitializerAccess(element);
+        backend.emitter.isolateLazyInitializerAccess(element);
     js.Call call = new js.Call(lazyGetter, <js.Expression>[]);
     push(call, node);
   }
 
   void visitStaticStore(HStaticStore node) {
     registry.registerStaticUse(node.element);
-    js.Node variable = backend.namer.elementAccess(node.element);
+    js.Node variable = backend.emitter.staticFieldAccess(node.element);
     use(node.inputs[0]);
     push(new js.Assignment(variable, pop()), node);
   }
@@ -2117,7 +2120,8 @@
     } else {
       Element convertToString = backend.getStringInterpolationHelper();
       registry.registerStaticUse(convertToString);
-      js.Expression jsHelper = backend.namer.elementAccess(convertToString);
+      js.Expression jsHelper =
+          backend.emitter.staticFunctionAccess(convertToString);
       use(input);
       push(new js.Call(jsHelper, <js.Expression>[pop()]), node);
     }
@@ -2129,13 +2133,11 @@
   }
 
   void generateArrayLiteral(HLiteralList node) {
-    int len = node.inputs.length;
-    List<js.ArrayElement> elements = <js.ArrayElement>[];
-    for (int i = 0; i < len; i++) {
-      use(node.inputs[i]);
-      elements.add(new js.ArrayElement(i, pop()));
-    }
-    push(new js.ArrayInitializer(len, elements), node);
+    List<js.Expression> elements = node.inputs.map((HInstruction input) {
+      use(input);
+      return pop();
+    }).toList();
+    push(new js.ArrayInitializer(elements), node);
   }
 
   void visitIndex(HIndex node) {
@@ -2253,21 +2255,6 @@
     push(new js.Binary('!=', pop(), new js.LiteralNull()));
   }
 
-  bool checkIndexingBehavior(HInstruction input, {bool negative: false}) {
-    if (!compiler.resolverWorld.isInstantiated(
-          backend.jsIndexingBehaviorInterface)) {
-      return false;
-    }
-
-    use(input);
-    js.Expression object1 = pop();
-    use(input);
-    js.Expression object2 = pop();
-    push(backend.generateIsJsIndexableCall(object1, object2));
-    if (negative) push(new js.Prefix('!', pop()));
-    return true;
-  }
-
   void checkType(HInstruction input, HInstruction interceptor,
                  DartType type, {bool negative: false}) {
     Element element = type.element;
@@ -2468,97 +2455,43 @@
     attachLocationToLast(node);
   }
 
-  js.Expression generateTest(HInstruction input, TypeMask checkedType) {
+  js.Expression generateReceiverOrArgumentTypeTest(
+      HInstruction input, TypeMask checkedType) {
     ClassWorld classWorld = compiler.world;
-    TypeMask receiver = input.instructionType;
+    TypeMask inputType = input.instructionType;
     // Figure out if it is beneficial to turn this into a null check.
     // V8 generally prefers 'typeof' checks, but for integers and
     // indexable primitives we cannot compile this test into a single
     // typeof check so the null check is cheaper.
-    bool turnIntoNumCheck = input.isIntegerOrNull(compiler)
-        && checkedType.containsOnlyInt(classWorld);
+    bool isIntCheck = checkedType.containsOnlyInt(classWorld);
+    bool turnIntoNumCheck = isIntCheck && input.isIntegerOrNull(compiler);
     bool turnIntoNullCheck = !turnIntoNumCheck
-        && (checkedType.nullable() == receiver)
-        && (checkedType.containsOnlyInt(classWorld)
+        && (checkedType.nullable() == inputType)
+        && (isIntCheck
             || checkedType.satisfies(backend.jsIndexableClass, classWorld));
-    js.Expression test;
+
     if (turnIntoNullCheck) {
       use(input);
-      test = new js.Binary("==", pop(), new js.LiteralNull());
-    } else if (checkedType.containsOnlyInt(classWorld) && !turnIntoNumCheck) {
+      return new js.Binary("==", pop(), new js.LiteralNull());
+    } else if (isIntCheck && !turnIntoNumCheck) {
       // input is !int
-      checkInt(input, '!==');
-      test = pop();
-    } else if (checkedType.containsOnlyNum(classWorld) || turnIntoNumCheck) {
+      checkBigInt(input, '!==');
+      return pop();
+    } else if (turnIntoNumCheck || checkedType.containsOnlyNum(classWorld)) {
       // input is !num
       checkNum(input, '!==');
-      test = pop();
+      return pop();
     } else if (checkedType.containsOnlyBool(classWorld)) {
       // input is !bool
       checkBool(input, '!==');
-      test = pop();
+      return pop();
     } else if (checkedType.containsOnlyString(classWorld)) {
       // input is !string
       checkString(input, '!==');
-      test = pop();
-    } else if (checkedType.satisfies(backend.jsExtendableArrayClass,
-                                     classWorld)) {
-      // input is !Object || input is !Array || input.isFixed
-      checkObject(input, '!==');
-      js.Expression objectTest = pop();
-      checkArray(input, '!==');
-      js.Expression arrayTest = pop();
-      checkFixedArray(input);
-      test = new js.Binary('||', objectTest, arrayTest);
-      test = new js.Binary('||', test, pop());
-    } else if (checkedType.satisfies(backend.jsMutableArrayClass, classWorld)) {
-      // input is !Object
-      // || ((input is !Array || input.isImmutable)
-      //     && input is !JsIndexingBehavior)
-      checkObject(input, '!==');
-      js.Expression objectTest = pop();
-      checkArray(input, '!==');
-      js.Expression arrayTest = pop();
-      checkImmutableArray(input);
-      js.Binary notArrayOrImmutable = new js.Binary('||', arrayTest, pop());
-
-      js.Binary notIndexing = checkIndexingBehavior(input, negative: true)
-          ? new js.Binary('&&', notArrayOrImmutable, pop())
-          : notArrayOrImmutable;
-      test = new js.Binary('||', objectTest, notIndexing);
-    } else if (checkedType.satisfies(backend.jsArrayClass, classWorld)) {
-      // input is !Object
-      // || (input is !Array && input is !JsIndexingBehavior)
-      checkObject(input, '!==');
-      js.Expression objectTest = pop();
-      checkArray(input, '!==');
-      js.Expression arrayTest = pop();
-
-      js.Expression notIndexing = checkIndexingBehavior(input, negative: true)
-          ? new js.Binary('&&', arrayTest, pop())
-          : arrayTest;
-      test = new js.Binary('||', objectTest, notIndexing);
-    } else if (checkedType.satisfies(backend.jsIndexableClass, classWorld)) {
-      // input is !String
-      // && (input is !Object
-      //     || (input is !Array && input is !JsIndexingBehavior))
-      checkString(input, '!==');
-      js.Expression stringTest = pop();
-      checkObject(input, '!==');
-      js.Expression objectTest = pop();
-      checkArray(input, '!==');
-      js.Expression arrayTest = pop();
-
-      js.Binary notIndexingTest = checkIndexingBehavior(input, negative: true)
-          ? new js.Binary('&&', arrayTest, pop())
-          : arrayTest;
-      js.Binary notObjectOrIndexingTest =
-          new js.Binary('||', objectTest, notIndexingTest);
-      test = new js.Binary('&&', stringTest, notObjectOrIndexingTest);
-    } else {
-      compiler.internalError(input, 'Unexpected check.');
+      return pop();
     }
-    return test;
+    compiler.internalError(input, 'Unexpected check.');
+    return null;
   }
 
   void visitTypeConversion(HTypeConversion node) {
@@ -2569,7 +2502,8 @@
       assert(compiler.trustTypeAnnotations ||
              !node.checkedType.containsOnlyInt(classWorld) ||
              node.checkedInput.isIntegerOrNull(compiler));
-      js.Expression test = generateTest(node.checkedInput, node.checkedType);
+      js.Expression test = generateReceiverOrArgumentTypeTest(
+          node.checkedInput, node.checkedType);
       js.Block oldContainer = currentContainer;
       js.Statement body = new js.Block.empty();
       currentContainer = body;
@@ -2649,16 +2583,16 @@
     if (namedParameters.isEmpty) {
       var arguments = [returnType];
       if (!parameterTypes.isEmpty || !optionalParameterTypes.isEmpty) {
-        arguments.add(new js.ArrayInitializer.from(parameterTypes));
+        arguments.add(new js.ArrayInitializer(parameterTypes));
       }
       if (!optionalParameterTypes.isEmpty) {
-        arguments.add(new js.ArrayInitializer.from(optionalParameterTypes));
+        arguments.add(new js.ArrayInitializer(optionalParameterTypes));
       }
       push(js.js('#(#)', [accessHelper('buildFunctionType'), arguments]));
     } else {
       var arguments = [
           returnType,
-          new js.ArrayInitializer.from(parameterTypes),
+          new js.ArrayInitializer(parameterTypes),
           new js.ObjectInitializer(namedParameters)];
       push(js.js('#(#)', [accessHelper('buildNamedFunctionType'), arguments]));
     }
@@ -2674,7 +2608,8 @@
       if (backend.isInterceptorClass(element.enclosingClass)) {
         int index = RuntimeTypes.getTypeVariableIndex(element);
         js.Expression receiver = pop();
-        js.Expression helper = backend.namer.elementAccess(helperElement);
+        js.Expression helper = backend.emitter
+            .staticFunctionAccess(helperElement);
         push(js.js(r'#(#.$builtinTypeInfo && #.$builtinTypeInfo[#])',
                 [helper, receiver, receiver, js.js.number(index)]));
       } else {
@@ -2684,7 +2619,7 @@
       }
     } else {
       push(js.js('#(#)', [
-          backend.namer.elementAccess(
+          backend.emitter.staticFunctionAccess(
               backend.findHelper('convertRtiToRuntimeType')),
           pop()]));
     }
@@ -2698,9 +2633,9 @@
     }
 
     ClassElement cls = node.dartType.element;
-    var arguments = [backend.namer.elementAccess(cls)];
+    var arguments = [backend.emitter.classAccess(cls)];
     if (!typeArguments.isEmpty) {
-      arguments.add(new js.ArrayInitializer.from(typeArguments));
+      arguments.add(new js.ArrayInitializer(typeArguments));
     }
     push(js.js('#(#)', [accessHelper('buildInterfaceType'), arguments]));
   }
@@ -2720,6 +2655,6 @@
       return js.js('(void 0).$name');
     }
     registry.registerStaticUse(helper);
-    return backend.namer.elementAccess(helper);
+    return backend.emitter.staticFunctionAccess(helper);
   }
 }
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index 3f17758..79a527c 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -255,6 +255,7 @@
     node.interceptedClasses = interceptedClasses;
 
     // Try creating a one-shot interceptor.
+    if (compiler.hasIncrementalSupport) return false;
     if (node.usedBy.length != 1) return false;
     if (node.usedBy[0] is !HInvokeDynamic) return false;
 
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 7d122f0..a6bb41a 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -17,6 +17,7 @@
     show ElementX,
          VariableElementX,
          ConstructorBodyElementX;
+import '../helpers/helpers.dart';
 import '../js/js.dart' as js;
 import '../js_backend/js_backend.dart';
 import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/optimization.dart b/pkg/compiler/lib/src/tree_ir/optimization/optimization.dart
index 63652c4..737ac3f 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/optimization.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/optimization.dart
@@ -22,6 +22,7 @@
   void rewrite(ExecutableDefinition root) => root.applyPass(this);
   void rewriteExecutableDefinition(ExecutableDefinition root);
   void rewriteFieldDefinition(FieldDefinition root) {
+    if (!root.hasInitializer) return;
     rewriteExecutableDefinition(root);
   }
   void rewriteFunctionDefinition(FunctionDefinition root) {
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
index 21cf920..49b61c9 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -110,6 +110,8 @@
   void rewrite(ExecutableDefinition definition) => definition.applyPass(this);
 
   void rewriteFieldDefinition(FieldDefinition definition) {
+    if (!definition.hasInitializer) return;
+
     environment = <Assign>[];
     definition.body = visitStatement(definition.body);
 
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index 77e7ea3..4c614c9 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -49,9 +49,9 @@
   final Map<Element, List<Variable>> element2variables =
       <Element,List<Variable>>{};
 
-  /// Like [element2variables], except for closure variables. Closure variables
-  /// are not subject to SSA, so at most one variable is used per local.
-  final Map<Local, Variable> local2closure = <Local, Variable>{};
+  /// Like [element2variables], except for closure variables.
+  final Map<cps_ir.ClosureVariable, Variable> local2closure =
+      <cps_ir.ClosureVariable, Variable>{};
 
   // Continuations with more than one use are replaced with Tree labels.  This
   // is the mapping from continuations to labels.
@@ -72,16 +72,12 @@
   /// variables.
   Variable phiTempVar;
 
-  Variable getClosureVariable(Local local) {
-    if (local.executableContext != currentElement) {
-      return parent.getClosureVariable(local);
+  Variable getClosureVariable(cps_ir.ClosureVariable irVariable) {
+    if (irVariable.host != currentElement) {
+      return parent.getClosureVariable(irVariable);
     }
-    Variable variable = local2closure[local];
-    if (variable == null) {
-      variable = new Variable(currentElement, local);
-      local2closure[local] = variable;
-    }
-    return variable;
+    return local2closure.putIfAbsent(irVariable,
+        () => new Variable(currentElement, irVariable.hint));
   }
 
   /// Obtains the variable representing the given primitive. Returns null for
@@ -90,11 +86,8 @@
     if (primitive.registerIndex == null) {
       return null; // variable is unused
     }
-    List<Variable> variables = element2variables[primitive.hint];
-    if (variables == null) {
-      variables = <Variable>[];
-      element2variables[primitive.hint] = variables;
-    }
+    List<Variable> variables = element2variables.putIfAbsent(primitive.hint,
+        () => <Variable>[]);
     while (variables.length <= primitive.registerIndex) {
       variables.add(new Variable(currentElement, primitive.hint));
     }
@@ -126,19 +119,31 @@
   }
 
   FieldDefinition buildField(cps_ir.FieldDefinition node) {
-    currentElement = node.element;
-    returnContinuation = node.returnContinuation;
+    Statement body;
+    if (node.hasInitializer) {
+      currentElement = node.element;
+      returnContinuation = node.returnContinuation;
 
-    phiTempVar = new Variable(node.element, null);
+      phiTempVar = new Variable(node.element, null);
 
-    return new FieldDefinition(node.element, visit(node.body));
+      body = visit(node.body);
+    }
+    return new FieldDefinition(node.element, body);
+  }
+
+  Variable getFunctionParameter(cps_ir.Definition variable) {
+    if (variable is cps_ir.Parameter) {
+      return getVariable(variable);
+    } else {
+      return getClosureVariable(variable as cps_ir.ClosureVariable);
+    }
   }
 
   FunctionDefinition buildFunction(cps_ir.FunctionDefinition node) {
     currentElement = node.element;
     List<Variable> parameters = <Variable>[];
-    for (cps_ir.Parameter p in node.parameters) {
-      Variable parameter = getVariable(p);
+    for (cps_ir.Definition p in node.parameters) {
+      Variable parameter = getFunctionParameter(p);
       assert(parameter != null);
       ++parameter.writeCount; // Being a parameter counts as a write.
       parameters.add(parameter);
@@ -344,18 +349,18 @@
   }
 
   Expression visitGetClosureVariable(cps_ir.GetClosureVariable node) {
-    return getClosureVariable(node.variable);
+    return getClosureVariable(node.variable.definition);
   }
 
   Statement visitSetClosureVariable(cps_ir.SetClosureVariable node) {
-    Variable variable = getClosureVariable(node.variable);
+    Variable variable = getClosureVariable(node.variable.definition);
     Expression value = getVariableReference(node.value);
     return new Assign(variable, value, visit(node.body),
                       isDeclaration: node.isDeclaration);
   }
 
   Statement visitDeclareFunction(cps_ir.DeclareFunction node) {
-    Variable variable = getClosureVariable(node.variable);
+    Variable variable = getClosureVariable(node.variable.definition);
     FunctionDefinition function = makeSubFunction(node.definition);
     return new FunctionDeclaration(variable, function, visit(node.body));
   }
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index ac8e464..6dc960f 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -42,6 +42,7 @@
  */
 abstract class Expression extends Node {
   accept(ExpressionVisitor v);
+  accept1(ExpressionVisitor1 v, arg);
 
   /// Temporary variable used by [StatementRewriter].
   /// If set to true, this expression has already had enclosing assignments
@@ -55,6 +56,7 @@
   Statement get next;
   void set next(Statement s);
   accept(StatementVisitor v);
+  accept1(StatementVisitor1 v, arg);
 }
 
 /**
@@ -106,6 +108,7 @@
   }
 
   accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitVariable(this, arg);
 }
 
 /**
@@ -129,6 +132,9 @@
   InvokeStatic(this.target, this.selector, this.arguments);
 
   accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitInvokeStatic(this, arg);
+  }
 }
 
 /**
@@ -147,6 +153,9 @@
   }
 
   accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitInvokeMethod(this, arg);
+  }
 }
 
 class InvokeSuperMethod extends Expression implements Invoke {
@@ -156,6 +165,9 @@
   InvokeSuperMethod(this.selector, this.arguments);
 
   accept(ExpressionVisitor visitor) => visitor.visitInvokeSuperMethod(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitInvokeSuperMethod(this, arg);
+  }
 }
 
 /**
@@ -174,6 +186,9 @@
   ClassElement get targetClass => target.enclosingElement;
 
   accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitInvokeConstructor(this, arg);
+  }
 }
 
 /// Calls [toString] on each argument and concatenates the results.
@@ -184,6 +199,9 @@
   ConcatenateStrings(this.arguments, [this.constant]);
 
   accept(ExpressionVisitor visitor) => visitor.visitConcatenateStrings(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitConcatenateStrings(this, arg);
+  }
 }
 
 /**
@@ -198,12 +216,14 @@
       : expression = new PrimitiveConstantExpression(primitiveValue);
 
   accept(ExpressionVisitor visitor) => visitor.visitConstant(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitConstant(this, arg);
 
   values.ConstantValue get value => expression.value;
 }
 
 class This extends Expression {
   accept(ExpressionVisitor visitor) => visitor.visitThis(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitThis(this, arg);
 }
 
 class ReifyTypeVar extends Expression {
@@ -212,6 +232,9 @@
   ReifyTypeVar(this.typeVariable);
 
   accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitReifyTypeVar(this, arg);
+  }
 }
 
 class LiteralList extends Expression {
@@ -221,6 +244,9 @@
   LiteralList(this.type, this.values);
 
   accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitLiteralList(this, arg);
+  }
 }
 
 class LiteralMapEntry {
@@ -237,6 +263,9 @@
   LiteralMap(this.type, this.entries);
 
   accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitLiteralMap(this, arg);
+  }
 }
 
 class TypeOperator extends Expression {
@@ -247,6 +276,9 @@
   TypeOperator(this.receiver, this.type, {bool this.isTypeTest});
 
   accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitTypeOperator(this, arg);
+  }
 
   String get operator => isTypeTest ? 'is' : 'as';
 }
@@ -260,6 +292,9 @@
   Conditional(this.condition, this.thenExpression, this.elseExpression);
 
   accept(ExpressionVisitor visitor) => visitor.visitConditional(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitConditional(this, arg);
+  }
 }
 
 /// An && or || expression. The operator is internally represented as a boolean
@@ -276,6 +311,9 @@
   String get operator => isAnd ? '&&' : '||';
 
   accept(ExpressionVisitor visitor) => visitor.visitLogicalOperator(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitLogicalOperator(this, arg);
+  }
 }
 
 /// Logical negation.
@@ -285,6 +323,7 @@
   Not(this.operand);
 
   accept(ExpressionVisitor visitor) => visitor.visitNot(this);
+  accept1(ExpressionVisitor1 visitor, arg) => visitor.visitNot(this, arg);
 }
 
 class FunctionExpression extends Expression {
@@ -295,6 +334,9 @@
   }
 
   accept(ExpressionVisitor visitor) => visitor.visitFunctionExpression(this);
+  accept1(ExpressionVisitor1 visitor, arg) {
+    return visitor.visitFunctionExpression(this, arg);
+  }
 }
 
 /// Declares a local function.
@@ -312,6 +354,9 @@
   }
 
   accept(StatementVisitor visitor) => visitor.visitFunctionDeclaration(this);
+  accept1(StatementVisitor1 visitor, arg) {
+    return visitor.visitFunctionDeclaration(this, arg);
+  }
 }
 
 /// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
@@ -335,6 +380,9 @@
   }
 
   accept(StatementVisitor visitor) => visitor.visitLabeledStatement(this);
+  accept1(StatementVisitor1 visitor, arg) {
+    return visitor.visitLabeledStatement(this, arg);
+  }
 }
 
 /// A [WhileTrue] or [WhileCondition] loop.
@@ -357,6 +405,7 @@
   void set next(Statement s) => throw 'UNREACHABLE';
 
   accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitWhileTrue(this, arg);
 }
 
 /**
@@ -382,6 +431,9 @@
   }
 
   accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
+  accept1(StatementVisitor1 visitor, arg) {
+    return visitor.visitWhileCondition(this, arg);
+  }
 }
 
 /// A [Break] or [Continue] statement.
@@ -404,6 +456,7 @@
   }
 
   accept(StatementVisitor visitor) => visitor.visitBreak(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitBreak(this, arg);
 }
 
 /**
@@ -421,6 +474,7 @@
   }
 
   accept(StatementVisitor visitor) => visitor.visitContinue(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitContinue(this, arg);
 }
 
 /**
@@ -447,6 +501,7 @@
   bool get hasExactlyOneUse => variable.readCount == 1;
 
   accept(StatementVisitor visitor) => visitor.visitAssign(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitAssign(this, arg);
 }
 
 /**
@@ -466,6 +521,7 @@
   Return(this.value);
 
   accept(StatementVisitor visitor) => visitor.visitReturn(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitReturn(this, arg);
 }
 
 /**
@@ -482,6 +538,7 @@
   If(this.condition, this.thenStatement, this.elseStatement);
 
   accept(StatementVisitor visitor) => visitor.visitIf(this);
+  accept1(StatementVisitor1 visitor, arg) => visitor.visitIf(this, arg);
 }
 
 class ExpressionStatement extends Statement {
@@ -491,6 +548,9 @@
   ExpressionStatement(this.expression, this.next);
 
   accept(StatementVisitor visitor) => visitor.visitExpressionStatement(this);
+  accept1(StatementVisitor1 visitor, arg) {
+    return visitor.visitExpressionStatement(this, arg);
+  }
 }
 
 abstract class ExecutableDefinition {
@@ -507,6 +567,25 @@
 
   FieldDefinition(this.element, this.body);
   applyPass(Pass pass) => pass.rewriteFieldDefinition(this);
+
+  /// `true` if this field has no initializer.
+  ///
+  /// If `true` [body] is `null`.
+  ///
+  /// This is different from a initializer that is `null`. Consider this class:
+  ///
+  ///     class Class {
+  ///       final field;
+  ///       Class.a(this.field);
+  ///       Class.b() : this.field = null;
+  ///       Class.c();
+  ///     }
+  ///
+  /// If `field` had an initializer, possibly `null`, constructors `Class.a` and
+  /// `Class.b` would be invalid, and since `field` has no initializer
+  /// constructor `Class.c` is invalid. We therefore need to distinguish the two
+  /// cases.
+  bool get hasInitializer => body != null;
 }
 
 class FunctionDefinition extends Node implements ExecutableDefinition {
@@ -546,6 +625,26 @@
   E visitFunctionExpression(FunctionExpression node);
 }
 
+abstract class ExpressionVisitor1<E, A> {
+  E visitExpression(Expression e, A arg) => e.accept1(this, arg);
+  E visitVariable(Variable node, A arg);
+  E visitInvokeStatic(InvokeStatic node, A arg);
+  E visitInvokeMethod(InvokeMethod node, A arg);
+  E visitInvokeSuperMethod(InvokeSuperMethod node, A arg);
+  E visitInvokeConstructor(InvokeConstructor node, A arg);
+  E visitConcatenateStrings(ConcatenateStrings node, A arg);
+  E visitConstant(Constant node, A arg);
+  E visitThis(This node, A arg);
+  E visitReifyTypeVar(ReifyTypeVar node, A arg);
+  E visitConditional(Conditional node, A arg);
+  E visitLogicalOperator(LogicalOperator node, A arg);
+  E visitNot(Not node, A arg);
+  E visitLiteralList(LiteralList node, A arg);
+  E visitLiteralMap(LiteralMap node, A arg);
+  E visitTypeOperator(TypeOperator node, A arg);
+  E visitFunctionExpression(FunctionExpression node, A arg);
+}
+
 abstract class StatementVisitor<S> {
   S visitStatement(Statement s) => s.accept(this);
   S visitLabeledStatement(LabeledStatement node);
@@ -560,12 +659,32 @@
   S visitExpressionStatement(ExpressionStatement node);
 }
 
+abstract class StatementVisitor1<S, A> {
+  S visitStatement(Statement s, A arg) => s.accept1(this, arg);
+  S visitLabeledStatement(LabeledStatement node, A arg);
+  S visitAssign(Assign node, A arg);
+  S visitReturn(Return node, A arg);
+  S visitBreak(Break node, A arg);
+  S visitContinue(Continue node, A arg);
+  S visitIf(If node, A arg);
+  S visitWhileTrue(WhileTrue node, A arg);
+  S visitWhileCondition(WhileCondition node, A arg);
+  S visitFunctionDeclaration(FunctionDeclaration node, A arg);
+  S visitExpressionStatement(ExpressionStatement node, A arg);
+}
+
 abstract class Visitor<S, E> implements ExpressionVisitor<E>,
                                         StatementVisitor<S> {
    E visitExpression(Expression e) => e.accept(this);
    S visitStatement(Statement s) => s.accept(this);
 }
 
+abstract class Visitor1<S, E, A> implements ExpressionVisitor1<E, A>,
+                                            StatementVisitor1<S, A> {
+   E visitExpression(Expression e, A arg) => e.accept1(this, arg);
+   S visitStatement(Statement s, A arg) => s.accept1(this, arg);
+}
+
 class RecursiveVisitor extends Visitor {
   visitFunctionDefinition(FunctionDefinition node) {
     visitStatement(node.body);
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
index a35e430..e78f426 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
@@ -51,7 +51,9 @@
   }
 
   void collect(ExecutableDefinition node) {
-    visitStatement(node.body);
+    if (node.body != null) {
+      visitStatement(node.body);
+    }
   }
 
   visitLabeledStatement(LabeledStatement node) {
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index 4073f29..2243375 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -1104,6 +1104,7 @@
       return const DynamicType();
     }
 
+    Identifier selector = node.selector.asIdentifier();
     if (Elements.isClosureSend(node, element)) {
       if (element != null) {
         // foo() where foo is a local or a parameter.
@@ -1113,9 +1114,12 @@
         DartType type = analyze(node.selector);
         return analyzeInvocation(node, new TypeAccess(type));
       }
+    } else if (Elements.isErroneousElement(element) && selector == null) {
+      // exp() where exp is an erroneous construct like `new Unresolved()`.
+      DartType type = analyze(node.selector);
+      return analyzeInvocation(node, new TypeAccess(type));
     }
 
-    Identifier selector = node.selector.asIdentifier();
     String name = selector.source;
 
     if (node.isOperator && identical(name, 'is')) {
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index 2ffec97..3577bbe 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -51,6 +51,7 @@
   useJs(new js.Program(null));
   useJs(new js.Blob(null));
   useJs(new js.NamedFunction(null, null));
+  useJs(new js.ArrayHole());
   useConcreteTypesInferrer(null);
   useColor();
   useFilenames();
diff --git a/pkg/csslib/CHANGELOG.md b/pkg/csslib/CHANGELOG.md
index 392de58..7c044aa 100644
--- a/pkg/csslib/CHANGELOG.md
+++ b/pkg/csslib/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.0+3
+
+* Improve the speed and memory efficiency of parsing.
+
 ## 0.11.0+2
 
 * Fix another test that was failing on IE10.
diff --git a/pkg/csslib/lib/parser.dart b/pkg/csslib/lib/parser.dart
index 282fe59..6060166 100644
--- a/pkg/csslib/lib/parser.dart
+++ b/pkg/csslib/lib/parser.dart
@@ -196,7 +196,7 @@
   StyleSheet parse() {
     List<TreeNode> productions = [];
 
-    int start = _peekToken.start;
+    var start = _peekToken.span;
     while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) {
       // TODO(terry): Need to handle charset.
       var directive = processDirective();
@@ -222,7 +222,7 @@
   StyleSheet parseSelector() {
     List<TreeNode> productions = [];
 
-    int start = _peekToken.start;
+    var start = _peekToken.span;
     while (!_maybeEat(TokenKind.END_OF_FILE) && !_peekKind(TokenKind.RBRACE)) {
       var selector = processSelector();
       if (selector != null) {
@@ -334,12 +334,14 @@
     messages.warning(message, location);
   }
 
-  SourceSpan _makeSpan(int start) {
+  SourceSpan _makeSpan(FileSpan start) {
     // TODO(terry): there are places where we are creating spans before we eat
-    // the tokens, so using _previousToken.end is not always valid.
-    var end = _previousToken != null && _previousToken.end >= start
-        ? _previousToken.end : _peekToken.end;
-    return file.span(start, end);
+    // the tokens, so using _previousToken is not always valid.
+    // TODO(nweiz): use < rather than compareTo when SourceSpan supports it.
+    if (_previousToken == null || _previousToken.span.compareTo(start) < 0) {
+      return start;
+    }
+    return start.expand(_previousToken.span);
   }
 
   ///////////////////////////////////////////////////////////////////
@@ -389,7 +391,7 @@
     // Grammar: [ONLY | NOT]? S* media_type S*
     //          [ AND S* MediaExpr ]* | MediaExpr [ AND S* MediaExpr ]*
 
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     // Is it a unary media operator?
     var op = _peekToken.text;
@@ -408,7 +410,7 @@
         }
       }
       _next();
-      start = _peekToken.start;
+      start = _peekToken.span;
     }
 
     var type;
@@ -441,14 +443,14 @@
   }
 
   MediaExpression processMediaExpression([bool andOperator = false]) {
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     // Grammar: '(' S* media_feature S* [ ':' S* expr ]? ')' S*
     if (_maybeEat(TokenKind.LPAREN)) {
       if (_peekIdentifier()) {
         var feature = identifier();           // Media feature.
         while (_maybeEat(TokenKind.COLON)) {
-          int startExpr = _peekToken.start;
+          var startExpr = _peekToken.span;
           var exprs = processExpr();
           if (_maybeEat(TokenKind.RPAREN)) {
             return new MediaExpression(andOperator, feature, exprs,
@@ -484,7 +486,7 @@
    *  content             '@content'
    */
   processDirective() {
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     var tokId = processVariableOrDirective();
     if (tokId is VarDefinitionDirective) return tokId;
@@ -703,7 +705,7 @@
 
         List<TreeNode> productions = [];
 
-        start = _peekToken.start;
+        start = _peekToken.span;
         while (!_maybeEat(TokenKind.END_OF_FILE)) {
           RuleSet ruleset = processRuleSet();
           if (ruleset == null) {
@@ -755,7 +757,7 @@
             namespaceUri, _makeSpan(start));
 
       case TokenKind.DIRECTIVE_MIXIN:
-        return processMixin(start);
+        return processMixin();
 
       case TokenKind.DIRECTIVE_INCLUDE:
         return processInclude( _makeSpan(start));
@@ -778,7 +780,7 @@
    *    [ruleset | property | directive]*
    *  '}'
    */
-  MixinDefinition processMixin(int start) {
+  MixinDefinition processMixin() {
     _next();
 
     var name = identifier();
@@ -793,7 +795,7 @@
         if (varDef is VarDefinitionDirective || varDef is VarDefinition) {
           params.add(varDef);
         } else if (mustHaveParam) {
-          _warning("Expecting parameter", _makeSpan(_peekToken.start));
+          _warning("Expecting parameter", _makeSpan(_peekToken.span));
           keepGoing = false;
         }
         if (_maybeEat(TokenKind.COMMA)) {
@@ -810,7 +812,7 @@
     List<TreeNode> declarations = [];
     var mixinDirective;
 
-    start = _peekToken.start;
+    var start = _peekToken.span;
     while (!_maybeEat(TokenKind.END_OF_FILE)) {
       var directive = processDirective();
       if (directive != null) {
@@ -833,7 +835,7 @@
                 include.span));
           } else {
             _warning("Error mixing of top-level vs declarations mixins",
-                _makeSpan(include));
+                _makeSpan(include.span));
           }
         });
         declGroup.declarations.insertAll(0, newDecls);
@@ -882,7 +884,7 @@
    * return the token id of a directive or -1 if neither.
    */
   processVariableOrDirective({bool mixinParameter: false}) {
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     var tokId = _peek();
     // Handle case for @ directive (where there's a whitespace between the @
@@ -1046,7 +1048,7 @@
   }
 
   DeclarationGroup processDeclarations({bool checkBrace: true}) {
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     if (checkBrace) _eat(TokenKind.LBRACE);
 
@@ -1104,7 +1106,7 @@
   List<DeclarationGroup> processMarginsDeclarations() {
     List groups = [];
 
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     _eat(TokenKind.LBRACE);
 
@@ -1189,7 +1191,7 @@
 
   SelectorGroup processSelectorGroup() {
     List<Selector> selectors = [];
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     do {
       Selector selector = processSelector();
@@ -1208,7 +1210,7 @@
    */
   Selector processSelector() {
     var simpleSequences = <SimpleSelectorSequence>[];
-    var start = _peekToken.start;
+    var start = _peekToken.span;
     while (true) {
       // First item is never descendant make sure it's COMBINATOR_NONE.
       var selectorItem = simpleSelectorSequence(simpleSequences.length == 0);
@@ -1225,7 +1227,7 @@
   }
 
   simpleSelectorSequence(bool forceCombinatorNone) {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
     var combinatorType = TokenKind.COMBINATOR_NONE;
     var thisOperator = false;
 
@@ -1301,12 +1303,12 @@
     //              code.
     // TODO(terry): Need to handle attribute namespace too.
     var first;
-    int start = _peekToken.start;
+    var start = _peekToken.span;
     switch (_peek()) {
       case TokenKind.ASTERISK:
         // Mark as universal namespace.
         var tok = _next();
-        first = new Wildcard(_makeSpan(tok.start));
+        first = new Wildcard(_makeSpan(tok.span));
         break;
       case TokenKind.IDENTIFIER:
         first = identifier();
@@ -1329,7 +1331,7 @@
         case TokenKind.ASTERISK:
           // Mark as universal element
           var tok = _next();
-          element = new Wildcard(_makeSpan(tok.start));
+          element = new Wildcard(_makeSpan(tok.span));
           break;
         case TokenKind.IDENTIFIER:
           element = identifier();
@@ -1366,7 +1368,7 @@
    */
   simpleSelectorTail() {
     // Check for HASH | class | attrib | pseudo | negation
-    var start = _peekToken.start;
+    var start = _peekToken.span;
     switch (_peek()) {
       case TokenKind.HASH:
         _eat(TokenKind.HASH);
@@ -1413,7 +1415,7 @@
     }
   }
 
-  processPseudoSelector(int start) {
+  processPseudoSelector(FileSpan start) {
     // :pseudo-class ::pseudo-element
     // TODO(terry): '::' should be token.
     _eat(TokenKind.COLON);
@@ -1492,7 +1494,7 @@
    *    NUMBER            {num}
    */
   processSelectorExpression() {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
 
     var expressions = [];
 
@@ -1503,12 +1505,12 @@
     while (keepParsing) {
       switch (_peek()) {
         case TokenKind.PLUS:
-          start = _peekToken.start;
+          start = _peekToken.span;
           termToken = _next();
           expressions.add(new OperatorPlus(_makeSpan(start)));
           break;
         case TokenKind.MINUS:
-          start = _peekToken.start;
+          start = _peekToken.span;
           termToken = _next();
           expressions.add(new OperatorMinus(_makeSpan(start)));
           break;
@@ -1573,7 +1575,7 @@
   //
   //
   AttributeSelector processAttribute() {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
 
     if (_maybeEat(TokenKind.LBRACK)) {
       var attrName = identifier();
@@ -1629,7 +1631,7 @@
   Declaration processDeclaration(List dartStyles) {
     Declaration decl;
 
-    int start = _peekToken.start;
+    var start = _peekToken.span;
 
     // IE7 hack of * before property name if so the property is IE7 or below.
     var ie7 = _peekKind(TokenKind.ASTERISK);
@@ -1681,7 +1683,7 @@
         simpleSequences.add(selector);
       }
       if (_peekKind(TokenKind.COLON)) {
-        var pseudoSelector = processPseudoSelector(_peekToken.start);
+        var pseudoSelector = processPseudoSelector(_peekToken.span);
         if (pseudoSelector is PseudoElementSelector ||
             pseudoSelector is PseudoClassSelector) {
           simpleSequences.add(pseudoSelector);
@@ -2033,7 +2035,7 @@
   //  term:         (see processTerm)
   //
   Expressions processExpr([bool ieFilter = false]) {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
     var expressions = new Expressions(_makeSpan(start));
 
     var keepGoing = true;
@@ -2041,7 +2043,7 @@
     while (keepGoing && (expr = processTerm(ieFilter)) != null) {
       var op;
 
-      var opStart = _peekToken.start;
+      var opStart = _peekToken.span;
 
       switch (_peek()) {
       case TokenKind.SLASH:
@@ -2053,7 +2055,7 @@
       case TokenKind.BACKSLASH:
         // Backslash outside of string; detected IE8 or older signaled by \9 at
         // end of an expression.
-        var ie8Start = _peekToken.start;
+        var ie8Start = _peekToken.span;
 
         _next();
         if (_peekKind(TokenKind.INTEGER)) {
@@ -2117,7 +2119,7 @@
   //  function:     IDENT '(' expr ')'
   //
   processTerm([bool ieFilter = false]) {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
     Token t;                          // token for term's value
     var value;                        // value of term (numeric values)
 
@@ -2364,7 +2366,7 @@
   }
 
   String processQuotedString([bool urlString = false]) {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
 
     // URI term sucks up everything inside of quotes(' or ") or between parens
     var stopToken = urlString ? TokenKind.RPAREN : -1;
@@ -2377,19 +2379,19 @@
     switch (_peek()) {
     case TokenKind.SINGLE_QUOTE:
       stopToken = TokenKind.SINGLE_QUOTE;
-      start = _peekToken.start + 1;   // Skip the quote might have whitespace.
-      _next();    // Skip the SINGLE_QUOTE.
+      _next(); // Skip the SINGLE_QUOTE.
+      start = _peekToken.span;
       break;
     case TokenKind.DOUBLE_QUOTE:
       stopToken = TokenKind.DOUBLE_QUOTE;
-      start = _peekToken.start + 1;   // Skip the quote might have whitespace.
-      _next();    // Skip the DOUBLE_QUOTE.
+      _next(); // Skip the DOUBLE_QUOTE.
+      start = _peekToken.span;
       break;
     default:
       if (urlString) {
         if (_peek() == TokenKind.LPAREN) {
           _next();    // Skip the LPAREN.
-          start = _peekToken.start;
+          start = _peekToken.span;
         }
         stopToken = TokenKind.RPAREN;
       } else {
@@ -2399,8 +2401,6 @@
     }
 
     // Gobble up everything until we hit our stop token.
-    var runningStart = _peekToken.start;
-
     var stringValue = new StringBuffer();
     while (_peek() != stopToken && _peek() != TokenKind.END_OF_FILE) {
       stringValue.write(_next().text);
@@ -2426,7 +2426,7 @@
    * We'll just parse everything after the 'progid:' look for the left paren
    * then parse to the right paren ignoring everything in between.
    */
-  processIEFilter(int startAfterProgidColon) {
+  processIEFilter(FileSpan startAfterProgidColon) {
     var parens = 0;
 
     while (_peek() != TokenKind.END_OF_FILE) {
@@ -2438,7 +2438,7 @@
         case TokenKind.RPAREN:
           _eat(TokenKind.RPAREN);
           if (--parens == 0) {
-            var tok = tokenizer.makeIEFilter(startAfterProgidColon,
+            var tok = tokenizer.makeIEFilter(startAfterProgidColon.start.offset,
                 _peekToken.start);
             return new LiteralTerm(tok.text, tok.text, tok.span);
           }
@@ -2454,7 +2454,7 @@
   //  function:     IDENT '(' expr ')'
   //
   processFunction(Identifier func) {
-    var start = _peekToken.start;
+    var start = _peekToken.span;
 
     var name = func.name;
 
@@ -2519,10 +2519,10 @@
       if (isChecked) {
         _warning('expected identifier, but found $tok', tok.span);
       }
-      return new Identifier("", _makeSpan(tok.start));
+      return new Identifier("", _makeSpan(tok.span));
     }
 
-    return new Identifier(tok.text, _makeSpan(tok.start));
+    return new Identifier(tok.text, _makeSpan(tok.span));
   }
 
   // TODO(terry): Move this to base <= 36 and into shared code.
diff --git a/pkg/csslib/lib/src/token.dart b/pkg/csslib/lib/src/token.dart
index debd301..b78fbcc 100644
--- a/pkg/csslib/lib/src/token.dart
+++ b/pkg/csslib/lib/src/token.dart
@@ -12,7 +12,7 @@
   final int kind;
 
   /** The location where this token was parsed from. */
-  final SourceSpan span;
+  final FileSpan span;
 
   /** The start offset of this token. */
   int get start => span.start.offset;
@@ -43,13 +43,13 @@
 /** A token containing a parsed literal value. */
 class LiteralToken extends Token {
   var value;
-  LiteralToken(int kind, SourceSpan span, this.value) : super(kind, span);
+  LiteralToken(int kind, FileSpan span, this.value) : super(kind, span);
 }
 
 /** A token containing error information. */
 class ErrorToken extends Token {
   String message;
-  ErrorToken(int kind, SourceSpan span, this.message) : super(kind, span);
+  ErrorToken(int kind, FileSpan span, this.message) : super(kind, span);
 }
 
 /**
@@ -61,6 +61,6 @@
 class IdentifierToken extends Token {
   final String text;
 
-  IdentifierToken(this.text, int kind, SourceSpan span)
+  IdentifierToken(this.text, int kind, FileSpan span)
       : super(kind, span);
 }
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 1c18c70..fdd238f 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.11.0+2
+version: 0.11.0+3
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
index b2b193c..f364acd 100644
--- a/pkg/dart2js_incremental/lib/caching_compiler.dart
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -65,10 +65,20 @@
         options,
         environment);
     JavaScriptBackend backend = compiler.backend;
+
     // Much like a scout, an incremental compiler is always prepared. For
     // mixins, at least.
     backend.emitter.oldEmitter.needsMixinSupport = true;
-    return new Future.value(compiler);
+
+    Uri core = Uri.parse("dart:core");
+    return compiler.libraryLoader.loadLibrary(core).then((_) {
+      // Likewise, always be prepared for runtimeType support.
+      // TODO(johnniwinther): Add global switch to force RTI.
+      compiler.enabledRuntimeType = true;
+      backend.registerRuntimeType(
+          compiler.enqueuer.resolution, compiler.globalDependencies);
+      return compiler;
+    });
   } else {
     for (final task in compiler.tasks) {
       if (task.watch != null) {
@@ -96,7 +106,9 @@
     // must be invalidated).
     backend.emitter.oldEmitter.cachedElements.add(null);
 
-    compiler.enqueuer.codegen.newlyEnqueuedElements.clear();
+    compiler.enqueuer.codegen
+        ..newlyEnqueuedElements.clear()
+        ..newlySeenSelectors.clear();
 
     backend.emitter.oldEmitter.containerBuilder
         ..staticGetters.clear();
@@ -129,7 +141,6 @@
         ..deferredConstants.clear()
         ..isolateProperties = null
         ..classesCollector = null
-        ..neededClasses.clear()
         ..outputClassLists.clear()
         ..nativeClasses.clear()
         ..mangledFieldNames.clear()
diff --git a/pkg/dart2js_incremental/lib/library_updater.dart b/pkg/dart2js_incremental/lib/library_updater.dart
index 559de96..2331ffb 100644
--- a/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/pkg/dart2js_incremental/lib/library_updater.dart
@@ -14,6 +14,7 @@
 
 import 'package:compiler/src/dart2jslib.dart' show
     Compiler,
+    EnqueueTask,
     Script;
 
 import 'package:compiler/src/elements/elements.dart' show
@@ -49,6 +50,7 @@
     ClassBuilder,
     ClassEmitter,
     CodeEmitterTask,
+    ContainerBuilder,
     MemberInfo,
     computeMixinClass;
 
@@ -71,6 +73,9 @@
     FieldElementX,
     LibraryElementX;
 
+import 'package:compiler/src/universe/universe.dart' show
+    Selector;
+
 import 'diff.dart' show
     Difference,
     computeDifference;
@@ -121,12 +126,18 @@
   final Set<ClassElementX> _classesWithSchemaChanges =
       new Set<ClassElementX>();
 
+  final Set<ClassElementX> _existingClasses = new Set();
+
   LibraryUpdater(
       this.compiler,
       this.inputProvider,
       this.uri,
       this.logTime,
-      this.logVerbose);
+      this.logVerbose) {
+    if (compiler != null) {
+      _existingClasses.addAll(emitter.neededClasses);
+    }
+  }
 
   /// When [true], updates must be applied (using [applyUpdates]) before the
   /// [compiler]'s state correctly reflects the updated program.
@@ -533,9 +544,6 @@
   }
 
   String computeUpdateJs() {
-    Set existingClasses =
-        new Set.from(compiler.codegenWorld.directlyInstantiatedClasses);
-
     List<Update> removals = <Update>[];
     List<Element> updatedElements = applyUpdates(removals);
     if (compiler.progress != null) {
@@ -543,12 +551,12 @@
     }
     for (Element element in updatedElements) {
       if (!element.isClass) {
-        compiler.enqueuer.resolution.addToWorkList(element);
+        enqueuer.resolution.addToWorkList(element);
       } else {
         NO_WARN(element).ensureResolved(compiler);
       }
     }
-    compiler.processQueue(compiler.enqueuer.resolution, null);
+    compiler.processQueue(enqueuer.resolution, null);
 
     compiler.phase = Compiler.PHASE_DONE_RESOLVING;
 
@@ -559,23 +567,61 @@
         new Set<ClassElementX>.from(_classesWithSchemaChanges);
     for (Element element in updatedElements) {
       if (!element.isClass) {
-        compiler.enqueuer.codegen.addToWorkList(element);
+        enqueuer.codegen.addToWorkList(element);
       } else {
         changedClasses.add(element);
       }
     }
-    compiler.processQueue(compiler.enqueuer.codegen, null);
+    compiler.processQueue(enqueuer.codegen, null);
+
+    // Run through all compiled methods and see if they may apply to
+    // newlySeenSelectors.
+    for (Element e in enqueuer.codegen.generatedCode.keys) {
+      if (e.isFunction && !e.isConstructor &&
+          e.functionSignature.hasOptionalParameters) {
+        for (Selector selector in enqueuer.codegen.newlySeenSelectors) {
+          // TODO(ahe): Group selectors by name at this point for improved
+          // performance.
+          if (e.isInstanceMember && selector.applies(e, compiler.world)) {
+            // TODO(ahe): Don't use
+            // enqueuer.codegen.newlyEnqueuedElements directly like
+            // this, make a copy.
+            enqueuer.codegen.newlyEnqueuedElements.add(e);
+          }
+          if (selector.name == namer.closureInvocationSelectorName) {
+            selector = new Selector.call(
+                e.name, e.library,
+                selector.argumentCount, selector.namedArguments);
+            if (selector.appliesUnnamed(e, compiler.world)) {
+              // TODO(ahe): Also make a copy here.
+              enqueuer.codegen.newlyEnqueuedElements.add(e);
+            }
+          }
+        }
+      }
+    }
 
     List<jsAst.Statement> updates = <jsAst.Statement>[];
 
-    Set newClasses =
-        new Set.from(compiler.codegenWorld.directlyInstantiatedClasses);
-    newClasses.removeAll(existingClasses);
+    // TODO(ahe): allInstantiatedClasses seem to include interfaces that aren't
+    // needed.
+    Set<ClassElementX> newClasses = new Set.from(
+        compiler.codegenWorld.allInstantiatedClasses.where(
+            emitter.computeClassFilter()));
+    newClasses.removeAll(_existingClasses);
+
+    // TODO(ahe): When more than one updated is computed, we need to make sure
+    // that existing classes aren't overwritten. No test except the one test
+    // that tests more than one update is affected by this problem, and only
+    // because main is closurized because we always enable tear-off. Is that
+    // really necessary? Also, add a test which tests directly that what
+    // happens when tear-off is introduced in second update.
+    emitter.neededClasses.addAll(newClasses);
 
     List<jsAst.Statement> inherits = <jsAst.Statement>[];
 
     for (ClassElementX cls in newClasses) {
-      jsAst.Node classAccess = namer.elementAccess(cls);
+      jsAst.Node classAccess = emitter.classAccess(cls);
       String name = namer.getNameOfClass(cls);
 
       updates.add(
@@ -584,7 +630,7 @@
 
       ClassElement superclass = cls.superclass;
       if (superclass != null) {
-        jsAst.Node superAccess = namer.elementAccess(superclass);
+        jsAst.Node superAccess = emitter.classAccess(superclass);
         inherits.add(
             js.statement(
                 r'self.$dart_unsafe_eval.inheritFrom(#, #)',
@@ -600,8 +646,9 @@
     for (ClassElementX cls in changedClasses) {
       ClassElement superclass = cls.superclass;
       jsAst.Node superAccess =
-          superclass == null ? js('null') : namer.elementAccess(superclass);
-      jsAst.Node classAccess = namer.elementAccess(cls);
+          superclass == null ? js('null')
+              : emitter.classAccess(superclass);
+      jsAst.Node classAccess = emitter.classAccess(cls);
       updates.add(
           js.statement(
               r'# = self.$dart_unsafe_eval.schemaChange(#, #, #)',
@@ -611,12 +658,23 @@
     for (RemovalUpdate update in removals) {
       update.writeUpdateJsOn(updates);
     }
-    for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
+    for (Element element in enqueuer.codegen.newlyEnqueuedElements) {
       if (!element.isField) {
         updates.add(computeMemberUpdateJs(element));
+      } else {
+        if (backend.constants.lazyStatics.contains(element)) {
+          throw new StateError("$element requires lazy initializer.");
+        }
       }
     }
 
+    updates.add(js.statement(r'''
+if (self.$dart_unsafe_eval.pendingStubs) {
+  self.$dart_unsafe_eval.pendingStubs.map(function(e) { return e(); });
+  self.$dart_unsafe_eval.pendingStubs = void 0;
+}
+'''));
+
     if (updates.length == 1) {
       return prettyPrintJs(updates.single);
     } else {
@@ -638,45 +696,36 @@
   }
 
   jsAst.Node computeMemberUpdateJs(Element element) {
-    MemberInfo info = emitter.oldEmitter.containerBuilder
-        .analyzeMemberMethod(element);
+    MemberInfo info = containerBuilder.analyzeMemberMethod(element);
     if (info == null) {
       compiler.internalError(element, '${element.runtimeType}');
     }
+    ClassBuilder builder = new ClassBuilder(element, namer);
+    containerBuilder.addMemberMethodFromInfo(info, builder);
+    jsAst.Node partialDescriptor =
+        builder.toObjectInitializer(omitClassDescriptor: true);
+
     String name = info.name;
     jsAst.Node function = info.code;
-    List<jsAst.Statement> statements = <jsAst.Statement>[];
-    if (element.isInstanceMember) {
-      jsAst.Node elementAccess = namer.elementAccess(element.enclosingClass);
-      statements.add(
-          js.statement('#.prototype.# = f', [elementAccess, name]));
+    bool isStatic = !element.isInstanceMember;
 
-      if (backend.isAliasedSuperMember(element)) {
-        String superName = namer.getNameOfAliasedSuperMember(element);
-        statements.add(
-          js.statement('#.prototype.# = f', [elementAccess, superName]));
-      }
+    /// Either a global object (non-instance members) or a prototype (instance
+    /// members).
+    jsAst.Node holder;
+
+    if (element.isInstanceMember) {
+      holder = js('#.prototype', emitter.classAccess(element.enclosingClass));
     } else {
-      jsAst.Node elementAccess = namer.elementAccess(element);
-      jsAst.Expression globalFunctionsAccess =
-          emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
-      statements.add(
-          js.statement(
-              '#.# = # = f',
-              [globalFunctionsAccess, name, elementAccess]));
-      if (info.canTearOff) {
-        String globalName = namer.globalObjectFor(element);
-        statements.add(
-            js.statement(
-                '#.#().# = f',
-                [globalName, info.tearOffName, callNameFor(element)]));
-      }
+      holder = js('#', namer.globalObjectFor(element));
     }
-    // Create a scope by creating a new function. The updated function literal
-    // is passed as an argument to this function which ensures that temporary
-    // names in updateScope don't shadow global names.
-    jsAst.Fun updateScope = js('function (f) { # }', [statements]);
-    return js.statement('(#)(#)', [updateScope, function]);
+
+    jsAst.Expression globalFunctionsAccess =
+        emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
+
+    return js.statement(
+        r'self.$dart_unsafe_eval.addMethod(#, #, #, #, #)',
+        [partialDescriptor, js.string(name), holder,
+         new jsAst.LiteralBool(isStatic), globalFunctionsAccess]);
   }
 
   String prettyPrintJs(jsAst.Node node) {
@@ -796,10 +845,6 @@
   /// non-instance methods.
   String name;
 
-  /// Name of super-alias property to remove using JavaScript "delete".  Null
-  /// for methods that aren't "super aliased", and non-instance methods.
-  String superName;
-
   /// For instance methods, access to class object. Otherwise, access to the
   /// method itself.
   jsAst.Node elementAccess;
@@ -818,13 +863,10 @@
     wasStateCaptured = true;
 
     if (element.isInstanceMember) {
-      elementAccess = namer.elementAccess(element.enclosingClass);
+      elementAccess = emitter.classAccess(element.enclosingClass);
       name = namer.getNameOfMember(element);
-      if (backend.isAliasedSuperMember(element)) {
-        superName = namer.getNameOfAliasedSuperMember(element);
-      }
     } else {
-      elementAccess = namer.elementAccess(element);
+      elementAccess = emitter.staticFunctionAccess(element);
     }
   }
 
@@ -846,11 +888,6 @@
       }
       updates.add(
           js.statement('delete #.prototype.#', [elementAccess, name]));
-
-      if (superName != null) {
-        updates.add(
-            js.statement('delete #.prototype.#', [elementAccess, superName]));
-      }
     } else {
       updates.add(js.statement('delete #', [elementAccess]));
     }
@@ -874,12 +911,11 @@
   void captureState() {
     if (wasStateCaptured) throw "captureState was called twice.";
     wasStateCaptured = true;
-
-    accessToStatics.add(namer.elementAccess(element));
+    accessToStatics.add(emitter.classAccess(element));
 
     element.forEachLocalMember((ElementX member) {
       if (!member.isInstanceMember) {
-        accessToStatics.add(namer.elementAccess(member));
+        accessToStatics.add(emitter.staticFunctionAccess(member));
       }
     });
   }
@@ -936,7 +972,7 @@
     if (wasStateCaptured) throw "captureState was called twice.";
     wasStateCaptured = true;
 
-    elementAccess = namer.elementAccess(element.enclosingClass);
+    elementAccess = emitter.classAccess(element.enclosingClass);
     getterName = namer.getterName(element);
     setterName = namer.setterName(element);
   }
@@ -1151,6 +1187,10 @@
   Namer get namer => backend.namer;
 
   CodeEmitterTask get emitter => backend.emitter;
+
+  ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder;
+
+  EnqueueTask get enqueuer => compiler.enqueuer;
 }
 
 class EmitterHelper extends JsFeatures {
diff --git a/pkg/docgen/bin/docgen.dart b/pkg/docgen/bin/docgen.dart
index 8b5e59d..5bb7e20 100644
--- a/pkg/docgen/bin/docgen.dart
+++ b/pkg/docgen/bin/docgen.dart
@@ -55,7 +55,8 @@
       pubScript: pubScript,
       noDocs: options['no-docs'],
       startPage: startPage,
-      indentJSON: indentJSON);
+      indentJSON: indentJSON,
+      sdk: options['sdk']);
 }
 
 /**
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 428f4c7..a9f171a 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -44,7 +44,7 @@
     bool includeDependentPackages: false, bool compile: false,
     bool serve: false, bool noDocs: false, String startPage,
     String pubScript : 'pub', String dartBinary: 'dart',
-    bool indentJSON: false}) {
+    bool indentJSON: false, String sdk}) {
   var result;
   if (!noDocs) {
     viewer.ensureMovedViewerCode();
@@ -55,7 +55,7 @@
         excludeLibraries: excludeLibraries,
         includeDependentPackages: includeDependentPackages,
         startPage: startPage, pubScriptValue: pubScript,
-        dartBinaryValue: dartBinary, indentJSON: indentJSON);
+        dartBinaryValue: dartBinary, indentJSON: indentJSON, sdk: sdk);
     viewer.addBackViewerCode();
     if (compile || serve) {
       result.then((success) {
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 3a05041..2f1722c 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -61,7 +61,7 @@
     bool parseSdk: false, String introFileName: '',
     out: DEFAULT_OUTPUT_DIRECTORY, List<String> excludeLibraries: const [], bool
     includeDependentPackages: false, String startPage, String dartBinaryValue,
-    String pubScriptValue, bool indentJSON: false}) {
+    String pubScriptValue, bool indentJSON: false, String sdk}) {
   _excluded = excludeLibraries;
   dartBinary = dartBinaryValue;
   pubScript = pubScriptValue;
@@ -80,7 +80,7 @@
   }
 
   return getMirrorSystem(allLibraries, includePrivate,
-      packageRoot: updatedPackageRoot, parseSdk: parseSdk)
+      packageRoot: updatedPackageRoot, parseSdk: parseSdk, sdkRoot: sdk)
       .then((MirrorSystem mirrorSystem) {
     if (mirrorSystem.libraries.isEmpty) {
       throw new StateError('No library mirrors were created.');
@@ -110,7 +110,8 @@
 /// Analyzes set of libraries by getting a mirror system and triggers the
 /// documentation of the libraries.
 Future<MirrorSystem> getMirrorSystem(List<Uri> libraries,
-    bool includePrivate, {String packageRoot, bool parseSdk: false}) {
+    bool includePrivate, {String packageRoot, bool parseSdk: false,
+    String sdkRoot}) {
   if (libraries.isEmpty) throw new StateError('No Libraries.');
 
   includePrivateMembers = includePrivate;
@@ -118,10 +119,12 @@
   // Finds the root of SDK library based off the location of docgen.
   // We have two different places to look, depending if we're in a development
   // repo or in a built SDK, either sdk or dart-sdk respectively
-  var root = rootDirectory;
-  var sdkRoot = path.normalize(path.absolute(path.join(root, 'sdk')));
-  if (!new Directory(sdkRoot).existsSync()) {
-    sdkRoot = path.normalize(path.absolute(path.join(root, 'dart-sdk')));
+  if (sdkRoot == null) {
+    var root = rootDirectory;
+    sdkRoot = path.normalize(path.absolute(path.join(root, 'sdk')));
+    if (!new Directory(sdkRoot).existsSync()) {
+      sdkRoot = path.normalize(path.absolute(path.join(root, 'dart-sdk')));
+    }
   }
   logger.info('SDK Root: ${sdkRoot}');
   return analyzeLibraries(libraries, sdkRoot, packageRoot: packageRoot);
diff --git a/pkg/docgen/lib/src/models/model_helpers.dart b/pkg/docgen/lib/src/models/model_helpers.dart
index 526ab4a..3c4c430 100644
--- a/pkg/docgen/lib/src/models/model_helpers.dart
+++ b/pkg/docgen/lib/src/models/model_helpers.dart
@@ -96,74 +96,74 @@
 
   @override
   Annotation visitBinary(BinaryConstantExpression exp,
-                         [AnnotationInfo context]) {
+                         AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitConcatenate(ConcatenateConstantExpression exp,
-                              [AnnotationInfo context]) {
+                              AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitConditional(ConditionalConstantExpression exp,
-                              [AnnotationInfo context]) {
+                              AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitConstructed(ConstructedConstantExpresssion exp,
-                              [AnnotationInfo context]) {
+                              AnnotationInfo context) {
     return createAnnotation(exp.target, context,
         exp.arguments.map((a) => a.getText()).toList());
   }
 
   @override
   Annotation visitFunction(FunctionConstantExpression exp,
-                           [AnnotationInfo context]) {
+                           AnnotationInfo context) {
     return createAnnotation(exp.element, context);
   }
 
   @override
   Annotation visitList(ListConstantExpression exp,
-                       [AnnotationInfo context]) {
+                       AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitMap(MapConstantExpression exp,
-                      [AnnotationInfo context]) {
+                      AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitPrimitive(PrimitiveConstantExpression exp,
-                            [AnnotationInfo context]) {
+                            AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitSymbol(SymbolConstantExpression exp,
-                         [AnnotationInfo context]) {
+                         AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitType(TypeConstantExpression exp,
-                       [AnnotationInfo context]) {
+                       AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitUnary(UnaryConstantExpression exp,
-                        [AnnotationInfo context]) {
+                        AnnotationInfo context) {
     return null;
   }
 
   @override
   Annotation visitVariable(VariableConstantExpression exp,
-                           [AnnotationInfo context]) {
+                           AnnotationInfo context) {
     return createAnnotation(exp.element, context);
   }
 }
diff --git a/pkg/docgen/lib/src/package_helpers.dart b/pkg/docgen/lib/src/package_helpers.dart
index ca189fa..f437166 100644
--- a/pkg/docgen/lib/src/package_helpers.dart
+++ b/pkg/docgen/lib/src/package_helpers.dart
@@ -12,19 +12,19 @@
 import 'package:yaml/yaml.dart';
 
 /// Helper accessor to determine the full pathname of the root of the dart
-/// checkout. We can be in one of three situations:
-/// 1) Running from pkg/docgen/bin/docgen.dart
-/// 2) Running from a snapshot in a build,
-///   e.g. xcodebuild/ReleaseIA32/dart-sdk/bin
-/// 3) Running from a built distribution,
-///   e.g. ...somename/dart-sdk/bin/snapshots
+/// checkout if we are running without the --sdk parameter specified. That
+/// normally means we are running directly from source, and we expect to
+/// find the root as the directory above 'pkg'. The only other time this
+/// would happen is running a snapshot directly, rather than from the
+/// dartdocgen script, where we look for the dart-sdk directory. If not
+/// using the script and not in a normal directory structure, you'll need
+/// to pass the --sdk parameter.
 String get rootDirectory {
   if (_rootDirectoryCache != null) return _rootDirectoryCache;
   var scriptDir = path.absolute(path.dirname(Platform.script.toFilePath()));
   var root = scriptDir;
   var base = path.basename(root);
-  // When we find dart-sdk or sdk we are one level below the root.
-  while (base != 'dart-sdk' && base != 'sdk' && base != 'pkg') {
+  while (base != 'dart-sdk' && base != 'pkg') {
     root = path.dirname(root);
     base = path.basename(root);
     if (root == base) {
diff --git a/pkg/fixnum/pubspec.yaml b/pkg/fixnum/pubspec.yaml
index 7eb50c15..2d54f85 100644
--- a/pkg/fixnum/pubspec.yaml
+++ b/pkg/fixnum/pubspec.yaml
@@ -1,5 +1,5 @@
 name: fixnum
-version: 0.9.0-dev+1
+version: 0.9.1
 author: Dart Team <misc@dartlang.org>
 description: Library for 32- and 64-bit fixed size integers.
 homepage: http://www.dartlang.org
diff --git a/pkg/intl/CHANGELOG.md b/pkg/intl/CHANGELOG.md
index ca7920e..9dca66f 100644
--- a/pkg/intl/CHANGELOG.md
+++ b/pkg/intl/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.11.11
+  * Add a -no-embedded-plurals flag to reject plurals and genders that
+    have either leading or trailing text around them. This follows the
+    ICU recommendation that a plural or gender should contain the
+    entire phrase/sentence, not just part of it.
+
 ## 0.11.10
   * Fix some style glitches with naming. The only publicly visible one
     is DateFormat.parseUtc, but the parseUTC variant is still retained
diff --git a/pkg/intl/bin/extract_to_arb.dart b/pkg/intl/bin/extract_to_arb.dart
index 970c0bc..a8fab7b 100644
--- a/pkg/intl/bin/extract_to_arb.dart
+++ b/pkg/intl/bin/extract_to_arb.dart
@@ -21,16 +21,22 @@
   var targetDir;
   var parser = new ArgParser();
   parser.addFlag("suppress-warnings", defaultsTo: false, callback: (x) =>
-      suppressWarnings = x);
+      suppressWarnings = x, help: 'Suppress printing of warnings.');
   parser.addFlag("warnings-are-errors", defaultsTo: false, callback: (x) =>
-      warningsAreErrors = x);
+      warningsAreErrors = x,
+      help: 'Treat all warnings as errors, stop processing ');
+  parser.addFlag("embedded-plurals", defaultsTo: true,
+      callback: (x) => allowEmbeddedPluralsAndGenders = x,
+      help: 'Allow plurals and genders to be embedded as part of a larger '
+          'string, otherwise they must be at the top level.');
 
   parser.addOption("output-dir", defaultsTo: '.', callback: (value) => targetDir
-      = value);
+      = value, help: 'Specify the output directory.');
   parser.parse(args);
   if (args.length == 0) {
-    print('Usage: extract_to_arb [--output-dir=<dir>] [files.dart]');
     print('Accepts Dart files and produces intl_messages.json');
+    print('Usage: extract_to_arb [options] [files.dart]');
+    print(parser.getUsage());
     exit(0);
   }
   var allMessages = {};
diff --git a/pkg/intl/bin/generate_from_arb.dart b/pkg/intl/bin/generate_from_arb.dart
index 7156e23..b4e48d8 100644
--- a/pkg/intl/bin/generate_from_arb.dart
+++ b/pkg/intl/bin/generate_from_arb.dart
@@ -34,21 +34,26 @@
   var targetDir;
   var parser = new ArgParser();
   parser.addFlag("suppress-warnings", defaultsTo: false,
-      callback: (x) => suppressWarnings = x);
+      callback: (x) => suppressWarnings = x,
+      help: 'Suppress printing of warnings.');
   parser.addOption("output-dir", defaultsTo: '.',
-      callback: (x) => targetDir = x);
+      callback: (x) => targetDir = x,
+      help: 'Specify the output directory.');
   parser.addOption("generated-file-prefix", defaultsTo: '',
-      callback: (x) => generatedFilePrefix = x);
+      callback: (x) => generatedFilePrefix = x,
+      help: 'Specify a prefix to be used for the generated file names.');
   parser.addFlag("use-deferred-loading", defaultsTo: true,
-      callback: (x) => useDeferredLoading = x);
+      callback: (x) => useDeferredLoading = x,
+      help: 'Generate message code that must be loaded with deferred loading. '
+      'Otherwise, all messages are eagerly loaded.');
   parser.parse(args);
   var dartFiles = args.where((x) => x.endsWith("dart")).toList();
   var jsonFiles = args.where((x) => x.endsWith(".arb")).toList();
   if (dartFiles.length == 0 || jsonFiles.length == 0) {
-    print('Usage: generate_from_arb [--output-dir=<dir>]'
-        ' [--[no-]use-deferred-loading]'
-        ' [--generated-file-prefix=<prefix>] file1.dart file2.dart ...'
+    print('Usage: generate_from_arb [options]'
+        ' file1.dart file2.dart ...'
         ' translation1_<languageTag>.arb translation2.arb ...');
+    print(parser.getUsage());
     exit(0);
   }
 
diff --git a/pkg/intl/lib/extract_messages.dart b/pkg/intl/lib/extract_messages.dart
index 1f3a39e..88045be 100644
--- a/pkg/intl/lib/extract_messages.dart
+++ b/pkg/intl/lib/extract_messages.dart
@@ -47,6 +47,16 @@
 /** Were there any warnings or errors in extracting messages. */
 bool get hasWarnings => warnings.isNotEmpty;
 
+/** Are plural and gender expressions required to be at the top level
+ * of an expression, or are they allowed to be embedded in string literals.
+ *
+ * For example, the following expression
+ *     'There are ${Intl.plural(...)} items'.
+ * is legal if [allowEmbeddedPluralsAndGenders] is true, but illegal
+ * if [allowEmbeddedPluralsAndGenders] is false.
+ */
+bool allowEmbeddedPluralsAndGenders = true;
+
 /**
  * Parse the source of the Dart program file [file] and return a Map from
  * message names to [IntlMessage] instances.
@@ -228,7 +238,8 @@
     message.arguments = parameters.parameters.map(
         (x) => x.identifier.name).toList();
     var arguments = node.argumentList.arguments;
-    extract(message, arguments);
+    var extractionResult = extract(message, arguments);
+    if (extractionResult == null) return null;
 
     for (var namedArgument in arguments.where((x) => x is NamedExpression)) {
       var name = namedArgument.name.label.name;
@@ -249,10 +260,19 @@
    */
   MainMessage messageFromIntlMessageCall(MethodInvocation node) {
 
-    void extractFromIntlCall(MainMessage message, List arguments) {
+    MainMessage extractFromIntlCall(MainMessage message, List arguments) {
       try {
         var interpolation = new InterpolationVisitor(message);
         arguments.first.accept(interpolation);
+        if (interpolation.pieces.any((x) => x is Plural || x is Gender) &&
+            !allowEmbeddedPluralsAndGenders) {
+          if (interpolation.pieces.any((x) => x is String && x.isNotEmpty)) {
+            throw new IntlMessageExtractionException(
+                "Plural and gender expressions must be at the top level, "
+                "they cannot be embedded in larger string literals.\n"
+                "Error at $node");
+          }
+        }
         message.messagePieces.addAll(interpolation.pieces);
       } on IntlMessageExtractionException catch (e) {
         message = null;
@@ -260,8 +280,9 @@
             ..writeAll(["Error ", e, "\nProcessing <", node, ">\n"])
             ..write(_reportErrorLocation(node));
         print(err);
-        warnings.add(err);
+        warnings.add(err.toString());
       }
+      return message; // Because we may have set it to null on an error.
     }
 
     void setValue(MainMessage message, String fieldName, Object fieldValue) {
@@ -279,10 +300,11 @@
   MainMessage messageFromDirectPluralOrGenderCall(MethodInvocation node) {
     var pluralOrGender;
 
-    void extractFromPluralOrGender(MainMessage message, _) {
+    MainMessage extractFromPluralOrGender(MainMessage message, _) {
       var visitor = new PluralAndGenderVisitor(message.messagePieces, message);
       node.accept(visitor);
       pluralOrGender = message.messagePieces.last;
+      return message;
     }
 
     void setAttribute(MainMessage msg, String fieldName, String fieldValue) {
@@ -424,7 +446,7 @@
 
   /**
    * Create a MainMessage from [node] using the name and
-   * parameters of the last function/method declaration we encountered            e
+   * parameters of the last function/method declaration we encountered
    * and the parameters to the Intl.message call.
    */
   Message messageFromMethodInvocation(MethodInvocation node) {
@@ -450,7 +472,7 @@
             ..writeAll(["Error ", e, "\nProcessing <", node, ">"])
             ..write(_reportErrorLocation(node));
         print(err);
-        warnings.add(err);
+        warnings.add(err.toString());
       }
     });
     var mainArg = node.argumentList.arguments.firstWhere(
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 1f7f06d..c2bcbef 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.11.10
+version: 0.11.11
 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/message_extraction/embedded_plural_text_after.dart b/pkg/intl/test/message_extraction/embedded_plural_text_after.dart
new file mode 100644
index 0000000..15704ae
--- /dev/null
+++ b/pkg/intl/test/message_extraction/embedded_plural_text_after.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A test library that should fail because there is a plural with text
+/// following the plural expression.
+library embedded_plural_text_after;
+
+import "package:intl/intl.dart";
+
+embeddedPlural2(n) => Intl.message(
+    "${Intl.plural(n, zero: 'none', one: 'one', other: 'some')} plus text.",
+    name: 'embeddedPlural2',
+    desc: 'An embedded plural',
+    args: [n]);
\ No newline at end of file
diff --git a/pkg/intl/test/message_extraction/embedded_plural_text_after_test.dart b/pkg/intl/test/message_extraction/embedded_plural_text_after_test.dart
new file mode 100644
index 0000000..64032b1
--- /dev/null
+++ b/pkg/intl/test/message_extraction/embedded_plural_text_after_test.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 embedded_plural_text_after_test;
+
+import "failed_extraction_test.dart";
+import "package:unittest/unittest.dart";
+
+main() {
+  test("Expect failure because of embedded plural with text after it", () {
+    var specialFiles = ['embedded_plural_text_after.dart'];
+    runTestWithWarnings(warningsAreErrors: true, expectedExitCode: 1,
+        embeddedPlurals: false, sourceFiles: specialFiles);
+  });
+}
diff --git a/pkg/intl/test/message_extraction/embedded_plural_text_before.dart b/pkg/intl/test/message_extraction/embedded_plural_text_before.dart
new file mode 100644
index 0000000..854b495
--- /dev/null
+++ b/pkg/intl/test/message_extraction/embedded_plural_text_before.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A test library that should fail because there is a plural with text
+/// before the plural expression.
+library embedded_plural_text_before;
+
+import "package:intl/intl.dart";
+
+embeddedPlural(n) => Intl.message(
+    "There are ${Intl.plural(n, zero: 'nothing', one: 'one', other: 'some')}.",
+    name: 'embeddedPlural',
+    desc: 'An embedded plural',
+    args: [n]);
diff --git a/pkg/intl/test/message_extraction/embedded_plural_text_before_test.dart b/pkg/intl/test/message_extraction/embedded_plural_text_before_test.dart
new file mode 100644
index 0000000..0cc44f7
--- /dev/null
+++ b/pkg/intl/test/message_extraction/embedded_plural_text_before_test.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 embedded_plural_text_before_test;
+
+import "failed_extraction_test.dart";
+import "package:unittest/unittest.dart";
+
+main() {
+  test("Expect failure because of embedded plural with text before it", () {
+    var files = ['embedded_plural_text_before.dart'];
+    runTestWithWarnings(warningsAreErrors: true, expectedExitCode: 1,
+        embeddedPlurals: false, sourceFiles: files);
+  });
+}
diff --git a/pkg/intl/test/message_extraction/failed_extraction_test.dart b/pkg/intl/test/message_extraction/failed_extraction_test.dart
index 430a43f..3a7d75e 100644
--- a/pkg/intl/test/message_extraction/failed_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/failed_extraction_test.dart
@@ -13,7 +13,11 @@
   });
 }
 
-void runTestWithWarnings({bool warningsAreErrors, int expectedExitCode}) {
+const defaultFiles =
+    const ["sample_with_messages.dart", "part_of_sample_with_messages.dart"];
+
+void runTestWithWarnings({bool warningsAreErrors, int expectedExitCode,
+  bool embeddedPlurals: true, List<String> sourceFiles: defaultFiles}) {
 
   void verify(ProcessResult result) {
     try {
@@ -29,8 +33,10 @@
   if (warningsAreErrors) {
     args.add('--warnings-are-errors');
   }
-  var files = [asTempDirPath("sample_with_messages.dart"), asTempDirPath(
-      "part_of_sample_with_messages.dart"),];
+  if (!embeddedPlurals) {
+    args.add('--no-embedded-plurals');
+  }
+  var files = sourceFiles.map(asTempDirPath).toList();
   var allArgs = [program]
       ..addAll(args)
       ..addAll(files);
diff --git a/pkg/intl/test/message_extraction/message_extraction_test.dart b/pkg/intl/test/message_extraction/message_extraction_test.dart
index 03f5499..2428b58 100644
--- a/pkg/intl/test/message_extraction/message_extraction_test.dart
+++ b/pkg/intl/test/message_extraction/message_extraction_test.dart
@@ -85,6 +85,8 @@
       asTestDirPath('part_of_sample_with_messages.dart'),
       asTestDirPath('verify_messages.dart'),
       asTestDirPath('run_and_verify.dart'),
+      asTestDirPath('embedded_plural_text_before.dart'),
+      asTestDirPath('embedded_plural_text_after.dart'),
       asTestDirPath('print_to_list.dart')];
   for (var filename in files) {
     var file = new File(filename);
@@ -150,7 +152,7 @@
 
 Future<ProcessResult> generateCodeFromTranslation(ProcessResult previousResult)
     => run(previousResult, [asTestDirPath('../../bin/generate_from_arb.dart'),
-    deferredLoadArg, '--generated-file-prefix=foo_', 
+    deferredLoadArg, '--generated-file-prefix=foo_',
     'sample_with_messages.dart', 'part_of_sample_with_messages.dart',
     'translation_fr.arb', 'translation_de_DE.arb']);
 
diff --git a/pkg/matcher/CHANGELOG.md b/pkg/matcher/CHANGELOG.md
index 8e7bd6f..4689c31 100644
--- a/pkg/matcher/CHANGELOG.md
+++ b/pkg/matcher/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.2
+
+* Add an `isNotEmpty` matcher.
+
 ## 0.11.1+1
 
 * Refactored libraries and tests.
diff --git a/pkg/matcher/lib/src/core_matchers.dart b/pkg/matcher/lib/src/core_matchers.dart
index c3c996d9..c2c1e84 100644
--- a/pkg/matcher/lib/src/core_matchers.dart
+++ b/pkg/matcher/lib/src/core_matchers.dart
@@ -9,23 +9,32 @@
 import 'util.dart';
 
 /// Returns a matcher that matches empty strings, maps or iterables
-/// (including collections).
+/// (including collections) using the isEmpty property.
 const Matcher isEmpty = const _Empty();
 
 class _Empty extends Matcher {
   const _Empty();
   bool matches(item, Map matchState) {
-    if (item is Map || item is Iterable) {
-      return item.isEmpty;
-    } else if (item is String) {
-      return item.length == 0;
-    } else {
-      return false;
-    }
+    return (item is Map || item is Iterable || item is String) && item.isEmpty;
   }
   Description describe(Description description) => description.add('empty');
 }
 
+/// Returns a matcher that matches non-empty strings, maps or iterables
+/// (including collections) using the isNotEmpty property.
+const Matcher isNotEmpty = const _NotEmpty();
+
+class _NotEmpty extends Matcher {
+  const _NotEmpty();
+
+  bool matches(item, Map matchState) {
+    return (item is Map || item is Iterable || item is String) &&
+      item.isNotEmpty;
+  }
+
+  Description describe(Description description) => description.add('non-empty');
+}
+
 /// A matcher that matches any null value.
 const Matcher isNull = const _IsNull();
 
diff --git a/pkg/matcher/pubspec.yaml b/pkg/matcher/pubspec.yaml
index c6cb49d..230ddc39 100644
--- a/pkg/matcher/pubspec.yaml
+++ b/pkg/matcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.11.1+1
+version: 0.11.2
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: https://pub.dartlang.org/packages/matcher
diff --git a/pkg/matcher/test/core_matchers_test.dart b/pkg/matcher/test/core_matchers_test.dart
index 99d10ac..be9758e 100644
--- a/pkg/matcher/test/core_matchers_test.dart
+++ b/pkg/matcher/test/core_matchers_test.dart
@@ -93,7 +93,6 @@
             r"   Which: threw 'X'"));
   });
 
-
   test('hasLength', () {
     var a = new Map();
     var b = new List();
diff --git a/pkg/matcher/test/iterable_matchers_test.dart b/pkg/matcher/test/iterable_matchers_test.dart
index 4570d526..91d5335 100644
--- a/pkg/matcher/test/iterable_matchers_test.dart
+++ b/pkg/matcher/test/iterable_matchers_test.dart
@@ -17,6 +17,11 @@
     shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
   });
 
+  test('isNotEmpty', () {
+    shouldFail([], isNotEmpty, "Expected: non-empty Actual: []");
+    shouldPass([1], isNotEmpty);
+  });
+
   test('contains', () {
     var d = [1, 2];
     shouldPass(d, contains(1));
diff --git a/pkg/matcher/test/matchers_minified_test.dart b/pkg/matcher/test/matchers_minified_test.dart
index 65a35ac..4b39d42 100644
--- a/pkg/matcher/test/matchers_minified_test.dart
+++ b/pkg/matcher/test/matchers_minified_test.dart
@@ -109,6 +109,14 @@
           matches(r"Expected: empty +Actual: " + _MINIFIED_NAME + r":\[1\]"));
     });
 
+    test('isNotEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(e, isNotEmpty);
+      shouldFail(d, isNotEmpty,
+          matches(r"Expected: non-empty +Actual: " + _MINIFIED_NAME + r":\[\]"));
+    });
+
     test('contains', () {
       var d = new SimpleIterable(3);
       shouldPass(d, contains(2));
diff --git a/pkg/matcher/test/matchers_unminified_test.dart b/pkg/matcher/test/matchers_unminified_test.dart
index 28d97ab..6947884 100644
--- a/pkg/matcher/test/matchers_unminified_test.dart
+++ b/pkg/matcher/test/matchers_unminified_test.dart
@@ -108,6 +108,15 @@
           "Actual: SimpleIterable:[1]");
     });
 
+    test('isNotEmpty', () {
+      var d = new SimpleIterable(0);
+      var e = new SimpleIterable(1);
+      shouldPass(e, isNotEmpty);
+      shouldFail(d, isNotEmpty, "Expected: non-empty "
+          "Actual: SimpleIterable:[]");
+    });
+
+
     test('contains', () {
       var d = new SimpleIterable(3);
       shouldPass(d, contains(2));
diff --git a/pkg/matcher/test/string_matchers_test.dart b/pkg/matcher/test/string_matchers_test.dart
index 1303641..ba96713 100644
--- a/pkg/matcher/test/string_matchers_test.dart
+++ b/pkg/matcher/test/string_matchers_test.dart
@@ -24,6 +24,13 @@
     shouldFail('a', isEmpty, "Expected: empty Actual: 'a'");
   });
 
+  test('isNotEmpty', () {
+    shouldFail('', isNotEmpty, "Expected: non-empty Actual: ''");
+    shouldFail(null, isNotEmpty, "Expected: non-empty Actual: <null>");
+    shouldFail(0, isNotEmpty, "Expected: non-empty Actual: <0>");
+    shouldPass('a', isNotEmpty);
+  });
+
   test('equalsIgnoringCase', () {
     shouldPass('hello', equalsIgnoringCase('HELLO'));
     shouldFail('hi', equalsIgnoringCase('HELLO'),
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
index 8b4db68..79efbe7 100644
--- a/pkg/observe/CHANGELOG.md
+++ b/pkg/observe/CHANGELOG.md
@@ -1,3 +1,7 @@
+#### 0.12.2
+  * Updated to match release 0.5.1
+    [observe-js#d530515](https://github.com/Polymer/observe-js/commit/d530515).
+
 #### 0.12.1+1
   * Expand stack_trace version constraint.
 
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index 0ba31a67..297bd1d 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -233,9 +233,9 @@
 
     int i = 0, last = _segments.length - 1;
     while (obj != null) {
-      // _segments[0] is passed to indicate that we are only observing that
-      // property of obj. See observe declaration in _ObserveSet.
-      observe(obj, _segments[0]);
+      // _segments[i] is passed to indicate that we are only observing that
+      // property of obj. See observe declaration in _ObservedSet.
+      observe(obj, _segments[i]);
 
       if (i >= last) break;
       obj = _getObjectProperty(obj, _segments[i++]);
@@ -865,6 +865,7 @@
     }
     _rootObject = null;
     _rootObjectProperties = null;
+    if (identical(_lastSet, this)) _lastSet = null;
   }
 
   /// Observe now takes a second argument to indicate which property of an
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index d1241c2..8798512 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.12.1+1
+version: 0.12.2
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 8602fc9..256f654 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -19,6 +19,7 @@
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 scheduled_test/test/scheduled_stream/stream_matcher_test: Pass, Slow
 polymer/test/build/script_compactor_test: Pass, Slow
+polymer/test/import_test: Skip # 17873
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 third_party/angular_tests/browser_test/*: Skip # github perf_api.dart issue 5
@@ -49,7 +50,7 @@
 polymer/test/js_interop_test: Pass, RuntimeError # Issue 18931
 polymer/test/nested_binding_test: Pass, RuntimeError # Issue 18931
 polymer/test/noscript_test: Pass, RuntimeError # Issue 18931
-polymer/test/platform_less_test: Pass, RuntimeError # Issue 18931
+polymer/test/web_components_less_test: Pass, RuntimeError # Issue 18931
 polymer/test/prop_attr_bind_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/prop_attr_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/property_change_test: Pass, Timeout # Issue 18931
@@ -71,6 +72,7 @@
 
 [ $runtime == vm && $mode == debug]
 analysis_server/test/analysis_server_test: Skip  # Times out
+analysis_server/test/completion_test: Skip  # Times out
 analysis_server/test/domain_context_test: Skip  # Times out
 analysis_server/test/domain_server_test: Skip  # Times out
 analysis_server/test/integration/analysis/reanalyze_concurrent_test: Skip # Times out
@@ -206,6 +208,7 @@
 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/import_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
@@ -214,7 +217,7 @@
 polymer/test/mirror_loader_test: Skip # uses dart:html
 polymer/test/nested_binding_test: Skip # uses dart:html
 polymer/test/noscript_test: Skip #uses dart:html
-polymer/test/platform_less_test: Skip #uses dart:html
+polymer/test/web_components_less_test: Skip #uses dart:html
 polymer/test/prop_attr_bind_reflection_test: Skip #uses dart:html
 polymer/test/prop_attr_reflection_test: Skip #uses dart:html
 polymer/test/property_change_test: Skip # uses dart:html
@@ -278,6 +281,9 @@
 [ $runtime == safari || $ie ]
 polymer/test/two_way_bind_test: Pass, RuntimeError # Issue 20075
 
+[ $runtime == ff ]
+polymer/test/layout_test: RuntimeError # Issue 21787
+
 # Skip browser-specific tests on VM
 [ $runtime == vm ]
 path/test/browser_test: Fail, OK # Uses dart:html
@@ -287,6 +293,7 @@
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
+analyzer/test/generated/all_the_rest_test: Fail # Issue 21772
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # These tests are runtime negative but statically positive, so we skip
@@ -360,6 +367,8 @@
 intl/test/message_extraction/message_extraction_test: Fail, OK # Uses dart:io.
 intl/test/message_extraction/message_extraction_no_deferred_test: Fail, OK # Uses dart:io.
 intl/test/message_extraction/really_fail_extraction_test: Fail, OK # Users dart:io
+intl/test/message_extraction/embedded_plural_text_after_test: Fail, OK # Uses dart:io.
+intl/test/message_extraction/embedded_plural_text_before_test: Fail, OK # Uses dart:io.
 observe/test/transformer_test: Fail, OK # Uses dart:io.
 observe/test/unique_message_test: Skip # Intended only as a vm test.
 path/test/io_test: Fail, OK # Uses dart:io.
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 8266fac..bd8fec1 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -4,7 +4,6 @@
 
 samples/third_party/dromaeo: Pass, Slow
 samples/third_party/todomvc_performance: Pass, Slow
-samples/pop_pop_win: Pass, Slow
 samples/searchable_list: Pass, Slow
 pkg/docgen: Pass, Slow
 
@@ -20,7 +19,6 @@
 third_party/pkg/async_await: Skip # Uses expect package.
 
 [ $builder_tag == russian ]
-samples/pop_pop_win: Fail # Issue 16356
 samples/third_party/angular_todo: Fail # Issue 16356
 
 [ $system == windows ]
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index 00d54b1..f99b3d6 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -1,4 +1,21 @@
-#### Pub version 0.15.1+5
+#### 0.15.3
+
+  * Narrow the constraint on observe to ensure that new features are reflected
+    in polymer's version.
+
+#### 0.15.2
+  * Upgraded to polymer js version
+    [0.5.1](https://github.com/Polymer/polymer/releases/tag/0.5.1).
+    **Dart Note**: Since dirty checking is only a development feature for
+    Polymer Dart, we did not include the functionality to stop dirty checks in
+    inactive windows.
+  * `polymer.js` is now the unminified version, and `polymer.min.js` is the
+    minified version.
+  * Fixed bug where polymer js was creating instances of extended elements in
+    order to check if they had been registered. All dart custom elements now get
+    registered with polymer js using the HTMLElement prototype.
+
+#### 0.15.1+5
   * Increase code_transformers lower bound and use shared transformers from it.
 
 #### 0.15.1+4
diff --git a/pkg/polymer/e2e_test/bad_import1/test/import_test.html b/pkg/polymer/e2e_test/bad_import1/test/import_test.html
index 0cc365e..bdb8935 100644
--- a/pkg/polymer/e2e_test/bad_import1/test/import_test.html
+++ b/pkg/polymer/e2e_test/bad_import1/test/import_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/bad_import1/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/e2e_test/bad_import2/test/import_test.html b/pkg/polymer/e2e_test/bad_import2/test/import_test.html
index 269b109..6ad4382 100644
--- a/pkg/polymer/e2e_test/bad_import2/test/import_test.html
+++ b/pkg/polymer/e2e_test/bad_import2/test/import_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/bad_import2/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/e2e_test/bad_import3/test/import_test.html b/pkg/polymer/e2e_test/bad_import3/test/import_test.html
index 06592c5..e19725c 100644
--- a/pkg/polymer/e2e_test/bad_import3/test/import_test.html
+++ b/pkg/polymer/e2e_test/bad_import3/test/import_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/bad_import3/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
index fadc41f..685f10b 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
index 7c489c1..511d592 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to test #1, but 'e' imports 'b' -->
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
index 7d6262f..74864d9 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to test #1, but 'f' imports 'b' -->
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
index 27cee29..948d1f8 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
index 0306816..19d4263 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization during the development cycle</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to test #1, but 'e' imports 'b' -->
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
index 2c94238..6aaee9f 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <!-- similar to test #1, but 'f' imports 'b' -->
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
index cc3ded8..a65b92ea 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
index 7a58a0d..f2646b4 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="../packages/canonicalization/a.html">
     <link rel="import" href="../packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
index e325a16..85f4b1f 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/canonicalization/a.html">
     <link rel="import" href="packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
index 0730068..dbff6a4 100644
--- a/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="../packages/canonicalization/a.html">
     <link rel="import" href="../packages/canonicalization/b.html">
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html
index 4d208d94..e3b3e22 100644
--- a/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html
+++ b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html
@@ -6,8 +6,6 @@
 -->
 <html>
 <!--polymer-test: this comment is needed for test_suite.dart-->
-<script src="packages/web_components/platform.js"></script>
-<script src="packages/web_components/dart_support.js"></script>
 <link rel="import" href="packages/polymer/polymer_experimental.html">
 <link rel="import" href="double_init_code.html">
 <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/import_test.html b/pkg/polymer/e2e_test/experimental_boot/test/import_test.html
index 8d8d73b..fac8aee 100644
--- a/pkg/polymer/e2e_test/experimental_boot/test/import_test.html
+++ b/pkg/polymer/e2e_test/experimental_boot/test/import_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization using the experimental bootstrap</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_experimental.html">
     <link rel="import" href="packages/experimental_boot/a.html">
     <link rel="import" href="packages/experimental_boot/f.html">
diff --git a/pkg/polymer/e2e_test/good_import/test/import_test.html b/pkg/polymer/e2e_test/good_import/test/import_test.html
index 3064ea1..b888eb9 100644
--- a/pkg/polymer/e2e_test/good_import/test/import_test.html
+++ b/pkg/polymer/e2e_test/good_import/test/import_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Tests canonicalization at deployment time</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">
     <link rel="import" href="packages/good_import/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.html b/pkg/polymer/example/component/news/test/news_index_test.html
index 03eae4f..1f5ded0 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.html
+++ b/pkg/polymer/example/component/news/test/news_index_test.html
@@ -7,8 +7,6 @@
 <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <title>Simple Web Components Example</title>
-  <link rel="import" href="packages/web_components/platform.js">
-  <link rel="import" href="packages/web_components/dart_support.js">
   <link rel="import" href="packages/polymer/polymer.html">
   <link rel="import" href="../web/news-component.html">
   <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/lib/builder.dart b/pkg/polymer/lib/builder.dart
index 1ddefc8..5419dd2 100644
--- a/pkg/polymer/lib/builder.dart
+++ b/pkg/polymer/lib/builder.dart
@@ -297,7 +297,7 @@
         'Content Security Policy restrictions.')
     ..addFlag('debug', help:
         'run in debug mode. For example, use the debug polyfill \n'
-        'web_components/platform.concat.js instead of the minified one.\n',
+        'web_components/webcomponents.js instead of the minified one.\n',
         defaultsTo: false)
     ..addFlag('help', abbr: 'h',
         negatable: false, help: 'Displays this help and exit.');
diff --git a/pkg/polymer/lib/deploy.dart b/pkg/polymer/lib/deploy.dart
index a62c18b..5b1309c 100644
--- a/pkg/polymer/lib/deploy.dart
+++ b/pkg/polymer/lib/deploy.dart
@@ -160,7 +160,7 @@
           defaultsTo: true)
       ..addFlag('debug', help:
           'run in debug mode. For example, use the debug polyfill \n'
-          'web_components/platform.concat.js instead of the minified one.\n',
+          'web_components/webcomponents.js instead of the minified one.\n',
           defaultsTo: false)
       ..addFlag('csp', help:
           'extracts inlined JavaScript code to comply with \n'
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index 6affec8..0c0103d 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -17,5 +17,5 @@
 
 <!-- unminified for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
-<script src="src/js/polymer/polymer.concat.js"></script>
+<script src="src/js/polymer/polymer.js"></script>
 -->
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index acdd89b..d1b9aa0 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -88,14 +88,14 @@
   // reachable (entry point+imported) html if deploying. See dartbug.com/17199.
   final LintOptions lint;
 
-  /// This will automatically inject `platform.js` from the `web_components`
+  /// This will automatically inject the polyfills from the `web_components`
   /// package in all entry points, if it is not already included.
-  final bool injectPlatformJs;
+  final bool injectWebComponentsJs;
 
   TransformOptions({entryPoints, this.inlineStylesheets,
       this.contentSecurityPolicy: false, this.directlyIncludeJS: true,
       this.releaseMode: true, this.lint: const LintOptions(),
-      this.injectBuildLogsInOutput: false, this.injectPlatformJs: true})
+      this.injectBuildLogsInOutput: false, this.injectWebComponentsJs: true})
       : entryPoints = entryPoints == null ? null
           : entryPoints.map(systemToAssetPath).toList();
 
diff --git a/pkg/polymer/lib/src/build/generated/messages.html b/pkg/polymer/lib/src/build/generated/messages.html
index 04c43b0..5ef165b 100644
--- a/pkg/polymer/lib/src/build/generated/messages.html
+++ b/pkg/polymer/lib/src/build/generated/messages.html
@@ -498,10 +498,10 @@
 but assign the value to true.</p>
 </div><hr />
 
-<div id="polymer_43"><h3>"dart_support.js" not necessary <a href="#polymer_43">#43</a></h3>
+<div id="polymer_43"><h3>"dart_support.js" injected automatically <a href="#polymer_43">#43</a></h3>
 <p>The script <code>packages/web_components/dart_support.js</code> is still used, but you no
 longer need to put it in your application's entrypoint.</p>
-<p>In the past this file served two purposes:</p><ul><li>to make dart2js work well with the platform polyfills, and</li><li>to support registering Dart APIs for JavaScript custom elements.</li></ul>
+<p>In the past this file served two purposes:</p><ul><li>to make dart2js work well with the web_components polyfills, and</li><li>to support registering Dart APIs for JavaScript custom elements.</li></ul>
 <p>Now, the code from <code>dart_support.js</code> is split in two halves. The half for
 dart2js is now injected by the polymer transformers automatically during <code>pub
 build</code>. The <code>web_components</code> package provides an HTML file containing the other
@@ -510,7 +510,7 @@
 application developers don't have to worry about it anymore.</p>
 </div><hr />
 
-<div id="polymer_44"><h3>A dart script file was included more than once. <a href="#polymer_44">#44</a></h3>
+<div id="polymer_44"><h3>Dart script file included more than once. <a href="#polymer_44">#44</a></h3>
 <p>Duplicate dart scripts often happen if you have multiple html imports that
 include the same script. The simplest workaround for this is to move your dart
 script to its own html file, and import that instead of the script (html imports
@@ -522,8 +522,24 @@
 <pre><code>&lt;link rel="import" href="foo.html"&gt;
 </code></pre>
 <p>And <code>foo.html</code> should look like:</p>
-<pre><code>&lt;!DOCTYPE html&gt;
-&lt;script type="application/dart" src="foo.dart"&gt;&lt;/script&gt;
+<pre><code>&lt;script type="application/dart" src="foo.dart"&gt;&lt;/script&gt;
 </code></pre>
+</div><hr />
+
+<div id="polymer_45"><h3>"webcomponents.js" injected automatically <a href="#polymer_45">#45</a></h3>
+<p>The script <code>packages/web_components/webcomponents.js</code> is still used, but you no
+longer need to put it in your application's entrypoint.</p>
+<p>The polyfills provided by this file are no longer required in chrome and will
+automatically be added during <code>pub build</code> and <code>pub serve</code>.</p>
+</div><hr />
+
+<div id="polymer_46"><h3>"platform.js" renamed to "webcomponents.js". <a href="#polymer_46">#46</a></h3>
+<p>The script <code>packages/web_components/platform.js</code> has been renamed to
+<code>packages/web_components/webcomponents.js</code>. This is automatically fixed in
+<code>pub serve</code> and <code>pub build</code> but we may remove this functionality in the next
+breaking version of Polymer.</p>
+<p>In addition, it is no longer required that you include this file directly, as
+<code>pub build</code> and <code>pub serve</code> will inject it for you, and its not required when
+running in dartium with a local server.</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 ed7929b..0a46ce8 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -153,7 +153,7 @@
   /// link rel=import, we move both of those into the body before we do any
   /// 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).
+  /// properly (webcomponents.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
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index fe12eef..39cea9b 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -313,6 +313,14 @@
       _logger.warning(DART_SUPPORT_NO_LONGER_REQUIRED, span: node.sourceSpan);
     }
 
+    if (src != null && src.contains('web_components/webcomponents.')) {
+      _logger.warning(WEB_COMPONENTS_NO_LONGER_REQUIRED, span: node.sourceSpan);
+    }
+
+    if (src != null && src.contains('web_components/platform.')) {
+      _logger.warning(PLATFORM_JS_RENAMED, span: node.sourceSpan);
+    }
+
     var isEmpty = node.innerHtml.trim() == '';
 
     if (src == null) {
diff --git a/pkg/polymer/lib/src/build/messages.dart b/pkg/polymer/lib/src/build/messages.dart
index 86335fd..987bccd 100644
--- a/pkg/polymer/lib/src/build/messages.dart
+++ b/pkg/polymer/lib/src/build/messages.dart
@@ -556,20 +556,19 @@
 
 If you would like to hide this warning and keep it inlined, do the same thing
 but assign the value to true.
-'''
-);
+''');
 
 const DART_SUPPORT_NO_LONGER_REQUIRED = const MessageTemplate(
     const MessageId('polymer', 43),
     'No need to include "dart_support.js" by hand anymore.',
-    '"dart_support.js" not necessary',
+    '"dart_support.js" injected automatically',
     '''
 The script `packages/web_components/dart_support.js` is still used, but you no
 longer need to put it in your application's entrypoint.
 
 In the past this file served two purposes:
 
-  * to make dart2js work well with the platform polyfills, and
+  * to make dart2js work well with the web_components polyfills, and
   * to support registering Dart APIs for JavaScript custom elements.
 
 Now, the code from `dart_support.js` is split in two halves. The half for
@@ -578,8 +577,7 @@
 half.  Developers of packages that wrap JavaScript custom elements (like
 `core_elements` and `paper_elements`) will import that file directly, so
 application developers don't have to worry about it anymore.
-'''
-);
+''');
 
 const SCRIPT_INCLUDED_MORE_THAN_ONCE = const MessageTemplate(
     const MessageId('polymer', 44),
@@ -603,3 +601,30 @@
 
     <script type="application/dart" src="foo.dart"></script>
 ''');
+
+const WEB_COMPONENTS_NO_LONGER_REQUIRED = const MessageTemplate(
+    const MessageId('polymer', 45),
+    'No need to include "webcomponents.js" by hand anymore.',
+    '"webcomponents.js" injected automatically',
+    '''
+The script `packages/web_components/webcomponents.js` is still used, but you no
+longer need to put it in your application's entrypoint.
+
+The polyfills provided by this file are no longer required in chrome and will
+automatically be added during `pub build` and `pub serve`.
+''');
+
+const PLATFORM_JS_RENAMED = const MessageTemplate(
+    const MessageId('polymer', 46),
+    '"platform.js" has been renamed to "webcomponents.js".',
+    '"platform.js" renamed to "webcomponents.js".',
+    '''
+The script `packages/web_components/platform.js` has been renamed to
+`packages/web_components/webcomponents.js`. This is automatically fixed in
+`pub serve` and `pub build` but we may remove this functionality in the next
+breaking version of Polymer.
+
+In addition, it is no longer required that you include this file directly, as
+`pub build` and `pub serve` will inject it for you, and its not required when
+running in dartium with a local server.
+''');
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index 2dc3b32..a675aa7 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -38,7 +38,7 @@
         detailsUri: 'http://goo.gl/5HPeuP');
     return readPrimaryAsHtml(transform, logger).then((document) {
       bool dartSupportFound = false;
-      Element platformJs;
+      Element webComponentsJs;
       Element dartJs;
       final dartScripts = <Element>[];
 
@@ -46,8 +46,12 @@
         var src = tag.attributes['src'];
         if (src != null) {
           var last = src.split('/').last;
-          if (_platformJS.hasMatch(last)) {
-            platformJs = tag;
+          if (_webComponentsJS.hasMatch(last)) {
+            webComponentsJs = tag;
+          } else if (_platformJS.hasMatch(last)) {
+            tag.attributes['src'] = src.replaceFirst(
+                _platformJS, 'webcomponents.min.js');
+            webComponentsJs = tag;
           } else if (_dartSupportJS.hasMatch(last)) {
             dartSupportFound = true;
           } else if (last == 'dart.js') {
@@ -98,24 +102,24 @@
       }
 
       // Inserts dart_support.js either at the top of the document or directly
-      // after platform.js if it exists.
+      // after webcomponents.js if it exists.
       if (!dartSupportFound) {
-        if (platformJs == null) {
+        if (webComponentsJs == null) {
           _addScriptFirst('web_components/dart_support.js');
         } else {
-          var parentsNodes = platformJs.parentNode.nodes;
+          var parentsNodes = webComponentsJs.parentNode.nodes;
           parentsNodes.insert(
-              parentsNodes.indexOf(platformJs) + 1,
+              parentsNodes.indexOf(webComponentsJs) + 1,
               parseFragment(
                   '\n<script src="packages/web_components/dart_support.js">'
                   '</script>'));
         }
       }
 
-      // By default platform.js should come before all other scripts.
-      if (platformJs == null && options.injectPlatformJs) {
-        var suffix = options.releaseMode ? '.js' : '.concat.js';
-        _addScriptFirst('web_components/platform$suffix');
+      // By default webcomponents.js should come before all other scripts.
+      if (webComponentsJs == null && options.injectWebComponentsJs) {
+        var suffix = options.releaseMode ? '.min.js' : '.js';
+        _addScriptFirst('web_components/webcomponents$suffix');
       }
 
       transform.addOutput(
@@ -125,4 +129,6 @@
 }
 
 final _platformJS = new RegExp(r'platform.*\.js', caseSensitive: false);
+final _webComponentsJS =
+    new RegExp(r'webcomponents.*\.js', caseSensitive: false);
 final _dartSupportJS = new RegExp(r'dart_support.js', caseSensitive: false);
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 1dedada..3adcb64 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -79,6 +79,38 @@
   /// The root URI for assets.
   Uri _rootUri;
 
+  /// List of properties to ignore for observation.
+  static Set<Symbol> _OBSERVATION_BLACKLIST =
+      new HashSet.from(const [#attribute]);
+
+  static bool _canObserveProperty(Symbol property) =>
+      !_OBSERVATION_BLACKLIST.contains(property);
+
+  /// This list contains some property names that people commonly want to use,
+  /// but won't work because of Chrome/Safari bugs. It isn't an exhaustive
+  /// list. In particular it doesn't contain any property names found on
+  /// subtypes of HTMLElement (e.g. name, value). Rather it attempts to catch
+  /// some common cases.
+  ///
+  /// Dart Note: `class` is left out since its an invalid symbol in dart. This
+  /// means that nobody could make a property by this name anyways though.
+  /// Dart Note: We have added `classes` to this list, which is the dart:html
+  /// equivalent of `classList` but more likely to have conflicts.
+  static Set<Symbol> _PROPERTY_NAME_BLACKLIST = new HashSet.from([
+      const Symbol('children'), const Symbol('id'), const Symbol('hidden'),
+      const Symbol('style'), const Symbol('title'), const Symbol('classes')]);
+
+  bool _checkPropertyBlacklist(Symbol name) {
+    if (_PROPERTY_NAME_BLACKLIST.contains(name)) {
+      print('Cannot define property "$name" for element "${this.name}" '
+          'because it has the same name as an HTMLElement property, and not '
+          'all browsers support overriding that. Consider giving it a '
+          'different name. ');
+      return true;
+    }
+    return false;
+  }
+
   // Dart note: since polymer-element is handled in JS now, we have a simplified
   // flow for registering. We don't need to wait for the supertype or the code
   // to be noticed.
@@ -248,6 +280,7 @@
         includeUpTo: HtmlElement, withAnnotations: const [PublishedProperty]);
     for (var decl in smoke.query(type, options)) {
       if (decl.isFinal) continue;
+      if (_checkPropertyBlacklist(decl.name)) continue;
       if (_publish == null) _publish = {};
       _publish[new PropertyPath([decl.name])] = decl;
 
@@ -423,6 +456,7 @@
       if (_observe == null) _observe = new HashMap();
       var name = smoke.symbolToName(decl.name);
       name = name.substring(0, name.length - 7);
+      if (!_canObserveProperty(decl.name)) continue;
       _observe[new PropertyPath(name)] = [decl.name];
     }
   }
@@ -470,8 +504,9 @@
         includeUpTo: HtmlElement, withAnnotations: const [ComputedProperty]);
     var existing = {};
     for (var decl in smoke.query(type, options)) {
-      var meta = decl.annotations.firstWhere((e) => e is ComputedProperty);
       var name = decl.name;
+      if (_checkPropertyBlacklist(name)) continue;
+      var meta = decl.annotations.firstWhere((e) => e is ComputedProperty);
       var prev = existing[name];
       // The definition of a child class takes priority.
       if (prev == null || smoke.isSubclassOf(decl.type, prev.type)) {
@@ -495,7 +530,8 @@
 bool _isRegistered(String name) => _declarations.containsKey(name);
 PolymerDeclaration _getDeclaration(String name) => _declarations[name];
 
-/// Using Polymer's platform/src/ShadowCSS.js passing the style tag's content.
+/// Using Polymer's web_components/src/ShadowCSS.js passing the style tag's
+/// content.
 void _shimShadowDomStyling(DocumentFragment template, String name,
     String extendee) {
   if (_ShadowCss == null ||!_hasShadowDomPolyfill) return;
@@ -504,7 +540,8 @@
 }
 
 final bool _hasShadowDomPolyfill = js.context.hasProperty('ShadowDOMPolyfill');
-final JsObject _ShadowCss = _Platform != null ? _Platform['ShadowCSS'] : null;
+final JsObject _ShadowCss =
+    _WebComponents != null ? _WebComponents['ShadowCSS'] : null;
 
 const _STYLE_SELECTOR = 'style';
 const _SHEET_SELECTOR = 'link[rel=stylesheet]';
@@ -558,5 +595,5 @@
 
 final _ATTRIBUTES_REGEX = new RegExp(r'\s|,');
 
-final JsObject _Platform = js.context['Platform'];
+final JsObject _WebComponents = js.context['WebComponents'];
 final JsObject _Polymer = js.context['Polymer'];
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 9965a1e..64834bc 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -168,6 +168,8 @@
     // the Dart type because we will handle that in PolymerDeclaration.
     // See _hookJsPolymerDeclaration for how this is done.
     (js.context['Polymer'] as JsFunction).apply([name]);
+    (js.context['HTMLElement']['register'] as JsFunction).apply(
+        [name, js.context['HTMLElement']['prototype']]);
   }
 
   /// Register a custom element that has no associated `<polymer-element>`.
@@ -198,23 +200,59 @@
     init.apply([], thisArg: poly);
   }
 
-  // Note: these are from src/declaration/import.js
-  // For now proxy to the JS methods, because we want to share the loader with
-  // polymer.js for interop purposes.
+  // Warning for when people try to use `importElements` or `import`.
+  static const String _DYNAMIC_IMPORT_WARNING = 'Dynamically loading html '
+      'imports has very limited support right now in dart, see '
+      'http://dartbug.com/17873.';
+
+  /// Loads the set of HTMLImports contained in `node`. Returns a future that
+  /// resolves when all the imports have been loaded. This method can be used to
+  /// lazily load imports. For example, given a template:
+  ///
+  ///     <template>
+  ///       <link rel="import" href="my-import1.html">
+  ///       <link rel="import" href="my-import2.html">
+  ///     </template>
+  ///
+  ///     Polymer.importElements(template.content)
+  ///         .then((_) => print('imports lazily loaded'));
+  ///
+  /// Dart Note: This has very limited support in dart, http://dartbug.com/17873
+  // Dart Note: From src/lib/import.js For now proxy to the JS methods,
+  // because we want to share the loader with polymer.js for interop purposes.
   static Future importElements(Node elementOrFragment) {
+    print(_DYNAMIC_IMPORT_WARNING);
     var completer = new Completer();
     js.context['Polymer'].callMethod('importElements',
         [elementOrFragment, () => completer.complete()]);
     return completer.future;
   }
 
-  static Future importUrls(List urls) {
+  /// Loads an HTMLImport for each url specified in the `urls` array. Notifies
+  /// when all the imports have loaded by calling the `callback` function
+  /// argument. This method can be used to lazily load imports. For example,
+  /// For example,
+  ///
+  ///     Polymer.import(['my-import1.html', 'my-import2.html'])
+  ///         .then((_) => print('imports lazily loaded'));
+  ///
+  /// Dart Note: This has very limited support in dart, http://dartbug.com/17873
+  // Dart Note: From src/lib/import.js. For now proxy to the JS methods,
+  // because we want to share the loader with polymer.js for interop purposes.
+  static Future import(List urls) {
+    print(_DYNAMIC_IMPORT_WARNING);
     var completer = new Completer();
-    js.context['Polymer'].callMethod('importUrls',
+    js.context['Polymer'].callMethod('import',
         [urls, () => completer.complete()]);
     return completer.future;
   }
 
+  /// Deprecated: Use `import` instead.
+  @deprecated
+  static Future importUrls(List urls) {
+    return import(urls);
+  }
+
   static final Completer _onReady = new Completer();
 
   /// Future indicating that the Polymer library has been loaded and is ready
@@ -364,7 +402,7 @@
     }
     prepareElement();
     if (!isTemplateStagingDocument(ownerDocument)) {
-      makeElementReady();
+      _makeElementReady();
     }
   }
 
@@ -392,42 +430,40 @@
   }
 
   /// Initialize JS interop for this element. For now we just initialize the
-  // JsObject, but in the future we could also initialize JS APIs here.
+  /// JsObject, but in the future we could also initialize JS APIs here.
   _initJsObject() {
     _jsElem = new JsObject.fromBrowserObject(this);
   }
 
-  makeElementReady() {
+  /// Deprecated: This is no longer a public method.
+  @deprecated
+  makeElementReady() => _makeElementReady();
+
+  _makeElementReady() {
     if (_readied) return;
     _readied = true;
     createComputedProperties();
 
-    // TODO(sorvell): We could create an entry point here
-    // for the user to compute property values.
-    // process declarative resources
     parseDeclarations(_element);
-    // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
-    // :unresolved; remove this attribute to be compatible with native
-    // CE.
+    // NOTE: Support use of the `unresolved` attribute to help polyfill
+    // custom elements' `:unresolved` feature.
     attributes.remove('unresolved');
     // user entry point
     _readyLog.info(() => '[$this]: ready');
     ready();
   }
 
-  /// Called when [prepareElement] is finished, which means that the element's
-  /// shadowRoot has been created, its event listeners have been setup,
-  /// attributes have been reflected to properties, and property observers have
-  /// been setup. To wait until the element has been attached to the default
-  /// view, use [attached] or [domReady].
+  /// Lifecycle method called when the element has populated it's `shadowRoot`,
+  /// prepared data-observation, and made itself ready for API interaction.
+  /// To wait until the element has been attached to the default view, use
+  /// [attached] or [domReady].
   void ready() {}
 
-  /// domReady can be used to access elements in dom (descendants,
-  /// ancestors, siblings) such that the developer is enured to upgrade
-  /// ordering. If the element definitions have loaded, domReady
-  /// can be used to access upgraded elements.
-  ///
-  /// To use, override this method in your element.
+  /// Implement to access custom elements in dom descendants, ancestors,
+  /// or siblings. Because custom elements upgrade in document order,
+  /// elements accessed in `ready` or `attached` may not be upgraded. When
+  /// `domReady` is called, all registered custom elements are guaranteed
+  /// to have been upgraded.
   void domReady() {}
 
   void attached() {
@@ -449,7 +485,18 @@
     if (!preventDispose) asyncUnbindAll();
   }
 
-  /// Recursive ancestral <element> initialization, oldest first.
+  /// Walks the prototype-chain of this element and allows specific
+  /// classes a chance to process static declarations.
+  ///
+  /// In particular, each polymer-element has it's own `template`.
+  /// `parseDeclarations` is used to accumulate all element `template`s
+  /// from an inheritance chain.
+  ///
+  /// `parseDeclaration` static methods implemented in the chain are called
+  /// recursively, oldest first, with the `<polymer-element>` associated
+  /// with the current prototype passed as an argument.
+  ///
+  /// An element may override this method to customize shadow-root generation.
   void parseDeclarations(PolymerDeclaration declaration) {
     if (declaration != null) {
       parseDeclarations(declaration.superDeclaration);
@@ -457,7 +504,14 @@
     }
   }
 
-  /// Parse input `<polymer-element>` as needed, override for custom behavior.
+  /// Perform init-time actions based on static information in the
+  /// `<polymer-element>` instance argument.
+  ///
+  /// For example, the standard implementation locates the template associated
+  /// with the given `<polymer-element>` and stamps it into a shadow-root to
+  /// implement shadow inheritance.
+  ///
+  /// An element may override this method for custom behavior.
   void parseDeclaration(Element elementElement) {
     var template = fetchTemplate(elementElement);
 
@@ -470,7 +524,10 @@
     }
   }
 
-  /// Return a shadow-root template (if desired), override for custom behavior.
+  /// Given a `<polymer-element>`, find an associated template (if any) to be
+  /// used for shadow-root generation.
+  ///
+  /// An element may override this method for custom behavior.
   Element fetchTemplate(Element elementElement) =>
       elementElement.querySelector('template');
 
@@ -561,6 +618,9 @@
     return completer.future;
   }
 
+  // copy attributes defined in the element declaration to the instance
+  // e.g. <polymer-element name="x-foo" tabIndex="0"> tabIndex is copied
+  // to the element instance here.
   void copyInstanceAttributes() {
     _element._instanceAttributes.forEach((name, value) {
       attributes.putIfAbsent(name, () => value);
@@ -607,7 +667,6 @@
   smoke.Declaration propertyForAttribute(String name) {
     final publishLC = _element._publishLC;
     if (publishLC == null) return null;
-    //console.log('propertyForAttribute:', name, 'matches', match);
     return publishLC[name];
   }
 
@@ -666,6 +725,9 @@
     return dom;
   }
 
+  /// Called by TemplateBinding/NodeBind to setup a binding to the given
+  /// property. It's overridden here to support property bindings in addition to
+  /// attribute bindings that are supported by default.
   Bindable bind(String name, bindable, {bool oneTime: false}) {
     var decl = propertyForAttribute(name);
     if (decl == null) {
@@ -697,7 +759,10 @@
     this.bindings[name] = observer;
   }
 
-  bindFinished() => makeElementReady();
+  /// Called by TemplateBinding when all bindings on an element have been
+  /// executed. This signals that all element inputs have been gathered and it's
+  /// safe to ready the element, create shadow-root and start data-observation.
+  bindFinished() => _makeElementReady();
 
   Map<String, Bindable> get bindings => nodeBindFallback(this).bindings;
   set bindings(Map value) { nodeBindFallback(this).bindings = value; }
@@ -705,15 +770,21 @@
   TemplateInstance get templateInstance =>
       nodeBindFallback(this).templateInstance;
 
-  // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
-  // TemplateBinding. We still need to close/dispose of observers but perhaps
-  // we should choose a more explicit name.
+  /// Called at detached time to signal that an element's bindings should be
+  /// cleaned up. This is done asynchronously so that users have the chance to
+  /// call `cancelUnbindAll` to prevent unbinding.
   void asyncUnbindAll() {
     if (_unbound == true) return;
     _unbindLog.fine(() => '[$_name] asyncUnbindAll');
     _unbindAllJob = scheduleJob(_unbindAllJob, unbindAll);
   }
 
+  /// This method should rarely be used and only if `cancelUnbindAll` has been
+  /// called to prevent element unbinding. In this case, the element's bindings
+  /// will not be automatically cleaned up and it cannot be garbage collected by
+  /// by the system. If memory pressure is a concern or a large amount of
+  /// elements need to be managed in this way, `unbindAll` can be called to
+  /// deactivate the element's bindings and allow its memory to be reclaimed.
   void unbindAll() {
     if (_unbound == true) return;
     closeObservers();
@@ -721,6 +792,11 @@
     _unbound = true;
   }
 
+  //// Call in `detached` to prevent the element from unbinding when it is
+  //// detached from the dom. The element is unbound as a cleanup step that
+  //// allows its memory to be reclaimed. If `cancelUnbindAll` is used, consider
+  /// calling `unbindAll` when the element is no longer needed. This will allow
+  /// its memory to be reclaimed.
   void cancelUnbindAll() {
     if (_unbound == true) {
       _unbindLog.warning(() =>
@@ -743,7 +819,9 @@
     }
   }
 
-  /// Set up property observers.
+  /// Creates a CompoundObserver to observe property changes.
+  /// NOTE, this is only done if there are any properties in the `_observe`
+  /// object.
   void createPropertyObserver() {
     final observe = _element._observe;
     if (observe != null) {
@@ -761,6 +839,7 @@
     }
   }
 
+  /// Start observing property changes.
   void openPropertyObserver() {
     if (_propertyObserver != null) {
       _propertyObserver.open(notifyPropertyChanges);
@@ -775,7 +854,8 @@
     }
   }
 
-  /// Responds to property changes on this element.
+  /// Handler for property changes; routes changes to observing methods.
+  /// Note: array valued properties are observed for array splices.
   void notifyPropertyChanges(List newValues, Map oldValues, List paths) {
     final observe = _element._observe;
     final called = new HashSet();
@@ -807,6 +887,10 @@
     });
   }
 
+  /// Force any pending property changes to synchronously deliver to handlers
+  /// specified in the `observe` object.
+  /// Note: normally changes are processed at microtask time.
+  ///
   // Dart note: had to rename this to avoid colliding with
   // Observable.deliverChanges. Even worse, super calls aren't possible or
   // it prevents Polymer from being a mixin, so we can't override it even if
@@ -1065,7 +1149,7 @@
       smoke.invoke(this, methodName, args, adjust: true);
 
   /// Invokes a function asynchronously.
-  /// This will call `Platform.flush()` and then return a `new Timer`
+  /// This will call `Polymer.flush()` and then return a `new Timer`
   /// with the provided [method] and [timeout].
   ///
   /// If you would prefer to run the callback using
@@ -1080,14 +1164,13 @@
     // when polyfilling Object.observe, ensure changes
     // propagate before executing the async method
     scheduleMicrotask(Observable.dirtyCheck);
-    _Platform.callMethod('flush'); // for polymer-js interop
+    _Polymer.callMethod('flush'); // for polymer-js interop
     return new Timer(timeout, method);
   }
 
-  /// Invokes a function asynchronously.
-  /// This will call `Platform.flush()` and then call
-  /// [window.requestAnimationFrame] with the provided [method] and return the
-  /// result.
+  /// Invokes a function asynchronously. The context of the callback function is
+  /// function is bound to 'this' automatically. Returns a handle which may be
+  /// passed to cancelAsync to cancel the asynchronous call.
   ///
   /// If you would prefer to run the callback after a given duration, see
   /// the [asyncTimer] method.
@@ -1097,12 +1180,11 @@
     // when polyfilling Object.observe, ensure changes
     // propagate before executing the async method
     scheduleMicrotask(Observable.dirtyCheck);
-    _Platform.callMethod('flush'); // for polymer-js interop
+    _Polymer.callMethod('flush'); // for polymer-js interop
     return window.requestAnimationFrame(method);
   }
 
-  /// Cancel an operation scenduled by [async]. This is just shorthand for:
-  ///     window.cancelAnimationFrame(id);
+  /// Cancel an operation scheduled by [async].
   void cancelAsync(int id) => window.cancelAnimationFrame(id);
 
   /// Fire a [CustomEvent] targeting [onNode], or `this` if onNode is not
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
deleted file mode 100644
index 7d6d7ac..0000000
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ /dev/null
@@ -1,10981 +0,0 @@
-/**
- * @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
- */
-window.PolymerGestures = {};
-
-/*
- * 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) {
-  var HAS_FULL_PATH = false;
-
-  // test for full event path support
-  var pathTest = document.createElement('meta');
-  if (pathTest.createShadowRoot) {
-    var sr = pathTest.createShadowRoot();
-    var s = document.createElement('span');
-    sr.appendChild(s);
-    pathTest.addEventListener('testpath', function(ev) {
-      if (ev.path) {
-        // if the span is in the event path, then path[0] is the real source for all events
-        HAS_FULL_PATH = ev.path[0] === s;
-      }
-      ev.stopPropagation();
-    });
-    var ev = new CustomEvent('testpath', {bubbles: true});
-    // must add node to DOM to trigger event listener
-    document.head.appendChild(pathTest);
-    s.dispatchEvent(ev);
-    pathTest.parentNode.removeChild(pathTest);
-    sr = s = null;
-  }
-  pathTest = null;
-
-  var target = {
-    shadow: function(inEl) {
-      if (inEl) {
-        return inEl.shadowRoot || inEl.webkitShadowRoot;
-      }
-    },
-    canTarget: function(shadow) {
-      return shadow && Boolean(shadow.elementFromPoint);
-    },
-    targetingShadow: function(inEl) {
-      var s = this.shadow(inEl);
-      if (this.canTarget(s)) {
-        return s;
-      }
-    },
-    olderShadow: function(shadow) {
-      var os = shadow.olderShadowRoot;
-      if (!os) {
-        var se = shadow.querySelector('shadow');
-        if (se) {
-          os = se.olderShadowRoot;
-        }
-      }
-      return os;
-    },
-    allShadows: function(element) {
-      var shadows = [], s = this.shadow(element);
-      while(s) {
-        shadows.push(s);
-        s = this.olderShadow(s);
-      }
-      return shadows;
-    },
-    searchRoot: function(inRoot, x, y) {
-      var t, st, sr, os;
-      if (inRoot) {
-        t = inRoot.elementFromPoint(x, y);
-        if (t) {
-          // found element, check if it has a ShadowRoot
-          sr = this.targetingShadow(t);
-        } else if (inRoot !== document) {
-          // check for sibling roots
-          sr = this.olderShadow(inRoot);
-        }
-        // search other roots, fall back to light dom element
-        return this.searchRoot(sr, x, y) || t;
-      }
-    },
-    owner: function(element) {
-      if (!element) {
-        return document;
-      }
-      var s = element;
-      // walk up until you hit the shadow root or document
-      while (s.parentNode) {
-        s = s.parentNode;
-      }
-      // the owner element is expected to be a Document or ShadowRoot
-      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
-        s = document;
-      }
-      return s;
-    },
-    findTarget: function(inEvent) {
-      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
-        return inEvent.path[0];
-      }
-      var x = inEvent.clientX, y = inEvent.clientY;
-      // if the listener is in the shadow root, it is much faster to start there
-      var s = this.owner(inEvent.target);
-      // if x, y is not in this root, fall back to document search
-      if (!s.elementFromPoint(x, y)) {
-        s = document;
-      }
-      return this.searchRoot(s, x, y);
-    },
-    findTouchAction: function(inEvent) {
-      var n;
-      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
-        var path = inEvent.path;
-        for (var i = 0; i < path.length; i++) {
-          n = path[i];
-          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
-            return n.getAttribute('touch-action');
-          }
-        }
-      } else {
-        n = inEvent.target;
-        while(n) {
-          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
-            return n.getAttribute('touch-action');
-          }
-          n = n.parentNode || n.host;
-        }
-      }
-      // auto is default
-      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;
-      }
-      // fast case, a is a direct descendant of b or vice versa
-      if (a.contains && a.contains(b)) {
-        return a;
-      }
-      if (b.contains && b.contains(a)) {
-        return b;
-      }
-      var adepth = this.depth(a);
-      var bdepth = this.depth(b);
-      var d = adepth - bdepth;
-      if (d >= 0) {
-        a = this.walk(a, d);
-      } else {
-        b = this.walk(b, -d);
-      }
-      while (a && b && a !== b) {
-        a = a.parentNode || a.host;
-        b = b.parentNode || b.host;
-      }
-      return a;
-    },
-    walk: function(n, u) {
-      for (var i = 0; n && (i < u); i++) {
-        n = n.parentNode || n.host;
-      }
-      return n;
-    },
-    depth: function(n) {
-      var d = 0;
-      while(n) {
-        d++;
-        n = n.parentNode || n.host;
-      }
-      return d;
-    },
-    deepContains: function(a, b) {
-      var common = this.LCA(a, b);
-      // if a is the common ancestor, it must "deeply" contain b
-      return common === a;
-    },
-    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;
-  /**
-   * Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting
-   *
-   * @param {Event} Event An event object with clientX and clientY properties
-   * @return {Element} The probable event origninator
-   */
-  scope.findTarget = target.findTarget.bind(target);
-  /**
-   * Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM
-   * roots.
-   *
-   * @param {Node} container
-   * @param {Node} containee
-   * @return {Boolean}
-   */
-  scope.deepContains = target.deepContains.bind(target);
-
-  /**
-   * Determines if the x/y position is inside the given node.
-   *
-   * Example:
-   *
-   *     function upHandler(event) {
-   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);
-   *       if (innode) {
-   *         // wait for tap?
-   *       } else {
-   *         // tap will never happen
-   *       }
-   *     }
-   *
-   * @param {Node} node
-   * @param {Number} x Screen X position
-   * @param {Number} y screen Y position
-   * @return {Boolean}
-   */
-  scope.insideNode = target.insideNode;
-
-})(window.PolymerGestures);
-
-/*
- *
- * 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() {
-  function shadowSelector(v) {
-    return 'html /deep/ ' + selector(v);
-  }
-  function selector(v) {
-    return '[touch-action="' + v + '"]';
-  }
-  function rule(v) {
-    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';
-  }
-  var attrib2css = [
-    'none',
-    'auto',
-    'pan-x',
-    'pan-y',
-    {
-      rule: 'pan-x pan-y',
-      selectors: [
-        'pan-x pan-y',
-        'pan-y pan-x'
-      ]
-    },
-    'manipulation'
-  ];
-  var styles = '';
-  // only install stylesheet if the browser has touch action support
-  var hasTouchAction = typeof document.head.style.touchAction === 'string';
-  // only add shadow selectors if shadowdom is supported
-  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
-
-  if (hasTouchAction) {
-    attrib2css.forEach(function(r) {
-      if (String(r) === r) {
-        styles += selector(r) + rule(r) + '\n';
-        if (hasShadowRoot) {
-          styles += shadowSelector(r) + rule(r) + '\n';
-        }
-      } else {
-        styles += r.selectors.map(selector) + rule(r.rule) + '\n';
-        if (hasShadowRoot) {
-          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
-        }
-      }
-    });
-
-    var el = document.createElement('style');
-    el.textContent = styles;
-    document.head.appendChild(el);
-  }
-})();
-
-/*
- * 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
- */
-
-/**
- * This is the constructor for new PointerEvents.
- *
- * New Pointer Events must be given a type, and an optional dictionary of
- * initialization properties.
- *
- * Due to certain platform requirements, events returned from the constructor
- * identify as MouseEvents.
- *
- * @constructor
- * @param {String} inType The type of the event to create.
- * @param {Object} [inDict] An optional dictionary of initial event properties.
- * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
- */
-(function(scope) {
-
-  var MOUSE_PROPS = [
-    'bubbles',
-    'cancelable',
-    'view',
-    'detail',
-    'screenX',
-    'screenY',
-    'clientX',
-    'clientY',
-    'ctrlKey',
-    'altKey',
-    'shiftKey',
-    'metaKey',
-    'button',
-    'relatedTarget',
-    'pageX',
-    'pageY'
-  ];
-
-  var MOUSE_DEFAULTS = [
-    false,
-    false,
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    false,
-    false,
-    false,
-    false,
-    0,
-    null,
-    0,
-    0
-  ];
-
-  var NOP_FACTORY = function(){ return function(){}; };
-
-  var eventFactory = {
-    // TODO(dfreedm): this is overridden by tap recognizer, needs review
-    preventTap: NOP_FACTORY,
-    makeBaseEvent: function(inType, inDict) {
-      var e = document.createEvent('Event');
-      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
-      e.preventTap = eventFactory.preventTap(e);
-      return e;
-    },
-    makeGestureEvent: function(inType, inDict) {
-      inDict = inDict || Object.create(null);
-
-      var e = this.makeBaseEvent(inType, inDict);
-      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {
-        k = keys[i];
-        e[k] = inDict[k];
-      }
-      return e;
-    },
-    makePointerEvent: function(inType, inDict) {
-      inDict = inDict || Object.create(null);
-
-      var e = this.makeBaseEvent(inType, inDict);
-      // define inherited MouseEvent properties
-      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {
-        p = MOUSE_PROPS[i];
-        e[p] = inDict[p] || MOUSE_DEFAULTS[i];
-      }
-      e.buttons = inDict.buttons || 0;
-
-      // Spec requires that pointers without pressure specified use 0.5 for down
-      // state and 0 for up state.
-      var pressure = 0;
-      if (inDict.pressure) {
-        pressure = inDict.pressure;
-      } else {
-        pressure = e.buttons ? 0.5 : 0;
-      }
-
-      // add x/y properties aliased to clientX/Y
-      e.x = e.clientX;
-      e.y = e.clientY;
-
-      // define the properties of the PointerEvent interface
-      e.pointerId = inDict.pointerId || 0;
-      e.width = inDict.width || 0;
-      e.height = inDict.height || 0;
-      e.pressure = pressure;
-      e.tiltX = inDict.tiltX || 0;
-      e.tiltY = inDict.tiltY || 0;
-      e.pointerType = inDict.pointerType || '';
-      e.hwTimestamp = inDict.hwTimestamp || 0;
-      e.isPrimary = inDict.isPrimary || false;
-      e._source = inDict._source || '';
-      return e;
-    }
-  };
-
-  scope.eventFactory = eventFactory;
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * This module implements an map of pointer states
- */
-(function(scope) {
-  var USE_MAP = window.Map && window.Map.prototype.forEach;
-  var POINTERS_FN = function(){ return this.size; };
-  function PointerMap() {
-    if (USE_MAP) {
-      var m = new Map();
-      m.pointers = POINTERS_FN;
-      return m;
-    } else {
-      this.keys = [];
-      this.values = [];
-    }
-  }
-
-  PointerMap.prototype = {
-    set: function(inId, inEvent) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.values[i] = inEvent;
-      } else {
-        this.keys.push(inId);
-        this.values.push(inEvent);
-      }
-    },
-    has: function(inId) {
-      return this.keys.indexOf(inId) > -1;
-    },
-    'delete': function(inId) {
-      var i = this.keys.indexOf(inId);
-      if (i > -1) {
-        this.keys.splice(i, 1);
-        this.values.splice(i, 1);
-      }
-    },
-    get: function(inId) {
-      var i = this.keys.indexOf(inId);
-      return this.values[i];
-    },
-    clear: function() {
-      this.keys.length = 0;
-      this.values.length = 0;
-    },
-    // return value, key, map
-    forEach: function(callback, thisArg) {
-      this.values.forEach(function(v, i) {
-        callback.call(thisArg, v, this.keys[i], this);
-      }, this);
-    },
-    pointers: function() {
-      return this.keys.length;
-    }
-  };
-
-  scope.PointerMap = PointerMap;
-})(window.PolymerGestures);
-
-/*
- * 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) {
-  var CLONE_PROPS = [
-    // MouseEvent
-    'bubbles',
-    'cancelable',
-    'view',
-    'detail',
-    'screenX',
-    'screenY',
-    'clientX',
-    'clientY',
-    'ctrlKey',
-    'altKey',
-    'shiftKey',
-    'metaKey',
-    'button',
-    'relatedTarget',
-    // DOM Level 3
-    'buttons',
-    // PointerEvent
-    'pointerId',
-    'width',
-    'height',
-    'pressure',
-    'tiltX',
-    'tiltY',
-    'pointerType',
-    'hwTimestamp',
-    'isPrimary',
-    // event instance
-    'type',
-    'target',
-    'currentTarget',
-    'which',
-    'pageX',
-    'pageY',
-    'timeStamp',
-    // gesture addons
-    'preventTap',
-    'tapPrevented',
-    '_source'
-  ];
-
-  var CLONE_DEFAULTS = [
-    // MouseEvent
-    false,
-    false,
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    false,
-    false,
-    false,
-    false,
-    0,
-    null,
-    // DOM Level 3
-    0,
-    // PointerEvent
-    0,
-    0,
-    0,
-    0,
-    0,
-    0,
-    '',
-    0,
-    false,
-    // event instance
-    '',
-    null,
-    null,
-    0,
-    0,
-    0,
-    0,
-    function(){},
-    false
-  ];
-
-  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
-
-  var eventFactory = scope.eventFactory;
-
-  // set of recognizers to run for the currently handled event
-  var currentGestures;
-
-  /**
-   * This module is for normalizing events. Mouse and Touch events will be
-   * collected here, and fire PointerEvents that have the same semantics, no
-   * matter the source.
-   * Events fired:
-   *   - pointerdown: a pointing is added
-   *   - pointerup: a pointer is removed
-   *   - pointermove: a pointer is moved
-   *   - pointerover: a pointer crosses into an element
-   *   - pointerout: a pointer leaves an element
-   *   - 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),
-    // Scope objects for native events.
-    // This exists for ease of testing.
-    eventSources: Object.create(null),
-    eventSourceList: [],
-    gestures: [],
-    // map gesture event -> {listeners: int, index: gestures[int]}
-    dependencyMap: {
-      // make sure down and up are in the map to trigger "register"
-      down: {listeners: 0, index: -1},
-      up: {listeners: 0, index: -1}
-    },
-    gestureQueue: [],
-    /**
-     * Add a new event source that will generate pointer events.
-     *
-     * `inSource` must contain an array of event names named `events`, and
-     * functions with the names specified in the `events` array.
-     * @param {string} name A name for the event source
-     * @param {Object} source A new source of platform events.
-     */
-    registerSource: function(name, source) {
-      var s = source;
-      var newEvents = s.events;
-      if (newEvents) {
-        newEvents.forEach(function(e) {
-          if (s[e]) {
-            this.eventMap[e] = s[e].bind(s);
-          }
-        }, this);
-        this.eventSources[name] = s;
-        this.eventSourceList.push(s);
-      }
-    },
-    registerGesture: function(name, source) {
-      var obj = Object.create(null);
-      obj.listeners = 0;
-      obj.index = this.gestures.length;
-      for (var i = 0, g; i < source.exposes.length; i++) {
-        g = source.exposes[i].toLowerCase();
-        this.dependencyMap[g] = obj;
-      }
-      this.gestures.push(source);
-    },
-    register: function(element, initial) {
-      var l = this.eventSourceList.length;
-      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
-        // call eventsource register
-        es.register.call(es, element, initial);
-      }
-    },
-    unregister: function(element) {
-      var l = this.eventSourceList.length;
-      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
-        // call eventsource register
-        es.unregister.call(es, element);
-      }
-    },
-    // EVENTS
-    down: function(inEvent) {
-      this.requiredGestures.set(inEvent.pointerId, currentGestures);
-      this.fireEvent('down', inEvent);
-    },
-    move: function(inEvent) {
-      // pipe move events into gesture queue directly
-      inEvent.type = 'move';
-      this.fillGestureQueue(inEvent);
-    },
-    up: function(inEvent) {
-      this.fireEvent('up', inEvent);
-      this.requiredGestures.delete(inEvent.pointerId);
-    },
-    cancel: function(inEvent) {
-      inEvent.tapPrevented = true;
-      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
-      // platform events. This can happen when two elements in different scopes
-      // are set up to create pointer events, which is relevant to Shadow DOM.
-
-      var type = inEvent.type;
-
-      // only generate the list of desired events on "down"
-      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {
-        if (!inEvent._handledByPG) {
-          currentGestures = {};
-        }
-        // 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);
-        }
-      }
-
-      if (inEvent._handledByPG) {
-        return;
-      }
-      var fn = this.eventMap && this.eventMap[type];
-      if (fn) {
-        fn(inEvent);
-      }
-      inEvent._handledByPG = true;
-    },
-    // set up event listeners
-    listen: function(target, events) {
-      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
-        this.addEvent(target, e);
-      }
-    },
-    // remove event listeners
-    unlisten: function(target, events) {
-      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
-        this.removeEvent(target, e);
-      }
-    },
-    addEvent: function(target, eventName) {
-      target.addEventListener(eventName, this.boundHandler);
-    },
-    removeEvent: function(target, eventName) {
-      target.removeEventListener(eventName, this.boundHandler);
-    },
-    // EVENT CREATION AND TRACKING
-    /**
-     * Creates a new Event of type `inType`, based on the information in
-     * `inEvent`.
-     *
-     * @param {string} inType A string representing the type of event to create
-     * @param {Event} inEvent A platform event with a target
-     * @return {Event} A PointerEvent of type `inType`
-     */
-    makeEvent: function(inType, inEvent) {
-      var e = eventFactory.makePointerEvent(inType, inEvent);
-      e.preventDefault = inEvent.preventDefault;
-      e.tapPrevented = inEvent.tapPrevented;
-      e._target = e._target || inEvent.target;
-      return e;
-    },
-    // make and dispatch an event in one call
-    fireEvent: function(inType, inEvent) {
-      var e = this.makeEvent(inType, inEvent);
-      return this.dispatchEvent(e);
-    },
-    /**
-     * Returns a snapshot of inEvent, with writable properties.
-     *
-     * @param {Event} inEvent An event that contains properties to copy.
-     * @return {Object} An object containing shallow copies of `inEvent`'s
-     *    properties.
-     */
-    cloneEvent: function(inEvent) {
-      var eventCopy = Object.create(null), p;
-      for (var i = 0; i < CLONE_PROPS.length; i++) {
-        p = CLONE_PROPS[i];
-        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
-        // Work around SVGInstanceElement shadow tree
-        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.
-        // This is the behavior implemented by Firefox.
-        if (p === 'target' || p === 'relatedTarget') {
-          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {
-            eventCopy[p] = eventCopy[p].correspondingUseElement;
-          }
-        }
-      }
-      // keep the semantics of preventDefault
-      eventCopy.preventDefault = function() {
-        inEvent.preventDefault();
-      };
-      return eventCopy;
-    },
-    /**
-     * Dispatches the event to its target.
-     *
-     * @param {Event} inEvent The event to be dispatched.
-     * @return {Boolean} True if an event handler returns true, false otherwise.
-     */
-    dispatchEvent: function(inEvent) {
-      var t = inEvent._target;
-      if (t) {
-        t.dispatchEvent(inEvent);
-        // clone the event for the gesture system to process
-        // clone after dispatch to pick up gesture prevention code
-        var clone = this.cloneEvent(inEvent);
-        clone.target = t;
-        this.fillGestureQueue(clone);
-      }
-    },
-    gestureTrigger: function() {
-      // process the gesture queue
-      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {
-        e = this.gestureQueue[i];
-        rg = e._requiredGestures;
-        for (var j = 0, g, fn; j < this.gestures.length; j++) {
-          // only run recognizer if an element in the source event's path is listening for those gestures
-          if (rg[j]) {
-            g = this.gestures[j];
-            fn = g[e.type];
-            if (fn) {
-              fn.call(g, e);
-            }
-          }
-        }
-      }
-      this.gestureQueue.length = 0;
-    },
-    fillGestureQueue: function(ev) {
-      // only trigger the gesture queue once
-      if (!this.gestureQueue.length) {
-        requestAnimationFrame(this.boundGestureTrigger);
-      }
-      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);
-      this.gestureQueue.push(ev);
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
-  scope.dispatcher = dispatcher;
-
-  /**
-   * Listen for `gesture` on `node` with the `handler` function
-   *
-   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.
-   *
-   * @param {Element} node
-   * @param {string} gesture
-   * @return Boolean `gesture` is a valid gesture
-   */
-  scope.activateGesture = function(node, gesture) {
-    var g = gesture.toLowerCase();
-    var dep = dispatcher.dependencyMap[g];
-    if (dep) {
-      var recognizer = dispatcher.gestures[dep.index];
-      if (!node._pgListeners) {
-        dispatcher.register(node);
-        node._pgListeners = 0;
-      }
-      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes
-      if (recognizer) {
-        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];
-        var actionNode;
-        switch(node.nodeType) {
-          case Node.ELEMENT_NODE:
-            actionNode = node;
-          break;
-          case Node.DOCUMENT_FRAGMENT_NODE:
-            actionNode = node.host;
-          break;
-          default:
-            actionNode = null;
-          break;
-        }
-        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {
-          actionNode.setAttribute('touch-action', touchAction);
-        }
-      }
-      if (!node._pgEvents) {
-        node._pgEvents = {};
-      }
-      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;
-      node._pgListeners++;
-    }
-    return Boolean(dep);
-  };
-
-  /**
-   *
-   * Listen for `gesture` from `node` with `handler` function.
-   *
-   * @param {Element} node
-   * @param {string} gesture
-   * @param {Function} handler
-   * @param {Boolean} capture
-   */
-  scope.addEventListener = function(node, gesture, handler, capture) {
-    if (handler) {
-      scope.activateGesture(node, gesture);
-      node.addEventListener(gesture, handler, capture);
-    }
-  };
-
-  /**
-   * Tears down the gesture configuration for `node`
-   *
-   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.
-   *
-   * @param {Element} node
-   * @param {string} gesture
-   * @return Boolean `gesture` is a valid gesture
-   */
-  scope.deactivateGesture = function(node, gesture) {
-    var g = gesture.toLowerCase();
-    var dep = dispatcher.dependencyMap[g];
-    if (dep) {
-      if (node._pgListeners > 0) {
-        node._pgListeners--;
-      }
-      if (node._pgListeners === 0) {
-        dispatcher.unregister(node);
-      }
-      if (node._pgEvents) {
-        if (node._pgEvents[g] > 0) {
-          node._pgEvents[g]--;
-        } else {
-          node._pgEvents[g] = 0;
-        }
-      }
-    }
-    return Boolean(dep);
-  };
-
-  /**
-   * Stop listening for `gesture` from `node` with `handler` function.
-   *
-   * @param {Element} node
-   * @param {string} gesture
-   * @param {Function} handler
-   * @param {Boolean} capture
-   */
-  scope.removeEventListener = function(node, gesture, handler, capture) {
-    if (handler) {
-      scope.deactivateGesture(node, gesture);
-      node.removeEventListener(gesture, handler, capture);
-    }
-  };
-})(window.PolymerGestures);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  // radius around touchend that swallows mouse events
-  var DEDUP_DIST = 25;
-
-  var WHICH_TO_BUTTONS = [0, 1, 4, 2];
-
-  var HAS_BUTTONS = false;
-  try {
-    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;
-  } catch (e) {}
-
-  // handler block for native mouse events
-  var mouseEvents = {
-    POINTER_ID: 1,
-    POINTER_TYPE: 'mouse',
-    events: [
-      'mousedown',
-      'mousemove',
-      'mouseup'
-    ],
-    exposes: [
-      'down',
-      'up',
-      'move'
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      if (target === document) {
-        return;
-      }
-      dispatcher.unlisten(target, this.events);
-    },
-    lastTouches: [],
-    // collide with the global mouse listener
-    isEventSimulatedFromTouch: function(inEvent) {
-      var lts = this.lastTouches;
-      var x = inEvent.clientX, y = inEvent.clientY;
-      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
-        // simulated mouse events will be swallowed near a primary touchend
-        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
-        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {
-          return true;
-        }
-      }
-    },
-    prepareEvent: function(inEvent) {
-      var e = dispatcher.cloneEvent(inEvent);
-      e.pointerId = this.POINTER_ID;
-      e.isPrimary = true;
-      e.pointerType = this.POINTER_TYPE;
-      e._source = 'mouse';
-      if (!HAS_BUTTONS) {
-        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;
-      }
-      return e;
-    },
-    mousedown: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var p = pointermap.has(this.POINTER_ID);
-        // TODO(dfreedman) workaround for some elements not sending mouseup
-        // http://crbug/149091
-        if (p) {
-          this.mouseup(inEvent);
-        }
-        var e = this.prepareEvent(inEvent);
-        e.target = scope.findTarget(inEvent);
-        pointermap.set(this.POINTER_ID, e.target);
-        dispatcher.down(e);
-      }
-    },
-    mousemove: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var target = pointermap.get(this.POINTER_ID);
-        if (target) {
-          var e = this.prepareEvent(inEvent);
-          e.target = target;
-          // handle case where we missed a mouseup
-          if (e.buttons === 0) {
-            dispatcher.cancel(e);
-            this.cleanupMouse();
-          } else {
-            dispatcher.move(e);
-          }
-        }
-      }
-    },
-    mouseup: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        e.relatedTarget = scope.findTarget(inEvent);
-        e.target = pointermap.get(this.POINTER_ID);
-        dispatcher.up(e);
-        this.cleanupMouse();
-      }
-    },
-    cleanupMouse: function() {
-      pointermap['delete'](this.POINTER_ID);
-    }
-  };
-
-  scope.mouseEvents = mouseEvents;
-})(window.PolymerGestures);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
-  var pointermap = dispatcher.pointermap;
-  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
-  // This should be long enough to ignore compat mouse events made by touch
-  var DEDUP_TIMEOUT = 2500;
-  var CLICK_COUNT_TIMEOUT = 200;
-  var HYSTERESIS = 20;
-  var ATTRIB = 'touch-action';
-  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved
-  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;
-  var HAS_TOUCH_ACTION = false;
-
-  // handler block for native touch events
-  var touchEvents = {
-    IS_IOS: false,
-    events: [
-      'touchstart',
-      'touchmove',
-      'touchend',
-      'touchcancel'
-    ],
-    exposes: [
-      'down',
-      'up',
-      'move'
-    ],
-    register: function(target, initial) {
-      if (this.IS_IOS ? initial : !initial) {
-        dispatcher.listen(target, this.events);
-      }
-    },
-    unregister: function(target) {
-      if (!this.IS_IOS) {
-        dispatcher.unlisten(target, this.events);
-      }
-    },
-    scrollTypes: {
-      EMITTER: 'none',
-      XSCROLLER: 'pan-x',
-      YSCROLLER: 'pan-y',
-    },
-    touchActionToScrollType: function(touchAction) {
-      var t = touchAction;
-      var st = this.scrollTypes;
-      if (t === st.EMITTER) {
-        return 'none';
-      } else if (t === st.XSCROLLER) {
-        return 'X';
-      } else if (t === st.YSCROLLER) {
-        return 'Y';
-      } else {
-        return 'XY';
-      }
-    },
-    POINTER_TYPE: 'touch',
-    firstTouch: null,
-    isPrimaryTouch: function(inTouch) {
-      return this.firstTouch === inTouch.identifier;
-    },
-    setPrimaryTouch: function(inTouch) {
-      // set primary touch if there no pointers, or the only pointer is the mouse
-      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
-        this.firstTouch = inTouch.identifier;
-        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
-        this.scrolling = null;
-        this.cancelResetClickCount();
-      }
-    },
-    removePrimaryPointer: function(inPointer) {
-      if (inPointer.isPrimary) {
-        this.firstTouch = null;
-        this.firstXY = null;
-        this.resetClickCount();
-      }
-    },
-    clickCount: 0,
-    resetId: null,
-    resetClickCount: function() {
-      var fn = function() {
-        this.clickCount = 0;
-        this.resetId = null;
-      }.bind(this);
-      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
-    },
-    cancelResetClickCount: function() {
-      if (this.resetId) {
-        clearTimeout(this.resetId);
-      }
-    },
-    typeToButtons: function(type) {
-      var ret = 0;
-      if (type === 'touchstart' || type === 'touchmove') {
-        ret = 1;
-      }
-      return ret;
-    },
-    findTarget: function(touch, id) {
-      if (this.currentTouchEvent.type === 'touchstart') {
-        if (this.isPrimaryTouch(touch)) {
-          var fastPath = {
-            clientX: touch.clientX,
-            clientY: touch.clientY,
-            path: this.currentTouchEvent.path,
-            target: this.currentTouchEvent.target
-          };
-          return scope.findTarget(fastPath);
-        } else {
-          return scope.findTarget(touch);
-        }
-      }
-      // reuse target we found in touchstart
-      return pointermap.get(id);
-    },
-    touchToPointer: function(inTouch) {
-      var cte = this.currentTouchEvent;
-      var e = dispatcher.cloneEvent(inTouch);
-      // Spec specifies that pointerId 1 is reserved for Mouse.
-      // Touch identifiers can start at 0.
-      // Add 2 to the touch identifier for compatibility.
-      var id = e.pointerId = inTouch.identifier + 2;
-      e.target = this.findTarget(inTouch, id);
-      e.bubbles = true;
-      e.cancelable = true;
-      e.detail = this.clickCount;
-      e.buttons = this.typeToButtons(cte.type);
-      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
-      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
-      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
-      e.isPrimary = this.isPrimaryTouch(inTouch);
-      e.pointerType = this.POINTER_TYPE;
-      e._source = 'touch';
-      // forward touch preventDefaults
-      var self = this;
-      e.preventDefault = function() {
-        self.scrolling = false;
-        self.firstXY = null;
-        cte.preventDefault();
-      };
-      return e;
-    },
-    processTouches: function(inEvent, inFunction) {
-      var tl = inEvent.changedTouches;
-      this.currentTouchEvent = inEvent;
-      for (var i = 0, t, p; i < tl.length; i++) {
-        t = tl[i];
-        p = this.touchToPointer(t);
-        if (inEvent.type === 'touchstart') {
-          pointermap.set(p.pointerId, p.target);
-        }
-        if (pointermap.has(p.pointerId)) {
-          inFunction.call(this, p);
-        }
-        if (inEvent.type === 'touchend' || inEvent._cancel) {
-          this.cleanUpPointer(p);
-        }
-      }
-    },
-    // For single axis scrollers, determines whether the element should emit
-    // pointer events or behave as a scroller
-    shouldScroll: function(inEvent) {
-      if (this.firstXY) {
-        var ret;
-        var touchAction = scope.targetFinding.findTouchAction(inEvent);
-        var scrollAxis = this.touchActionToScrollType(touchAction);
-        if (scrollAxis === 'none') {
-          // this element is a touch-action: none, should never scroll
-          ret = false;
-        } else if (scrollAxis === 'XY') {
-          // this element should always scroll
-          ret = true;
-        } else {
-          var t = inEvent.changedTouches[0];
-          // check the intended scroll axis, and other axis
-          var a = scrollAxis;
-          var oa = scrollAxis === 'Y' ? 'X' : 'Y';
-          var da = Math.abs(t['client' + a] - this.firstXY[a]);
-          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
-          // if delta in the scroll axis > delta other axis, scroll instead of
-          // making events
-          ret = da >= doa;
-        }
-        return ret;
-      }
-    },
-    findTouch: function(inTL, inId) {
-      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
-        if (t.identifier === inId) {
-          return true;
-        }
-      }
-    },
-    // In some instances, a touchstart can happen without a touchend. This
-    // leaves the pointermap in a broken state.
-    // Therefore, on every touchstart, we remove the touches that did not fire a
-    // touchend event.
-    // To keep state globally consistent, we fire a
-    // pointercancel for this "abandoned" touch
-    vacuumTouches: function(inEvent) {
-      var tl = inEvent.touches;
-      // pointermap.pointers() should be < tl.length here, as the touchstart has not
-      // been processed yet.
-      if (pointermap.pointers() >= tl.length) {
-        var d = [];
-        pointermap.forEach(function(value, key) {
-          // Never remove pointerId == 1, which is mouse.
-          // Touch identifiers are 2 smaller than their pointerId, which is the
-          // index in pointermap.
-          if (key !== 1 && !this.findTouch(tl, key - 2)) {
-            var p = value;
-            d.push(p);
-          }
-        }, this);
-        d.forEach(function(p) {
-          this.cancel(p);
-          pointermap.delete(p.pointerId);
-        });
-      }
-    },
-    touchstart: function(inEvent) {
-      this.vacuumTouches(inEvent);
-      this.setPrimaryTouch(inEvent.changedTouches[0]);
-      this.dedupSynthMouse(inEvent);
-      if (!this.scrolling) {
-        this.clickCount++;
-        this.processTouches(inEvent, this.down);
-      }
-    },
-    down: function(inPointer) {
-      dispatcher.down(inPointer);
-    },
-    touchmove: function(inEvent) {
-      if (HAS_TOUCH_ACTION) {
-        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36
-        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ
-        if (inEvent.cancelable) {
-          this.processTouches(inEvent, this.move);
-        }
-      } else {
-        if (!this.scrolling) {
-          if (this.scrolling === null && this.shouldScroll(inEvent)) {
-            this.scrolling = true;
-          } else {
-            this.scrolling = false;
-            inEvent.preventDefault();
-            this.processTouches(inEvent, this.move);
-          }
-        } else if (this.firstXY) {
-          var t = inEvent.changedTouches[0];
-          var dx = t.clientX - this.firstXY.X;
-          var dy = t.clientY - this.firstXY.Y;
-          var dd = Math.sqrt(dx * dx + dy * dy);
-          if (dd >= HYSTERESIS) {
-            this.touchcancel(inEvent);
-            this.scrolling = true;
-            this.firstXY = null;
-          }
-        }
-      }
-    },
-    move: function(inPointer) {
-      dispatcher.move(inPointer);
-    },
-    touchend: function(inEvent) {
-      this.dedupSynthMouse(inEvent);
-      this.processTouches(inEvent, this.up);
-    },
-    up: function(inPointer) {
-      inPointer.relatedTarget = scope.findTarget(inPointer);
-      dispatcher.up(inPointer);
-    },
-    cancel: function(inPointer) {
-      dispatcher.cancel(inPointer);
-    },
-    touchcancel: function(inEvent) {
-      inEvent._cancel = true;
-      this.processTouches(inEvent, this.cancel);
-    },
-    cleanUpPointer: function(inPointer) {
-      pointermap['delete'](inPointer.pointerId);
-      this.removePrimaryPointer(inPointer);
-    },
-    // prevent synth mouse events from creating pointer events
-    dedupSynthMouse: function(inEvent) {
-      var lts = scope.mouseEvents.lastTouches;
-      var t = inEvent.changedTouches[0];
-      // only the primary finger will synth mouse events
-      if (this.isPrimaryTouch(t)) {
-        // remember x/y of last touch
-        var lt = {x: t.clientX, y: t.clientY};
-        lts.push(lt);
-        var fn = (function(lts, lt){
-          var i = lts.indexOf(lt);
-          if (i > -1) {
-            lts.splice(i, 1);
-          }
-        }).bind(null, lts, lt);
-        setTimeout(fn, DEDUP_TIMEOUT);
-      }
-    }
-  };
-
-  scope.touchEvents = touchEvents;
-})(window.PolymerGestures);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';
-  var msEvents = {
-    events: [
-      'MSPointerDown',
-      'MSPointerMove',
-      'MSPointerUp',
-      'MSPointerCancel',
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      if (target === document) {
-        return;
-      }
-      dispatcher.unlisten(target, this.events);
-    },
-    POINTER_TYPES: [
-      '',
-      'unavailable',
-      'touch',
-      'pen',
-      'mouse'
-    ],
-    prepareEvent: function(inEvent) {
-      var e = inEvent;
-      e = dispatcher.cloneEvent(inEvent);
-      if (HAS_BITMAP_TYPE) {
-        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
-      }
-      e._source = 'ms';
-      return e;
-    },
-    cleanup: function(id) {
-      pointermap['delete'](id);
-    },
-    MSPointerDown: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = scope.findTarget(inEvent);
-      pointermap.set(inEvent.pointerId, e.target);
-      dispatcher.down(e);
-    },
-    MSPointerMove: function(inEvent) {
-      var target = pointermap.get(inEvent.pointerId);
-      if (target) {
-        var e = this.prepareEvent(inEvent);
-        e.target = target;
-        dispatcher.move(e);
-      }
-    },
-    MSPointerUp: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.findTarget(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.up(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    MSPointerCancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.findTarget(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    }
-  };
-
-  scope.msEvents = msEvents;
-})(window.PolymerGestures);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  var pointerEvents = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    prepareEvent: function(inEvent) {
-      var e = dispatcher.cloneEvent(inEvent);
-      e._source = 'pointer';
-      return e;
-    },
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      if (target === document) {
-        return;
-      }
-      dispatcher.unlisten(target, this.events);
-    },
-    cleanup: function(id) {
-      pointermap['delete'](id);
-    },
-    pointerdown: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = scope.findTarget(inEvent);
-      pointermap.set(e.pointerId, e.target);
-      dispatcher.down(e);
-    },
-    pointermove: function(inEvent) {
-      var target = pointermap.get(inEvent.pointerId);
-      if (target) {
-        var e = this.prepareEvent(inEvent);
-        e.target = target;
-        dispatcher.move(e);
-      }
-    },
-    pointerup: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.findTarget(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.up(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    pointercancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = scope.findTarget(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    }
-  };
-
-  scope.pointerEvents = pointerEvents;
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * This module contains the handlers for native platform events.
- * From here, the dispatcher is called to create unified pointer events.
- * Included are touch events (v1), mouse events, and MSPointerEvents.
- */
-(function(scope) {
-
-  var dispatcher = scope.dispatcher;
-  var nav = window.navigator;
-
-  if (window.PointerEvent) {
-    dispatcher.registerSource('pointer', scope.pointerEvents);
-  } else if (nav.msPointerEnabled) {
-    dispatcher.registerSource('ms', scope.msEvents);
-  } else {
-    dispatcher.registerSource('mouse', scope.mouseEvents);
-    if (window.ontouchstart !== undefined) {
-      dispatcher.registerSource('touch', scope.touchEvents);
-    }
-  }
-
-  // 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);
-
-/*
- * 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
- */
-
-/**
- * This event denotes the beginning of a series of tracking events.
- *
- * @module PointerGestures
- * @submodule Events
- * @class trackstart
- */
-/**
- * Pixels moved in the x direction since trackstart.
- * @type Number
- * @property dx
- */
-/**
- * Pixes moved in the y direction since trackstart.
- * @type Number
- * @property dy
- */
-/**
- * Pixels moved in the x direction since the last track.
- * @type Number
- * @property ddx
- */
-/**
- * Pixles moved in the y direction since the last track.
- * @type Number
- * @property ddy
- */
-/**
- * The clientX position of the track gesture.
- * @type Number
- * @property clientX
- */
-/**
- * The clientY position of the track gesture.
- * @type Number
- * @property clientY
- */
-/**
- * The pageX position of the track gesture.
- * @type Number
- * @property pageX
- */
-/**
- * The pageY position of the track gesture.
- * @type Number
- * @property pageY
- */
-/**
- * The screenX position of the track gesture.
- * @type Number
- * @property screenX
- */
-/**
- * The screenY position of the track gesture.
- * @type Number
- * @property screenY
- */
-/**
- * The last x axis direction of the pointer.
- * @type Number
- * @property xDirection
- */
-/**
- * The last y axis direction of the pointer.
- * @type Number
- * @property yDirection
- */
-/**
- * A shared object between all tracking events.
- * @type Object
- * @property trackInfo
- */
-/**
- * The element currently under the pointer.
- * @type Element
- * @property relatedTarget
- */
-/**
- * The type of pointer that make the track gesture.
- * @type String
- * @property pointerType
- */
-/**
- *
- * This event fires for all pointer movement being tracked.
- *
- * @class track
- * @extends trackstart
- */
-/**
- * This event fires when the pointer is no longer being tracked.
- *
- * @class trackend
- * @extends trackstart
- */
-
- (function(scope) {
-   var dispatcher = scope.dispatcher;
-   var eventFactory = scope.eventFactory;
-   var pointermap = new scope.PointerMap();
-   var track = {
-     events: [
-       'down',
-       'move',
-       'up',
-     ],
-     exposes: [
-      'trackstart',
-      'track',
-      'trackx',
-      'tracky',
-      'trackend'
-     ],
-     defaultActions: {
-       'track': 'none',
-       'trackx': 'pan-y',
-       'tracky': 'pan-x'
-     },
-     WIGGLE_THRESHOLD: 4,
-     clampDir: function(inDelta) {
-       return inDelta > 0 ? 1 : -1;
-     },
-     calcPositionDelta: function(inA, inB) {
-       var x = 0, y = 0;
-       if (inA && inB) {
-         x = inB.pageX - inA.pageX;
-         y = inB.pageY - inA.pageY;
-       }
-       return {x: x, y: y};
-     },
-     fireTrack: function(inType, inEvent, inTrackingData) {
-       var t = inTrackingData;
-       var d = this.calcPositionDelta(t.downEvent, inEvent);
-       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
-       if (dd.x) {
-         t.xDirection = this.clampDir(dd.x);
-       } else if (inType === 'trackx') {
-         return;
-       }
-       if (dd.y) {
-         t.yDirection = this.clampDir(dd.y);
-       } else if (inType === 'tracky') {
-         return;
-       }
-       var gestureProto = {
-         bubbles: true,
-         cancelable: true,
-         trackInfo: t.trackInfo,
-         relatedTarget: inEvent.relatedTarget,
-         pointerType: inEvent.pointerType,
-         pointerId: inEvent.pointerId,
-         _source: 'track'
-       };
-       if (inType !== 'tracky') {
-         gestureProto.x = inEvent.x;
-         gestureProto.dx = d.x;
-         gestureProto.ddx = dd.x;
-         gestureProto.clientX = inEvent.clientX;
-         gestureProto.pageX = inEvent.pageX;
-         gestureProto.screenX = inEvent.screenX;
-         gestureProto.xDirection = t.xDirection;
-       }
-       if (inType !== 'trackx') {
-         gestureProto.dy = d.y;
-         gestureProto.ddy = dd.y;
-         gestureProto.y = inEvent.y;
-         gestureProto.clientY = inEvent.clientY;
-         gestureProto.pageY = inEvent.pageY;
-         gestureProto.screenY = inEvent.screenY;
-         gestureProto.yDirection = t.yDirection;
-       }
-       var e = eventFactory.makeGestureEvent(inType, gestureProto);
-       t.downTarget.dispatchEvent(e);
-     },
-     down: function(inEvent) {
-       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {
-         var p = {
-           downEvent: inEvent,
-           downTarget: inEvent.target,
-           trackInfo: {},
-           lastMoveEvent: null,
-           xDirection: 0,
-           yDirection: 0,
-           tracking: false
-         };
-         pointermap.set(inEvent.pointerId, p);
-       }
-     },
-     move: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (!p.tracking) {
-           var d = this.calcPositionDelta(p.downEvent, inEvent);
-           var move = d.x * d.x + d.y * d.y;
-           // start tracking only if finger moves more than WIGGLE_THRESHOLD
-           if (move > this.WIGGLE_THRESHOLD) {
-             p.tracking = true;
-             p.lastMoveEvent = p.downEvent;
-             this.fireTrack('trackstart', inEvent, p);
-           }
-         }
-         if (p.tracking) {
-           this.fireTrack('track', inEvent, p);
-           this.fireTrack('trackx', inEvent, p);
-           this.fireTrack('tracky', inEvent, p);
-         }
-         p.lastMoveEvent = inEvent;
-       }
-     },
-     up: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (p.tracking) {
-           this.fireTrack('trackend', inEvent, p);
-         }
-         pointermap.delete(inEvent.pointerId);
-       }
-     }
-   };
-   dispatcher.registerGesture('track', track);
- })(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * This event is fired when a pointer is held down for 200ms.
- *
- * @module PointerGestures
- * @submodule Events
- * @class hold
- */
-/**
- * Type of pointer that made the holding event.
- * @type String
- * @property pointerType
- */
-/**
- * Screen X axis position of the held pointer
- * @type Number
- * @property clientX
- */
-/**
- * Screen Y axis position of the held pointer
- * @type Number
- * @property clientY
- */
-/**
- * Type of pointer that made the holding event.
- * @type String
- * @property pointerType
- */
-/**
- * This event is fired every 200ms while a pointer is held down.
- *
- * @class holdpulse
- * @extends hold
- */
-/**
- * Milliseconds pointer has been held down.
- * @type Number
- * @property holdTime
- */
-/**
- * This event is fired when a held pointer is released or moved.
- *
- * @class release
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var eventFactory = scope.eventFactory;
-  var hold = {
-    // wait at least HOLD_DELAY ms between hold and pulse events
-    HOLD_DELAY: 200,
-    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold
-    WIGGLE_THRESHOLD: 16,
-    events: [
-      'down',
-      'move',
-      'up',
-    ],
-    exposes: [
-      'hold',
-      'holdpulse',
-      'release'
-    ],
-    heldPointer: null,
-    holdJob: null,
-    pulse: function() {
-      var hold = Date.now() - this.heldPointer.timeStamp;
-      var type = this.held ? 'holdpulse' : 'hold';
-      this.fireHold(type, hold);
-      this.held = true;
-    },
-    cancel: function() {
-      clearInterval(this.holdJob);
-      if (this.held) {
-        this.fireHold('release');
-      }
-      this.held = false;
-      this.heldPointer = null;
-      this.target = null;
-      this.holdJob = null;
-    },
-    down: function(inEvent) {
-      if (inEvent.isPrimary && !this.heldPointer) {
-        this.heldPointer = inEvent;
-        this.target = inEvent.target;
-        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
-      }
-    },
-    up: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        this.cancel();
-      }
-    },
-    move: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        var x = inEvent.clientX - this.heldPointer.clientX;
-        var y = inEvent.clientY - this.heldPointer.clientY;
-        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {
-          this.cancel();
-        }
-      }
-    },
-    fireHold: function(inType, inHoldTime) {
-      var p = {
-        bubbles: true,
-        cancelable: true,
-        pointerType: this.heldPointer.pointerType,
-        pointerId: this.heldPointer.pointerId,
-        x: this.heldPointer.clientX,
-        y: this.heldPointer.clientY,
-        _source: 'hold'
-      };
-      if (inHoldTime) {
-        p.holdTime = inHoldTime;
-      }
-      var e = eventFactory.makeGestureEvent(inType, p);
-      this.target.dispatchEvent(e);
-    }
-  };
-  dispatcher.registerGesture('hold', hold);
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * This event is fired when a pointer quickly goes down and up, and is used to
- * denote activation.
- *
- * Any gesture event can prevent the tap event from being created by calling
- * `event.preventTap`.
- *
- * Any pointer event can prevent the tap by setting the `tapPrevented` property
- * on itself.
- *
- * @module PointerGestures
- * @submodule Events
- * @class tap
- */
-/**
- * X axis position of the tap.
- * @property x
- * @type Number
- */
-/**
- * Y axis position of the tap.
- * @property y
- * @type Number
- */
-/**
- * Type of the pointer that made the tap.
- * @property pointerType
- * @type String
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var eventFactory = scope.eventFactory;
-  var pointermap = new scope.PointerMap();
-  var tap = {
-    events: [
-      'down',
-      'up'
-    ],
-    exposes: [
-      'tap'
-    ],
-    down: function(inEvent) {
-      if (inEvent.isPrimary && !inEvent.tapPrevented) {
-        pointermap.set(inEvent.pointerId, {
-          target: inEvent.target,
-          buttons: inEvent.buttons,
-          x: inEvent.clientX,
-          y: inEvent.clientY
-        });
-      }
-    },
-    shouldTap: function(e, downState) {
-      if (e.pointerType === 'mouse') {
-        // only allow left click to tap for mouse
-        return downState.buttons === 1;
-      }
-      return !e.tapPrevented;
-    },
-    up: function(inEvent) {
-      var start = pointermap.get(inEvent.pointerId);
-      if (start && this.shouldTap(inEvent, start)) {
-        // up.relatedTarget is target currently under finger
-        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);
-        if (t) {
-          var e = eventFactory.makeGestureEvent('tap', {
-            bubbles: true,
-            cancelable: true,
-            x: inEvent.clientX,
-            y: inEvent.clientY,
-            detail: inEvent.detail,
-            pointerType: inEvent.pointerType,
-            pointerId: inEvent.pointerId,
-            altKey: inEvent.altKey,
-            ctrlKey: inEvent.ctrlKey,
-            metaKey: inEvent.metaKey,
-            shiftKey: inEvent.shiftKey,
-            _source: 'tap'
-          });
-          t.dispatchEvent(e);
-        }
-      }
-      pointermap.delete(inEvent.pointerId);
-    }
-  };
-  // patch eventFactory to remove id from tap's pointermap for preventTap calls
-  eventFactory.preventTap = function(e) {
-    return function() {
-      e.tapPrevented = true;
-      pointermap.delete(e.pointerId);
-    };
-  };
-  dispatcher.registerGesture('tap', tap);
-})(window.PolymerGestures);
-
-/*
-  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-(function (global) {
-    'use strict';
-
-    var Token,
-        TokenName,
-        Syntax,
-        Messages,
-        source,
-        index,
-        length,
-        delegate,
-        lookahead,
-        state;
-
-    Token = {
-        BooleanLiteral: 1,
-        EOF: 2,
-        Identifier: 3,
-        Keyword: 4,
-        NullLiteral: 5,
-        NumericLiteral: 6,
-        Punctuator: 7,
-        StringLiteral: 8
-    };
-
-    TokenName = {};
-    TokenName[Token.BooleanLiteral] = 'Boolean';
-    TokenName[Token.EOF] = '<end>';
-    TokenName[Token.Identifier] = 'Identifier';
-    TokenName[Token.Keyword] = 'Keyword';
-    TokenName[Token.NullLiteral] = 'Null';
-    TokenName[Token.NumericLiteral] = 'Numeric';
-    TokenName[Token.Punctuator] = 'Punctuator';
-    TokenName[Token.StringLiteral] = 'String';
-
-    Syntax = {
-        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'
-    };
-
-    // Error messages should be identical to V8.
-    Messages = {
-        UnexpectedToken:  'Unexpected token %0',
-        UnknownLabel: 'Undefined label \'%0\'',
-        Redeclaration: '%0 \'%1\' has already been declared'
-    };
-
-    // Ensure the condition is true, otherwise throw an error.
-    // This is only to have a better contract semantic, i.e. another safety net
-    // to catch a logic error. The condition shall be fulfilled in normal case.
-    // Do NOT use this to enforce a certain condition on any user input.
-
-    function assert(condition, message) {
-        if (!condition) {
-            throw new Error('ASSERT: ' + message);
-        }
-    }
-
-    function isDecimalDigit(ch) {
-        return (ch >= 48 && ch <= 57);   // 0..9
-    }
-
-
-    // 7.2 White Space
-
-    function isWhiteSpace(ch) {
-        return (ch === 32) ||  // space
-            (ch === 9) ||      // tab
-            (ch === 0xB) ||
-            (ch === 0xC) ||
-            (ch === 0xA0) ||
-            (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);
-    }
-
-    // 7.3 Line Terminators
-
-    function isLineTerminator(ch) {
-        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);
-    }
-
-    // 7.6 Identifier Names and Identifiers
-
-    function isIdentifierStart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122);          // a..z
-    }
-
-    function isIdentifierPart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122) ||        // a..z
-            (ch >= 48 && ch <= 57);           // 0..9
-    }
-
-    // 7.6.1.1 Keywords
-
-    function isKeyword(id) {
-        return (id === 'this')
-    }
-
-    // 7.4 Comments
-
-    function skipWhitespace() {
-        while (index < length && isWhiteSpace(source.charCodeAt(index))) {
-           ++index;
-        }
-    }
-
-    function getIdentifier() {
-        var start, ch;
-
-        start = index++;
-        while (index < length) {
-            ch = source.charCodeAt(index);
-            if (isIdentifierPart(ch)) {
-                ++index;
-            } else {
-                break;
-            }
-        }
-
-        return source.slice(start, index);
-    }
-
-    function scanIdentifier() {
-        var start, id, type;
-
-        start = index;
-
-        id = getIdentifier();
-
-        // There is no keyword or literal with only one character.
-        // Thus, it must be an identifier.
-        if (id.length === 1) {
-            type = Token.Identifier;
-        } else if (isKeyword(id)) {
-            type = Token.Keyword;
-        } else if (id === 'null') {
-            type = Token.NullLiteral;
-        } else if (id === 'true' || id === 'false') {
-            type = Token.BooleanLiteral;
-        } else {
-            type = Token.Identifier;
-        }
-
-        return {
-            type: type,
-            value: id,
-            range: [start, index]
-        };
-    }
-
-
-    // 7.7 Punctuators
-
-    function scanPunctuator() {
-        var start = index,
-            code = source.charCodeAt(index),
-            code2,
-            ch1 = source[index],
-            ch2;
-
-        switch (code) {
-
-        // Check for most common single-character punctuators.
-        case 46:   // . dot
-        case 40:   // ( open bracket
-        case 41:   // ) close bracket
-        case 59:   // ; semicolon
-        case 44:   // , comma
-        case 123:  // { open curly brace
-        case 125:  // } close curly brace
-        case 91:   // [
-        case 93:   // ]
-        case 58:   // :
-        case 63:   // ?
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: String.fromCharCode(code),
-                range: [start, index]
-            };
-
-        default:
-            code2 = source.charCodeAt(index + 1);
-
-            // '=' (char #61) marks an assignment or comparison operator.
-            if (code2 === 61) {
-                switch (code) {
-                case 37:  // %
-                case 38:  // &
-                case 42:  // *:
-                case 43:  // +
-                case 45:  // -
-                case 47:  // /
-                case 60:  // <
-                case 62:  // >
-                case 124: // |
-                    index += 2;
-                    return {
-                        type: Token.Punctuator,
-                        value: String.fromCharCode(code) + String.fromCharCode(code2),
-                        range: [start, index]
-                    };
-
-                case 33: // !
-                case 61: // =
-                    index += 2;
-
-                    // !== and ===
-                    if (source.charCodeAt(index) === 61) {
-                        ++index;
-                    }
-                    return {
-                        type: Token.Punctuator,
-                        value: source.slice(start, index),
-                        range: [start, index]
-                    };
-                default:
-                    break;
-                }
-            }
-            break;
-        }
-
-        // Peek more characters.
-
-        ch2 = source[index + 1];
-
-        // Other 2-character punctuators: && ||
-
-        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
-            index += 2;
-            return {
-                type: Token.Punctuator,
-                value: ch1 + ch2,
-                range: [start, index]
-            };
-        }
-
-        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: ch1,
-                range: [start, index]
-            };
-        }
-
-        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-    }
-
-    // 7.8.3 Numeric Literals
-    function scanNumericLiteral() {
-        var number, start, ch;
-
-        ch = source[index];
-        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
-            'Numeric literal must start with a decimal digit or a decimal point');
-
-        start = index;
-        number = '';
-        if (ch !== '.') {
-            number = source[index++];
-            ch = source[index];
-
-            // Hex number starts with '0x'.
-            // Octal number starts with '0'.
-            if (number === '0') {
-                // decimal number starts with '0' such as '09' is illegal.
-                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
-                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                }
-            }
-
-            while (isDecimalDigit(source.charCodeAt(index))) {
-                number += source[index++];
-            }
-            ch = source[index];
-        }
-
-        if (ch === '.') {
-            number += source[index++];
-            while (isDecimalDigit(source.charCodeAt(index))) {
-                number += source[index++];
-            }
-            ch = source[index];
-        }
-
-        if (ch === 'e' || ch === 'E') {
-            number += source[index++];
-
-            ch = source[index];
-            if (ch === '+' || ch === '-') {
-                number += source[index++];
-            }
-            if (isDecimalDigit(source.charCodeAt(index))) {
-                while (isDecimalDigit(source.charCodeAt(index))) {
-                    number += source[index++];
-                }
-            } else {
-                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-            }
-        }
-
-        if (isIdentifierStart(source.charCodeAt(index))) {
-            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-        }
-
-        return {
-            type: Token.NumericLiteral,
-            value: parseFloat(number),
-            range: [start, index]
-        };
-    }
-
-    // 7.8.4 String Literals
-
-    function scanStringLiteral() {
-        var str = '', quote, start, ch, octal = false;
-
-        quote = source[index];
-        assert((quote === '\'' || quote === '"'),
-            'String literal must starts with a quote');
-
-        start = index;
-        ++index;
-
-        while (index < length) {
-            ch = source[index++];
-
-            if (ch === quote) {
-                quote = '';
-                break;
-            } else if (ch === '\\') {
-                ch = source[index++];
-                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
-                    switch (ch) {
-                    case 'n':
-                        str += '\n';
-                        break;
-                    case 'r':
-                        str += '\r';
-                        break;
-                    case 't':
-                        str += '\t';
-                        break;
-                    case 'b':
-                        str += '\b';
-                        break;
-                    case 'f':
-                        str += '\f';
-                        break;
-                    case 'v':
-                        str += '\x0B';
-                        break;
-
-                    default:
-                        str += ch;
-                        break;
-                    }
-                } else {
-                    if (ch ===  '\r' && source[index] === '\n') {
-                        ++index;
-                    }
-                }
-            } else if (isLineTerminator(ch.charCodeAt(0))) {
-                break;
-            } else {
-                str += ch;
-            }
-        }
-
-        if (quote !== '') {
-            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-        }
-
-        return {
-            type: Token.StringLiteral,
-            value: str,
-            octal: octal,
-            range: [start, index]
-        };
-    }
-
-    function isIdentifierName(token) {
-        return token.type === Token.Identifier ||
-            token.type === Token.Keyword ||
-            token.type === Token.BooleanLiteral ||
-            token.type === Token.NullLiteral;
-    }
-
-    function advance() {
-        var ch;
-
-        skipWhitespace();
-
-        if (index >= length) {
-            return {
-                type: Token.EOF,
-                range: [index, index]
-            };
-        }
-
-        ch = source.charCodeAt(index);
-
-        // Very common: ( and ) and ;
-        if (ch === 40 || ch === 41 || ch === 58) {
-            return scanPunctuator();
-        }
-
-        // String literal starts with single quote (#39) or double quote (#34).
-        if (ch === 39 || ch === 34) {
-            return scanStringLiteral();
-        }
-
-        if (isIdentifierStart(ch)) {
-            return scanIdentifier();
-        }
-
-        // Dot (.) char #46 can also start a floating-point number, hence the need
-        // to check the next character.
-        if (ch === 46) {
-            if (isDecimalDigit(source.charCodeAt(index + 1))) {
-                return scanNumericLiteral();
-            }
-            return scanPunctuator();
-        }
-
-        if (isDecimalDigit(ch)) {
-            return scanNumericLiteral();
-        }
-
-        return scanPunctuator();
-    }
-
-    function lex() {
-        var token;
-
-        token = lookahead;
-        index = token.range[1];
-
-        lookahead = advance();
-
-        index = token.range[1];
-
-        return token;
-    }
-
-    function peek() {
-        var pos;
-
-        pos = index;
-        lookahead = advance();
-        index = pos;
-    }
-
-    // Throw an exception
-
-    function throwError(token, messageFormat) {
-        var error,
-            args = Array.prototype.slice.call(arguments, 2),
-            msg = messageFormat.replace(
-                /%(\d)/g,
-                function (whole, index) {
-                    assert(index < args.length, 'Message reference must be in range');
-                    return args[index];
-                }
-            );
-
-        error = new Error(msg);
-        error.index = index;
-        error.description = msg;
-        throw error;
-    }
-
-    // Throw an exception because of the token.
-
-    function throwUnexpected(token) {
-        throwError(token, Messages.UnexpectedToken, token.value);
-    }
-
-    // Expect the next token to match the specified punctuator.
-    // If not, an exception will be thrown.
-
-    function expect(value) {
-        var token = lex();
-        if (token.type !== Token.Punctuator || token.value !== value) {
-            throwUnexpected(token);
-        }
-    }
-
-    // Return true if the next token matches the specified punctuator.
-
-    function match(value) {
-        return lookahead.type === Token.Punctuator && lookahead.value === value;
-    }
-
-    // Return true if the next token matches the specified keyword
-
-    function matchKeyword(keyword) {
-        return lookahead.type === Token.Keyword && lookahead.value === keyword;
-    }
-
-    function consumeSemicolon() {
-        // Catch the very common case first: immediately a semicolon (char #59).
-        if (source.charCodeAt(index) === 59) {
-            lex();
-            return;
-        }
-
-        skipWhitespace();
-
-        if (match(';')) {
-            lex();
-            return;
-        }
-
-        if (lookahead.type !== Token.EOF && !match('}')) {
-            throwUnexpected(lookahead);
-        }
-    }
-
-    // 11.1.4 Array Initialiser
-
-    function parseArrayInitialiser() {
-        var elements = [];
-
-        expect('[');
-
-        while (!match(']')) {
-            if (match(',')) {
-                lex();
-                elements.push(null);
-            } else {
-                elements.push(parseExpression());
-
-                if (!match(']')) {
-                    expect(',');
-                }
-            }
-        }
-
-        expect(']');
-
-        return delegate.createArrayExpression(elements);
-    }
-
-    // 11.1.5 Object Initialiser
-
-    function parseObjectPropertyKey() {
-        var token;
-
-        skipWhitespace();
-        token = lex();
-
-        // Note: This function is called only from parseObjectProperty(), where
-        // EOF and Punctuator tokens are already filtered out.
-        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
-            return delegate.createLiteral(token);
-        }
-
-        return delegate.createIdentifier(token.value);
-    }
-
-    function parseObjectProperty() {
-        var token, key;
-
-        token = lookahead;
-        skipWhitespace();
-
-        if (token.type === Token.EOF || token.type === Token.Punctuator) {
-            throwUnexpected(token);
-        }
-
-        key = parseObjectPropertyKey();
-        expect(':');
-        return delegate.createProperty('init', key, parseExpression());
-    }
-
-    function parseObjectInitialiser() {
-        var properties = [];
-
-        expect('{');
-
-        while (!match('}')) {
-            properties.push(parseObjectProperty());
-
-            if (!match('}')) {
-                expect(',');
-            }
-        }
-
-        expect('}');
-
-        return delegate.createObjectExpression(properties);
-    }
-
-    // 11.1.6 The Grouping Operator
-
-    function parseGroupExpression() {
-        var expr;
-
-        expect('(');
-
-        expr = parseExpression();
-
-        expect(')');
-
-        return expr;
-    }
-
-
-    // 11.1 Primary Expressions
-
-    function parsePrimaryExpression() {
-        var type, token, expr;
-
-        if (match('(')) {
-            return parseGroupExpression();
-        }
-
-        type = lookahead.type;
-
-        if (type === Token.Identifier) {
-            expr = delegate.createIdentifier(lex().value);
-        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
-            expr = delegate.createLiteral(lex());
-        } else if (type === Token.Keyword) {
-            if (matchKeyword('this')) {
-                lex();
-                expr = delegate.createThisExpression();
-            }
-        } else if (type === Token.BooleanLiteral) {
-            token = lex();
-            token.value = (token.value === 'true');
-            expr = delegate.createLiteral(token);
-        } else if (type === Token.NullLiteral) {
-            token = lex();
-            token.value = null;
-            expr = delegate.createLiteral(token);
-        } else if (match('[')) {
-            expr = parseArrayInitialiser();
-        } else if (match('{')) {
-            expr = parseObjectInitialiser();
-        }
-
-        if (expr) {
-            return expr;
-        }
-
-        throwUnexpected(lex());
-    }
-
-    // 11.2 Left-Hand-Side Expressions
-
-    function parseArguments() {
-        var args = [];
-
-        expect('(');
-
-        if (!match(')')) {
-            while (index < length) {
-                args.push(parseExpression());
-                if (match(')')) {
-                    break;
-                }
-                expect(',');
-            }
-        }
-
-        expect(')');
-
-        return args;
-    }
-
-    function parseNonComputedProperty() {
-        var token;
-
-        token = lex();
-
-        if (!isIdentifierName(token)) {
-            throwUnexpected(token);
-        }
-
-        return delegate.createIdentifier(token.value);
-    }
-
-    function parseNonComputedMember() {
-        expect('.');
-
-        return parseNonComputedProperty();
-    }
-
-    function parseComputedMember() {
-        var expr;
-
-        expect('[');
-
-        expr = parseExpression();
-
-        expect(']');
-
-        return expr;
-    }
-
-    function parseLeftHandSideExpression() {
-        var expr, args, property;
-
-        expr = parsePrimaryExpression();
-
-        while (true) {
-            if (match('[')) {
-                property = parseComputedMember();
-                expr = delegate.createMemberExpression('[', expr, property);
-            } else if (match('.')) {
-                property = parseNonComputedMember();
-                expr = delegate.createMemberExpression('.', expr, property);
-            } else if (match('(')) {
-                args = parseArguments();
-                expr = delegate.createCallExpression(expr, args);
-            } else {
-                break;
-            }
-        }
-
-        return expr;
-    }
-
-    // 11.3 Postfix Expressions
-
-    var parsePostfixExpression = parseLeftHandSideExpression;
-
-    // 11.4 Unary Operators
-
-    function parseUnaryExpression() {
-        var token, expr;
-
-        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
-            expr = parsePostfixExpression();
-        } else if (match('+') || match('-') || match('!')) {
-            token = lex();
-            expr = parseUnaryExpression();
-            expr = delegate.createUnaryExpression(token.value, expr);
-        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
-            throwError({}, Messages.UnexpectedToken);
-        } else {
-            expr = parsePostfixExpression();
-        }
-
-        return expr;
-    }
-
-    function binaryPrecedence(token) {
-        var prec = 0;
-
-        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
-            return 0;
-        }
-
-        switch (token.value) {
-        case '||':
-            prec = 1;
-            break;
-
-        case '&&':
-            prec = 2;
-            break;
-
-        case '==':
-        case '!=':
-        case '===':
-        case '!==':
-            prec = 6;
-            break;
-
-        case '<':
-        case '>':
-        case '<=':
-        case '>=':
-        case 'instanceof':
-            prec = 7;
-            break;
-
-        case 'in':
-            prec = 7;
-            break;
-
-        case '+':
-        case '-':
-            prec = 9;
-            break;
-
-        case '*':
-        case '/':
-        case '%':
-            prec = 11;
-            break;
-
-        default:
-            break;
-        }
-
-        return prec;
-    }
-
-    // 11.5 Multiplicative Operators
-    // 11.6 Additive Operators
-    // 11.7 Bitwise Shift Operators
-    // 11.8 Relational Operators
-    // 11.9 Equality Operators
-    // 11.10 Binary Bitwise Operators
-    // 11.11 Binary Logical Operators
-
-    function parseBinaryExpression() {
-        var expr, token, prec, stack, right, operator, left, i;
-
-        left = parseUnaryExpression();
-
-        token = lookahead;
-        prec = binaryPrecedence(token);
-        if (prec === 0) {
-            return left;
-        }
-        token.prec = prec;
-        lex();
-
-        right = parseUnaryExpression();
-
-        stack = [left, token, right];
-
-        while ((prec = binaryPrecedence(lookahead)) > 0) {
-
-            // Reduce: make a binary expression from the three topmost entries.
-            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
-                right = stack.pop();
-                operator = stack.pop().value;
-                left = stack.pop();
-                expr = delegate.createBinaryExpression(operator, left, right);
-                stack.push(expr);
-            }
-
-            // Shift.
-            token = lex();
-            token.prec = prec;
-            stack.push(token);
-            expr = parseUnaryExpression();
-            stack.push(expr);
-        }
-
-        // Final reduce to clean-up the stack.
-        i = stack.length - 1;
-        expr = stack[i];
-        while (i > 1) {
-            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
-            i -= 2;
-        }
-
-        return expr;
-    }
-
-
-    // 11.12 Conditional Operator
-
-    function parseConditionalExpression() {
-        var expr, consequent, alternate;
-
-        expr = parseBinaryExpression();
-
-        if (match('?')) {
-            lex();
-            consequent = parseConditionalExpression();
-            expect(':');
-            alternate = parseConditionalExpression();
-
-            expr = delegate.createConditionalExpression(expr, consequent, alternate);
-        }
-
-        return expr;
-    }
-
-    // Simplification since we do not support AssignmentExpression.
-    var parseExpression = parseConditionalExpression;
-
-    // Polymer Syntax extensions
-
-    // Filter ::
-    //   Identifier
-    //   Identifier "(" ")"
-    //   Identifier "(" FilterArguments ")"
-
-    function parseFilter() {
-        var identifier, args;
-
-        identifier = lex();
-
-        if (identifier.type !== Token.Identifier) {
-            throwUnexpected(identifier);
-        }
-
-        args = match('(') ? parseArguments() : [];
-
-        return delegate.createFilter(identifier.value, args);
-    }
-
-    // Filters ::
-    //   "|" Filter
-    //   Filters "|" Filter
-
-    function parseFilters() {
-        while (match('|')) {
-            lex();
-            parseFilter();
-        }
-    }
-
-    // TopLevel ::
-    //   LabelledExpressions
-    //   AsExpression
-    //   InExpression
-    //   FilterExpression
-
-    // AsExpression ::
-    //   FilterExpression as Identifier
-
-    // InExpression ::
-    //   Identifier, Identifier in FilterExpression
-    //   Identifier in FilterExpression
-
-    // FilterExpression ::
-    //   Expression
-    //   Expression Filters
-
-    function parseTopLevel() {
-        skipWhitespace();
-        peek();
-
-        var expr = parseExpression();
-        if (expr) {
-            if (lookahead.value === ',' || lookahead.value == 'in' &&
-                       expr.type === Syntax.Identifier) {
-                parseInExpression(expr);
-            } else {
-                parseFilters();
-                if (lookahead.value === 'as') {
-                    parseAsExpression(expr);
-                } else {
-                    delegate.createTopLevel(expr);
-                }
-            }
-        }
-
-        if (lookahead.type !== Token.EOF) {
-            throwUnexpected(lookahead);
-        }
-    }
-
-    function parseAsExpression(expr) {
-        lex();  // as
-        var identifier = lex().value;
-        delegate.createAsExpression(expr, identifier);
-    }
-
-    function parseInExpression(identifier) {
-        var indexName;
-        if (lookahead.value === ',') {
-            lex();
-            if (lookahead.type !== Token.Identifier)
-                throwUnexpected(lookahead);
-            indexName = lex().value;
-        }
-
-        lex();  // in
-        var expr = parseExpression();
-        parseFilters();
-        delegate.createInExpression(identifier.name, indexName, expr);
-    }
-
-    function parse(code, inDelegate) {
-        delegate = inDelegate;
-        source = code;
-        index = 0;
-        length = source.length;
-        lookahead = null;
-        state = {
-            labelSet: {}
-        };
-
-        return parseTopLevel();
-    }
-
-    global.esprima = {
-        parse: parse
-    };
-})(this);
-
-// 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';
-
-  function prepareBinding(expressionText, name, node, filterRegistry) {
-    var expression;
-    try {
-      expression = getExpression(expressionText);
-      if (expression.scopeIdent &&
-          (node.nodeType !== Node.ELEMENT_NODE ||
-           node.tagName !== 'TEMPLATE' ||
-           (name !== 'bind' && name !== 'repeat'))) {
-        throw Error('as and in can only be used within <template bind/repeat>');
-      }
-    } catch (ex) {
-      console.error('Invalid expression syntax: ' + expressionText, ex);
-      return;
-    }
-
-    return function(model, node, oneTime) {
-      var binding = expression.getBinding(model, filterRegistry, oneTime);
-      if (expression.scopeIdent && binding) {
-        node.polymerExpressionScopeIdent_ = expression.scopeIdent;
-        if (expression.indexIdent)
-          node.polymerExpressionIndexIdent_ = expression.indexIdent;
-      }
-
-      return binding;
-    }
-  }
-
-  // TODO(rafaelw): Implement simple LRU.
-  var expressionParseCache = Object.create(null);
-
-  function getExpression(expressionText) {
-    var expression = expressionParseCache[expressionText];
-    if (!expression) {
-      var delegate = new ASTDelegate();
-      esprima.parse(expressionText, delegate);
-      expression = new Expression(delegate);
-      expressionParseCache[expressionText] = expression;
-    }
-    return expression;
-  }
-
-  function Literal(value) {
-    this.value = value;
-    this.valueFn_ = undefined;
-  }
-
-  Literal.prototype = {
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var value = this.value;
-        this.valueFn_ = function() {
-          return value;
-        }
-      }
-
-      return this.valueFn_;
-    }
-  }
-
-  function IdentPath(name) {
-    this.name = name;
-    this.path = Path.get(name);
-  }
-
-  IdentPath.prototype = {
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var name = this.name;
-        var path = this.path;
-        this.valueFn_ = function(model, observer) {
-          if (observer)
-            observer.addPath(model, path);
-
-          return path.getValueFrom(model);
-        }
-      }
-
-      return this.valueFn_;
-    },
-
-    setValue: function(model, newValue) {
-      if (this.path.length == 1);
-        model = findScope(model, this.path[0]);
-
-      return this.path.setValueFrom(model, newValue);
-    }
-  };
-
-  function MemberExpression(object, property, accessor) {
-    this.computed = accessor == '[';
-
-    this.dynamicDeps = typeof object == 'function' ||
-                       object.dynamicDeps ||
-                       (this.computed && !(property instanceof Literal));
-
-    this.simplePath =
-        !this.dynamicDeps &&
-        (property instanceof IdentPath || property instanceof Literal) &&
-        (object instanceof MemberExpression || object instanceof IdentPath);
-
-    this.object = this.simplePath ? object : getFn(object);
-    this.property = !this.computed || this.simplePath ?
-        property : getFn(property);
-  }
-
-  MemberExpression.prototype = {
-    get fullPath() {
-      if (!this.fullPath_) {
-
-        var parts = this.object instanceof MemberExpression ?
-            this.object.fullPath.slice() : [this.object.name];
-        parts.push(this.property instanceof IdentPath ?
-            this.property.name : this.property.value);
-        this.fullPath_ = Path.get(parts);
-      }
-
-      return this.fullPath_;
-    },
-
-    valueFn: function() {
-      if (!this.valueFn_) {
-        var object = this.object;
-
-        if (this.simplePath) {
-          var path = this.fullPath;
-
-          this.valueFn_ = function(model, observer) {
-            if (observer)
-              observer.addPath(model, path);
-
-            return path.getValueFrom(model);
-          };
-        } else if (!this.computed) {
-          var path = Path.get(this.property.name);
-
-          this.valueFn_ = function(model, observer, filterRegistry) {
-            var context = object(model, observer, filterRegistry);
-
-            if (observer)
-              observer.addPath(context, path);
-
-            return path.getValueFrom(context);
-          }
-        } else {
-          // Computed property.
-          var property = this.property;
-
-          this.valueFn_ = function(model, observer, filterRegistry) {
-            var context = object(model, observer, filterRegistry);
-            var propName = property(model, observer, filterRegistry);
-            if (observer)
-              observer.addPath(context, [propName]);
-
-            return context ? context[propName] : undefined;
-          };
-        }
-      }
-      return this.valueFn_;
-    },
-
-    setValue: function(model, newValue) {
-      if (this.simplePath) {
-        this.fullPath.setValueFrom(model, newValue);
-        return newValue;
-      }
-
-      var object = this.object(model);
-      var propName = this.property instanceof IdentPath ? this.property.name :
-          this.property(model);
-      return object[propName] = newValue;
-    }
-  };
-
-  function Filter(name, args) {
-    this.name = name;
-    this.args = [];
-    for (var i = 0; i < args.length; i++) {
-      this.args[i] = getFn(args[i]);
-    }
-  }
-
-  Filter.prototype = {
-    transform: function(model, observer, filterRegistry, toModelDirection,
-                        initialArgs) {
-      var fn = filterRegistry[this.name];
-      var context = model;
-      if (fn) {
-        context = undefined;
-      } else {
-        fn = context[this.name];
-        if (!fn) {
-          console.error('Cannot find function or filter: ' + this.name);
-          return;
-        }
-      }
-
-      // If toModelDirection is falsey, then the "normal" (dom-bound) direction
-      // is used. Otherwise, it looks for a 'toModel' property function on the
-      // object.
-      if (toModelDirection) {
-        fn = fn.toModel;
-      } else if (typeof fn.toDOM == 'function') {
-        fn = fn.toDOM;
-      }
-
-      if (typeof fn != 'function') {
-        console.error('Cannot find function or filter: ' + this.name);
-        return;
-      }
-
-      var args = initialArgs || [];
-      for (var i = 0; i < this.args.length; i++) {
-        args.push(getFn(this.args[i])(model, observer, filterRegistry));
-      }
-
-      return fn.apply(context, args);
-    }
-  };
-
-  function notImplemented() { throw Error('Not Implemented'); }
-
-  var unaryOperators = {
-    '+': function(v) { return +v; },
-    '-': function(v) { return -v; },
-    '!': function(v) { return !v; }
-  };
-
-  var binaryOperators = {
-    '+': function(l, r) { return l+r; },
-    '-': function(l, r) { return l-r; },
-    '*': function(l, r) { return l*r; },
-    '/': function(l, r) { return l/r; },
-    '%': function(l, r) { return l%r; },
-    '<': function(l, r) { return l<r; },
-    '>': function(l, r) { return l>r; },
-    '<=': function(l, r) { return l<=r; },
-    '>=': function(l, r) { return l>=r; },
-    '==': function(l, r) { return l==r; },
-    '!=': function(l, r) { return l!=r; },
-    '===': function(l, r) { return l===r; },
-    '!==': function(l, r) { return l!==r; },
-    '&&': function(l, r) { return l&&r; },
-    '||': function(l, r) { return l||r; },
-  };
-
-  function getFn(arg) {
-    return typeof arg == 'function' ? arg : arg.valueFn();
-  }
-
-  function ASTDelegate() {
-    this.expression = null;
-    this.filters = [];
-    this.deps = {};
-    this.currentPath = undefined;
-    this.scopeIdent = undefined;
-    this.indexIdent = undefined;
-    this.dynamicDeps = false;
-  }
-
-  ASTDelegate.prototype = {
-    createUnaryExpression: function(op, argument) {
-      if (!unaryOperators[op])
-        throw Error('Disallowed operator: ' + op);
-
-      argument = getFn(argument);
-
-      return function(model, observer, filterRegistry) {
-        return unaryOperators[op](argument(model, observer, filterRegistry));
-      };
-    },
-
-    createBinaryExpression: function(op, left, right) {
-      if (!binaryOperators[op])
-        throw Error('Disallowed operator: ' + op);
-
-      left = getFn(left);
-      right = getFn(right);
-
-      switch (op) {
-        case '||':
-          this.dynamicDeps = true;
-          return function(model, observer, filterRegistry) {
-            return left(model, observer, filterRegistry) ||
-                right(model, observer, filterRegistry);
-          };
-        case '&&':
-          this.dynamicDeps = true;
-          return function(model, observer, filterRegistry) {
-            return left(model, observer, filterRegistry) &&
-                right(model, observer, filterRegistry);
-          };
-      }
-
-      return function(model, observer, filterRegistry) {
-        return binaryOperators[op](left(model, observer, filterRegistry),
-                                   right(model, observer, filterRegistry));
-      };
-    },
-
-    createConditionalExpression: function(test, consequent, alternate) {
-      test = getFn(test);
-      consequent = getFn(consequent);
-      alternate = getFn(alternate);
-
-      this.dynamicDeps = true;
-
-      return function(model, observer, filterRegistry) {
-        return test(model, observer, filterRegistry) ?
-            consequent(model, observer, filterRegistry) :
-            alternate(model, observer, filterRegistry);
-      }
-    },
-
-    createIdentifier: function(name) {
-      var ident = new IdentPath(name);
-      ident.type = 'Identifier';
-      return ident;
-    },
-
-    createMemberExpression: function(accessor, object, property) {
-      var ex = new MemberExpression(object, property, accessor);
-      if (ex.dynamicDeps)
-        this.dynamicDeps = true;
-      return ex;
-    },
-
-    createCallExpression: function(expression, args) {
-      if (!(expression instanceof IdentPath))
-        throw Error('Only identifier function invocations are allowed');
-
-      var filter = new Filter(expression.name, args);
-
-      return function(model, observer, filterRegistry) {
-        return filter.transform(model, observer, filterRegistry, false);
-      };
-    },
-
-    createLiteral: function(token) {
-      return new Literal(token.value);
-    },
-
-    createArrayExpression: function(elements) {
-      for (var i = 0; i < elements.length; i++)
-        elements[i] = getFn(elements[i]);
-
-      return function(model, observer, filterRegistry) {
-        var arr = []
-        for (var i = 0; i < elements.length; i++)
-          arr.push(elements[i](model, observer, filterRegistry));
-        return arr;
-      }
-    },
-
-    createProperty: function(kind, key, value) {
-      return {
-        key: key instanceof IdentPath ? key.name : key.value,
-        value: value
-      };
-    },
-
-    createObjectExpression: function(properties) {
-      for (var i = 0; i < properties.length; i++)
-        properties[i].value = getFn(properties[i].value);
-
-      return function(model, observer, filterRegistry) {
-        var obj = {};
-        for (var i = 0; i < properties.length; i++)
-          obj[properties[i].key] =
-              properties[i].value(model, observer, filterRegistry);
-        return obj;
-      }
-    },
-
-    createFilter: function(name, args) {
-      this.filters.push(new Filter(name, args));
-    },
-
-    createAsExpression: function(expression, scopeIdent) {
-      this.expression = expression;
-      this.scopeIdent = scopeIdent;
-    },
-
-    createInExpression: function(scopeIdent, indexIdent, expression) {
-      this.expression = expression;
-      this.scopeIdent = scopeIdent;
-      this.indexIdent = indexIdent;
-    },
-
-    createTopLevel: function(expression) {
-      this.expression = expression;
-    },
-
-    createThisExpression: notImplemented
-  }
-
-  function ConstantObservable(value) {
-    this.value_ = value;
-  }
-
-  ConstantObservable.prototype = {
-    open: function() { return this.value_; },
-    discardChanges: function() { return this.value_; },
-    deliver: function() {},
-    close: function() {},
-  }
-
-  function Expression(delegate) {
-    this.scopeIdent = delegate.scopeIdent;
-    this.indexIdent = delegate.indexIdent;
-
-    if (!delegate.expression)
-      throw Error('No expression found.');
-
-    this.expression = delegate.expression;
-    getFn(this.expression); // forces enumeration of path dependencies
-
-    this.filters = delegate.filters;
-    this.dynamicDeps = delegate.dynamicDeps;
-  }
-
-  Expression.prototype = {
-    getBinding: function(model, filterRegistry, oneTime) {
-      if (oneTime)
-        return this.getValue(model, undefined, filterRegistry);
-
-      var observer = new CompoundObserver();
-      // captures deps.
-      var firstValue = this.getValue(model, observer, filterRegistry);
-      var firstTime = true;
-      var self = this;
-
-      function valueFn() {
-        // deps cannot have changed on first value retrieval.
-        if (firstTime) {
-          firstTime = false;
-          return firstValue;
-        }
-
-        if (self.dynamicDeps)
-          observer.startReset();
-
-        var value = self.getValue(model,
-                                  self.dynamicDeps ? observer : undefined,
-                                  filterRegistry);
-        if (self.dynamicDeps)
-          observer.finishReset();
-
-        return value;
-      }
-
-      function setValueFn(newValue) {
-        self.setValue(model, newValue, filterRegistry);
-        return newValue;
-      }
-
-      return new ObserverTransform(observer, valueFn, setValueFn, true);
-    },
-
-    getValue: function(model, observer, filterRegistry) {
-      var value = getFn(this.expression)(model, observer, filterRegistry);
-      for (var i = 0; i < this.filters.length; i++) {
-        value = this.filters[i].transform(model, observer, filterRegistry,
-            false, [value]);
-      }
-
-      return value;
-    },
-
-    setValue: function(model, newValue, filterRegistry) {
-      var count = this.filters ? this.filters.length : 0;
-      while (count-- > 0) {
-        newValue = this.filters[count].transform(model, undefined,
-            filterRegistry, true, [newValue]);
-      }
-
-      if (this.expression.setValue)
-        return this.expression.setValue(model, newValue);
-    }
-  }
-
-  /**
-   * Converts a style property name to a css property name. For example:
-   * "WebkitUserSelect" to "-webkit-user-select"
-   */
-  function convertStylePropertyName(name) {
-    return String(name).replace(/[A-Z]/g, function(c) {
-      return '-' + c.toLowerCase();
-    });
-  }
-
-  var parentScopeName = '@' + Math.random().toString(36).slice(2);
-
-  // Single ident paths must bind directly to the appropriate scope object.
-  // I.e. Pushed values in two-bindings need to be assigned to the actual model
-  // object.
-  function findScope(model, prop) {
-    while (model[parentScopeName] &&
-           !Object.prototype.hasOwnProperty.call(model, prop)) {
-      model = model[parentScopeName];
-    }
-
-    return model;
-  }
-
-  function isLiteralExpression(pathString) {
-    switch (pathString) {
-      case '':
-        return false;
-
-      case 'false':
-      case 'null':
-      case 'true':
-        return true;
-    }
-
-    if (!isNaN(Number(pathString)))
-      return true;
-
-    return false;
-  };
-
-  function PolymerExpressions() {}
-
-  PolymerExpressions.prototype = {
-    // "built-in" filters
-    styleObject: function(value) {
-      var parts = [];
-      for (var key in value) {
-        parts.push(convertStylePropertyName(key) + ': ' + value[key]);
-      }
-      return parts.join('; ');
-    },
-
-    tokenList: function(value) {
-      var tokens = [];
-      for (var key in value) {
-        if (value[key])
-          tokens.push(key);
-      }
-      return tokens.join(' ');
-    },
-
-    // binding delegate API
-    prepareInstancePositionChanged: function(template) {
-      var indexIdent = template.polymerExpressionIndexIdent_;
-      if (!indexIdent)
-        return;
-
-      return function(templateInstance, index) {
-        templateInstance.model[indexIdent] = index;
-      };
-    },
-
-    prepareBinding: function(pathString, name, node) {
-      var path = Path.get(pathString);
-
-      if (!isLiteralExpression(pathString) && path.valid) {
-        if (path.length == 1) {
-          return function(model, node, oneTime) {
-            if (oneTime)
-              return path.getValueFrom(model);
-
-            var scope = findScope(model, path[0]);
-            return new PathObserver(scope, path);
-          };
-        }
-        return; // bail out early if pathString is simple path.
-      }
-
-      return prepareBinding(pathString, name, node, this);
-    },
-
-    prepareInstanceModel: function(template) {
-      var scopeName = template.polymerExpressionScopeIdent_;
-      if (!scopeName)
-        return;
-
-      var parentScope = template.templateInstance ?
-          template.templateInstance.model :
-          template.model;
-
-      var indexName = template.polymerExpressionIndexIdent_;
-
-      return function(model) {
-        return createScopeObject(parentScope, model, scopeName, indexName);
-      };
-    }
-  };
-
-  var createScopeObject = ('__proto__' in {}) ?
-    function(parentScope, model, scopeName, indexName) {
-      var scope = {};
-      scope[scopeName] = model;
-      scope[indexName] = undefined;
-      scope[parentScopeName] = parentScope;
-      scope.__proto__ = parentScope;
-      return scope;
-    } :
-    function(parentScope, model, scopeName, indexName) {
-      var scope = Object.create(parentScope);
-      Object.defineProperty(scope, scopeName,
-          { value: model, configurable: true, writable: true });
-      Object.defineProperty(scope, indexName,
-          { value: undefined, configurable: true, writable: true });
-      Object.defineProperty(scope, parentScopeName,
-          { value: parentScope, configurable: true, writable: true });
-      return scope;
-    };
-
-  global.PolymerExpressions = PolymerExpressions;
-  PolymerExpressions.getExpression = getExpression;
-})(this);
-
-/*
- * 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
- */
-Polymer = {
-  version: '0.4.2-8c339cf'
-};
-
-/*
- * 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
- */
-
-// TODO(sorvell): this ensures Polymer is an object and not a function
-// Platform is currently defining it as a function to allow for async loading
-// of polymer; once we refine the loading process this likely goes away.
-if (typeof window.Polymer === 'function') {
-  Polymer = {};
-}
-
-
-/*
- * 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
- */
-
- /*
-	On supported platforms, platform.js is not needed. To retain compatibility
-	with the polyfills, we stub out minimal functionality.
- */
-if (!window.Platform) {
-  logFlags = window.logFlags || {};
-
-
-  Platform = {
-  	flush: function() {}
-  };
-
-  CustomElements = {
-  	useNative: true,
-    ready: true,
-    takeRecords: function() {},
-    instanceof: function(obj, base) {
-      return obj instanceof base;
-    }
-  };
-  
-  HTMLImports = {
-  	useNative: true
-  };
-
-  
-  addEventListener('HTMLImportsLoaded', function() {
-    document.dispatchEvent(
-      new CustomEvent('WebComponentsReady', {bubbles: true})
-    );
-  });
-
-
-  // ShadowDOM
-  ShadowDOMPolyfill = null;
-  wrap = unwrap = function(n){
-    return n;
-  };
-
-}
-
-/*

- * 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) {

-

-var IMPORT_LINK_TYPE = 'import';

-var hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));

-var useNative = hasNative;

-var isIE = /Trident/.test(navigator.userAgent);

-

-// TODO(sorvell): SD polyfill intrusion

-var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);

-var wrap = function(node) {

-  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;

-};

-

-var rootDocument = wrap(document);

-    

-// NOTE: We cannot polyfill document.currentScript because it's not possible

-// both to override and maintain the ability to capture the native value;

-// therefore we choose to expose _currentScript both when native imports

-// and the polyfill are in use.

-var currentScriptDescriptor = {

-  get: function() {

-    var script = HTMLImports.currentScript || document.currentScript ||

-        // NOTE: only works when called in synchronously executing code.

-        // readyState should check if `loading` but IE10 is 

-        // interactive when scripts run so we cheat.

-        (document.readyState !== 'complete' ? 

-        document.scripts[document.scripts.length - 1] : null);

-    return wrap(script);

-  },

-  configurable: true

-};

-

-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);

-Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor);

-

-// call a callback when all HTMLImports in the document at call (or at least

-//  document ready) time have loaded.

-// 1. ensure the document is in a ready state (has dom), then 

-// 2. watch for loading of imports and call callback when done

-function whenReady(callback, doc) {

-  doc = doc || rootDocument;

-  // if document is loading, wait and try again

-  whenDocumentReady(function() {

-    watchImportsLoad(callback, doc);

-  }, doc);

-}

-

-// call the callback when the document is in a ready state (has dom)

-var requiredReadyState = isIE ? 'complete' : 'interactive';

-var READY_EVENT = 'readystatechange';

-function isDocumentReady(doc) {

-  return (doc.readyState === 'complete' ||

-      doc.readyState === requiredReadyState);

-}

-

-// call <callback> when we ensure the document is in a ready state

-function whenDocumentReady(callback, doc) {

-  if (!isDocumentReady(doc)) {

-    var checkReady = function() {

-      if (doc.readyState === 'complete' || 

-          doc.readyState === requiredReadyState) {

-        doc.removeEventListener(READY_EVENT, checkReady);

-        whenDocumentReady(callback, doc);

-      }

-    };

-    doc.addEventListener(READY_EVENT, checkReady);

-  } else if (callback) {

-    callback();

-  }

-}

-

-function markTargetLoaded(event) {

-  event.target.__loaded = true;

-}

-

-// call <callback> when we ensure all imports have loaded

-function watchImportsLoad(callback, doc) {

-  var imports = doc.querySelectorAll('link[rel=import]');

-  var loaded = 0, l = imports.length;

-  function checkDone(d) { 

-    if ((loaded == l) && callback) {

-       callback();

-    }

-  }

-  function loadedImport(e) {

-    markTargetLoaded(e);

-    loaded++;

-    checkDone();

-  }

-  if (l) {

-    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {

-      if (isImportLoaded(imp)) {

-        loadedImport.call(imp, {target: imp});

-      } else {

-        imp.addEventListener('load', loadedImport);

-        imp.addEventListener('error', loadedImport);

-      }

-    }

-  } else {

-    checkDone();

-  }

-}

-

-// 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.import && link.import.readyState !== 'loading') :

-      link.__importParsed;

-}

-

-// TODO(sorvell): Workaround for 

-// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when

-// this bug is addressed.

-// (1) Install a mutation observer to see when HTMLImports have loaded

-// (2) if this script is run during document load it will watch any existing

-// imports for loading.

-//

-// NOTE: The workaround has restricted functionality: (1) it's only compatible

-// with imports that are added to document.head since the mutation observer 

-// watches only head for perf reasons, (2) it requires this script

-// to run before any imports have completed loading.

-if (useNative) {

-  new MutationObserver(function(mxns) {

-    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {

-      if (m.addedNodes) {

-        handleImports(m.addedNodes);

-      }

-    }

-  }).observe(document.head, {childList: true});

-

-  function handleImports(nodes) {

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

-      if (isImport(n)) {

-        handleImport(n);  

-      }

-    }

-  }

-

-  function isImport(element) {

-    return element.localName === 'link' && element.rel === 'import';

-  }

-

-  function handleImport(element) {

-    var loaded = element.import;

-    if (loaded) {

-      markTargetLoaded({target: element});

-    } else {

-      element.addEventListener('load', markTargetLoaded);

-      element.addEventListener('error', markTargetLoaded);

-    }

-  }

-

-  // make sure to catch any imports that are in the process of loading

-  // when this script is run.

-  (function() {

-    if (document.readyState === 'loading') {

-      var imports = document.querySelectorAll('link[rel=import]');

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

-        handleImport(imp);

-      }

-    }

-  })();

-

-}

-

-// Fire the 'HTMLImportsLoaded' event when imports in document at load time 

-// have loaded. This event is required to simulate the script blocking 

-// behavior of native imports. A main document script that needs to be sure

-// imports have loaded should wait for this event.

-whenReady(function() {

-  HTMLImports.ready = true;

-  HTMLImports.readyTime = new Date().getTime();

-  rootDocument.dispatchEvent(

-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})

-  );

-});

-

-// exports

-scope.useNative = useNative;

-scope.isImportLoaded = isImportLoaded;

-scope.whenReady = whenReady;

-scope.rootDocument = rootDocument;

-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;

-scope.isIE = isIE;

-

-})(window.HTMLImports);
-/*
- * 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) {
-
-  function withDependencies(task, depends) {
-    depends = depends || [];
-    if (!depends.map) {
-      depends = [depends];
-    }
-    return task.apply(this, depends.map(marshal));
-  }
-
-  function module(name, dependsOrFactory, moduleFactory) {
-    var module;
-    switch (arguments.length) {
-      case 0:
-        return;
-      case 1:
-        module = null;
-        break;
-      case 2:
-        // dependsOrFactory is `factory` in this case
-        module = dependsOrFactory.apply(this);
-        break;
-      default:
-        // dependsOrFactory is `depends` in this case
-        module = withDependencies(moduleFactory, dependsOrFactory);
-        break;
-    }
-    modules[name] = module;
-  };
-
-  function marshal(name) {
-    return modules[name];
-  }
-
-  var modules = {};
-
-  function using(depends, task) {
-    HTMLImports.whenImportsReady(function() {
-      withDependencies(task, depends);
-    });
-  };
-
-  // exports
-
-  scope.marshal = marshal;
-  // `module` confuses commonjs detectors
-  scope.modularize = module;
-  scope.using = using;
-
-})(window);
-
-/*
- * 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) {
-
-  // TODO(sorvell): 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.
-  var style = document.createElement('style');
-  style.textContent = ''
-      + 'body {'
-      + 'transition: opacity ease-in 0.2s;' 
-      + ' } \n'
-      + 'body[unresolved] {'
-      + 'opacity: 0; display: block; overflow: hidden;' 
-      + ' } \n'
-      ;
-  var head = document.querySelector('head');
-  head.insertBefore(style, head.firstChild);
-
-})(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(global) {
-  'use strict';
-
-  var testingExposeCycleCount = global.testingExposeCycleCount;
-
-  // Detect and do basic sanity checking on Object/Array.observe.
-  function detectObjectObserve() {
-    if (typeof Object.observe !== 'function' ||
-        typeof Array.observe !== 'function') {
-      return false;
-    }
-
-    var records = [];
-
-    function callback(recs) {
-      records = recs;
-    }
-
-    var test = {};
-    var arr = [];
-    Object.observe(test, callback);
-    Array.observe(arr, callback);
-    test.id = 1;
-    test.id = 2;
-    delete test.id;
-    arr.push(1, 2);
-    arr.length = 0;
-
-    Object.deliverChangeRecords(callback);
-    if (records.length !== 5)
-      return false;
-
-    if (records[0].type != 'add' ||
-        records[1].type != 'update' ||
-        records[2].type != 'delete' ||
-        records[3].type != 'splice' ||
-        records[4].type != 'splice') {
-      return false;
-    }
-
-    Object.unobserve(test, callback);
-    Array.unobserve(arr, callback);
-
-    return true;
-  }
-
-  var hasObserve = detectObjectObserve();
-
-  function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-
-    // 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 (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
-      return false;
-    }
-
-    try {
-      var f = new Function('', 'return true;');
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-
-  var hasEval = detectEval();
-
-  function isIndex(s) {
-    return +s === s >>> 0 && s !== '';
-  }
-
-  function toNumber(s) {
-    return +s;
-  }
-
-  function isObject(obj) {
-    return obj === Object(obj);
-  }
-
-  var numberIsNaN = global.Number.isNaN || function(value) {
-    return typeof value === 'number' && global.isNaN(value);
-  }
-
-  function areSameValue(left, right) {
-    if (left === right)
-      return left !== 0 || 1 / left === 1 / right;
-    if (numberIsNaN(left) && numberIsNaN(right))
-      return true;
-
-    return left !== left && right !== right;
-  }
-
-  var createObject = ('__proto__' in {}) ?
-    function(obj) { return obj; } :
-    function(obj) {
-      var proto = obj.__proto__;
-      if (!proto)
-        return obj;
-      var newObject = Object.create(proto);
-      Object.getOwnPropertyNames(obj).forEach(function(name) {
-        Object.defineProperty(newObject, name,
-                             Object.getOwnPropertyDescriptor(obj, name));
-      });
-      return newObject;
-    };
-
-  var identStart = '[\$_a-zA-Z]';
-  var identPart = '[\$_a-zA-Z0-9]';
-  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
-
-  function getPathCharType(char) {
-    if (char === undefined)
-      return 'eof';
-
-    var code = char.charCodeAt(0);
-
-    switch(code) {
-      case 0x5B: // [
-      case 0x5D: // ]
-      case 0x2E: // .
-      case 0x22: // "
-      case 0x27: // '
-      case 0x30: // 0
-        return char;
-
-      case 0x5F: // _
-      case 0x24: // $
-        return 'ident';
-
-      case 0x20: // Space
-      case 0x09: // Tab
-      case 0x0A: // Newline
-      case 0x0D: // Return
-      case 0xA0:  // No-break space
-      case 0xFEFF:  // Byte Order Mark
-      case 0x2028:  // Line Separator
-      case 0x2029:  // Paragraph Separator
-        return 'ws';
-    }
-
-    // a-z, A-Z
-    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
-      return 'ident';
-
-    // 1-9
-    if (0x31 <= code && code <= 0x39)
-      return 'number';
-
-    return 'else';
-  }
-
-  var 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']
-    }
-  }
-
-  function noop() {}
-
-  function parsePath(path) {
-    var keys = [];
-    var index = -1;
-    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
-
-    var actions = {
-      push: function() {
-        if (key === undefined)
-          return;
-
-        keys.push(key);
-        key = undefined;
-      },
-
-      append: function() {
-        if (key === undefined)
-          key = newChar
-        else
-          key += newChar;
-      }
-    };
-
-    function maybeUnescapeQuote() {
-      if (index >= path.length)
-        return;
-
-      var nextChar = path[index + 1];
-      if ((mode == 'inSingleQuote' && nextChar == "'") ||
-          (mode == 'inDoubleQuote' && nextChar == '"')) {
-        index++;
-        newChar = nextChar;
-        actions.append();
-        return true;
-      }
-    }
-
-    while (mode) {
-      index++;
-      c = path[index];
-
-      if (c == '\\' && maybeUnescapeQuote(mode))
-        continue;
-
-      type = getPathCharType(c);
-      typeMap = pathStateMachine[mode];
-      transition = typeMap[type] || typeMap['else'] || 'error';
-
-      if (transition == 'error')
-        return; // parse error;
-
-      mode = transition[0];
-      action = actions[transition[1]] || noop;
-      newChar = transition[2] === undefined ? c : transition[2];
-      action();
-
-      if (mode === 'afterPath') {
-        return keys;
-      }
-    }
-
-    return; // parse error
-  }
-
-  function isIdent(s) {
-    return identRegExp.test(s);
-  }
-
-  var constructorIsPrivate = {};
-
-  function Path(parts, privateToken) {
-    if (privateToken !== constructorIsPrivate)
-      throw Error('Use Path.get to retrieve path objects');
-
-    for (var i = 0; i < parts.length; i++) {
-      this.push(String(parts[i]));
-    }
-
-    if (hasEval && this.length) {
-      this.getValueFrom = this.compiledGetValueFromFn();
-    }
-  }
-
-  // TODO(rafaelw): Make simple LRU cache
-  var pathCache = {};
-
-  function getPath(pathString) {
-    if (pathString instanceof Path)
-      return pathString;
-
-    if (pathString == null || pathString.length == 0)
-      pathString = '';
-
-    if (typeof pathString != 'string') {
-      if (isIndex(pathString.length)) {
-        // Constructed with array-like (pre-parsed) keys
-        return new Path(pathString, constructorIsPrivate);
-      }
-
-      pathString = String(pathString);
-    }
-
-    var path = pathCache[pathString];
-    if (path)
-      return path;
-
-    var parts = parsePath(pathString);
-    if (!parts)
-      return invalidPath;
-
-    var path = new Path(parts, constructorIsPrivate);
-    pathCache[pathString] = path;
-    return path;
-  }
-
-  Path.get = getPath;
-
-  function formatAccessor(key) {
-    if (isIndex(key)) {
-      return '[' + key + ']';
-    } else {
-      return '["' + key.replace(/"/g, '\\"') + '"]';
-    }
-  }
-
-  Path.prototype = createObject({
-    __proto__: [],
-    valid: true,
-
-    toString: function() {
-      var pathString = '';
-      for (var i = 0; i < this.length; i++) {
-        var key = this[i];
-        if (isIdent(key)) {
-          pathString += i ? '.' + key : key;
-        } else {
-          pathString += formatAccessor(key);
-        }
-      }
-
-      return pathString;
-    },
-
-    getValueFrom: function(obj, directObserver) {
-      for (var i = 0; i < this.length; i++) {
-        if (obj == null)
-          return;
-        obj = obj[this[i]];
-      }
-      return obj;
-    },
-
-    iterateObjects: function(obj, observe) {
-      for (var i = 0; i < this.length; i++) {
-        if (i)
-          obj = obj[this[i - 1]];
-        if (!isObject(obj))
-          return;
-        observe(obj, this[0]);
-      }
-    },
-
-    compiledGetValueFromFn: function() {
-      var str = '';
-      var pathString = 'obj';
-      str += 'if (obj != null';
-      var i = 0;
-      var key;
-      for (; i < (this.length - 1); i++) {
-        key = this[i];
-        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-        str += ' &&\n     ' + pathString + ' != null';
-      }
-      str += ')\n';
-
-      var key = this[i];
-      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-
-      str += '  return ' + pathString + ';\nelse\n  return undefined;';
-      return new Function('obj', str);
-    },
-
-    setValueFrom: function(obj, value) {
-      if (!this.length)
-        return false;
-
-      for (var i = 0; i < this.length - 1; i++) {
-        if (!isObject(obj))
-          return false;
-        obj = obj[this[i]];
-      }
-
-      if (!isObject(obj))
-        return false;
-
-      obj[this[i]] = value;
-      return true;
-    }
-  });
-
-  var invalidPath = new Path('', constructorIsPrivate);
-  invalidPath.valid = false;
-  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
-
-  var MAX_DIRTY_CHECK_CYCLES = 1000;
-
-  function dirtyCheck(observer) {
-    var cycles = 0;
-    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
-      cycles++;
-    }
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    return cycles > 0;
-  }
-
-  function objectIsEmpty(object) {
-    for (var prop in object)
-      return false;
-    return true;
-  }
-
-  function diffIsEmpty(diff) {
-    return objectIsEmpty(diff.added) &&
-           objectIsEmpty(diff.removed) &&
-           objectIsEmpty(diff.changed);
-  }
-
-  function diffObjectFromOldObject(object, oldObject) {
-    var added = {};
-    var removed = {};
-    var changed = {};
-
-    for (var prop in oldObject) {
-      var newValue = object[prop];
-
-      if (newValue !== undefined && newValue === oldObject[prop])
-        continue;
-
-      if (!(prop in object)) {
-        removed[prop] = undefined;
-        continue;
-      }
-
-      if (newValue !== oldObject[prop])
-        changed[prop] = newValue;
-    }
-
-    for (var prop in object) {
-      if (prop in oldObject)
-        continue;
-
-      added[prop] = object[prop];
-    }
-
-    if (Array.isArray(object) && object.length !== oldObject.length)
-      changed.length = object.length;
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  var eomTasks = [];
-  function runEOMTasks() {
-    if (!eomTasks.length)
-      return false;
-
-    for (var i = 0; i < eomTasks.length; i++) {
-      eomTasks[i]();
-    }
-    eomTasks.length = 0;
-    return true;
-  }
-
-  var runEOM = hasObserve ? (function(){
-    var eomObj = { pingPong: true };
-    var eomRunScheduled = false;
-
-    Object.observe(eomObj, function() {
-      runEOMTasks();
-      eomRunScheduled = false;
-    });
-
-    return function(fn) {
-      eomTasks.push(fn);
-      if (!eomRunScheduled) {
-        eomRunScheduled = true;
-        eomObj.pingPong = !eomObj.pingPong;
-      }
-    };
-  })() :
-  (function() {
-    return function(fn) {
-      eomTasks.push(fn);
-    };
-  })();
-
-  var observedObjectCache = [];
-
-  function newObservedObject() {
-    var observer;
-    var object;
-    var discardRecords = false;
-    var first = true;
-
-    function callback(records) {
-      if (observer && observer.state_ === OPENED && !discardRecords)
-        observer.check_(records);
-    }
-
-    return {
-      open: function(obs) {
-        if (observer)
-          throw Error('ObservedObject in use');
-
-        if (!first)
-          Object.deliverChangeRecords(callback);
-
-        observer = obs;
-        first = false;
-      },
-      observe: function(obj, arrayObserve) {
-        object = obj;
-        if (arrayObserve)
-          Array.observe(object, callback);
-        else
-          Object.observe(object, callback);
-      },
-      deliver: function(discard) {
-        discardRecords = discard;
-        Object.deliverChangeRecords(callback);
-        discardRecords = false;
-      },
-      close: function() {
-        observer = undefined;
-        Object.unobserve(object, callback);
-        observedObjectCache.push(this);
-      }
-    };
-  }
-
-  /*
-   * The observedSet abstraction is a perf optimization which reduces the total
-   * number of Object.observe observations of a set of objects. The idea is that
-   * groups of Observers will have some object dependencies in common and this
-   * observed set ensures that each object in the transitive closure of
-   * dependencies is only observed once. The observedSet acts as a write barrier
-   * such that whenever any change comes through, all Observers are checked for
-   * changed values.
-   *
-   * Note that this optimization is explicitly moving work from setup-time to
-   * change-time.
-   *
-   * TODO(rafaelw): Implement "garbage collection". In order to move work off
-   * the critical path, when Observers are closed, their observed objects are
-   * not Object.unobserve(d). As a result, it's possible that if the observedSet
-   * is kept open, but some Observers have been closed, it could cause "leaks"
-   * (prevent otherwise collectable objects from being collected). At some
-   * point, we should implement incremental "gc" which keeps a list of
-   * observedSets which may need clean-up and does small amounts of cleanup on a
-   * timeout until all is clean.
-   */
-
-  function getObservedObject(observer, object, arrayObserve) {
-    var dir = observedObjectCache.pop() || newObservedObject();
-    dir.open(observer);
-    dir.observe(object, arrayObserve);
-    return dir;
-  }
-
-  var observedSetCache = [];
-
-  function newObservedSet() {
-    var observerCount = 0;
-    var observers = [];
-    var objects = [];
-    var rootObj;
-    var rootObjProps;
-
-    function observe(obj, prop) {
-      if (!obj)
-        return;
-
-      if (obj === rootObj)
-        rootObjProps[prop] = true;
-
-      if (objects.indexOf(obj) < 0) {
-        objects.push(obj);
-        Object.observe(obj, callback);
-      }
-
-      observe(Object.getPrototypeOf(obj), prop);
-    }
-
-    function allRootObjNonObservedProps(recs) {
-      for (var i = 0; i < recs.length; i++) {
-        var rec = recs[i];
-        if (rec.object !== rootObj ||
-            rootObjProps[rec.name] ||
-            rec.type === 'setPrototype') {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    function callback(recs) {
-      if (allRootObjNonObservedProps(recs))
-        return;
-
-      var observer;
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.iterateObjects_(observe);
-        }
-      }
-
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.check_();
-        }
-      }
-    }
-
-    var record = {
-      object: undefined,
-      objects: objects,
-      open: function(obs, object) {
-        if (!rootObj) {
-          rootObj = object;
-          rootObjProps = {};
-        }
-
-        observers.push(obs);
-        observerCount++;
-        obs.iterateObjects_(observe);
-      },
-      close: function(obs) {
-        observerCount--;
-        if (observerCount > 0) {
-          return;
-        }
-
-        for (var i = 0; i < objects.length; i++) {
-          Object.unobserve(objects[i], callback);
-          Observer.unobservedCount++;
-        }
-
-        observers.length = 0;
-        objects.length = 0;
-        rootObj = undefined;
-        rootObjProps = undefined;
-        observedSetCache.push(this);
-      }
-    };
-
-    return record;
-  }
-
-  var lastObservedSet;
-
-  function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
-      lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
-    }
-    lastObservedSet.open(observer, obj);
-    return lastObservedSet;
-  }
-
-  var UNOPENED = 0;
-  var OPENED = 1;
-  var CLOSED = 2;
-  var RESETTING = 3;
-
-  var nextObserverId = 1;
-
-  function Observer() {
-    this.state_ = UNOPENED;
-    this.callback_ = undefined;
-    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
-    this.directObserver_ = undefined;
-    this.value_ = undefined;
-    this.id_ = nextObserverId++;
-  }
-
-  Observer.prototype = {
-    open: function(callback, target) {
-      if (this.state_ != UNOPENED)
-        throw Error('Observer has already been opened.');
-
-      addToAll(this);
-      this.callback_ = callback;
-      this.target_ = target;
-      this.connect_();
-      this.state_ = OPENED;
-      return this.value_;
-    },
-
-    close: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      removeFromAll(this);
-      this.disconnect_();
-      this.value_ = undefined;
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.state_ = CLOSED;
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      dirtyCheck(this);
-    },
-
-    report_: function(changes) {
-      try {
-        this.callback_.apply(this.target_, changes);
-      } catch (ex) {
-        Observer._errorThrownDuringCallback = true;
-        console.error('Exception caught during observer callback: ' +
-                       (ex.stack || ex));
-      }
-    },
-
-    discardChanges: function() {
-      this.check_(undefined, true);
-      return this.value_;
-    }
-  }
-
-  var collectObservers = !hasObserve;
-  var allObservers;
-  Observer._allObserversCount = 0;
-
-  if (collectObservers) {
-    allObservers = [];
-  }
-
-  function addToAll(observer) {
-    Observer._allObserversCount++;
-    if (!collectObservers)
-      return;
-
-    allObservers.push(observer);
-  }
-
-  function removeFromAll(observer) {
-    Observer._allObserversCount--;
-  }
-
-  var runningMicrotaskCheckpoint = false;
-
-  global.Platform = global.Platform || {};
-
-  global.Platform.performMicrotaskCheckpoint = function() {
-    if (runningMicrotaskCheckpoint)
-      return;
-
-    if (!collectObservers)
-      return;
-
-    runningMicrotaskCheckpoint = true;
-
-    var cycles = 0;
-    var anyChanged, toCheck;
-
-    do {
-      cycles++;
-      toCheck = allObservers;
-      allObservers = [];
-      anyChanged = false;
-
-      for (var i = 0; i < toCheck.length; i++) {
-        var observer = toCheck[i];
-        if (observer.state_ != OPENED)
-          continue;
-
-        if (observer.check_())
-          anyChanged = true;
-
-        allObservers.push(observer);
-      }
-      if (runEOMTasks())
-        anyChanged = true;
-    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
-
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    runningMicrotaskCheckpoint = false;
-  };
-
-  if (collectObservers) {
-    global.Platform.clearObservers = function() {
-      allObservers = [];
-    };
-  }
-
-  function ObjectObserver(object) {
-    Observer.call(this);
-    this.value_ = object;
-    this.oldObject_ = undefined;
-  }
-
-  ObjectObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    arrayObserve: false,
-
-    connect_: function(callback, target) {
-      if (hasObserve) {
-        this.directObserver_ = getObservedObject(this, this.value_,
-                                                 this.arrayObserve);
-      } else {
-        this.oldObject_ = this.copyObject(this.value_);
-      }
-
-    },
-
-    copyObject: function(object) {
-      var copy = Array.isArray(object) ? [] : {};
-      for (var prop in object) {
-        copy[prop] = object[prop];
-      };
-      if (Array.isArray(object))
-        copy.length = object.length;
-      return copy;
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var diff;
-      var oldValues;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-
-        oldValues = {};
-        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
-                                           oldValues);
-      } else {
-        oldValues = this.oldObject_;
-        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
-      }
-
-      if (diffIsEmpty(diff))
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([
-        diff.added || {},
-        diff.removed || {},
-        diff.changed || {},
-        function(property) {
-          return oldValues[property];
-        }
-      ]);
-
-      return true;
-    },
-
-    disconnect_: function() {
-      if (hasObserve) {
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-      } else {
-        this.oldObject_ = undefined;
-      }
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      if (hasObserve)
-        this.directObserver_.deliver(false);
-      else
-        dirtyCheck(this);
-    },
-
-    discardChanges: function() {
-      if (this.directObserver_)
-        this.directObserver_.deliver(true);
-      else
-        this.oldObject_ = this.copyObject(this.value_);
-
-      return this.value_;
-    }
-  });
-
-  function ArrayObserver(array) {
-    if (!Array.isArray(array))
-      throw Error('Provided object is not an Array');
-    ObjectObserver.call(this, array);
-  }
-
-  ArrayObserver.prototype = createObject({
-
-    __proto__: ObjectObserver.prototype,
-
-    arrayObserve: true,
-
-    copyObject: function(arr) {
-      return arr.slice();
-    },
-
-    check_: function(changeRecords) {
-      var splices;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-        splices = projectArraySplices(this.value_, changeRecords);
-      } else {
-        splices = calcSplices(this.value_, 0, this.value_.length,
-                              this.oldObject_, 0, this.oldObject_.length);
-      }
-
-      if (!splices || !splices.length)
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([splices]);
-      return true;
-    }
-  });
-
-  ArrayObserver.applySplices = function(previous, current, splices) {
-    splices.forEach(function(splice) {
-      var spliceArgs = [splice.index, splice.removed.length];
-      var addIndex = splice.index;
-      while (addIndex < splice.index + splice.addedCount) {
-        spliceArgs.push(current[addIndex]);
-        addIndex++;
-      }
-
-      Array.prototype.splice.apply(previous, spliceArgs);
-    });
-  };
-
-  function PathObserver(object, path) {
-    Observer.call(this);
-
-    this.object_ = object;
-    this.path_ = getPath(path);
-    this.directObserver_ = undefined;
-  }
-
-  PathObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    get path() {
-      return this.path_;
-    },
-
-    connect_: function() {
-      if (hasObserve)
-        this.directObserver_ = getObservedSet(this, this.object_);
-
-      this.check_(undefined, true);
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    iterateObjects_: function(observe) {
-      this.path_.iterateObjects(this.object_, observe);
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValue = this.value_;
-      this.value_ = this.path_.getValueFrom(this.object_);
-      if (skipChanges || areSameValue(this.value_, oldValue))
-        return false;
-
-      this.report_([this.value_, oldValue, this]);
-      return true;
-    },
-
-    setValue: function(newValue) {
-      if (this.path_)
-        this.path_.setValueFrom(this.object_, newValue);
-    }
-  });
-
-  function CompoundObserver(reportChangesOnOpen) {
-    Observer.call(this);
-
-    this.reportChangesOnOpen_ = reportChangesOnOpen;
-    this.value_ = [];
-    this.directObserver_ = undefined;
-    this.observed_ = [];
-  }
-
-  var observerSentinel = {};
-
-  CompoundObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      if (hasObserve) {
-        var object;
-        var needsDirectObserver = false;
-        for (var i = 0; i < this.observed_.length; i += 2) {
-          object = this.observed_[i]
-          if (object !== observerSentinel) {
-            needsDirectObserver = true;
-            break;
-          }
-        }
-
-        if (needsDirectObserver)
-          this.directObserver_ = getObservedSet(this, object);
-      }
-
-      this.check_(undefined, !this.reportChangesOnOpen_);
-    },
-
-    disconnect_: function() {
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        if (this.observed_[i] === observerSentinel)
-          this.observed_[i + 1].close();
-      }
-      this.observed_.length = 0;
-      this.value_.length = 0;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    addPath: function(object, path) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add paths once started.');
-
-      var path = getPath(path);
-      this.observed_.push(object, path);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = path.getValueFrom(object);
-    },
-
-    addObserver: function(observer) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add observers once started.');
-
-      this.observed_.push(observerSentinel, observer);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = observer.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');
-      this.state_ = OPENED;
-      this.connect_();
-
-      return this.value_;
-    },
-
-    iterateObjects_: function(observe) {
-      var object;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        object = this.observed_[i]
-        if (object !== observerSentinel)
-          this.observed_[i + 1].iterateObjects(object, observe)
-      }
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValues;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        var object = this.observed_[i];
-        var path = this.observed_[i+1];
-        var value;
-        if (object === observerSentinel) {
-          var observable = path;
-          value = this.state_ === UNOPENED ?
-              observable.open(this.deliver, this) :
-              observable.discardChanges();
-        } else {
-          value = path.getValueFrom(object);
-        }
-
-        if (skipChanges) {
-          this.value_[i / 2] = value;
-          continue;
-        }
-
-        if (areSameValue(value, this.value_[i / 2]))
-          continue;
-
-        oldValues = oldValues || [];
-        oldValues[i / 2] = this.value_[i / 2];
-        this.value_[i / 2] = value;
-      }
-
-      if (!oldValues)
-        return false;
-
-      // TODO(rafaelw): Having observed_ as the third callback arg here is
-      // pretty lame API. Fix.
-      this.report_([this.value_, oldValues, this.observed_]);
-      return true;
-    }
-  });
-
-  function identFn(value) { return value; }
-
-  function ObserverTransform(observable, getValueFn, setValueFn,
-                             dontPassThroughSet) {
-    this.callback_ = undefined;
-    this.target_ = undefined;
-    this.value_ = undefined;
-    this.observable_ = observable;
-    this.getValueFn_ = getValueFn || identFn;
-    this.setValueFn_ = setValueFn || identFn;
-    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
-    // at the moment because of a bug in it's dependency tracking.
-    this.dontPassThroughSet_ = dontPassThroughSet;
-  }
-
-  ObserverTransform.prototype = {
-    open: function(callback, target) {
-      this.callback_ = callback;
-      this.target_ = target;
-      this.value_ =
-          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
-      return this.value_;
-    },
-
-    observedCallback_: function(value) {
-      value = this.getValueFn_(value);
-      if (areSameValue(value, this.value_))
-        return;
-      var oldValue = this.value_;
-      this.value_ = value;
-      this.callback_.call(this.target_, this.value_, oldValue);
-    },
-
-    discardChanges: function() {
-      this.value_ = this.getValueFn_(this.observable_.discardChanges());
-      return this.value_;
-    },
-
-    deliver: function() {
-      return this.observable_.deliver();
-    },
-
-    setValue: function(value) {
-      value = this.setValueFn_(value);
-      if (!this.dontPassThroughSet_ && this.observable_.setValue)
-        return this.observable_.setValue(value);
-    },
-
-    close: function() {
-      if (this.observable_)
-        this.observable_.close();
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.observable_ = undefined;
-      this.value_ = undefined;
-      this.getValueFn_ = undefined;
-      this.setValueFn_ = undefined;
-    }
-  }
-
-  var expectedRecordTypes = {
-    add: true,
-    update: true,
-    delete: true
-  };
-
-  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
-    var added = {};
-    var removed = {};
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      if (!expectedRecordTypes[record.type]) {
-        console.error('Unknown changeRecord type: ' + record.type);
-        console.error(record);
-        continue;
-      }
-
-      if (!(record.name in oldValues))
-        oldValues[record.name] = record.oldValue;
-
-      if (record.type == 'update')
-        continue;
-
-      if (record.type == 'add') {
-        if (record.name in removed)
-          delete removed[record.name];
-        else
-          added[record.name] = true;
-
-        continue;
-      }
-
-      // type = 'delete'
-      if (record.name in added) {
-        delete added[record.name];
-        delete oldValues[record.name];
-      } else {
-        removed[record.name] = true;
-      }
-    }
-
-    for (var prop in added)
-      added[prop] = object[prop];
-
-    for (var prop in removed)
-      removed[prop] = undefined;
-
-    var changed = {};
-    for (var prop in oldValues) {
-      if (prop in added || prop in removed)
-        continue;
-
-      var newValue = object[prop];
-      if (oldValues[prop] !== newValue)
-        changed[prop] = newValue;
-    }
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  function newSplice(index, removed, addedCount) {
-    return {
-      index: index,
-      removed: removed,
-      addedCount: addedCount
-    };
-  }
-
-  var EDIT_LEAVE = 0;
-  var EDIT_UPDATE = 1;
-  var EDIT_ADD = 2;
-  var EDIT_DELETE = 3;
-
-  function ArraySplice() {}
-
-  ArraySplice.prototype = {
-
-    // Note: This function is *based* on the computation of the Levenshtein
-    // "edit" distance. The one change is that "updates" are treated as two
-    // edits - not one. With Array splices, an update is really a delete
-    // followed by an add. By retaining this, we optimize for "keeping" the
-    // maximum array items in the original array. For example:
-    //
-    //   'xxxx123' -> '123yyyy'
-    //
-    // With 1-edit updates, the shortest path would be just to update all seven
-    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
-    // leaves the substring '123' intact.
-    calcEditDistances: function(current, currentStart, currentEnd,
-                                old, oldStart, oldEnd) {
-      // "Deletion" columns
-      var rowCount = oldEnd - oldStart + 1;
-      var columnCount = currentEnd - currentStart + 1;
-      var distances = new Array(rowCount);
-
-      // "Addition" rows. Initialize null column.
-      for (var i = 0; i < rowCount; i++) {
-        distances[i] = new Array(columnCount);
-        distances[i][0] = i;
-      }
-
-      // Initialize null row
-      for (var j = 0; j < columnCount; j++)
-        distances[0][j] = j;
-
-      for (var i = 1; i < rowCount; i++) {
-        for (var j = 1; j < columnCount; j++) {
-          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
-            distances[i][j] = distances[i - 1][j - 1];
-          else {
-            var north = distances[i - 1][j] + 1;
-            var west = distances[i][j - 1] + 1;
-            distances[i][j] = north < west ? north : west;
-          }
-        }
-      }
-
-      return distances;
-    },
-
-    // This starts at the final weight, and walks "backward" by finding
-    // the minimum previous weight recursively until the origin of the weight
-    // matrix.
-    spliceOperationsFromEditDistances: function(distances) {
-      var i = distances.length - 1;
-      var j = distances[0].length - 1;
-      var current = distances[i][j];
-      var edits = [];
-      while (i > 0 || j > 0) {
-        if (i == 0) {
-          edits.push(EDIT_ADD);
-          j--;
-          continue;
-        }
-        if (j == 0) {
-          edits.push(EDIT_DELETE);
-          i--;
-          continue;
-        }
-        var northWest = distances[i - 1][j - 1];
-        var west = distances[i - 1][j];
-        var north = distances[i][j - 1];
-
-        var min;
-        if (west < north)
-          min = west < northWest ? west : northWest;
-        else
-          min = north < northWest ? north : northWest;
-
-        if (min == northWest) {
-          if (northWest == current) {
-            edits.push(EDIT_LEAVE);
-          } else {
-            edits.push(EDIT_UPDATE);
-            current = northWest;
-          }
-          i--;
-          j--;
-        } else if (min == west) {
-          edits.push(EDIT_DELETE);
-          i--;
-          current = west;
-        } else {
-          edits.push(EDIT_ADD);
-          j--;
-          current = north;
-        }
-      }
-
-      edits.reverse();
-      return edits;
-    },
-
-    /**
-     * Splice Projection functions:
-     *
-     * A splice map is a representation of how a previous array of items
-     * was transformed into a new array of items. Conceptually it is a list of
-     * tuples of
-     *
-     *   <index, removed, addedCount>
-     *
-     * which are kept in ascending index order of. The tuple represents that at
-     * the |index|, |removed| sequence of items were removed, and counting forward
-     * from |index|, |addedCount| items were added.
-     */
-
-    /**
-     * Lacking individual splice mutation information, the minimal set of
-     * splices can be synthesized given the previous state and final state of an
-     * array. The basic approach is to calculate the edit distance matrix and
-     * choose the shortest path through it.
-     *
-     * Complexity: O(l * p)
-     *   l: The length of the current array
-     *   p: The length of the old array
-     */
-    calcSplices: function(current, currentStart, currentEnd,
-                          old, oldStart, oldEnd) {
-      var prefixCount = 0;
-      var suffixCount = 0;
-
-      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-      if (currentStart == 0 && oldStart == 0)
-        prefixCount = this.sharedPrefix(current, old, minLength);
-
-      if (currentEnd == current.length && oldEnd == old.length)
-        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-
-      currentStart += prefixCount;
-      oldStart += prefixCount;
-      currentEnd -= suffixCount;
-      oldEnd -= suffixCount;
-
-      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
-        return [];
-
-      if (currentStart == currentEnd) {
-        var splice = newSplice(currentStart, [], 0);
-        while (oldStart < oldEnd)
-          splice.removed.push(old[oldStart++]);
-
-        return [ splice ];
-      } else if (oldStart == oldEnd)
-        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-
-      var ops = this.spliceOperationsFromEditDistances(
-          this.calcEditDistances(current, currentStart, currentEnd,
-                                 old, oldStart, oldEnd));
-
-      var splice = undefined;
-      var splices = [];
-      var index = currentStart;
-      var oldIndex = oldStart;
-      for (var i = 0; i < ops.length; i++) {
-        switch(ops[i]) {
-          case EDIT_LEAVE:
-            if (splice) {
-              splices.push(splice);
-              splice = undefined;
-            }
-
-            index++;
-            oldIndex++;
-            break;
-          case EDIT_UPDATE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-          case EDIT_ADD:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-            break;
-          case EDIT_DELETE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-        }
-      }
-
-      if (splice) {
-        splices.push(splice);
-      }
-      return splices;
-    },
-
-    sharedPrefix: function(current, old, searchLength) {
-      for (var i = 0; i < searchLength; i++)
-        if (!this.equals(current[i], old[i]))
-          return i;
-      return searchLength;
-    },
-
-    sharedSuffix: function(current, old, searchLength) {
-      var index1 = current.length;
-      var index2 = old.length;
-      var count = 0;
-      while (count < searchLength && this.equals(current[--index1], old[--index2]))
-        count++;
-
-      return count;
-    },
-
-    calculateSplices: function(current, previous) {
-      return this.calcSplices(current, 0, current.length, previous, 0,
-                              previous.length);
-    },
-
-    equals: function(currentValue, previousValue) {
-      return currentValue === previousValue;
-    }
-  };
-
-  var arraySplice = new ArraySplice();
-
-  function calcSplices(current, currentStart, currentEnd,
-                       old, oldStart, oldEnd) {
-    return arraySplice.calcSplices(current, currentStart, currentEnd,
-                                   old, oldStart, oldEnd);
-  }
-
-  function intersect(start1, end1, start2, end2) {
-    // Disjoint
-    if (end1 < start2 || end2 < start1)
-      return -1;
-
-    // Adjacent
-    if (end1 == start2 || end2 == start1)
-      return 0;
-
-    // Non-zero intersect, span1 first
-    if (start1 < start2) {
-      if (end1 < end2)
-        return end1 - start2; // Overlap
-      else
-        return end2 - start2; // Contained
-    } else {
-      // Non-zero intersect, span2 first
-      if (end2 < end1)
-        return end2 - start1; // Overlap
-      else
-        return end1 - start1; // Contained
-    }
-  }
-
-  function mergeSplice(splices, index, removed, addedCount) {
-
-    var splice = newSplice(index, removed, addedCount);
-
-    var inserted = false;
-    var insertionOffset = 0;
-
-    for (var i = 0; i < splices.length; i++) {
-      var current = splices[i];
-      current.index += insertionOffset;
-
-      if (inserted)
-        continue;
-
-      var intersectCount = intersect(splice.index,
-                                     splice.index + splice.removed.length,
-                                     current.index,
-                                     current.index + current.addedCount);
-
-      if (intersectCount >= 0) {
-        // Merge the two splices
-
-        splices.splice(i, 1);
-        i--;
-
-        insertionOffset -= current.addedCount - current.removed.length;
-
-        splice.addedCount += current.addedCount - intersectCount;
-        var deleteCount = splice.removed.length +
-                          current.removed.length - intersectCount;
-
-        if (!splice.addedCount && !deleteCount) {
-          // merged splice is a noop. discard.
-          inserted = true;
-        } else {
-          var removed = current.removed;
-
-          if (splice.index < current.index) {
-            // some prefix of splice.removed is prepended to current.removed.
-            var prepend = splice.removed.slice(0, current.index - splice.index);
-            Array.prototype.push.apply(prepend, removed);
-            removed = prepend;
-          }
-
-          if (splice.index + splice.removed.length > current.index + current.addedCount) {
-            // some suffix of splice.removed is appended to current.removed.
-            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
-            Array.prototype.push.apply(removed, append);
-          }
-
-          splice.removed = removed;
-          if (current.index < splice.index) {
-            splice.index = current.index;
-          }
-        }
-      } else if (splice.index < current.index) {
-        // Insert splice here.
-
-        inserted = true;
-
-        splices.splice(i, 0, splice);
-        i++;
-
-        var offset = splice.addedCount - splice.removed.length
-        current.index += offset;
-        insertionOffset += offset;
-      }
-    }
-
-    if (!inserted)
-      splices.push(splice);
-  }
-
-  function createInitialSplices(array, changeRecords) {
-    var splices = [];
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      switch(record.type) {
-        case 'splice':
-          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
-          break;
-        case 'add':
-        case 'update':
-        case 'delete':
-          if (!isIndex(record.name))
-            continue;
-          var index = toNumber(record.name);
-          if (index < 0)
-            continue;
-          mergeSplice(splices, index, [record.oldValue], 1);
-          break;
-        default:
-          console.error('Unexpected record type: ' + JSON.stringify(record));
-          break;
-      }
-    }
-
-    return splices;
-  }
-
-  function projectArraySplices(array, changeRecords) {
-    var splices = [];
-
-    createInitialSplices(array, changeRecords).forEach(function(splice) {
-      if (splice.addedCount == 1 && splice.removed.length == 1) {
-        if (splice.removed[0] !== array[splice.index])
-          splices.push(splice);
-
-        return
-      };
-
-      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
-                                           splice.removed, 0, splice.removed.length));
-    });
-
-    return splices;
-  }
-
-  global.Observer = Observer;
-  global.Observer.runEOM_ = runEOM;
-  global.Observer.observerSentinel_ = observerSentinel; // for testing.
-  global.Observer.hasObjectObserve = hasObserve;
-  global.ArrayObserver = ArrayObserver;
-  global.ArrayObserver.calculateSplices = function(current, previous) {
-    return arraySplice.calculateSplices(current, previous);
-  };
-
-  global.ArraySplice = ArraySplice;
-  global.ObjectObserver = ObjectObserver;
-  global.PathObserver = PathObserver;
-  global.CompoundObserver = CompoundObserver;
-  global.Path = Path;
-  global.ObserverTransform = ObserverTransform;
-})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
-
-// 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';
-
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-
-  function getTreeScope(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-
-    return typeof node.getElementById === 'function' ? node : null;
-  }
-
-  Node.prototype.bind = function(name, observable) {
-    console.error('Unhandled binding to Node: ', this, name, observable);
-  };
-
-  Node.prototype.bindFinished = function() {};
-
-  function updateBindings(node, name, binding) {
-    var bindings = node.bindings_;
-    if (!bindings)
-      bindings = node.bindings_ = {};
-
-    if (bindings[name])
-      binding[name].close();
-
-    return bindings[name] = binding;
-  }
-
-  function returnBinding(node, name, binding) {
-    return binding;
-  }
-
-  function sanitizeValue(value) {
-    return value == null ? '' : value;
-  }
-
-  function updateText(node, value) {
-    node.data = sanitizeValue(value);
-  }
-
-  function textBinding(node) {
-    return function(value) {
-      return updateText(node, value);
-    };
-  }
-
-  var maybeUpdateBindings = returnBinding;
-
-  Object.defineProperty(Platform, 'enableBindingsReflection', {
-    get: function() {
-      return maybeUpdateBindings === updateBindings;
-    },
-    set: function(enable) {
-      maybeUpdateBindings = enable ? updateBindings : returnBinding;
-      return enable;
-    },
-    configurable: true
-  });
-
-  Text.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'textContent')
-      return Node.prototype.bind.call(this, name, value, oneTime);
-
-    if (oneTime)
-      return updateText(this, value);
-
-    var observable = value;
-    updateText(this, observable.open(textBinding(this)));
-    return maybeUpdateBindings(this, name, observable);
-  }
-
-  function updateAttribute(el, name, conditional, value) {
-    if (conditional) {
-      if (value)
-        el.setAttribute(name, '');
-      else
-        el.removeAttribute(name);
-      return;
-    }
-
-    el.setAttribute(name, sanitizeValue(value));
-  }
-
-  function attributeBinding(el, name, conditional) {
-    return function(value) {
-      updateAttribute(el, name, conditional, value);
-    };
-  }
-
-  Element.prototype.bind = function(name, value, oneTime) {
-    var conditional = name[name.length - 1] == '?';
-    if (conditional) {
-      this.removeAttribute(name);
-      name = name.slice(0, -1);
-    }
-
-    if (oneTime)
-      return updateAttribute(this, name, conditional, value);
-
-
-    var observable = value;
-    updateAttribute(this, name, conditional,
-        observable.open(attributeBinding(this, name, conditional)));
-
-    return maybeUpdateBindings(this, name, observable);
-  };
-
-  var checkboxEventType;
-  (function() {
-    // Attempt to feature-detect which event (change or click) is fired first
-    // for checkboxes.
-    var div = document.createElement('div');
-    var checkbox = div.appendChild(document.createElement('input'));
-    checkbox.setAttribute('type', 'checkbox');
-    var first;
-    var count = 0;
-    checkbox.addEventListener('click', function(e) {
-      count++;
-      first = first || 'click';
-    });
-    checkbox.addEventListener('change', function() {
-      count++;
-      first = first || 'change';
-    });
-
-    var event = document.createEvent('MouseEvent');
-    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
-        false, false, false, 0, null);
-    checkbox.dispatchEvent(event);
-    // WebKit/Blink don't fire the change event if the element is outside the
-    // document, so assume 'change' for that case.
-    checkboxEventType = count == 1 ? 'change' : first;
-  })();
-
-  function getEventForInputType(element) {
-    switch (element.type) {
-      case 'checkbox':
-        return checkboxEventType;
-      case 'radio':
-      case 'select-multiple':
-      case 'select-one':
-        return 'change';
-      case 'range':
-        if (/Trident|MSIE/.test(navigator.userAgent))
-          return 'change';
-      default:
-        return 'input';
-    }
-  }
-
-  function updateInput(input, property, value, santizeFn) {
-    input[property] = (santizeFn || sanitizeValue)(value);
-  }
-
-  function inputBinding(input, property, santizeFn) {
-    return function(value) {
-      return updateInput(input, property, value, santizeFn);
-    }
-  }
-
-  function noop() {}
-
-  function bindInputEvent(input, property, observable, postEventFn) {
-    var eventType = getEventForInputType(input);
-
-    function eventHandler() {
-      observable.setValue(input[property]);
-      observable.discardChanges();
-      (postEventFn || noop)(input);
-      Platform.performMicrotaskCheckpoint();
-    }
-    input.addEventListener(eventType, eventHandler);
-
-    return {
-      close: function() {
-        input.removeEventListener(eventType, eventHandler);
-        observable.close();
-      },
-
-      observable_: observable
-    }
-  }
-
-  function booleanSanitize(value) {
-    return Boolean(value);
-  }
-
-  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
-  // Returns an array containing all radio buttons other than |element| that
-  // have the same |name|, either in the form that |element| belongs to or,
-  // if no form, in the document tree to which |element| belongs.
-  //
-  // This implementation is based upon the HTML spec definition of a
-  // "radio button group":
-  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
-  //
-  function getAssociatedRadioButtons(element) {
-    if (element.form) {
-      return filter(element.form.elements, function(el) {
-        return el != element &&
-            el.tagName == 'INPUT' &&
-            el.type == 'radio' &&
-            el.name == element.name;
-      });
-    } else {
-      var treeScope = getTreeScope(element);
-      if (!treeScope)
-        return [];
-      var radios = treeScope.querySelectorAll(
-          'input[type="radio"][name="' + element.name + '"]');
-      return filter(radios, function(el) {
-        return el != element && !el.form;
-      });
-    }
-  }
-
-  function checkedPostEvent(input) {
-    // Only the radio button that is getting checked gets an event. We
-    // therefore find all the associated radio buttons and update their
-    // check binding manually.
-    if (input.tagName === 'INPUT' &&
-        input.type === 'radio') {
-      getAssociatedRadioButtons(input).forEach(function(radio) {
-        var checkedBinding = radio.bindings_.checked;
-        if (checkedBinding) {
-          // Set the value directly to avoid an infinite call stack.
-          checkedBinding.observable_.setValue(false);
-        }
-      });
-    }
-  }
-
-  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value' && name !== 'checked')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
-    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
-
-    if (oneTime)
-      return updateInput(this, name, value, sanitizeFn);
-
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable, postEventFn);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name, sanitizeFn)),
-                sanitizeFn);
-
-    // Checkboxes may need to update bindings of other checkboxes.
-    return updateBindings(this, name, binding);
-  }
-
-  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateInput(this, 'value', value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateInput(this, 'value',
-                observable.open(inputBinding(this, 'value', sanitizeValue)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  function updateOption(option, value) {
-    var parentNode = option.parentNode;;
-    var select;
-    var selectBinding;
-    var oldValue;
-    if (parentNode instanceof HTMLSelectElement &&
-        parentNode.bindings_ &&
-        parentNode.bindings_.value) {
-      select = parentNode;
-      selectBinding = select.bindings_.value;
-      oldValue = select.value;
-    }
-
-    option.value = sanitizeValue(value);
-
-    if (select && select.value != oldValue) {
-      selectBinding.observable_.setValue(select.value);
-      selectBinding.observable_.discardChanges();
-      Platform.performMicrotaskCheckpoint();
-    }
-  }
-
-  function optionBinding(option) {
-    return function(value) {
-      updateOption(option, value);
-    }
-  }
-
-  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
-    if (name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute('value');
-
-    if (oneTime)
-      return updateOption(this, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, 'value', observable);
-    updateOption(this, observable.open(optionBinding(this)));
-    return maybeUpdateBindings(this, name, binding);
-  }
-
-  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
-    if (name === 'selectedindex')
-      name = 'selectedIndex';
-
-    if (name !== 'selectedIndex' && name !== 'value')
-      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
-
-    this.removeAttribute(name);
-
-    if (oneTime)
-      return updateInput(this, name, value);
-
-    var observable = value;
-    var binding = bindInputEvent(this, name, observable);
-    updateInput(this, name,
-                observable.open(inputBinding(this, name)));
-
-    // Option update events may need to access select bindings.
-    return updateBindings(this, name, binding);
-  }
-})(this);
-
-// 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';
-
-  function assert(v) {
-    if (!v)
-      throw new Error('Assertion failed');
-  }
-
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-  function getFragmentRoot(node) {
-    var p;
-    while (p = node.parentNode) {
-      node = p;
-    }
-
-    return node;
-  }
-
-  function searchRefId(node, id) {
-    if (!id)
-      return;
-
-    var ref;
-    var selector = '#' + id;
-    while (!ref) {
-      node = getFragmentRoot(node);
-
-      if (node.protoContent_)
-        ref = node.protoContent_.querySelector(selector);
-      else if (node.getElementById)
-        ref = node.getElementById(id);
-
-      if (ref || !node.templateCreator_)
-        break
-
-      node = node.templateCreator_;
-    }
-
-    return ref;
-  }
-
-  function getInstanceRoot(node) {
-    while (node.parentNode) {
-      node = node.parentNode;
-    }
-    return node.templateCreator_ ? node : null;
-  }
-
-  var Map;
-  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
-    Map = global.Map;
-  } else {
-    Map = function() {
-      this.keys = [];
-      this.values = [];
-    };
-
-    Map.prototype = {
-      set: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0) {
-          this.keys.push(key);
-          this.values.push(value);
-        } else {
-          this.values[index] = value;
-        }
-      },
-
-      get: function(key) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return;
-
-        return this.values[index];
-      },
-
-      delete: function(key, value) {
-        var index = this.keys.indexOf(key);
-        if (index < 0)
-          return false;
-
-        this.keys.splice(index, 1);
-        this.values.splice(index, 1);
-        return true;
-      },
-
-      forEach: function(f, opt_this) {
-        for (var i = 0; i < this.keys.length; i++)
-          f.call(opt_this || this, this.values[i], this.keys[i], this);
-      }
-    };
-  }
-
-  // JScript does not have __proto__. We wrap all object literals with
-  // createObject which uses Object.create, Object.defineProperty and
-  // Object.getOwnPropertyDescriptor to create a new object that does the exact
-  // same thing. The main downside to this solution is that we have to extract
-  // all those property descriptors for IE.
-  var createObject = ('__proto__' in {}) ?
-      function(obj) { return obj; } :
-      function(obj) {
-        var proto = obj.__proto__;
-        if (!proto)
-          return obj;
-        var newObject = Object.create(proto);
-        Object.getOwnPropertyNames(obj).forEach(function(name) {
-          Object.defineProperty(newObject, name,
-                               Object.getOwnPropertyDescriptor(obj, name));
-        });
-        return newObject;
-      };
-
-  // IE does not support have Document.prototype.contains.
-  if (typeof document.contains != 'function') {
-    Document.prototype.contains = function(node) {
-      if (node === this || node.parentNode === this)
-        return true;
-      return this.documentElement.contains(node);
-    }
-  }
-
-  var BIND = 'bind';
-  var REPEAT = 'repeat';
-  var IF = 'if';
-
-  var templateAttributeDirectives = {
-    'template': true,
-    'repeat': true,
-    'bind': true,
-    'ref': true
-  };
-
-  var semanticTemplateElements = {
-    'THEAD': true,
-    'TBODY': true,
-    'TFOOT': true,
-    'TH': true,
-    'TR': true,
-    'TD': true,
-    'COLGROUP': true,
-    'COL': true,
-    'CAPTION': true,
-    'OPTION': true,
-    'OPTGROUP': true
-  };
-
-  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
-  if (hasTemplateElement) {
-    // TODO(rafaelw): Remove when fix for
-    // https://codereview.chromium.org/164803002/
-    // makes it to Chrome release.
-    (function() {
-      var t = document.createElement('template');
-      var d = t.content.ownerDocument;
-      var html = d.appendChild(d.createElement('html'));
-      var head = html.appendChild(d.createElement('head'));
-      var base = d.createElement('base');
-      base.href = document.baseURI;
-      head.appendChild(base);
-    })();
-  }
-
-  var allTemplatesSelectors = 'template, ' +
-      Object.keys(semanticTemplateElements).map(function(tagName) {
-        return tagName.toLowerCase() + '[template]';
-      }).join(', ');
-
-  function isSVGTemplate(el) {
-    return el.tagName == 'template' &&
-           el.namespaceURI == 'http://www.w3.org/2000/svg';
-  }
-
-  function isHTMLTemplate(el) {
-    return el.tagName == 'TEMPLATE' &&
-           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
-  }
-
-  function isAttributeTemplate(el) {
-    return Boolean(semanticTemplateElements[el.tagName] &&
-                   el.hasAttribute('template'));
-  }
-
-  function isTemplate(el) {
-    if (el.isTemplate_ === undefined)
-      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
-
-    return el.isTemplate_;
-  }
-
-  // FIXME: Observe templates being added/removed from documents
-  // FIXME: Expose imperative API to decorate and observe templates in
-  // "disconnected tress" (e.g. ShadowRoot)
-  document.addEventListener('DOMContentLoaded', function(e) {
-    bootstrapTemplatesRecursivelyFrom(document);
-    // FIXME: Is this needed? Seems like it shouldn't be.
-    Platform.performMicrotaskCheckpoint();
-  }, false);
-
-  function forAllTemplatesFrom(node, fn) {
-    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
-
-    if (isTemplate(node))
-      fn(node)
-    forEach(subTemplates, fn);
-  }
-
-  function bootstrapTemplatesRecursivelyFrom(node) {
-    function bootstrap(template) {
-      if (!HTMLTemplateElement.decorate(template))
-        bootstrapTemplatesRecursivelyFrom(template.content);
-    }
-
-    forAllTemplatesFrom(node, bootstrap);
-  }
-
-  if (!hasTemplateElement) {
-    /**
-     * This represents a <template> element.
-     * @constructor
-     * @extends {HTMLElement}
-     */
-    global.HTMLTemplateElement = function() {
-      throw TypeError('Illegal constructor');
-    };
-  }
-
-  var hasProto = '__proto__' in {};
-
-  function mixin(to, from) {
-    Object.getOwnPropertyNames(from).forEach(function(name) {
-      Object.defineProperty(to, name,
-                            Object.getOwnPropertyDescriptor(from, name));
-    });
-  }
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  function getOrCreateTemplateContentsOwner(template) {
-    var doc = template.ownerDocument
-    if (!doc.defaultView)
-      return doc;
-    var d = doc.templateContentsOwner_;
-    if (!d) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHTMLDocument('');
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      doc.templateContentsOwner_ = d;
-    }
-    return d;
-  }
-
-  function getTemplateStagingDocument(template) {
-    if (!template.stagingDocument_) {
-      var owner = template.ownerDocument;
-      if (!owner.stagingDocument_) {
-        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
-        owner.stagingDocument_.isStagingDocument = true;
-        // TODO(rafaelw): Remove when fix for
-        // https://codereview.chromium.org/164803002/
-        // makes it to Chrome release.
-        var base = owner.stagingDocument_.createElement('base');
-        base.href = document.baseURI;
-        owner.stagingDocument_.head.appendChild(base);
-
-        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
-      }
-
-      template.stagingDocument_ = owner.stagingDocument_;
-    }
-
-    return template.stagingDocument_;
-  }
-
-  // For non-template browsers, the parser will disallow <template> in certain
-  // locations, so we allow "attribute templates" which combine the template
-  // element with the top-level container node of the content, e.g.
-  //
-  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
-  //
-  // becomes
-  //
-  //   <template repeat="{{ foo }}">
-  //   + #document-fragment
-  //     + <tr class="bar">
-  //       + <td>Bar</td>
-  //
-  function extractTemplateFromAttributeTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      if (templateAttributeDirectives[attrib.name]) {
-        if (attrib.name !== 'template')
-          template.setAttribute(attrib.name, attrib.value);
-        el.removeAttribute(attrib.name);
-      }
-    }
-
-    return template;
-  }
-
-  function extractTemplateFromSVGTemplate(el) {
-    var template = el.ownerDocument.createElement('template');
-    el.parentNode.insertBefore(template, el);
-
-    var attribs = el.attributes;
-    var count = attribs.length;
-    while (count-- > 0) {
-      var attrib = attribs[count];
-      template.setAttribute(attrib.name, attrib.value);
-      el.removeAttribute(attrib.name);
-    }
-
-    el.parentNode.removeChild(el);
-    return template;
-  }
-
-  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
-    var content = template.content;
-    if (useRoot) {
-      content.appendChild(el);
-      return;
-    }
-
-    var child;
-    while (child = el.firstChild) {
-      content.appendChild(child);
-    }
-  }
-
-  var templateObserver;
-  if (typeof MutationObserver == 'function') {
-    templateObserver = new MutationObserver(function(records) {
-      for (var i = 0; i < records.length; i++) {
-        records[i].target.refChanged_();
-      }
-    });
-  }
-
-  /**
-   * Ensures proper API and content model for template elements.
-   * @param {HTMLTemplateElement} opt_instanceRef The template element which
-   *     |el| template element will return as the value of its ref(), and whose
-   *     content will be used as source when createInstance() is invoked.
-   */
-  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
-    if (el.templateIsDecorated_)
-      return false;
-
-    var templateElement = el;
-    templateElement.templateIsDecorated_ = true;
-
-    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
-                               hasTemplateElement;
-    var bootstrapContents = isNativeHTMLTemplate;
-    var liftContents = !isNativeHTMLTemplate;
-    var liftRoot = false;
-
-    if (!isNativeHTMLTemplate) {
-      if (isAttributeTemplate(templateElement)) {
-        assert(!opt_instanceRef);
-        templateElement = extractTemplateFromAttributeTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-        liftRoot = true;
-      } else if (isSVGTemplate(templateElement)) {
-        templateElement = extractTemplateFromSVGTemplate(el);
-        templateElement.templateIsDecorated_ = true;
-        isNativeHTMLTemplate = hasTemplateElement;
-      }
-    }
-
-    if (!isNativeHTMLTemplate) {
-      fixTemplateElementPrototype(templateElement);
-      var doc = getOrCreateTemplateContentsOwner(templateElement);
-      templateElement.content_ = doc.createDocumentFragment();
-    }
-
-    if (opt_instanceRef) {
-      // template is contained within an instance, its direct content must be
-      // empty
-      templateElement.instanceRef_ = opt_instanceRef;
-    } else if (liftContents) {
-      liftNonNativeTemplateChildrenIntoContent(templateElement,
-                                               el,
-                                               liftRoot);
-    } else if (bootstrapContents) {
-      bootstrapTemplatesRecursivelyFrom(templateElement.content);
-    }
-
-    return true;
-  };
-
-  // TODO(rafaelw): This used to decorate recursively all templates from a given
-  // node. This happens by default on 'DOMContentLoaded', but may be needed
-  // in subtrees not descendent from document (e.g. ShadowRoot).
-  // Review whether this is the right public API.
-  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
-
-  var htmlElement = global.HTMLUnknownElement || HTMLElement;
-
-  var contentDescriptor = {
-    get: function() {
-      return this.content_;
-    },
-    enumerable: true,
-    configurable: true
-  };
-
-  if (!hasTemplateElement) {
-    // Gecko is more picky with the prototype than WebKit. Make sure to use the
-    // same prototype as created in the constructor.
-    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
-
-    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
-                          contentDescriptor);
-  }
-
-  function fixTemplateElementPrototype(el) {
-    if (hasProto)
-      el.__proto__ = HTMLTemplateElement.prototype;
-    else
-      mixin(el, HTMLTemplateElement.prototype);
-  }
-
-  function ensureSetModelScheduled(template) {
-    if (!template.setModelFn_) {
-      template.setModelFn_ = function() {
-        template.setModelFnScheduled_ = false;
-        var map = getBindings(template,
-            template.delegate_ && template.delegate_.prepareBinding);
-        processBindings(template, map, template.model_);
-      };
-    }
-
-    if (!template.setModelFnScheduled_) {
-      template.setModelFnScheduled_ = true;
-      Observer.runEOM_(template.setModelFn_);
-    }
-  }
-
-  mixin(HTMLTemplateElement.prototype, {
-    bind: function(name, value, oneTime) {
-      if (name != 'ref')
-        return Element.prototype.bind.call(this, name, value, oneTime);
-
-      var self = this;
-      var ref = oneTime ? value : value.open(function(ref) {
-        self.setAttribute('ref', ref);
-        self.refChanged_();
-      });
-
-      this.setAttribute('ref', ref);
-      this.refChanged_();
-      if (oneTime)
-        return;
-
-      if (!this.bindings_) {
-        this.bindings_ = { ref: value };
-      } else {
-        this.bindings_.ref = value;
-      }
-
-      return value;
-    },
-
-    processBindingDirectives_: function(directives) {
-      if (this.iterator_)
-        this.iterator_.closeDeps();
-
-      if (!directives.if && !directives.bind && !directives.repeat) {
-        if (this.iterator_) {
-          this.iterator_.close();
-          this.iterator_ = undefined;
-        }
-
-        return;
-      }
-
-      if (!this.iterator_) {
-        this.iterator_ = new TemplateIterator(this);
-      }
-
-      this.iterator_.updateDependencies(directives, this.model_);
-
-      if (templateObserver) {
-        templateObserver.observe(this, { attributes: true,
-                                         attributeFilter: ['ref'] });
-      }
-
-      return this.iterator_;
-    },
-
-    createInstance: function(model, bindingDelegate, delegate_) {
-      if (bindingDelegate)
-        delegate_ = this.newDelegate_(bindingDelegate);
-      else if (!delegate_)
-        delegate_ = this.delegate_;
-
-      if (!this.refContent_)
-        this.refContent_ = this.ref_.content;
-      var content = this.refContent_;
-      if (content.firstChild === null)
-        return emptyInstance;
-
-      var map = getInstanceBindingMap(content, delegate_);
-      var stagingDocument = getTemplateStagingDocument(this);
-      var instance = stagingDocument.createDocumentFragment();
-      instance.templateCreator_ = this;
-      instance.protoContent_ = content;
-      instance.bindings_ = [];
-      instance.terminator_ = null;
-      var instanceRecord = instance.templateInstance_ = {
-        firstNode: null,
-        lastNode: null,
-        model: model
-      };
-
-      var i = 0;
-      var collectTerminator = false;
-      for (var child = content.firstChild; child; child = child.nextSibling) {
-        // The terminator of the instance is the clone of the last child of the
-        // content. If the last child is an active template, it may produce
-        // instances as a result of production, so simply collecting the last
-        // child of the instance after it has finished producing may be wrong.
-        if (child.nextSibling === null)
-          collectTerminator = true;
-
-        var clone = cloneAndBindInstance(child, instance, stagingDocument,
-                                         map.children[i++],
-                                         model,
-                                         delegate_,
-                                         instance.bindings_);
-        clone.templateInstance_ = instanceRecord;
-        if (collectTerminator)
-          instance.terminator_ = clone;
-      }
-
-      instanceRecord.firstNode = instance.firstChild;
-      instanceRecord.lastNode = instance.lastChild;
-      instance.templateCreator_ = undefined;
-      instance.protoContent_ = undefined;
-      return instance;
-    },
-
-    get model() {
-      return this.model_;
-    },
-
-    set model(model) {
-      this.model_ = model;
-      ensureSetModelScheduled(this);
-    },
-
-    get bindingDelegate() {
-      return this.delegate_ && this.delegate_.raw;
-    },
-
-    refChanged_: function() {
-      if (!this.iterator_ || this.refContent_ === this.ref_.content)
-        return;
-
-      this.refContent_ = undefined;
-      this.iterator_.valueChanged();
-      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
-    },
-
-    clear: function() {
-      this.model_ = undefined;
-      this.delegate_ = undefined;
-      if (this.bindings_ && this.bindings_.ref)
-        this.bindings_.ref.close()
-      this.refContent_ = undefined;
-      if (!this.iterator_)
-        return;
-      this.iterator_.valueChanged();
-      this.iterator_.close()
-      this.iterator_ = undefined;
-    },
-
-    setDelegate_: function(delegate) {
-      this.delegate_ = delegate;
-      this.bindingMap_ = undefined;
-      if (this.iterator_) {
-        this.iterator_.instancePositionChangedFn_ = undefined;
-        this.iterator_.instanceModelFn_ = undefined;
-      }
-    },
-
-    newDelegate_: function(bindingDelegate) {
-      if (!bindingDelegate)
-        return;
-
-      function delegateFn(name) {
-        var fn = bindingDelegate && bindingDelegate[name];
-        if (typeof fn != 'function')
-          return;
-
-        return function() {
-          return fn.apply(bindingDelegate, arguments);
-        };
-      }
-
-      return {
-        bindingMaps: {},
-        raw: bindingDelegate,
-        prepareBinding: delegateFn('prepareBinding'),
-        prepareInstanceModel: delegateFn('prepareInstanceModel'),
-        prepareInstancePositionChanged:
-            delegateFn('prepareInstancePositionChanged')
-      };
-    },
-
-    set bindingDelegate(bindingDelegate) {
-      if (this.delegate_) {
-        throw Error('Template must be cleared before a new bindingDelegate ' +
-                    'can be assigned');
-      }
-
-      this.setDelegate_(this.newDelegate_(bindingDelegate));
-    },
-
-    get ref_() {
-      var ref = searchRefId(this, this.getAttribute('ref'));
-      if (!ref)
-        ref = this.instanceRef_;
-
-      if (!ref)
-        return this;
-
-      var nextRef = ref.ref_;
-      return nextRef ? nextRef : ref;
-    }
-  });
-
-  // Returns
-  //   a) undefined if there are no mustaches.
-  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
-  function parseMustaches(s, name, node, prepareBindingFn) {
-    if (!s || !s.length)
-      return;
-
-    var tokens;
-    var length = s.length;
-    var startIndex = 0, lastIndex = 0, endIndex = 0;
-    var onlyOneTime = true;
-    while (lastIndex < length) {
-      var startIndex = s.indexOf('{{', lastIndex);
-      var oneTimeStart = s.indexOf('[[', lastIndex);
-      var oneTime = false;
-      var terminator = '}}';
-
-      if (oneTimeStart >= 0 &&
-          (startIndex < 0 || oneTimeStart < startIndex)) {
-        startIndex = oneTimeStart;
-        oneTime = true;
-        terminator = ']]';
-      }
-
-      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
-
-      if (endIndex < 0) {
-        if (!tokens)
-          return;
-
-        tokens.push(s.slice(lastIndex)); // TEXT
-        break;
-      }
-
-      tokens = tokens || [];
-      tokens.push(s.slice(lastIndex, startIndex)); // TEXT
-      var pathString = s.slice(startIndex + 2, endIndex).trim();
-      tokens.push(oneTime); // ONE_TIME?
-      onlyOneTime = onlyOneTime && oneTime;
-      var delegateFn = prepareBindingFn &&
-                       prepareBindingFn(pathString, name, node);
-      // Don't try to parse the expression if there's a prepareBinding function
-      if (delegateFn == null) {
-        tokens.push(Path.get(pathString)); // PATH
-      } else {
-        tokens.push(null);
-      }
-      tokens.push(delegateFn); // DELEGATE_FN
-      lastIndex = endIndex + 2;
-    }
-
-    if (lastIndex === length)
-      tokens.push(''); // TEXT
-
-    tokens.hasOnePath = tokens.length === 5;
-    tokens.isSimplePath = tokens.hasOnePath &&
-                          tokens[0] == '' &&
-                          tokens[4] == '';
-    tokens.onlyOneTime = onlyOneTime;
-
-    tokens.combinator = function(values) {
-      var newValue = tokens[0];
-
-      for (var i = 1; i < tokens.length; i += 4) {
-        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];
-        if (value !== undefined)
-          newValue += value;
-        newValue += tokens[i + 3];
-      }
-
-      return newValue;
-    }
-
-    return tokens;
-  };
-
-  function processOneTimeBinding(name, tokens, node, model) {
-    if (tokens.hasOnePath) {
-      var delegateFn = tokens[3];
-      var value = delegateFn ? delegateFn(model, node, true) :
-                               tokens[2].getValueFrom(model);
-      return tokens.isSimplePath ? value : tokens.combinator(value);
-    }
-
-    var values = [];
-    for (var i = 1; i < tokens.length; i += 4) {
-      var delegateFn = tokens[i + 2];
-      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :
-          tokens[i + 1].getValueFrom(model);
-    }
-
-    return tokens.combinator(values);
-  }
-
-  function processSinglePathBinding(name, tokens, node, model) {
-    var delegateFn = tokens[3];
-    var observer = delegateFn ? delegateFn(model, node, false) :
-        new PathObserver(model, tokens[2]);
-
-    return tokens.isSimplePath ? observer :
-        new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBinding(name, tokens, node, model) {
-    if (tokens.onlyOneTime)
-      return processOneTimeBinding(name, tokens, node, model);
-
-    if (tokens.hasOnePath)
-      return processSinglePathBinding(name, tokens, node, model);
-
-    var observer = new CompoundObserver();
-
-    for (var i = 1; i < tokens.length; i += 4) {
-      var oneTime = tokens[i];
-      var delegateFn = tokens[i + 2];
-
-      if (delegateFn) {
-        var value = delegateFn(model, node, oneTime);
-        if (oneTime)
-          observer.addPath(value)
-        else
-          observer.addObserver(value);
-        continue;
-      }
-
-      var path = tokens[i + 1];
-      if (oneTime)
-        observer.addPath(path.getValueFrom(model))
-      else
-        observer.addPath(model, path);
-    }
-
-    return new ObserverTransform(observer, tokens.combinator);
-  }
-
-  function processBindings(node, bindings, model, instanceBindings) {
-    for (var i = 0; i < bindings.length; i += 2) {
-      var name = bindings[i]
-      var tokens = bindings[i + 1];
-      var value = processBinding(name, tokens, node, model);
-      var binding = node.bind(name, value, tokens.onlyOneTime);
-      if (binding && instanceBindings)
-        instanceBindings.push(binding);
-    }
-
-    node.bindFinished();
-    if (!bindings.isTemplate)
-      return;
-
-    node.model_ = model;
-    var iter = node.processBindingDirectives_(bindings);
-    if (instanceBindings && iter)
-      instanceBindings.push(iter);
-  }
-
-  function parseWithDefault(el, name, prepareBindingFn) {
-    var v = el.getAttribute(name);
-    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
-  }
-
-  function parseAttributeBindings(element, prepareBindingFn) {
-    assert(element);
-
-    var bindings = [];
-    var ifFound = false;
-    var bindFound = false;
-
-    for (var i = 0; i < element.attributes.length; i++) {
-      var attr = element.attributes[i];
-      var name = attr.name;
-      var value = attr.value;
-
-      // Allow bindings expressed in attributes to be prefixed with underbars.
-      // We do this to allow correct semantics for browsers that don't implement
-      // <template> where certain attributes might trigger side-effects -- and
-      // for IE which sanitizes certain attributes, disallowing mustache
-      // replacements in their text.
-      while (name[0] === '_') {
-        name = name.substring(1);
-      }
-
-      if (isTemplate(element) &&
-          (name === IF || name === BIND || name === REPEAT)) {
-        continue;
-      }
-
-      var tokens = parseMustaches(value, name, element,
-                                  prepareBindingFn);
-      if (!tokens)
-        continue;
-
-      bindings.push(name, tokens);
-    }
-
-    if (isTemplate(element)) {
-      bindings.isTemplate = true;
-      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
-      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
-      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
-
-      if (bindings.if && !bindings.bind && !bindings.repeat)
-        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
-    }
-
-    return bindings;
-  }
-
-  function getBindings(node, prepareBindingFn) {
-    if (node.nodeType === Node.ELEMENT_NODE)
-      return parseAttributeBindings(node, prepareBindingFn);
-
-    if (node.nodeType === Node.TEXT_NODE) {
-      var tokens = parseMustaches(node.data, 'textContent', node,
-                                  prepareBindingFn);
-      if (tokens)
-        return ['textContent', tokens];
-    }
-
-    return [];
-  }
-
-  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
-                                delegate,
-                                instanceBindings,
-                                instanceRecord) {
-    var clone = parent.appendChild(stagingDocument.importNode(node, false));
-
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      cloneAndBindInstance(child, clone, stagingDocument,
-                            bindings.children[i++],
-                            model,
-                            delegate,
-                            instanceBindings);
-    }
-
-    if (bindings.isTemplate) {
-      HTMLTemplateElement.decorate(clone, node);
-      if (delegate)
-        clone.setDelegate_(delegate);
-    }
-
-    processBindings(clone, bindings, model, instanceBindings);
-    return clone;
-  }
-
-  function createInstanceBindingMap(node, prepareBindingFn) {
-    var map = getBindings(node, prepareBindingFn);
-    map.children = {};
-    var index = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
-    }
-
-    return map;
-  }
-
-  var contentUidCounter = 1;
-
-  // TODO(rafaelw): Setup a MutationObserver on content which clears the id
-  // so that bindingMaps regenerate when the template.content changes.
-  function getContentUid(content) {
-    var id = content.id_;
-    if (!id)
-      id = content.id_ = contentUidCounter++;
-    return id;
-  }
-
-  // Each delegate is associated with a set of bindingMaps, one for each
-  // content which may be used by a template. The intent is that each binding
-  // delegate gets the opportunity to prepare the instance (via the prepare*
-  // delegate calls) once across all uses.
-  // TODO(rafaelw): Separate out the parse map from the binding map. In the
-  // current implementation, if two delegates need a binding map for the same
-  // content, the second will have to reparse.
-  function getInstanceBindingMap(content, delegate_) {
-    var contentId = getContentUid(content);
-    if (delegate_) {
-      var map = delegate_.bindingMaps[contentId];
-      if (!map) {
-        map = delegate_.bindingMaps[contentId] =
-            createInstanceBindingMap(content, delegate_.prepareBinding) || [];
-      }
-      return map;
-    }
-
-    var map = content.bindingMap_;
-    if (!map) {
-      map = content.bindingMap_ =
-          createInstanceBindingMap(content, undefined) || [];
-    }
-    return map;
-  }
-
-  Object.defineProperty(Node.prototype, 'templateInstance', {
-    get: function() {
-      var instance = this.templateInstance_;
-      return instance ? instance :
-          (this.parentNode ? this.parentNode.templateInstance : undefined);
-    }
-  });
-
-  var emptyInstance = document.createDocumentFragment();
-  emptyInstance.bindings_ = [];
-  emptyInstance.terminator_ = null;
-
-  function TemplateIterator(templateElement) {
-    this.closed = false;
-    this.templateElement_ = templateElement;
-    this.instances = [];
-    this.deps = undefined;
-    this.iteratedValue = [];
-    this.presentValue = undefined;
-    this.arrayObserver = undefined;
-  }
-
-  TemplateIterator.prototype = {
-    closeDeps: function() {
-      var deps = this.deps;
-      if (deps) {
-        if (deps.ifOneTime === false)
-          deps.ifValue.close();
-        if (deps.oneTime === false)
-          deps.value.close();
-      }
-    },
-
-    updateDependencies: function(directives, model) {
-      this.closeDeps();
-
-      var deps = this.deps = {};
-      var template = this.templateElement_;
-
-      var ifValue = true;
-      if (directives.if) {
-        deps.hasIf = true;
-        deps.ifOneTime = directives.if.onlyOneTime;
-        deps.ifValue = processBinding(IF, directives.if, template, model);
-
-        ifValue = deps.ifValue;
-
-        // oneTime if & predicate is false. nothing else to do.
-        if (deps.ifOneTime && !ifValue) {
-          this.valueChanged();
-          return;
-        }
-
-        if (!deps.ifOneTime)
-          ifValue = ifValue.open(this.updateIfValue, this);
-      }
-
-      if (directives.repeat) {
-        deps.repeat = true;
-        deps.oneTime = directives.repeat.onlyOneTime;
-        deps.value = processBinding(REPEAT, directives.repeat, template, model);
-      } else {
-        deps.repeat = false;
-        deps.oneTime = directives.bind.onlyOneTime;
-        deps.value = processBinding(BIND, directives.bind, template, model);
-      }
-
-      var value = deps.value;
-      if (!deps.oneTime)
-        value = value.open(this.updateIteratedValue, this);
-
-      if (!ifValue) {
-        this.valueChanged();
-        return;
-      }
-
-      this.updateValue(value);
-    },
-
-    /**
-     * Gets the updated value of the bind/repeat. This can potentially call
-     * user code (if a bindingDelegate is set up) so we try to avoid it if we
-     * already have the value in hand (from Observer.open).
-     */
-    getUpdatedValue: function() {
-      var value = this.deps.value;
-      if (!this.deps.oneTime)
-        value = value.discardChanges();
-      return value;
-    },
-
-    updateIfValue: function(ifValue) {
-      if (!ifValue) {
-        this.valueChanged();
-        return;
-      }
-
-      this.updateValue(this.getUpdatedValue());
-    },
-
-    updateIteratedValue: function(value) {
-      if (this.deps.hasIf) {
-        var ifValue = this.deps.ifValue;
-        if (!this.deps.ifOneTime)
-          ifValue = ifValue.discardChanges();
-        if (!ifValue) {
-          this.valueChanged();
-          return;
-        }
-      }
-
-      this.updateValue(value);
-    },
-
-    updateValue: function(value) {
-      if (!this.deps.repeat)
-        value = [value];
-      var observe = this.deps.repeat &&
-                    !this.deps.oneTime &&
-                    Array.isArray(value);
-      this.valueChanged(value, observe);
-    },
-
-    valueChanged: function(value, observeValue) {
-      if (!Array.isArray(value))
-        value = [];
-
-      if (value === this.iteratedValue)
-        return;
-
-      this.unobserve();
-      this.presentValue = value;
-      if (observeValue) {
-        this.arrayObserver = new ArrayObserver(this.presentValue);
-        this.arrayObserver.open(this.handleSplices, this);
-      }
-
-      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
-                                                        this.iteratedValue));
-    },
-
-    getLastInstanceNode: function(index) {
-      if (index == -1)
-        return this.templateElement_;
-      var instance = this.instances[index];
-      var terminator = instance.terminator_;
-      if (!terminator)
-        return this.getLastInstanceNode(index - 1);
-
-      if (terminator.nodeType !== Node.ELEMENT_NODE ||
-          this.templateElement_ === terminator) {
-        return terminator;
-      }
-
-      var subtemplateIterator = terminator.iterator_;
-      if (!subtemplateIterator)
-        return terminator;
-
-      return subtemplateIterator.getLastTemplateNode();
-    },
-
-    getLastTemplateNode: function() {
-      return this.getLastInstanceNode(this.instances.length - 1);
-    },
-
-    insertInstanceAt: function(index, fragment) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var parent = this.templateElement_.parentNode;
-      this.instances.splice(index, 0, fragment);
-
-      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
-    },
-
-    extractInstanceAt: function(index) {
-      var previousInstanceLast = this.getLastInstanceNode(index - 1);
-      var lastNode = this.getLastInstanceNode(index);
-      var parent = this.templateElement_.parentNode;
-      var instance = this.instances.splice(index, 1)[0];
-
-      while (lastNode !== previousInstanceLast) {
-        var node = previousInstanceLast.nextSibling;
-        if (node == lastNode)
-          lastNode = previousInstanceLast;
-
-        instance.appendChild(parent.removeChild(node));
-      }
-
-      return instance;
-    },
-
-    getDelegateFn: function(fn) {
-      fn = fn && fn(this.templateElement_);
-      return typeof fn === 'function' ? fn : null;
-    },
-
-    handleSplices: function(splices) {
-      if (this.closed || !splices.length)
-        return;
-
-      var template = this.templateElement_;
-
-      if (!template.parentNode) {
-        this.close();
-        return;
-      }
-
-      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
-                                 splices);
-
-      var delegate = template.delegate_;
-      if (this.instanceModelFn_ === undefined) {
-        this.instanceModelFn_ =
-            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
-      }
-
-      if (this.instancePositionChangedFn_ === undefined) {
-        this.instancePositionChangedFn_ =
-            this.getDelegateFn(delegate &&
-                               delegate.prepareInstancePositionChanged);
-      }
-
-      // Instance Removals
-      var instanceCache = new Map;
-      var removeDelta = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var removed = splice.removed;
-        for (var j = 0; j < removed.length; j++) {
-          var model = removed[j];
-          var instance = this.extractInstanceAt(splice.index + removeDelta);
-          if (instance !== emptyInstance) {
-            instanceCache.set(model, instance);
-          }
-        }
-
-        removeDelta -= splice.addedCount;
-      }
-
-      // Instance Insertions
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        var addIndex = splice.index;
-        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
-          var model = this.iteratedValue[addIndex];
-          var instance = instanceCache.get(model);
-          if (instance) {
-            instanceCache.delete(model);
-          } else {
-            if (this.instanceModelFn_) {
-              model = this.instanceModelFn_(model);
-            }
-
-            if (model === undefined) {
-              instance = emptyInstance;
-            } else {
-              instance = template.createInstance(model, undefined, delegate);
-            }
-          }
-
-          this.insertInstanceAt(addIndex, instance);
-        }
-      }
-
-      instanceCache.forEach(function(instance) {
-        this.closeInstanceBindings(instance);
-      }, this);
-
-      if (this.instancePositionChangedFn_)
-        this.reportInstancesMoved(splices);
-    },
-
-    reportInstanceMoved: function(index) {
-      var instance = this.instances[index];
-      if (instance === emptyInstance)
-        return;
-
-      this.instancePositionChangedFn_(instance.templateInstance_, index);
-    },
-
-    reportInstancesMoved: function(splices) {
-      var index = 0;
-      var offset = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        if (offset != 0) {
-          while (index < splice.index) {
-            this.reportInstanceMoved(index);
-            index++;
-          }
-        } else {
-          index = splice.index;
-        }
-
-        while (index < splice.index + splice.addedCount) {
-          this.reportInstanceMoved(index);
-          index++;
-        }
-
-        offset += splice.addedCount - splice.removed.length;
-      }
-
-      if (offset == 0)
-        return;
-
-      var length = this.instances.length;
-      while (index < length) {
-        this.reportInstanceMoved(index);
-        index++;
-      }
-    },
-
-    closeInstanceBindings: function(instance) {
-      var bindings = instance.bindings_;
-      for (var i = 0; i < bindings.length; i++) {
-        bindings[i].close();
-      }
-    },
-
-    unobserve: function() {
-      if (!this.arrayObserver)
-        return;
-
-      this.arrayObserver.close();
-      this.arrayObserver = undefined;
-    },
-
-    close: function() {
-      if (this.closed)
-        return;
-      this.unobserve();
-      for (var i = 0; i < this.instances.length; i++) {
-        this.closeInstanceBindings(this.instances[i]);
-      }
-
-      this.instances.length = 0;
-      this.closeDeps();
-      this.templateElement_.iterator_ = undefined;
-      this.closed = true;
-    }
-  };
-
-  // Polyfill-specific API.
-  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
-})(this);
-
-/*
- * 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) {
-
-var iterations = 0;
-var callbacks = [];
-var twiddle = document.createTextNode('');
-
-function endOfMicrotask(callback) {
-  twiddle.textContent = iterations++;
-  callbacks.push(callback);
-}
-
-function atEndOfMicrotask() {
-  while (callbacks.length) {
-    callbacks.shift()();
-  }
-}
-
-new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
-  .observe(twiddle, {characterData: true})
-  ;
-
-// exports
-
-scope.endOfMicrotask = endOfMicrotask;
-
-})(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) {
-
-// inject style sheet
-var style = document.createElement('style');
-style.textContent = 'template {display: none !important;} /* injected by platform.js */';
-var head = document.querySelector('head');
-head.insertBefore(style, head.firstChild);
-
-// flush (with logging)
-var flushing;
-function flush() {
-  if (!flushing) {
-    flushing = true;
-    scope.endOfMicrotask(function() {
-      flushing = false;
-      logFlags.data && console.group('Platform.flush()');
-      scope.performMicrotaskCheckpoint();
-      logFlags.data && console.groupEnd();
-    });
-  }
-};
-
-// polling dirty checker
-// flush periodically if platform does not have object observe.
-if (!Observer.hasObjectObserve) {
-  var FLUSH_POLL_INTERVAL = 125;
-  window.addEventListener('WebComponentsReady', function() {
-    flush();
-    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
-  });
-} else {
-  // make flush a no-op when we have Object.observe
-  flush = function() {};
-}
-
-if (window.CustomElements && !CustomElements.useNative) {
-  var originalImportNode = Document.prototype.importNode;
-  Document.prototype.importNode = function(node, deep) {
-    var imported = originalImportNode.call(this, node, deep);
-    CustomElements.upgradeAll(imported);
-    return imported;
-  }
-}
-
-// exports
-scope.flush = flush;
-
-})(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) {
-
-var urlResolver = {
-  resolveDom: function(root, url) {
-    url = url || root.ownerDocument.baseURI;
-    this.resolveAttributes(root, url);
-    this.resolveStyles(root, url);
-    // handle template.content
-    var templates = root.querySelectorAll('template');
-    if (templates) {
-      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
-        if (t.content) {
-          this.resolveDom(t.content, url);
-        }
-      }
-    }
-  },
-  resolveTemplate: function(template) {
-    this.resolveDom(template.content, template.ownerDocument.baseURI);
-  },
-  resolveStyles: function(root, url) {
-    var styles = root.querySelectorAll('style');
-    if (styles) {
-      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
-        this.resolveStyle(s, url);
-      }
-    }
-  },
-  resolveStyle: function(style, url) {
-    url = url || style.ownerDocument.baseURI;
-    style.textContent = this.resolveCssText(style.textContent, url);
-  },
-  resolveCssText: function(cssText, baseUrl, keepAbsolute) {
-    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);
-    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);
-  },
-  resolveAttributes: function(root, url) {
-    if (root.hasAttributes && root.hasAttributes()) {
-      this.resolveElementAttributes(root, url);
-    }
-    // search for attributes that host urls
-    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
-    if (nodes) {
-      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
-        this.resolveElementAttributes(n, url);
-      }
-    }
-  },
-  resolveElementAttributes: function(node, url) {
-    url = url || node.ownerDocument.baseURI;
-    URL_ATTRS.forEach(function(v) {
-      var attr = node.attributes[v];
-      var value = attr && attr.value;
-      var replacement;
-      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
-        if (v === 'style') {
-          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
-        } else {
-          replacement = resolveRelativeUrl(url, value);
-        }
-        attr.value = replacement;
-      }
-    });
-  }
-};
-
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
-var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
-var URL_TEMPLATE_SEARCH = '{{.*}}';
-
-function replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {
-  return cssText.replace(regexp, function(m, pre, url, post) {
-    var urlPath = url.replace(/["']/g, '');
-    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);
-    return pre + '\'' + urlPath + '\'' + post;
-  });
-}
-
-function resolveRelativeUrl(baseUrl, url, keepAbsolute) {
-  // do not resolve '/' absolute urls
-  if (url && url[0] === '/') {
-    return url;
-  }
-  var u = new URL(url, baseUrl);
-  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);
-}
-
-function makeDocumentRelPath(url) {
-  var root = new URL(document.baseURI);
-  var u = new URL(url, root);
-  if (u.host === root.host && u.port === root.port &&
-      u.protocol === root.protocol) {
-    return makeRelPath(root, u);
-  } else {
-    return url;
-  }
-}
-
-// make a relative path from source to target
-function makeRelPath(sourceUrl, targetUrl) {
-  var source = sourceUrl.pathname;
-  var target = targetUrl.pathname;
-  var s = source.split('/');
-  var t = target.split('/');
-  while (s.length && s[0] === t[0]){
-    s.shift();
-    t.shift();
-  }
-  for (var i = 0, l = s.length - 1; i < l; i++) {
-    t.unshift('..');
-  }
-  return t.join('/') + targetUrl.search + targetUrl.hash;
-}
-
-// exports
-scope.urlResolver = urlResolver;
-
-})(Polymer);
-
-/*
- * 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) {
-  var endOfMicrotask = Platform.endOfMicrotask;
-
-  // Generic url loader
-  function Loader(regex) {
-    this.cache = Object.create(null);
-    this.map = Object.create(null);
-    this.requests = 0;
-    this.regex = regex;
-  }
-  Loader.prototype = {
-
-    // TODO(dfreedm): there may be a better factoring here
-    // extract absolute urls from the text (full of relative urls)
-    extractUrls: function(text, base) {
-      var matches = [];
-      var matched, u;
-      while ((matched = this.regex.exec(text))) {
-        u = new URL(matched[1], base);
-        matches.push({matched: matched[0], url: u.href});
-      }
-      return matches;
-    },
-    // take a text blob, a root url, and a callback and load all the urls found within the text
-    // returns a map of absolute url to text
-    process: function(text, root, callback) {
-      var matches = this.extractUrls(text, root);
-
-      // every call to process returns all the text this loader has ever received
-      var done = callback.bind(null, this.map);
-      this.fetch(matches, done);
-    },
-    // build a mapping of url -> text from matches
-    fetch: function(matches, callback) {
-      var inflight = matches.length;
-
-      // return early if there is no fetching to be done
-      if (!inflight) {
-        return callback();
-      }
-
-      // wait for all subrequests to return
-      var done = function() {
-        if (--inflight === 0) {
-          callback();
-        }
-      };
-
-      // start fetching all subrequests
-      var m, req, url;
-      for (var i = 0; i < inflight; i++) {
-        m = matches[i];
-        url = m.url;
-        req = this.cache[url];
-        // if this url has already been requested, skip requesting it again
-        if (!req) {
-          req = this.xhr(url);
-          req.match = m;
-          this.cache[url] = req;
-        }
-        // wait for the request to process its subrequests
-        req.wait(done);
-      }
-    },
-    handleXhr: function(request) {
-      var match = request.match;
-      var url = match.url;
-
-      // handle errors with an empty string
-      var response = request.response || request.responseText || '';
-      this.map[url] = response;
-      this.fetch(this.extractUrls(response, url), request.resolve);
-    },
-    xhr: function(url) {
-      this.requests++;
-      var request = new XMLHttpRequest();
-      request.open('GET', url, true);
-      request.send();
-      request.onerror = request.onload = this.handleXhr.bind(this, request);
-
-      // queue of tasks to run after XHR returns
-      request.pending = [];
-      request.resolve = function() {
-        var pending = request.pending;
-        for(var i = 0; i < pending.length; i++) {
-          pending[i]();
-        }
-        request.pending = null;
-      };
-
-      // if we have already resolved, pending is null, async call the callback
-      request.wait = function(fn) {
-        if (request.pending) {
-          request.pending.push(fn);
-        } else {
-          endOfMicrotask(fn);
-        }
-      };
-
-      return request;
-    }
-  };
-
-  scope.Loader = Loader;
-})(Polymer);
-
-/*
- * 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) {
-
-var urlResolver = scope.urlResolver;
-var Loader = scope.Loader;
-
-function StyleResolver() {
-  this.loader = new Loader(this.regex);
-}
-StyleResolver.prototype = {
-  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
-  // Recursively replace @imports with the text at that url
-  resolve: function(text, url, callback) {
-    var done = function(map) {
-      callback(this.flatten(text, url, map));
-    }.bind(this);
-    this.loader.process(text, url, done);
-  },
-  // resolve the textContent of a style node
-  resolveNode: function(style, url, callback) {
-    var text = style.textContent;
-    var done = function(text) {
-      style.textContent = text;
-      callback(style);
-    };
-    this.resolve(text, url, done);
-  },
-  // flatten all the @imports to text
-  flatten: function(text, base, map) {
-    var matches = this.loader.extractUrls(text, base);
-    var match, url, intermediate;
-    for (var i = 0; i < matches.length; i++) {
-      match = matches[i];
-      url = match.url;
-      // resolve any css text to be relative to the importer, keep absolute url
-      intermediate = urlResolver.resolveCssText(map[url], url, true);
-      // flatten intermediate @imports
-      intermediate = this.flatten(intermediate, base, map);
-      text = text.replace(match.matched, intermediate);
-    }
-    return text;
-  },
-  loadStyles: function(styles, base, callback) {
-    var loaded=0, l = styles.length;
-    // called in the context of the style
-    function loadedStyle(style) {
-      loaded++;
-      if (loaded === l && callback) {
-        callback();
-      }
-    }
-    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
-      this.resolveNode(s, base, loadedStyle);
-    }
-  }
-};
-
-var styleResolver = new StyleResolver();
-
-// exports
-scope.styleResolver = styleResolver;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
-  function extend(prototype, api) {
-    if (prototype && api) {
-      // use only own properties of 'api'
-      Object.getOwnPropertyNames(api).forEach(function(n) {
-        // acquire property descriptor
-        var pd = Object.getOwnPropertyDescriptor(api, n);
-        if (pd) {
-          // clone property via descriptor
-          Object.defineProperty(prototype, n, pd);
-          // cache name-of-method for 'super' engine
-          if (typeof pd.value == 'function') {
-            // hint the 'super' engine
-            pd.value.nom = n;
-          }
-        }
-      });
-    }
-    return prototype;
-  }
-
-
-  // mixin
-
-  // copy all properties from inProps (et al) to inObj
-  function mixin(inObj/*, inProps, inMoreProps, ...*/) {
-    var obj = inObj || {};
-    for (var i = 1; i < arguments.length; i++) {
-      var p = arguments[i];
-      try {
-        for (var n in p) {
-          copyProperty(n, p, obj);
-        }
-      } catch(x) {
-      }
-    }
-    return obj;
-  }
-
-  // copy property inName from inSource object to inTarget object
-  function copyProperty(inName, inSource, inTarget) {
-    var pd = getPropertyDescriptor(inSource, inName);
-    Object.defineProperty(inTarget, inName, pd);
-  }
-
-  // get property descriptor for inName on inObject, even if
-  // inName exists on some link in inObject's prototype chain
-  function getPropertyDescriptor(inObject, inName) {
-    if (inObject) {
-      var pd = Object.getOwnPropertyDescriptor(inObject, inName);
-      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);
-    }
-  }
-
-  // exports
-
-  scope.extend = extend;
-  scope.mixin = mixin;
-
-  // for bc
-  Platform.mixin = mixin;
-
-})(Polymer);
-
-/*
- * 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) {
-  
-  // usage
-  
-  // invoke cb.call(this) in 100ms, unless the job is re-registered,
-  // which resets the timer
-  // 
-  // this.myJob = this.job(this.myJob, cb, 100)
-  //
-  // returns a job handle which can be used to re-register a job
-
-  var Job = function(inContext) {
-    this.context = inContext;
-    this.boundComplete = this.complete.bind(this)
-  };
-  Job.prototype = {
-    go: function(callback, wait) {
-      this.callback = callback;
-      var h;
-      if (!wait) {
-        h = requestAnimationFrame(this.boundComplete);
-        this.handle = function() {
-          cancelAnimationFrame(h);
-        }
-      } else {
-        h = setTimeout(this.boundComplete, wait);
-        this.handle = function() {
-          clearTimeout(h);
-        }
-      }
-    },
-    stop: function() {
-      if (this.handle) {
-        this.handle();
-        this.handle = null;
-      }
-    },
-    complete: function() {
-      if (this.handle) {
-        this.stop();
-        this.callback.call(this.context);
-      }
-    }
-  };
-  
-  function job(job, callback, wait) {
-    if (job) {
-      job.stop();
-    } else {
-      job = new Job(this);
-    }
-    job.go(callback, wait);
-    return job;
-  }
-  
-  // exports 
-
-  scope.job = job;
-  
-})(Polymer);
-
-/*
- * 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) {
-
-  var registry = {};
-
-  HTMLElement.register = function(tag, prototype) {
-    registry[tag] = prototype;
-  }
-
-  // get prototype mapped to node <tag>
-  HTMLElement.getPrototypeForTag = function(tag) {
-    var prototype = !tag ? HTMLElement.prototype : registry[tag];
-    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
-    return prototype || Object.getPrototypeOf(document.createElement(tag));
-  };
-
-  // we have to flag propagation stoppage for the event dispatcher
-  var originalStopPropagation = Event.prototype.stopPropagation;
-  Event.prototype.stopPropagation = function() {
-    this.cancelBubble = true;
-    originalStopPropagation.apply(this, arguments);
-  };
-  
-  
-  // polyfill DOMTokenList
-  // * add/remove: allow these methods to take multiple classNames
-  // * toggle: add a 2nd argument which forces the given state rather
-  //  than toggling.
-
-  var add = DOMTokenList.prototype.add;
-  var remove = DOMTokenList.prototype.remove;
-  DOMTokenList.prototype.add = function() {
-    for (var i = 0; i < arguments.length; i++) {
-      add.call(this, arguments[i]);
-    }
-  };
-  DOMTokenList.prototype.remove = function() {
-    for (var i = 0; i < arguments.length; i++) {
-      remove.call(this, arguments[i]);
-    }
-  };
-  DOMTokenList.prototype.toggle = function(name, bool) {
-    if (arguments.length == 1) {
-      bool = !this.contains(name);
-    }
-    bool ? this.add(name) : this.remove(name);
-  };
-  DOMTokenList.prototype.switch = function(oldName, newName) {
-    oldName && this.remove(oldName);
-    newName && this.add(newName);
-  };
-
-  // add array() to NodeList, NamedNodeMap, HTMLCollection
-
-  var ArraySlice = function() {
-    return Array.prototype.slice.call(this);
-  };
-
-  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});
-
-  NodeList.prototype.array = ArraySlice;
-  namedNodeMap.prototype.array = ArraySlice;
-  HTMLCollection.prototype.array = ArraySlice;
-
-  // utility
-
-  function createDOM(inTagOrNode, inHTML, inAttrs) {
-    var dom = typeof inTagOrNode == 'string' ?
-        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);
-    dom.innerHTML = inHTML;
-    if (inAttrs) {
-      for (var n in inAttrs) {
-        dom.setAttribute(n, inAttrs[n]);
-      }
-    }
-    return dom;
-  }
-
-  // exports
-
-  scope.createDOM = createDOM;
-
-})(Polymer);
-
-/*

- * 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) {

-    // super

-

-    // `arrayOfArgs` is an optional array of args like one might pass

-    // to `Function.apply`

-

-    // TODO(sjmiles):

-    //    $super must be installed on an instance or prototype chain

-    //    as `super`, and invoked via `this`, e.g.

-    //      `this.super();`

-

-    //    will not work if function objects are not unique, for example,

-    //    when using mixins.

-    //    The memoization strategy assumes each function exists on only one 

-    //    prototype chain i.e. we use the function object for memoizing)

-    //    perhaps we can bookkeep on the prototype itself instead

-    function $super(arrayOfArgs) {

-      // since we are thunking a method call, performance is important here: 

-      // memoize all lookups, once memoized the fast path calls no other 

-      // functions

-      //

-      // find the caller (cannot be `strict` because of 'caller')

-      var caller = $super.caller;

-      // memoized 'name of method' 

-      var nom = caller.nom;

-      // memoized next implementation prototype

-      var _super = caller._super;

-      if (!_super) {

-        if (!nom) {

-          nom = caller.nom = nameInThis.call(this, caller);

-        }

-        if (!nom) {

-          console.warn('called super() on a method not installed declaratively (has no .nom property)');

-        }

-        // super prototype is either cached or we have to find it

-        // by searching __proto__ (at the 'top')

-        // invariant: because we cache _super on fn below, we never reach 

-        // here from inside a series of calls to super(), so it's ok to 

-        // start searching from the prototype of 'this' (at the 'top')

-        // we must never memoize a null super for this reason

-        _super = memoizeSuper(caller, nom, getPrototypeOf(this));

-      }

-      // our super function

-      var fn = _super[nom];

-      if (fn) {

-        // memoize information so 'fn' can call 'super'

-        if (!fn._super) {

-          // must not memoize null, or we lose our invariant above

-          memoizeSuper(fn, nom, _super);

-        }

-        // invoke the inherited method

-        // if 'fn' is not function valued, this will throw

-        return fn.apply(this, arrayOfArgs || []);

-      }

-    }

-

-    function nameInThis(value) {

-      var p = this.__proto__;

-      while (p && p !== HTMLElement.prototype) {

-        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive

-        var n$ = Object.getOwnPropertyNames(p);

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

-          var d = Object.getOwnPropertyDescriptor(p, n);

-          if (typeof d.value === 'function' && d.value === value) {

-            return n;

-          }

-        }

-        p = p.__proto__;

-      }

-    }

-

-    function memoizeSuper(method, name, proto) {

-      // find and cache next prototype containing `name`

-      // we need the prototype so we can do another lookup

-      // from here

-      var s = nextSuper(proto, name, method);

-      if (s[name]) {

-        // `s` is a prototype, the actual method is `s[name]`

-        // tag super method with it's name for quicker lookups

-        s[name].nom = name;

-      }

-      return method._super = s;

-    }

-

-    function nextSuper(proto, name, caller) {

-      // look for an inherited prototype that implements name

-      while (proto) {

-        if ((proto[name] !== caller) && proto[name]) {

-          return proto;

-        }

-        proto = getPrototypeOf(proto);

-      }

-      // must not return null, or we lose our invariant above

-      // in this case, a super() call was invoked where no superclass

-      // method exists

-      // TODO(sjmiles): thow an exception?

-      return Object;

-    }

-

-    // NOTE: In some platforms (IE10) the prototype chain is faked via 

-    // __proto__. Therefore, always get prototype via __proto__ instead of

-    // the more standard Object.getPrototypeOf.

-    function getPrototypeOf(prototype) {

-      return prototype.__proto__;

-    }

-

-    // utility function to precompute name tags for functions

-    // in a (unchained) prototype

-    function hintSuper(prototype) {

-      // tag functions with their prototype name to optimize

-      // super call invocations

-      for (var n in prototype) {

-        var pd = Object.getOwnPropertyDescriptor(prototype, n);

-        if (pd && typeof pd.value === 'function') {

-          pd.value.nom = n;

-        }

-      }

-    }

-

-    // exports

-

-    scope.super = $super;

-

-})(Polymer);

-
-/*
- * 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) {
-
-  function noopHandler(value) {
-    return value;
-  }
-
-  var typeHandlers = {
-    string: noopHandler,
-    'undefined': noopHandler,
-    date: function(value) {
-      return new Date(Date.parse(value) || Date.now());
-    },
-    boolean: function(value) {
-      if (value === '') {
-        return true;
-      }
-      return value === 'false' ? false : !!value;
-    },
-    number: function(value) {
-      var n = parseFloat(value);
-      // hex values like "0xFFFF" parseFloat as 0
-      if (n === 0) {
-        n = parseInt(value);
-      }
-      return isNaN(n) ? value : n;
-      // this code disabled because encoded values (like "0xFFFF")
-      // do not round trip to their original format
-      //return (String(floatVal) === value) ? floatVal : value;
-    },
-    object: function(value, currentValue) {
-      if (currentValue === null) {
-        return value;
-      }
-      try {
-        // If the string is an object, we can parse is with the JSON library.
-        // include convenience replace for single-quotes. If the author omits
-        // quotes altogether, parse will fail.
-        return JSON.parse(value.replace(/'/g, '"'));
-      } catch(e) {
-        // The object isn't valid JSON, return the raw value
-        return value;
-      }
-    },
-    // avoid deserialization of functions
-    'function': function(value, currentValue) {
-      return currentValue;
-    }
-  };
-
-  function deserializeValue(value, currentValue) {
-    // attempt to infer type from default value
-    var inferredType = typeof currentValue;
-    // invent 'date' type value for Date
-    if (currentValue instanceof Date) {
-      inferredType = 'date';
-    }
-    // delegate deserialization via type string
-    return typeHandlers[inferredType](value, currentValue);
-  }
-
-  // exports
-
-  scope.deserializeValue = deserializeValue;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var extend = scope.extend;
-
-  // module
-
-  var api = {};
-
-  api.declaration = {};
-  api.instance = {};
-
-  api.publish = function(apis, prototype) {
-    for (var n in apis) {
-      extend(prototype, apis[n]);
-    }
-  };
-
-  // exports
-
-  scope.api = api;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  var utils = {
-    /**
-      * Invokes a function asynchronously. The context of the callback
-      * function is bound to 'this' automatically.
-      * @method async
-      * @param {Function|String} method
-      * @param {any|Array} args
-      * @param {number} timeout
-      */
-    async: function(method, args, timeout) {
-      // when polyfilling Object.observe, ensure changes 
-      // propagate before executing the async method
-      Platform.flush();
-      // second argument to `apply` must be an array
-      args = (args && args.length) ? args : [args];
-      // function to invoke
-      var fn = function() {
-        (this[method] || method).apply(this, args);
-      }.bind(this);
-      // execute `fn` sooner or later
-      var handle = timeout ? setTimeout(fn, timeout) :
-          requestAnimationFrame(fn);
-      // NOTE: switch on inverting handle to determine which time is used.
-      return timeout ? handle : ~handle;
-    },
-    cancelAsync: function(handle) {
-      if (handle < 0) {
-        cancelAnimationFrame(~handle);
-      } else {
-        clearTimeout(handle);
-      }
-    },
-    /**
-      * Fire an event.
-      * @method fire
-      * @returns {Object} event
-      * @param {string} type An event name.
-      * @param {any} detail
-      * @param {Node} onNode Target node.
-      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true
-      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true
-      */
-    fire: function(type, detail, onNode, bubbles, cancelable) {
-      var node = onNode || this;
-      var detail = detail === null || detail === undefined ? {} : detail;
-      var event = new CustomEvent(type, {
-        bubbles: bubbles !== undefined ? bubbles : true,
-        cancelable: cancelable !== undefined ? cancelable : true,
-        detail: detail
-      });
-      node.dispatchEvent(event);
-      return event;
-    },
-    /**
-      * Fire an event asynchronously.
-      * @method asyncFire
-      * @param {string} type An event name.
-      * @param detail
-      * @param {Node} toNode Target node.
-      */
-    asyncFire: function(/*inType, inDetail*/) {
-      this.async("fire", arguments);
-    },
-    /**
-      * Remove class from old, add class to anew, if they exist.
-      * @param classFollows
-      * @param anew A node.
-      * @param old A node
-      * @param className
-      */
-    classFollows: function(anew, old, className) {
-      if (old) {
-        old.classList.remove(className);
-      }
-      if (anew) {
-        anew.classList.add(className);
-      }
-    },
-    /**
-      * Inject HTML which contains markup bound to this element into
-      * a target element (replacing target element content).
-      * @param String html to inject
-      * @param Element target element
-      */
-    injectBoundHTML: function(html, element) {
-      var template = document.createElement('template');
-      template.innerHTML = html;
-      var fragment = this.instanceTemplate(template);
-      if (element) {
-        element.textContent = '';
-        element.appendChild(fragment);
-      }
-      return fragment;
-    }
-  };
-
-  // no-operation function for handy stubs
-  var nop = function() {};
-
-  // null-object for handy stubs
-  var nob = {};
-
-  // deprecated
-
-  utils.asyncMethod = utils.async;
-
-  // exports
-
-  scope.api.instance.utils = utils;
-  scope.nop = nop;
-  scope.nob = nob;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var EVENT_PREFIX = 'on-';
-
-  // instance events api
-  var events = {
-    // read-only
-    EVENT_PREFIX: EVENT_PREFIX,
-    // event listeners on host
-    addHostListeners: function() {
-      var events = this.eventDelegates;
-      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
-      // NOTE: host events look like bindings but really are not;
-      // (1) we don't want the attribute to be set and (2) we want to support
-      // multiple event listeners ('host' and 'instance') and Node.bind
-      // by default supports 1 thing being bound.
-      for (var type in events) {
-        var methodName = events[type];
-        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));
-      }
-    },
-    // call 'method' or function method on 'obj' with 'args', if the method exists
-    dispatchMethod: function(obj, method, args) {
-      if (obj) {
-        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
-        var fn = typeof method === 'function' ? method : obj[method];
-        if (fn) {
-          fn[args ? 'apply' : 'call'](obj, args);
-        }
-        log.events && console.groupEnd();
-        Platform.flush();
-      }
-    }
-  };
-
-  // exports
-
-  scope.api.instance.events = events;
-
-  // alias PolymerGestures event listener logic
-  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);
-
-/*

- * 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) {

-

-  // instance api for attributes

-

-  var attributes = {

-    copyInstanceAttributes: function () {

-      var a$ = this._instanceAttributes;

-      for (var k in a$) {

-        if (!this.hasAttribute(k)) {

-          this.setAttribute(k, a$[k]);

-        }

-      }

-    },

-    // for each attribute on this, deserialize value to property as needed

-    takeAttributes: function() {

-      // if we have no publish lookup table, we have no attributes to take

-      // TODO(sjmiles): ad hoc

-      if (this._publishLC) {

-        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

-          this.attributeToProperty(a.name, a.value);

-        }

-      }

-    },

-    // if attribute 'name' is mapped to a property, deserialize

-    // 'value' into that property

-    attributeToProperty: function(name, value) {

-      // try to match this attribute to a property (attributes are

-      // all lower-case, so this is case-insensitive search)

-      var name = this.propertyForAttribute(name);

-      if (name) {

-        // filter out 'mustached' values, these are to be

-        // replaced with bound-data and are not yet values

-        // themselves

-        if (value && value.search(scope.bindPattern) >= 0) {

-          return;

-        }

-        // get original value

-        var currentValue = this[name];

-        // deserialize Boolean or Number values from attribute

-        var value = this.deserializeValue(value, currentValue);

-        // only act if the value has changed

-        if (value !== currentValue) {

-          // install new value (has side-effects)

-          this[name] = value;

-        }

-      }

-    },

-    // return the published property matching name, or undefined

-    propertyForAttribute: function(name) {

-      var match = this._publishLC && this._publishLC[name];

-      //console.log('propertyForAttribute:', name, 'matches', match);

-      return match;

-    },

-    // convert representation of 'stringValue' based on type of 'currentValue'

-    deserializeValue: function(stringValue, currentValue) {

-      return scope.deserializeValue(stringValue, currentValue);

-    },

-    serializeValue: function(value, inferredType) {

-      if (inferredType === 'boolean') {

-        return value ? '' : undefined;

-      } else if (inferredType !== 'object' && inferredType !== 'function'

-          && value !== undefined) {

-        return value;

-      }

-    },

-    reflectPropertyToAttribute: function(name) {

-      var inferredType = typeof this[name];

-      // try to intelligently serialize property value

-      var serializedValue = this.serializeValue(this[name], inferredType);

-      // boolean properties must reflect as boolean attributes

-      if (serializedValue !== undefined) {

-        this.setAttribute(name, serializedValue);

-        // TODO(sorvell): we should remove attr for all properties

-        // that have undefined serialization; however, we will need to

-        // refine the attr reflection system to achieve this; pica, for example,

-        // relies on having inferredType object properties not removed as

-        // attrs.

-      } else if (inferredType === 'boolean') {

-        this.removeAttribute(name);

-      }

-    }

-  };

-

-  // exports

-

-  scope.api.instance.attributes = attributes;

-

-})(Polymer);

-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-
-  // magic words
-
-  var OBSERVE_SUFFIX = 'Changed';
-
-  // element api
-
-  var empty = [];
-
-  var updateRecord = {
-    object: undefined,
-    type: 'update',
-    name: undefined,
-    oldValue: undefined
-  };
-
-  var numberIsNaN = Number.isNaN || function(value) {
-    return typeof value === 'number' && isNaN(value);
-  }
-
-  function areSameValue(left, right) {
-    if (left === right)
-      return left !== 0 || 1 / left === 1 / right;
-    if (numberIsNaN(left) && numberIsNaN(right))
-      return true;
-
-    return left !== left && right !== right;
-  }
-
-  // capture A's value if B's value is null or undefined,
-  // otherwise use B's value
-  function resolveBindingValue(oldValue, value) {
-    if (value === undefined && oldValue === null) {
-      return value;
-    }
-    return (value === null || value === undefined) ? oldValue : value;
-  }
-
-  var properties = {
-    createPropertyObserver: function() {
-      var n$ = this._observeNames;
-      if (n$ && n$.length) {
-        var o = this._propertyObserver = new CompoundObserver(true);
-        this.registerObserver(o);
-        // TODO(sorvell): may not be kosher to access the value here (this[n]);
-        // previously we looked at the descriptor on the prototype
-        // this doesn't work for inheritance and not for accessors without
-        // a value property
-        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
-          o.addPath(this, n);
-          this.observeArrayValue(n, this[n], null);
-        }
-      }
-    },
-    openPropertyObserver: function() {
-      if (this._propertyObserver) {
-        this._propertyObserver.open(this.notifyPropertyChanges, this);
-      }
-    },
-    notifyPropertyChanges: function(newValues, oldValues, paths) {
-      var name, method, called = {};
-      for (var i in oldValues) {
-        // note: paths is of form [object, path, object, path]
-        name = paths[2 * i + 1];
-        method = this.observe[name];
-        if (method) {
-          var ov = oldValues[i], nv = newValues[i];
-          // observes the value if it is an array
-          this.observeArrayValue(name, nv, ov);
-          if (!called[method]) {
-            // only invoke change method if one of ov or nv is not (undefined | null)
-            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {
-              called[method] = true;
-              // TODO(sorvell): call method with the set of values it's expecting;
-              // e.g. 'foo bar': 'invalidate' expects the new and old values for
-              // foo and bar. Currently we give only one of these and then
-              // deliver all the arguments.
-              this.invokeMethod(method, [ov, nv, arguments]);
-            }
-          }
-        }
-      }
-    },
-    deliverChanges: function() {
-      if (this._propertyObserver) {
-        this._propertyObserver.deliver();
-      }
-    },
-    propertyChanged_: function(name, value, oldValue) {
-      if (this.reflect[name]) {
-        this.reflectPropertyToAttribute(name);
-      }
-    },
-    observeArrayValue: function(name, value, old) {
-      // we only care if there are registered side-effects
-      var callbackName = this.observe[name];
-      if (callbackName) {
-        // if we are observing the previous value, stop
-        if (Array.isArray(old)) {
-          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
-          this.closeNamedObserver(name + '__array');
-        }
-        // if the new value is an array, being observing it
-        if (Array.isArray(value)) {
-          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
-          var observer = new ArrayObserver(value);
-          observer.open(function(splices) {
-            this.invokeMethod(callbackName, [splices]);
-          }, this);
-          this.registerNamedObserver(name + '__array', observer);
-        }
-      }
-    },
-    emitPropertyChangeRecord: function(name, value, oldValue) {
-      var object = this;
-      if (areSameValue(value, oldValue))
-        return;
-
-      this.propertyChanged_(name, value, oldValue);
-
-      if (!Observer.hasObjectObserve)
-        return;
-
-      var notifier = this.notifier_;
-      if (!notifier)
-        notifier = this.notifier_ = Object.getNotifier(this);
-
-      updateRecord.object = this;
-      updateRecord.name = name;
-      updateRecord.oldValue = oldValue;
-
-      notifier.notify(updateRecord);
-    },
-    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;
-      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);
-        if (!areSameValue(value, resolvedValue)) {
-          value = resolvedValue;
-          if (observable.setValue)
-            observable.setValue(value);
-        }
-      }
-
-      updateValue(value, oldValue);
-
-      var observer = {
-        close: function() {
-          observable.close();
-          self[privateObservable] = undefined;
-          self[privateComputedBoundValue] = undefined;
-        }
-      };
-      this.registerObserver(observer);
-      return observer;
-    },
-    createComputedProperties: function() {
-      if (!this._computedNames) {
-        return;
-      }
-
-      for (var i = 0; i < this._computedNames.length; i++) {
-        var name = this._computedNames[i];
-        var expressionText = this.computed[name];
-        try {
-          var expression = PolymerExpressions.getExpression(expressionText);
-          var observable = expression.getBinding(this, this.element.syntax);
-          this.bindToAccessor(name, observable);
-        } catch (ex) {
-          console.error('Failed to create computed property', ex);
-        }
-      }
-    },
-    bindProperty: function(property, observable, oneTime) {
-      if (oneTime) {
-        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) {
-      var fn = this[method] || method;
-      if (typeof fn === 'function') {
-        fn.apply(this, args);
-      }
-    },
-    registerObserver: function(observer) {
-      if (!this._observers) {
-        this._observers = [observer];
-        return;
-      }
-
-      this._observers.push(observer);
-    },
-    // observer array items are arrays of observers.
-    closeObservers: function() {
-      if (!this._observers) {
-        return;
-      }
-
-      var observers = this._observers;
-      for (var i = 0; i < observers.length; i++) {
-        var observer = observers[i];
-        if (observer && typeof observer.close == 'function') {
-          observer.close();
-        }
-      }
-
-      this._observers = [];
-    },
-    // bookkeeping observers for memory management
-    registerNamedObserver: function(name, observer) {
-      var o$ = this._namedObservers || (this._namedObservers = {});
-      o$[name] = observer;
-    },
-    closeNamedObserver: function(name) {
-      var o$ = this._namedObservers;
-      if (o$ && o$[name]) {
-        o$[name].close();
-        o$[name] = null;
-        return true;
-      }
-    },
-    closeNamedObservers: function() {
-      if (this._namedObservers) {
-        for (var i in this._namedObservers) {
-          this.closeNamedObserver(i);
-        }
-        this._namedObservers = {};
-      }
-    }
-  };
-
-  // logging
-  var LOG_OBSERVE = '[%s] watching [%s]';
-  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
-  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
-
-  // exports
-
-  scope.api.instance.properties = properties;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || 0;
-
-  // element api supporting mdv
-  var mdv = {
-    instanceTemplate: function(template) {
-      // ensure template is decorated (lets' things like <tr template ...> work)
-      HTMLTemplateElement.decorate(template);
-      // ensure a default bindingDelegate
-      var syntax = this.syntax || (!template.bindingDelegate &&
-          this.element.syntax);
-      var dom = template.createInstance(this, syntax);
-      var observers = dom.bindings_;
-      for (var i = 0; i < observers.length; i++) {
-        this.registerObserver(observers[i]);
-      }
-      return dom;
-    },
-    bind: function(name, observable, oneTime) {
-      var property = this.propertyForAttribute(name);
-      if (!property) {
-        // TODO(sjmiles): this mixin method must use the special form
-        // of `super` installed by `mixinMethod` in declaration/prototype.js
-        return this.mixinSuper(arguments);
-      } else {
-        // use n-way Polymer binding
-        var observer = this.bindProperty(property, observable, oneTime);
-        // NOTE: reflecting binding information is typically required only for
-        // tooling. It has a performance cost so it's opt-in in Node.bind.
-        if (Platform.enableBindingsReflection && observer) {
-          observer.path = observable.path_;
-          this._recordBinding(property, observer);
-        }
-        if (this.reflect[property]) {
-          this.reflectPropertyToAttribute(property);
-        }
-        return observer;
-      }
-    },
-    bindFinished: function() {
-      this.makeElementReady();
-    },
-    _recordBinding: function(name, observer) {
-      this.bindings_ = this.bindings_ || {};
-      this.bindings_[name] = observer;
-    },
-    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
-    // TemplateBinding. We still need to close/dispose of observers but perhaps
-    // we should choose a more explicit name.
-    asyncUnbindAll: function() {
-      if (!this._unbound) {
-        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
-        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
-      }
-    },
-    unbindAll: function() {
-      if (!this._unbound) {
-        this.closeObservers();
-        this.closeNamedObservers();
-        this._unbound = true;
-      }
-    },
-    cancelUnbindAll: function() {
-      if (this._unbound) {
-        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
-        return;
-      }
-      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
-      if (this._unbindAllJob) {
-        this._unbindAllJob = this._unbindAllJob.stop();
-      }
-    }
-  };
-
-  function unbindNodeTree(node) {
-    forNodeTree(node, _nodeUnbindAll);
-  }
-
-  function _nodeUnbindAll(node) {
-    node.unbindAll();
-  }
-
-  function forNodeTree(node, callback) {
-    if (node) {
-      callback(node);
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        forNodeTree(child, callback);
-      }
-    }
-  }
-
-  var mustachePattern = /\{\{([^{}]*)}}/;
-
-  // exports
-
-  scope.bindPattern = mustachePattern;
-  scope.api.instance.mdv = mdv;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  var base = {
-    PolymerBase: true,
-    job: function(job, callback, wait) {
-      if (typeof job === 'string') {
-        var n = '___' + job;
-        this[n] = Polymer.job.call(this, this[n], callback, wait);
-      } else {
-        return Polymer.job.call(this, job, callback, wait);
-      }
-    },
-    super: Polymer.super,
-    // user entry point for element has had its createdCallback called
-    created: function() {
-    },
-    // user entry point for element has shadowRoot and is ready for
-    // api interaction
-    ready: function() {
-    },
-    createdCallback: function() {
-      if (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();
-      if (!this.ownerDocument.isStagingDocument) {
-        this.makeElementReady();
-      }
-    },
-    // system entry point, do not override
-    prepareElement: function() {
-      if (this._elementPrepared) {
-        console.warn('Element already prepared', this.localName);
-        return;
-      }
-      this._elementPrepared = true;
-      // storage for shadowRoots info
-      this.shadowRoots = {};
-      // install property observers
-      this.createPropertyObserver();
-      this.openPropertyObserver();
-      // install boilerplate attributes
-      this.copyInstanceAttributes();
-      // process input attributes
-      this.takeAttributes();
-      // add event listeners
-      this.addHostListeners();
-    },
-    makeElementReady: function() {
-      if (this._readied) {
-        return;
-      }
-      this._readied = true;
-      this.createComputedProperties();
-      // TODO(sorvell): We could create an entry point here
-      // for the user to compute property values.
-      // process declarative resources
-      this.parseDeclarations(this.__proto__);
-      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
-      // :unresolved; remove this attribute to be compatible with native
-      // CE.
-      this.removeAttribute('unresolved');
-      // user entry point
-      this.ready();
-    },
-    attachedCallback: function() {
-      this.cancelUnbindAll();
-      // invoke user action
-      if (this.attached) {
-        this.attached();
-      }
-      // TODO(sorvell): bc
-      if (this.enteredView) {
-        this.enteredView();
-      }
-      // NOTE: domReady can be used to access elements in dom (descendants,
-      // ancestors, siblings) such that the developer is enured to upgrade
-      // ordering. If the element definitions have loaded, domReady
-      // can be used to access upgraded elements.
-      if (!this.hasBeenAttached) {
-        this.hasBeenAttached = true;
-        if (this.domReady) {
-          this.async('domReady');
-        }
-      }
-    },
-    detachedCallback: function() {
-      if (!this.preventDispose) {
-        this.asyncUnbindAll();
-      }
-      // invoke user action
-      if (this.detached) {
-        this.detached();
-      }
-      // TODO(sorvell): bc
-      if (this.leftView) {
-        this.leftView();
-      }
-    },
-    // TODO(sorvell): bc
-    enteredViewCallback: function() {
-      this.attachedCallback();
-    },
-    // TODO(sorvell): bc
-    leftViewCallback: function() {
-      this.detachedCallback();
-    },
-    // TODO(sorvell): bc
-    enteredDocumentCallback: function() {
-      this.attachedCallback();
-    },
-    // TODO(sorvell): bc
-    leftDocumentCallback: function() {
-      this.detachedCallback();
-    },
-    // recursive ancestral <element> initialization, oldest first
-    parseDeclarations: function(p) {
-      if (p && p.element) {
-        this.parseDeclarations(p.__proto__);
-        p.parseDeclaration.call(this, p.element);
-      }
-    },
-    // parse input <element> as needed, override for custom behavior
-    parseDeclaration: function(elementElement) {
-      var template = this.fetchTemplate(elementElement);
-      if (template) {
-        var root = this.shadowFromTemplate(template);
-        this.shadowRoots[elementElement.name] = root;
-      }
-    },
-    // return a shadow-root template (if desired), override for custom behavior
-    fetchTemplate: function(elementElement) {
-      return elementElement.querySelector('template');
-    },
-    // utility function that creates a shadow root from a <template>
-    shadowFromTemplate: function(template) {
-      if (template) {
-        // make a shadow root
-        var root = this.createShadowRoot();
-        // stamp template
-        // which includes parsing and applying MDV bindings before being
-        // inserted (to avoid {{}} in attribute values)
-        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
-        var dom = this.instanceTemplate(template);
-        // append to shadow dom
-        root.appendChild(dom);
-        // perform post-construction initialization tasks on shadow root
-        this.shadowRootReady(root, template);
-        // return the created shadow root
-        return root;
-      }
-    },
-    // utility function that stamps a <template> into light-dom
-    lightFromTemplate: function(template, refNode) {
-      if (template) {
-        // TODO(sorvell): mark this element as an eventController so that
-        // event listeners on bound nodes inside it will be called on it.
-        // Note, the expectation here is that events on all descendants
-        // should be handled by this element.
-        this.eventController = this;
-        // stamp template
-        // which includes parsing and applying MDV bindings before being
-        // inserted (to avoid {{}} in attribute values)
-        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
-        var dom = this.instanceTemplate(template);
-        // append to shadow dom
-        if (refNode) {
-          this.insertBefore(dom, refNode);
-        } else {
-          this.appendChild(dom);
-        }
-        // perform post-construction initialization tasks on ahem, light root
-        this.shadowRootReady(this);
-        // return the created shadow root
-        return dom;
-      }
-    },
-    shadowRootReady: function(root) {
-      // locate nodes with id and store references to them in this.$ hash
-      this.marshalNodeReferences(root);
-    },
-    // locate nodes with id and store references to them in this.$ hash
-    marshalNodeReferences: function(root) {
-      // establish $ instance variable
-      var $ = this.$ = this.$ || {};
-      // populate $ from nodes with ID from the LOCAL tree
-      if (root) {
-        var n$ = root.querySelectorAll("[id]");
-        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
-          $[n.id] = n;
-        };
-      }
-    },
-    attributeChangedCallback: function(name, oldValue) {
-      // TODO(sjmiles): adhoc filter
-      if (name !== 'class' && name !== 'style') {
-        this.attributeToProperty(name, this.getAttribute(name));
-      }
-      if (this.attributeChanged) {
-        this.attributeChanged.apply(this, arguments);
-      }
-    },
-    onMutation: function(node, listener) {
-      var observer = new MutationObserver(function(mutations) {
-        listener.call(this, observer, mutations);
-        observer.disconnect();
-      }.bind(this));
-      observer.observe(node, {childList: true, subtree: true});
-    }
-  };
-
-  // true if object has own PolymerBase api
-  function isBase(object) {
-    return object.hasOwnProperty('PolymerBase')
-  }
-
-  // name a base constructor for dev tools
-
-  function PolymerBase() {};
-  PolymerBase.prototype = base;
-  base.constructor = PolymerBase;
-
-  // exports
-
-  scope.Base = PolymerBase;
-  scope.isBase = isBase;
-  scope.api.instance.base = base;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
-
-  // magic words
-  
-  var STYLE_SCOPE_ATTRIBUTE = 'element';
-  var STYLE_CONTROLLER_SCOPE = 'controller';
-  
-  var styles = {
-    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
-    /**
-     * Installs external stylesheets and <style> elements with the attribute 
-     * polymer-scope='controller' into the scope of element. This is intended
-     * to be a called during custom element construction.
-    */
-    installControllerStyles: function() {
-      // apply controller styles, but only if they are not yet applied
-      var scope = this.findStyleScope();
-      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
-        // allow inherited controller styles
-        var proto = getPrototypeOf(this), cssText = '';
-        while (proto && proto.element) {
-          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
-          proto = getPrototypeOf(proto);
-        }
-        if (cssText) {
-          this.installScopeCssText(cssText, scope);
-        }
-      }
-    },
-    installScopeStyle: function(style, name, scope) {
-      var scope = scope || this.findStyleScope(), name = name || '';
-      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
-        var cssText = '';
-        if (style instanceof Array) {
-          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
-            cssText += s.textContent + '\n\n';
-          }
-        } else {
-          cssText = style.textContent;
-        }
-        this.installScopeCssText(cssText, scope, name);
-      }
-    },
-    installScopeCssText: function(cssText, scope, name) {
-      scope = scope || this.findStyleScope();
-      name = name || '';
-      if (!scope) {
-        return;
-      }
-      if (hasShadowDOMPolyfill) {
-        cssText = shimCssText(cssText, scope.host);
-      }
-      var style = this.element.cssTextToScopeStyle(cssText,
-          STYLE_CONTROLLER_SCOPE);
-      Polymer.applyStyleToScope(style, scope);
-      // cache that this style has been applied
-      this.styleCacheForScope(scope)[this.localName + name] = true;
-    },
-    findStyleScope: function(node) {
-      // find the shadow root that contains this element
-      var n = node || this;
-      while (n.parentNode) {
-        n = n.parentNode;
-      }
-      return n;
-    },
-    scopeHasNamedStyle: function(scope, name) {
-      var cache = this.styleCacheForScope(scope);
-      return cache[name];
-    },
-    styleCacheForScope: function(scope) {
-      if (hasShadowDOMPolyfill) {
-        var scopeName = scope.host ? scope.host.localName : scope.localName;
-        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
-      } else {
-        return scope._scopeStyles = (scope._scopeStyles || {});
-      }
-    }
-  };
-
-  var polyfillScopeStyleCache = {};
-  
-  // NOTE: use raw prototype traversal so that we ensure correct traversal
-  // on platforms where the protoype chain is simulated via __proto__ (IE10)
-  function getPrototypeOf(prototype) {
-    return prototype.__proto__;
-  }
-
-  function shimCssText(cssText, host) {
-    var name = '', is = false;
-    if (host) {
-      name = host.localName;
-      is = host.hasAttribute('is');
-    }
-    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);
-    return Platform.ShadowCSS.shimCssText(cssText, selector);
-  }
-
-  // exports
-
-  scope.api.instance.styles = styles;
-  
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-
-  // imperative implementation: Polymer()
-
-  // specify an 'own' prototype for tag `name`
-  function element(name, prototype) {
-    if (typeof name !== 'string') {
-      var script = prototype || document._currentScript;
-      prototype = name;
-      name = script && script.parentNode && script.parentNode.getAttribute ?
-          script.parentNode.getAttribute('name') : '';
-      if (!name) {
-        throw 'Element name could not be inferred.';
-      }
-    }
-    if (getRegisteredPrototype(name)) {
-      throw 'Already registered (Polymer) prototype for element ' + name;
-    }
-    // cache the prototype
-    registerPrototype(name, prototype);
-    // notify the registrar waiting for 'name', if any
-    notifyPrototype(name);
-  }
-
-  // async prototype source
-
-  function waitingForPrototype(name, client) {
-    waitPrototype[name] = client;
-  }
-
-  var waitPrototype = {};
-
-  function notifyPrototype(name) {
-    if (waitPrototype[name]) {
-      waitPrototype[name].registerWhenReady();
-      delete waitPrototype[name];
-    }
-  }
-
-  // utility and bookkeeping
-
-  // maps tag names to prototypes, as registered with
-  // Polymer. Prototypes associated with a tag name
-  // using document.registerElement are available from
-  // HTMLElement.getPrototypeForTag().
-  // If an element was fully registered by Polymer, then
-  // Polymer.getRegisteredPrototype(name) === 
-  //   HTMLElement.getPrototypeForTag(name)
-
-  var prototypesByName = {};
-
-  function registerPrototype(name, prototype) {
-    return prototypesByName[name] = prototype || {};
-  }
-
-  function getRegisteredPrototype(name) {
-    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
-
-  // make window.Polymer reference `element()`
-
-  window.Polymer = element;
-
-  // TODO(sjmiles): find a way to do this that is less terrible
-  // copy window.Polymer properties onto `element()`
-
-  extend(Polymer, scope);
-
-  // Under the HTMLImports polyfill, scripts in the main document
-  // do not block on imports; we want to allow calls to Polymer in the main
-  // document. Platform collects those calls until we can process them, which
-  // we do here.
-
-  if (Platform.consumeDeclarations) {
-    Platform.consumeDeclarations(function(declarations) {;
-      if (declarations) {
-        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
-          element.apply(null, d);
-        }
-      }
-    });
-  }
-
-})(Polymer);
-
-/*
- * 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) {
-
-var path = {
-  resolveElementPaths: function(node) {
-    Polymer.urlResolver.resolveDom(node);
-  },
-  addResolvePathApi: function() {
-    // let assetpath attribute modify the resolve path
-    var assetPath = this.getAttribute('assetpath') || '';
-    var root = new URL(assetPath, this.ownerDocument.baseURI);
-    this.prototype.resolvePath = function(urlPath, base) {
-      var u = new URL(urlPath, base || root);
-      return u.href;
-    };
-  }
-};
-
-// exports
-scope.api.declaration.path = path;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.styles;
-  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
-
-  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
-
-  // magic words
-
-  var STYLE_SELECTOR = 'style';
-  var STYLE_LOADABLE_MATCH = '@import';
-  var SHEET_SELECTOR = 'link[rel=stylesheet]';
-  var STYLE_GLOBAL_SCOPE = 'global';
-  var SCOPE_ATTR = 'polymer-scope';
-
-  var styles = {
-    // returns true if resources are loading
-    loadStyles: function(callback) {
-      var template = this.fetchTemplate();
-      var content = template && this.templateContent();
-      if (content) {
-        this.convertSheetsToStyles(content);
-        var styles = this.findLoadableStyles(content);
-        if (styles.length) {
-          var templateUrl = template.ownerDocument.baseURI;
-          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);
-        }
-      }
-      if (callback) {
-        callback();
-      }
-    },
-    convertSheetsToStyles: function(root) {
-      var s$ = root.querySelectorAll(SHEET_SELECTOR);
-      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
-        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
-            this.ownerDocument);
-        this.copySheetAttributes(c, s);
-        s.parentNode.replaceChild(c, s);
-      }
-    },
-    copySheetAttributes: function(style, link) {
-      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
-        if (a.name !== 'rel' && a.name !== 'href') {
-          style.setAttribute(a.name, a.value);
-        }
-      }
-    },
-    findLoadableStyles: function(root) {
-      var loadables = [];
-      if (root) {
-        var s$ = root.querySelectorAll(STYLE_SELECTOR);
-        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
-          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
-            loadables.push(s);
-          }
-        }
-      }
-      return loadables;
-    },
-    /**
-     * Install external stylesheets loaded in <polymer-element> elements into the 
-     * element's template.
-     * @param elementElement The <element> element to style.
-     */
-    installSheets: function() {
-      this.cacheSheets();
-      this.cacheStyles();
-      this.installLocalSheets();
-      this.installGlobalStyles();
-    },
-    /**
-     * Remove all sheets from element and store for later use.
-     */
-    cacheSheets: function() {
-      this.sheets = this.findNodes(SHEET_SELECTOR);
-      this.sheets.forEach(function(s) {
-        if (s.parentNode) {
-          s.parentNode.removeChild(s);
-        }
-      });
-    },
-    cacheStyles: function() {
-      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
-      this.styles.forEach(function(s) {
-        if (s.parentNode) {
-          s.parentNode.removeChild(s);
-        }
-      });
-    },
-    /**
-     * Takes external stylesheets loaded in an <element> element and moves
-     * their content into a <style> element inside the <element>'s template.
-     * The sheet is then removed from the <element>. This is done only so 
-     * that if the element is loaded in the main document, the sheet does
-     * not become active.
-     * Note, ignores sheets with the attribute 'polymer-scope'.
-     * @param elementElement The <element> element to style.
-     */
-    installLocalSheets: function () {
-      var sheets = this.sheets.filter(function(s) {
-        return !s.hasAttribute(SCOPE_ATTR);
-      });
-      var content = this.templateContent();
-      if (content) {
-        var cssText = '';
-        sheets.forEach(function(sheet) {
-          cssText += cssTextFromSheet(sheet) + '\n';
-        });
-        if (cssText) {
-          var style = createStyleElement(cssText, this.ownerDocument);
-          content.insertBefore(style, content.firstChild);
-        }
-      }
-    },
-    findNodes: function(selector, matcher) {
-      var nodes = this.querySelectorAll(selector).array();
-      var content = this.templateContent();
-      if (content) {
-        var templateNodes = content.querySelectorAll(selector).array();
-        nodes = nodes.concat(templateNodes);
-      }
-      return matcher ? nodes.filter(matcher) : nodes;
-    },
-    /**
-     * Promotes external stylesheets and <style> elements with the attribute 
-     * polymer-scope='global' into global scope.
-     * This is particularly useful for defining @keyframe rules which 
-     * currently do not function in scoped or shadow style elements.
-     * (See wkb.ug/72462)
-     * @param elementElement The <element> element to style.
-    */
-    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
-    installGlobalStyles: function() {
-      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
-      applyStyleToScope(style, document.head);
-    },
-    cssTextForScope: function(scopeDescriptor) {
-      var cssText = '';
-      // handle stylesheets
-      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
-      var matcher = function(s) {
-        return matchesSelector(s, selector);
-      };
-      var sheets = this.sheets.filter(matcher);
-      sheets.forEach(function(sheet) {
-        cssText += cssTextFromSheet(sheet) + '\n\n';
-      });
-      // handle cached style elements
-      var styles = this.styles.filter(matcher);
-      styles.forEach(function(style) {
-        cssText += style.textContent + '\n\n';
-      });
-      return cssText;
-    },
-    styleForScope: function(scopeDescriptor) {
-      var cssText = this.cssTextForScope(scopeDescriptor);
-      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
-    },
-    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
-      if (cssText) {
-        var style = createStyleElement(cssText);
-        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
-            '-' + scopeDescriptor);
-        return style;
-      }
-    }
-  };
-
-  function importRuleForSheet(sheet, baseUrl) {
-    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
-    return '@import \'' + href + '\';';
-  }
-
-  function applyStyleToScope(style, scope) {
-    if (style) {
-      if (scope === document) {
-        scope = document.head;
-      }
-      if (hasShadowDOMPolyfill) {
-        scope = document.head;
-      }
-      // TODO(sorvell): necessary for IE
-      // see https://connect.microsoft.com/IE/feedback/details/790212/
-      // cloning-a-style-element-and-adding-to-document-produces
-      // -unexpected-result#details
-      // var clone = style.cloneNode(true);
-      var clone = createStyleElement(style.textContent);
-      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
-      if (attr) {
-        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
-      }
-      // TODO(sorvell): probably too brittle; try to figure out 
-      // where to put the element.
-      var refNode = scope.firstElementChild;
-      if (scope === document.head) {
-        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
-        var s$ = document.head.querySelectorAll(selector);
-        if (s$.length) {
-          refNode = s$[s$.length-1].nextElementSibling;
-        }
-      }
-      scope.insertBefore(clone, refNode);
-    }
-  }
-
-  function createStyleElement(cssText, scope) {
-    scope = scope || document;
-    scope = scope.createElement ? scope : scope.ownerDocument;
-    var style = scope.createElement('style');
-    style.textContent = cssText;
-    return style;
-  }
-
-  function cssTextFromSheet(sheet) {
-    return (sheet && sheet.__resource) || '';
-  }
-
-  function matchesSelector(node, inSelector) {
-    if (matches) {
-      return matches.call(node, inSelector);
-    }
-  }
-  var p = HTMLElement.prototype;
-  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
-      || p.mozMatchesSelector;
-  
-  // exports
-
-  scope.api.declaration.styles = styles;
-  scope.applyStyleToScope = applyStyleToScope;
-  
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.events;
-  var EVENT_PREFIX = api.EVENT_PREFIX;
-  // polymer-element declarative api: events feature
-
-  var mixedCaseEventTypes = {};
-  [
-    'webkitAnimationStart',
-    'webkitAnimationEnd',
-    'webkitTransitionEnd',
-    'DOMFocusOut',
-    'DOMFocusIn',
-    'DOMMouseScroll'
-  ].forEach(function(e) {
-    mixedCaseEventTypes[e.toLowerCase()] = e;
-  });
-
-  var events = {
-    parseHostEvents: function() {
-      // our delegates map
-      var delegates = this.prototype.eventDelegates;
-      // extract data from attributes into delegates
-      this.addAttributeDelegates(delegates);
-    },
-    addAttributeDelegates: function(delegates) {
-      // for each attribute
-      for (var i=0, a; a=this.attributes[i]; i++) {
-        // does it have magic marker identifying it as an event delegate?
-        if (this.hasEventPrefix(a.name)) {
-          // if so, add the info to delegates
-          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
-              .replace('}}', '').trim();
-        }
-      }
-    },
-    // starts with 'on-'
-    hasEventPrefix: function (n) {
-      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
-    },
-    removeEventPrefix: function(n) {
-      return n.slice(prefixLength);
-    },
-    findController: function(node) {
-      while (node.parentNode) {
-        if (node.eventController) {
-          return node.eventController;
-        }
-        node = node.parentNode;
-      }
-      return node.host;
-    },
-    getEventHandler: function(controller, target, method) {
-      var events = this;
-      return function(e) {
-        if (!controller || !controller.PolymerBase) {
-          controller = events.findController(target);
-        }
-
-        var args = [e, e.detail, e.currentTarget];
-        controller.dispatchMethod(controller, method, args);
-      };
-    },
-    prepareEventBinding: function(pathString, name, node) {
-      if (!this.hasEventPrefix(name))
-        return;
-
-      var eventType = this.removeEventPrefix(name);
-      eventType = mixedCaseEventTypes[eventType] || eventType;
-
-      var events = this;
-
-      return function(model, node, oneTime) {
-        var handler = events.getEventHandler(undefined, node, pathString);
-        PolymerGestures.addEventListener(node, eventType, handler);
-
-        if (oneTime)
-          return;
-
-        // TODO(rafaelw): This is really pointless work. Aside from the cost
-        // of these allocations, NodeBind is going to setAttribute back to its
-        // current value. Fixing this would mean changing the TemplateBinding
-        // binding delegate API.
-        function bindingValue() {
-          return '{{ ' + pathString + ' }}';
-        }
-
-        return {
-          open: bindingValue,
-          discardChanges: bindingValue,
-          close: function() {
-            PolymerGestures.removeEventListener(node, eventType, handler);
-          }
-        };
-      };
-    }
-  };
-
-  var prefixLength = EVENT_PREFIX.length;
-
-  // exports
-  scope.api.declaration.events = events;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // element api
-
-  var properties = {
-    inferObservers: function(prototype) {
-      // called before prototype.observe is chained to inherited object
-      var observe = prototype.observe, property;
-      for (var n in prototype) {
-        if (n.slice(-7) === 'Changed') {
-          if (!observe) {
-            observe  = (prototype.observe = {});
-          }
-          property = n.slice(0, -7)
-          observe[property] = observe[property] || n;
-        }
-      }
-    },
-    explodeObservers: function(prototype) {
-      // called before prototype.observe is chained to inherited object
-      var o = prototype.observe;
-      if (o) {
-        var exploded = {};
-        for (var n in o) {
-          var names = n.split(' ');
-          for (var i=0, ni; ni=names[i]; i++) {
-            exploded[ni] = o[n];
-          }
-        }
-        prototype.observe = exploded;
-      }
-    },
-    optimizePropertyMaps: function(prototype) {
-      if (prototype.observe) {
-        // construct name list
-        var a = prototype._observeNames = [];
-        for (var n in prototype.observe) {
-          var names = n.split(' ');
-          for (var i=0, ni; ni=names[i]; i++) {
-            a.push(ni);
-          }
-        }
-      }
-      if (prototype.publish) {
-        // construct name list
-        var a = prototype._publishNames = [];
-        for (var n in prototype.publish) {
-          a.push(n);
-        }
-      }
-      if (prototype.computed) {
-        // construct name list
-        var a = prototype._computedNames = [];
-        for (var n in prototype.computed) {
-          a.push(n);
-        }
-      }
-    },
-    publishProperties: function(prototype, base) {
-      // if we have any properties to publish
-      var publish = prototype.publish;
-      if (publish) {
-        // transcribe `publish` entries onto own prototype
-        this.requireProperties(publish, prototype, base);
-        // construct map of lower-cased property names
-        prototype._publishLC = this.lowerCaseMap(publish);
-      }
-    },
-    //
-    // `name: value` entries in the `publish` object may need to generate 
-    // matching properties on the prototype.
-    //
-    // Values that are objects may have a `reflect` property, which
-    // signals that the value describes property control metadata.
-    // In metadata objects, the prototype default value (if any)
-    // is encoded in the `value` property.
-    //
-    // publish: {
-    //   foo: 5, 
-    //   bar: {value: true, reflect: true},
-    //   zot: {}
-    // }
-    //
-    // `reflect` metadata property controls whether changes to the property
-    // are reflected back to the attribute (default false). 
-    //
-    // A value is stored on the prototype unless it's === `undefined`,
-    // in which case the base chain is checked for a value.
-    // If the basal value is also undefined, `null` is stored on the prototype.
-    //
-    // The reflection data is stored on another prototype object, `reflect`
-    // which also can be specified directly.
-    //
-    // reflect: {
-    //   foo: true
-    // }
-    //
-    requireProperties: function(propertyInfos, prototype, base) {
-      // per-prototype storage for reflected properties
-      prototype.reflect = prototype.reflect || {};
-      // ensure a prototype value for each property
-      // and update the property's reflect to attribute status
-      for (var n in propertyInfos) {
-        var value = propertyInfos[n];
-        // value has metadata if it has a `reflect` property
-        if (value && value.reflect !== undefined) {
-          prototype.reflect[n] = Boolean(value.reflect);
-          value = value.value;
-        }
-        // only set a value if one is specified
-        if (value !== undefined) {
-          prototype[n] = value;
-        }
-      }
-    },
-    lowerCaseMap: function(properties) {
-      var map = {};
-      for (var n in properties) {
-        map[n.toLowerCase()] = n;
-      }
-      return map;
-    },
-    createPropertyAccessor: function(name, ignoreWrites) {
-      var proto = this.prototype;
-
-      var privateName = name + '_';
-      var privateObservable  = name + 'Observable_';
-      proto[privateName] = proto[name];
-
-      Object.defineProperty(proto, name, {
-        get: function() {
-          var observable = this[privateObservable];
-          if (observable)
-            observable.deliver();
-
-          return this[privateName];
-        },
-        set: function(value) {
-          if (ignoreWrites) {
-            return this[privateName];
-          }
-
-          var observable = this[privateObservable];
-          if (observable) {
-            observable.setValue(value);
-            return;
-          }
-
-          var oldValue = this[privateName];
-          this[privateName] = value;
-          this.emitPropertyChangeRecord(name, value, oldValue);
-
-          return value;
-        },
-        configurable: true
-      });
-    },
-    createPropertyAccessors: function(prototype) {
-      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, 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);
-          }
-        }
-      }
-    }
-  };
-
-  // exports
-
-  scope.api.declaration.properties = properties;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // magic words
-
-  var ATTRIBUTES_ATTRIBUTE = 'attributes';
-  var ATTRIBUTES_REGEX = /\s|,/;
-
-  // attributes api
-
-  var attributes = {
-    
-    inheritAttributesObjects: function(prototype) {
-      // chain our lower-cased publish map to the inherited version
-      this.inheritObject(prototype, 'publishLC');
-      // chain our instance attributes map to the inherited version
-      this.inheritObject(prototype, '_instanceAttributes');
-    },
-
-    publishAttributes: function(prototype, base) {
-      // merge names from 'attributes' attribute into the 'publish' object
-      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
-      if (attributes) {
-        // create a `publish` object if needed.
-        // the `publish` object is only relevant to this prototype, the 
-        // publishing logic in `declaration/properties.js` is responsible for
-        // managing property values on the prototype chain.
-        // TODO(sjmiles): the `publish` object is later chained to it's 
-        //                ancestor object, presumably this is only for 
-        //                reflection or other non-library uses. 
-        var publish = prototype.publish || (prototype.publish = {}); 
-        // names='a b c' or names='a,b,c'
-        var names = attributes.split(ATTRIBUTES_REGEX);
-        // record each name for publishing
-        for (var i=0, l=names.length, n; i<l; i++) {
-          // remove excess ws
-          n = names[i].trim();
-          // looks weird, but causes n to exist on `publish` if it does not;
-          // a more careful test would need expensive `in` operator
-          if (n && publish[n] === undefined) {
-            publish[n] = undefined;
-          }
-        }
-      }
-    },
-
-    // record clonable attributes from <element>
-    accumulateInstanceAttributes: function() {
-      // inherit instance attributes
-      var clonable = this.prototype._instanceAttributes;
-      // merge attributes from element
-      var a$ = this.attributes;
-      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
-        if (this.isInstanceAttribute(a.name)) {
-          clonable[a.name] = a.value;
-        }
-      }
-    },
-
-    isInstanceAttribute: function(name) {
-      return !this.blackList[name] && name.slice(0,3) !== 'on-';
-    },
-
-    // do not clone these attributes onto instances
-    blackList: {
-      name: 1,
-      'extends': 1,
-      constructor: 1,
-      noscript: 1,
-      assetpath: 1,
-      'cache-csstext': 1
-    }
-    
-  };
-
-  // add ATTRIBUTES_ATTRIBUTE to the blacklist
-  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
-
-  // exports
-
-  scope.api.declaration.attributes = attributes;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-  var events = scope.api.declaration.events;
-
-  var syntax = new PolymerExpressions();
-  var prepareBinding = syntax.prepareBinding;
-
-  // Polymer takes a first crack at the binding to see if it's a declarative
-  // event handler.
-  syntax.prepareBinding = function(pathString, name, node) {
-    return events.prepareEventBinding(pathString, name, node) ||
-           prepareBinding.call(syntax, pathString, name, node);
-  };
-
-  // declaration api supporting mdv
-  var mdv = {
-    syntax: syntax,
-    fetchTemplate: function() {
-      return this.querySelector('template');
-    },
-    templateContent: function() {
-      var template = this.fetchTemplate();
-      return template && template.content;
-    },
-    installBindingDelegate: function(template) {
-      if (template) {
-        template.bindingDelegate = this.syntax;
-      }
-    }
-  };
-
-  // exports
-  scope.api.declaration.mdv = mdv;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-  
-  var api = scope.api;
-  var isBase = scope.isBase;
-  var extend = scope.extend;
-
-  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
-
-  // prototype api
-
-  var prototype = {
-
-    register: function(name, extendeeName) {
-      // build prototype combining extendee, Polymer base, and named api
-      this.buildPrototype(name, extendeeName);
-      // register our custom element with the platform
-      this.registerPrototype(name, extendeeName);
-      // reference constructor in a global named by 'constructor' attribute
-      this.publishConstructor();
-    },
-
-    buildPrototype: function(name, extendeeName) {
-      // get our custom prototype (before chaining)
-      var extension = scope.getRegisteredPrototype(name);
-      // get basal prototype
-      var base = this.generateBasePrototype(extendeeName);
-      // implement declarative features
-      this.desugarBeforeChaining(extension, base);
-      // join prototypes
-      this.prototype = this.chainPrototypes(extension, base);
-      // more declarative features
-      this.desugarAfterChaining(name, extendeeName);
-    },
-
-    desugarBeforeChaining: function(prototype, base) {
-      // back reference declaration element
-      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
-      prototype.element = this;
-      // transcribe `attributes` declarations onto own prototype's `publish`
-      this.publishAttributes(prototype, base);
-      // `publish` properties to the prototype and to attribute watch
-      this.publishProperties(prototype, base);
-      // infer observers for `observe` list based on method names
-      this.inferObservers(prototype);
-      // desugar compound observer syntax, e.g. 'a b c' 
-      this.explodeObservers(prototype);
-    },
-
-    chainPrototypes: function(prototype, base) {
-      // chain various meta-data objects to inherited versions
-      this.inheritMetaData(prototype, base);
-      // chain custom api to inherited
-      var chained = this.chainObject(prototype, base);
-      // x-platform fixup
-      ensurePrototypeTraversal(chained);
-      return chained;
-    },
-
-    inheritMetaData: function(prototype, base) {
-      // chain observe object to inherited
-      this.inheritObject('observe', prototype, base);
-      // chain publish object to inherited
-      this.inheritObject('publish', prototype, base);
-      // chain reflect object to inherited
-      this.inheritObject('reflect', prototype, base);
-      // chain our lower-cased publish map to the inherited version
-      this.inheritObject('_publishLC', prototype, base);
-      // chain our instance attributes map to the inherited version
-      this.inheritObject('_instanceAttributes', prototype, base);
-      // chain our event delegates map to the inherited version
-      this.inheritObject('eventDelegates', prototype, base);
-    },
-
-    // implement various declarative features
-    desugarAfterChaining: function(name, extendee) {
-      // build side-chained lists to optimize iterations
-      this.optimizePropertyMaps(this.prototype);
-      this.createPropertyAccessors(this.prototype);
-      // install mdv delegate on template
-      this.installBindingDelegate(this.fetchTemplate());
-      // install external stylesheets as if they are inline
-      this.installSheets();
-      // adjust any paths in dom from imports
-      this.resolveElementPaths(this);
-      // compile list of attributes to copy to instances
-      this.accumulateInstanceAttributes();
-      // parse on-* delegates declared on `this` element
-      this.parseHostEvents();
-      //
-      // install a helper method this.resolvePath to aid in 
-      // setting resource urls. e.g.
-      // this.$.image.src = this.resolvePath('images/foo.png')
-      this.addResolvePathApi();
-      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
-      if (hasShadowDOMPolyfill) {
-        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
-      }
-      // allow custom element access to the declarative context
-      if (this.prototype.registerCallback) {
-        this.prototype.registerCallback(this);
-      }
-    },
-
-    // if a named constructor is requested in element, map a reference
-    // to the constructor to the given symbol
-    publishConstructor: function() {
-      var symbol = this.getAttribute('constructor');
-      if (symbol) {
-        window[symbol] = this.ctor;
-      }
-    },
-
-    // build prototype combining extendee, Polymer base, and named api
-    generateBasePrototype: function(extnds) {
-      var prototype = this.findBasePrototype(extnds);
-      if (!prototype) {
-        // create a prototype based on tag-name extension
-        var prototype = HTMLElement.getPrototypeForTag(extnds);
-        // insert base api in inheritance chain (if needed)
-        prototype = this.ensureBaseApi(prototype);
-        // memoize this base
-        memoizedBases[extnds] = prototype;
-      }
-      return prototype;
-    },
-
-    findBasePrototype: function(name) {
-      return memoizedBases[name];
-    },
-
-    // install Polymer instance api into prototype chain, as needed 
-    ensureBaseApi: function(prototype) {
-      if (prototype.PolymerBase) {
-        return prototype;
-      }
-      var extended = Object.create(prototype);
-      // we need a unique copy of base api for each base prototype
-      // therefore we 'extend' here instead of simply chaining
-      api.publish(api.instance, extended);
-      // TODO(sjmiles): sharing methods across prototype chains is
-      // not supported by 'super' implementation which optimizes
-      // by memoizing prototype relationships.
-      // Probably we should have a version of 'extend' that is 
-      // share-aware: it could study the text of each function,
-      // look for usage of 'super', and wrap those functions in
-      // closures.
-      // As of now, there is only one problematic method, so 
-      // we just patch it manually.
-      // To avoid re-entrancy problems, the special super method
-      // installed is called `mixinSuper` and the mixin method
-      // must use this method instead of the default `super`.
-      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
-      // return buffed-up prototype
-      return extended;
-    },
-
-    mixinMethod: function(extended, prototype, api, name) {
-      var $super = function(args) {
-        return prototype[name].apply(this, args);
-      };
-      extended[name] = function() {
-        this.mixinSuper = $super;
-        return api[name].apply(this, arguments);
-      }
-    },
-
-    // ensure prototype[name] inherits from a prototype.prototype[name]
-    inheritObject: function(name, prototype, base) {
-      // require an object
-      var source = prototype[name] || {};
-      // chain inherited properties onto a new object
-      prototype[name] = this.chainObject(source, base[name]);
-    },
-
-    // register 'prototype' to custom element 'name', store constructor 
-    registerPrototype: function(name, extendee) { 
-      var info = {
-        prototype: this.prototype
-      }
-      // native element must be specified in extends
-      var typeExtension = this.findTypeExtension(extendee);
-      if (typeExtension) {
-        info.extends = typeExtension;
-      }
-      // register the prototype with HTMLElement for name lookup
-      HTMLElement.register(name, this.prototype);
-      // register the custom type
-      this.ctor = document.registerElement(name, info);
-    },
-
-    findTypeExtension: function(name) {
-      if (name && name.indexOf('-') < 0) {
-        return name;
-      } else {
-        var p = this.findBasePrototype(name);
-        if (p.element) {
-          return this.findTypeExtension(p.element.extends);
-        }
-      }
-    }
-
-  };
-
-  // memoize base prototypes
-  var memoizedBases = {};
-
-  // implementation of 'chainObject' depends on support for __proto__
-  if (Object.__proto__) {
-    prototype.chainObject = function(object, inherited) {
-      if (object && inherited && object !== inherited) {
-        object.__proto__ = inherited;
-      }
-      return object;
-    }
-  } else {
-    prototype.chainObject = function(object, inherited) {
-      if (object && inherited && object !== inherited) {
-        var chained = Object.create(inherited);
-        object = extend(chained, object);
-      }
-      return object;
-    }
-  }
-
-  // On platforms that do not support __proto__ (versions of IE), the prototype
-  // chain of a custom element is simulated via installation of __proto__.
-  // Although custom elements manages this, we install it here so it's
-  // available during desugaring.
-  function ensurePrototypeTraversal(prototype) {
-    if (!Object.__proto__) {
-      var ancestor = Object.getPrototypeOf(prototype);
-      prototype.__proto__ = ancestor;
-      if (isBase(ancestor)) {
-        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
-      }
-    }
-  }
-
-  // exports
-
-  api.declaration.prototype = prototype;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  /*
-
-    Elements are added to a registration queue so that they register in 
-    the proper order at the appropriate time. We do this for a few reasons:
-
-    * to enable elements to load resources (like stylesheets) 
-    asynchronously. We need to do this until the platform provides an efficient
-    alternative. One issue is that remote @import stylesheets are 
-    re-fetched whenever stamped into a shadowRoot.
-
-    * to ensure elements loaded 'at the same time' (e.g. via some set of
-    imports) are registered as a batch. This allows elements to be enured from
-    upgrade ordering as long as they query the dom tree 1 task after
-    upgrade (aka domReady). This is a performance tradeoff. On the one hand,
-    elements that could register while imports are loading are prevented from 
-    doing so. On the other, grouping upgrades into a single task means less
-    incremental work (for example style recalcs),  Also, we can ensure the 
-    document is in a known state at the single quantum of time when 
-    elements upgrade.
-
-  */
-  var queue = {
-
-    // tell the queue to wait for an element to be ready
-    wait: function(element) {
-      if (!element.__queue) {
-        element.__queue = {};
-        elements.push(element);
-      }
-    },
-
-    // enqueue an element to the next spot in the queue.
-    enqueue: function(element, check, go) {
-      var shouldAdd = element.__queue && !element.__queue.check;
-      if (shouldAdd) {
-        queueForElement(element).push(element);
-        element.__queue.check = check;
-        element.__queue.go = go;
-      }
-      return (this.indexOf(element) !== 0);
-    },
-
-    indexOf: function(element) {
-      var i = queueForElement(element).indexOf(element);
-      if (i >= 0 && document.contains(element)) {
-        i += (HTMLImports.useNative || HTMLImports.ready) ? 
-          importQueue.length : 1e9;
-      }
-      return i;  
-    },
-
-    // tell the queue an element is ready to be registered
-    go: function(element) {
-      var readied = this.remove(element);
-      if (readied) {
-        element.__queue.flushable = true;
-        this.addToFlushQueue(readied);
-        this.check();
-      }
-    },
-
-    remove: function(element) {
-      var i = this.indexOf(element);
-      if (i !== 0) {
-        //console.warn('queue order wrong', i);
-        return;
-      }
-      return queueForElement(element).shift();
-    },
-
-    check: function() {
-      // next
-      var element = this.nextElement();
-      if (element) {
-        element.__queue.check.call(element);
-      }
-      if (this.canReady()) {
-        this.ready();
-        return true;
-      }
-    },
-
-    nextElement: function() {
-      return nextQueued();
-    },
-
-    canReady: function() {
-      return !this.waitToReady && this.isEmpty();
-    },
-
-    isEmpty: function() {
-      for (var i=0, l=elements.length, e; (i<l) && 
-          (e=elements[i]); i++) {
-        if (e.__queue && !e.__queue.flushable) {
-          return;
-        }
-      }
-      return true;
-    },
-
-    addToFlushQueue: function(element) {
-      flushQueue.push(element);  
-    },
-
-    flush: function() {
-      // prevent re-entrance
-      if (this.flushing) {
-        return;
-      }
-      this.flushing = true;
-      var element;
-      while (flushQueue.length) {
-        element = flushQueue.shift();
-        element.__queue.go.call(element);
-        element.__queue = null;
-      }
-      this.flushing = false;
-    },
-
-    ready: function() {
-      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
-      // while registering. This way we avoid having to upgrade each document
-      // piecemeal per registration and can instead register all elements
-      // and upgrade once in a batch. Without this optimization, upgrade time
-      // degrades significantly when SD polyfill is used. This is mainly because
-      // querying the document tree for elements is slow under the SD polyfill.
-      var polyfillWasReady = CustomElements.ready;
-      CustomElements.ready = false;
-      this.flush();
-      if (!CustomElements.useNative) {
-        CustomElements.upgradeDocumentTree(document);
-      }
-      CustomElements.ready = polyfillWasReady;
-      Platform.flush();
-      requestAnimationFrame(this.flushReadyCallbacks);
-    },
-
-    addReadyCallback: function(callback) {
-      if (callback) {
-        readyCallbacks.push(callback);
-      }
-    },
-
-    flushReadyCallbacks: function() {
-      if (readyCallbacks) {
-        var fn;
-        while (readyCallbacks.length) {
-          fn = readyCallbacks.shift();
-          fn();
-        }
-      }
-    },
-  
-    /**
-    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
-
-  };
-
-  var elements = [];
-  var flushQueue = [];
-  var importQueue = [];
-  var mainQueue = [];
-  var readyCallbacks = [];
-
-  function queueForElement(element) {
-    return document.contains(element) ? mainQueue : importQueue;
-  }
-
-  function nextQueued() {
-    return importQueue.length ? importQueue[0] : mainQueue[0];
-  }
-
-  function whenReady(callback) {
-    queue.waitToReady = true;
-    Platform.endOfMicrotask(function() {
-      HTMLImports.whenReady(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);
-
-/*
- * 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) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-  var queue = scope.queue;
-  var whenReady = scope.whenReady;
-  var getRegisteredPrototype = scope.getRegisteredPrototype;
-  var waitingForPrototype = scope.waitingForPrototype;
-
-  // declarative implementation: <polymer-element>
-
-  var prototype = extend(Object.create(HTMLElement.prototype), {
-
-    createdCallback: function() {
-      if (this.getAttribute('name')) {
-        this.init();
-      }
-    },
-
-    init: function() {
-      // fetch declared values
-      this.name = this.getAttribute('name');
-      this.extends = this.getAttribute('extends');
-      queue.wait(this);
-      // initiate any async resource fetches
-      this.loadResources();
-      // register when all constraints are met
-      this.registerWhenReady();
-    },
-
-    // TODO(sorvell): we currently queue in the order the prototypes are 
-    // registered, but we should queue in the order that polymer-elements
-    // are registered. We are currently blocked from doing this based on 
-    // crbug.com/395686.
-    registerWhenReady: function() {
-     if (this.registered
-       || this.waitingForPrototype(this.name)
-       || this.waitingForQueue()
-       || this.waitingForResources()) {
-          return;
-      }
-      queue.go(this);
-    },
-
-    _register: function() {
-      //console.log('registering', this.name);
-      // warn if extending from a custom element not registered via Polymer
-      if (isCustomTag(this.extends) && !isRegistered(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 = true;
-    },
-
-    waitingForPrototype: function(name) {
-      if (!getRegisteredPrototype(name)) {
-        // then wait for a prototype
-        waitingForPrototype(name, this);
-        // emulate script if user is not supplying one
-        this.handleNoScript(name);
-        // prototype not ready yet
-        return true;
-      }
-    },
-
-    handleNoScript: function(name) {
-      // if explicitly marked as 'noscript'
-      if (this.hasAttribute('noscript') && !this.noscript) {
-        this.noscript = true;
-        // imperative element registration
-        Polymer(name);
-      }
-    },
-
-    waitingForResources: function() {
-      return this._needsResources;
-    },
-
-    // NOTE: Elements must be queued in proper order for inheritance/composition
-    // dependency resolution. Previously this was enforced for inheritance,
-    // and by rule for composition. It's now entirely by rule.
-    waitingForQueue: function() {
-      return queue.enqueue(this, this.registerWhenReady, this._register);
-    },
-
-    loadResources: function() {
-      this._needsResources = true;
-      this.loadStyles(function() {
-        this._needsResources = false;
-        this.registerWhenReady();
-      }.bind(this));
-    }
-
-  });
-
-  // semi-pluggable APIs 
-
-  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
-  // the various plugins are allowed to depend on each other directly)
-  api.publish(api.declaration, prototype);
-
-  // utility and bookkeeping
-
-  function isRegistered(name) {
-    return Boolean(HTMLElement.getPrototypeForTag(name));
-  }
-
-  function isCustomTag(name) {
-    return (name && name.indexOf('-') >= 0);
-  }
-
-  // boot tasks
-
-  whenReady(function() {
-    document.body.removeAttribute('unresolved');
-    document.dispatchEvent(
-      new CustomEvent('polymer-ready', {bubbles: true})
-    );
-  });
-
-  // register polymer-element with document
-
-  document.registerElement('polymer-element', {prototype: prototype});
-
-})(Polymer);
-
-/*
- * 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) {
-
-  var whenPolymerReady = scope.whenPolymerReady;
-
-  function importElements(elementOrFragment, callback) {
-    if (elementOrFragment) {
-      document.head.appendChild(elementOrFragment);
-      whenPolymerReady(callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  function importUrls(urls, callback) {
-    if (urls && urls.length) {
-        var frag = document.createDocumentFragment();
-        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
-          link = document.createElement('link');
-          link.rel = 'import';
-          link.href = url;
-          frag.appendChild(link);
-        }
-        importElements(frag, callback);
-    } else if (callback) {
-      callback();
-    }
-  }
-
-  // exports
-  scope.import = importUrls;
-  scope.importElements = importElements;
-
-})(Polymer);
-
-/*
- * 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
- */
-
-/**
- * The `auto-binding` element extends the template element. It provides a quick 
- * and easy way to do data binding without the need to setup a model. 
- * The `auto-binding` element itself serves as the model and controller for the 
- * elements it contains. Both data and event handlers can be bound. 
- *
- * The `auto-binding` element acts just like a template that is bound to 
- * a model. It stamps its content in the dom adjacent to itself. When the 
- * content is stamped, the `template-bound` event is fired.
- *
- * Example:
- *
- *     <template is="auto-binding">
- *       <div>Say something: <input value="{{value}}"></div>
- *       <div>You said: {{value}}</div>
- *       <button on-tap="{{buttonTap}}">Tap me!</button>
- *     </template>
- *     <script>
- *       var template = document.querySelector('template');
- *       template.value = 'something';
- *       template.buttonTap = function() {
- *         console.log('tap!');
- *       };
- *     </script>
- *
- * @module Polymer
- * @status stable
-*/
-
-(function() {
-
-  var element = document.createElement('polymer-element');
-  element.setAttribute('name', 'auto-binding');
-  element.setAttribute('extends', 'template');
-  element.init();
-
-  Polymer('auto-binding', {
-
-    createdCallback: function() {
-      this.syntax = this.bindingDelegate = this.makeSyntax();
-      // delay stamping until polymer-ready so that auto-binding is not
-      // required to load last.
-      Polymer.whenPolymerReady(function() {
-        this.model = this;
-        this.setAttribute('bind', '');
-        // we don't bother with an explicit signal here, we could ust a MO
-        // if necessary
-        this.async(function() {
-          // note: this will marshall *all* the elements in the parentNode
-          // rather than just stamped ones. We'd need to use createInstance
-          // to fix this or something else fancier.
-          this.marshalNodeReferences(this.parentNode);
-          // template stamping is asynchronous so stamping isn't complete
-          // by polymer-ready; fire an event so users can use stamped elements
-          this.fire('template-bound');
-        });
-      }.bind(this));
-    },
-
-    makeSyntax: function() {
-      var events = Object.create(Polymer.api.declaration.events);
-      var self = this;
-      events.findController = function() { return self.model; };
-
-      var syntax = new PolymerExpressions();
-      var prepareBinding = syntax.prepareBinding;  
-      syntax.prepareBinding = function(pathString, name, node) {
-        return events.prepareEventBinding(pathString, name, node) ||
-               prepareBinding.call(syntax, pathString, name, node);
-      };
-      return syntax;
-    }
-
-  });
-
-})();
-
-//# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
deleted file mode 100644
index 64572b5..0000000
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ /dev/null
@@ -1,120 +0,0 @@
-{
-  "version": 3,
-  "file": "polymer.concat.js",
-  "sources": [
-    "../polymer-gestures/src/scope.js",
-    "../polymer-gestures/src/targetfind.js",
-    "../polymer-gestures/src/touch-action.js",
-    "../polymer-gestures/src/eventFactory.js",
-    "../polymer-gestures/src/pointermap.js",
-    "../polymer-gestures/src/dispatcher.js",
-    "../polymer-gestures/src/mouse.js",
-    "../polymer-gestures/src/touch.js",
-    "../polymer-gestures/src/ms.js",
-    "../polymer-gestures/src/pointer.js",
-    "../polymer-gestures/src/platform-events.js",
-    "../polymer-gestures/src/track.js",
-    "../polymer-gestures/src/hold.js",
-    "../polymer-gestures/src/tap.js",
-    "../polymer-expressions/third_party/esprima/esprima.js",
-    "../polymer-expressions/src/polymer-expressions.js",
-    "build/polymer-versioned.js",
-    "src/boot.js",
-    "src/system/compat.js",
-    "../HTMLImports/src/base.js",
-    "src/system/module.js",
-    "src/system/unresolved.js",
-    "../observe-js/src/observe.js",
-    "../NodeBind/src/NodeBind.js",
-    "../TemplateBinding/src/TemplateBinding.js",
-    "src/system/microtask.js",
-    "src/system/patches-mdv.js",
-    "src/lib/url.js",
-    "src/lib/loader.js",
-    "src/lib/styleloader.js",
-    "src/lib/lang.js",
-    "src/lib/job.js",
-    "src/lib/dom.js",
-    "src/lib/super.js",
-    "src/lib/deserialize.js",
-    "src/api.js",
-    "src/instance/utils.js",
-    "src/instance/events.js",
-    "src/instance/attributes.js",
-    "src/instance/properties.js",
-    "src/instance/mdv.js",
-    "src/instance/base.js",
-    "src/instance/styles.js",
-    "src/declaration/polymer.js",
-    "src/declaration/path.js",
-    "src/declaration/styles.js",
-    "src/declaration/events.js",
-    "src/declaration/properties.js",
-    "src/declaration/attributes.js",
-    "src/declaration/mdv.js",
-    "src/declaration/prototype.js",
-    "src/declaration/queue.js",
-    "src/declaration/polymer-element.js",
-    "src/lib/import.js",
-    "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;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 && 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    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.2-8c339cf'\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 IMPORT_LINK_TYPE = 'import';\r\nvar hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));\r\nvar useNative = hasNative;\r\nvar isIE = /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\n\r\nvar rootDocument = 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(rootDocument, '_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 whenReady(callback, doc) {\r\n  doc = doc || rootDocument;\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) && callback) {\r\n       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\nwhenReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  rootDocument.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 = whenReady;\r\nscope.rootDocument = rootDocument;\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.isIE = isIE;\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",
-    "/*\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",
-    "/*\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 * 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 * 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 * 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 * 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 * 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 * 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",
-    "/*\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 * 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 = 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      // 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  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, 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    /**\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.whenReady(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"
-  ]
-}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.html b/pkg/polymer/lib/src/js/polymer/polymer.html
index 7e3d8f1..8b38742 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.html
+++ b/pkg/polymer/lib/src/js/polymer/polymer.html
@@ -9,4 +9,4 @@
 
 <link rel="import" href="layout.html">
 
-<script src="polymer.js"></script>
+<script src="polymer.min.js"></script>
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 6a8caf2..b8b62b0 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,9 +7,11823 @@
  * 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.2-8c339cf
-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.2-8c339cf"},"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||q,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===s}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===s)&&(b.removeEventListener(t,e),d(a,b))};b.addEventListener(t,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 m?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",l=k in document.createElement("link"),m=l,n=/Trident/.test(navigator.userAgent),o=Boolean(window.ShadowDOMPolyfill),p=function(a){return o?ShadowDOMPolyfill.wrapIfNeeded(a):a},q=p(document),r={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(a)},configurable:!0};Object.defineProperty(document,"_currentScript",r),Object.defineProperty(q,"_currentScript",r);var s=n?"complete":"interactive",t="readystatechange";m&&(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(),q.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=m,a.isImportLoaded=g,a.whenReady=b,a.rootDocument=q,a.IMPORT_LINK_TYPE=k,a.isIE=n}(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.whenReady(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
+// @version 0.5.1
+window.PolymerGestures = {};
+
+(function(scope) {
+  var HAS_FULL_PATH = false;
+
+  // test for full event path support
+  var pathTest = document.createElement('meta');
+  if (pathTest.createShadowRoot) {
+    var sr = pathTest.createShadowRoot();
+    var s = document.createElement('span');
+    sr.appendChild(s);
+    pathTest.addEventListener('testpath', function(ev) {
+      if (ev.path) {
+        // if the span is in the event path, then path[0] is the real source for all events
+        HAS_FULL_PATH = ev.path[0] === s;
+      }
+      ev.stopPropagation();
+    });
+    var ev = new CustomEvent('testpath', {bubbles: true});
+    // must add node to DOM to trigger event listener
+    document.head.appendChild(pathTest);
+    s.dispatchEvent(ev);
+    pathTest.parentNode.removeChild(pathTest);
+    sr = s = null;
+  }
+  pathTest = null;
+
+  var target = {
+    shadow: function(inEl) {
+      if (inEl) {
+        return inEl.shadowRoot || inEl.webkitShadowRoot;
+      }
+    },
+    canTarget: function(shadow) {
+      return shadow && Boolean(shadow.elementFromPoint);
+    },
+    targetingShadow: function(inEl) {
+      var s = this.shadow(inEl);
+      if (this.canTarget(s)) {
+        return s;
+      }
+    },
+    olderShadow: function(shadow) {
+      var os = shadow.olderShadowRoot;
+      if (!os) {
+        var se = shadow.querySelector('shadow');
+        if (se) {
+          os = se.olderShadowRoot;
+        }
+      }
+      return os;
+    },
+    allShadows: function(element) {
+      var shadows = [], s = this.shadow(element);
+      while(s) {
+        shadows.push(s);
+        s = this.olderShadow(s);
+      }
+      return shadows;
+    },
+    searchRoot: function(inRoot, x, y) {
+      var t, st, sr, os;
+      if (inRoot) {
+        t = inRoot.elementFromPoint(x, y);
+        if (t) {
+          // found element, check if it has a ShadowRoot
+          sr = this.targetingShadow(t);
+        } else if (inRoot !== document) {
+          // check for sibling roots
+          sr = this.olderShadow(inRoot);
+        }
+        // search other roots, fall back to light dom element
+        return this.searchRoot(sr, x, y) || t;
+      }
+    },
+    owner: function(element) {
+      if (!element) {
+        return document;
+      }
+      var s = element;
+      // walk up until you hit the shadow root or document
+      while (s.parentNode) {
+        s = s.parentNode;
+      }
+      // the owner element is expected to be a Document or ShadowRoot
+      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
+        s = document;
+      }
+      return s;
+    },
+    findTarget: function(inEvent) {
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
+        return inEvent.path[0];
+      }
+      var x = inEvent.clientX, y = inEvent.clientY;
+      // if the listener is in the shadow root, it is much faster to start there
+      var s = this.owner(inEvent.target);
+      // if x, y is not in this root, fall back to document search
+      if (!s.elementFromPoint(x, y)) {
+        s = document;
+      }
+      return this.searchRoot(s, x, y);
+    },
+    findTouchAction: function(inEvent) {
+      var n;
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
+        var path = inEvent.path;
+        for (var i = 0; i < path.length; i++) {
+          n = path[i];
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
+          }
+        }
+      } else {
+        n = inEvent.target;
+        while(n) {
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
+          }
+          n = n.parentNode || n.host;
+        }
+      }
+      // auto is default
+      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;
+      }
+      // fast case, a is a direct descendant of b or vice versa
+      if (a.contains && a.contains(b)) {
+        return a;
+      }
+      if (b.contains && b.contains(a)) {
+        return b;
+      }
+      var adepth = this.depth(a);
+      var bdepth = this.depth(b);
+      var d = adepth - bdepth;
+      if (d >= 0) {
+        a = this.walk(a, d);
+      } else {
+        b = this.walk(b, -d);
+      }
+      while (a && b && a !== b) {
+        a = a.parentNode || a.host;
+        b = b.parentNode || b.host;
+      }
+      return a;
+    },
+    walk: function(n, u) {
+      for (var i = 0; n && (i < u); i++) {
+        n = n.parentNode || n.host;
+      }
+      return n;
+    },
+    depth: function(n) {
+      var d = 0;
+      while(n) {
+        d++;
+        n = n.parentNode || n.host;
+      }
+      return d;
+    },
+    deepContains: function(a, b) {
+      var common = this.LCA(a, b);
+      // if a is the common ancestor, it must "deeply" contain b
+      return common === a;
+    },
+    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;
+  /**
+   * Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting
+   *
+   * @param {Event} Event An event object with clientX and clientY properties
+   * @return {Element} The probable event origninator
+   */
+  scope.findTarget = target.findTarget.bind(target);
+  /**
+   * Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM
+   * roots.
+   *
+   * @param {Node} container
+   * @param {Node} containee
+   * @return {Boolean}
+   */
+  scope.deepContains = target.deepContains.bind(target);
+
+  /**
+   * Determines if the x/y position is inside the given node.
+   *
+   * Example:
+   *
+   *     function upHandler(event) {
+   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);
+   *       if (innode) {
+   *         // wait for tap?
+   *       } else {
+   *         // tap will never happen
+   *       }
+   *     }
+   *
+   * @param {Node} node
+   * @param {Number} x Screen X position
+   * @param {Number} y screen Y position
+   * @return {Boolean}
+   */
+  scope.insideNode = target.insideNode;
+
+})(window.PolymerGestures);
+
+(function() {
+  function shadowSelector(v) {
+    return 'html /deep/ ' + selector(v);
+  }
+  function selector(v) {
+    return '[touch-action="' + v + '"]';
+  }
+  function rule(v) {
+    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';
+  }
+  var attrib2css = [
+    'none',
+    'auto',
+    'pan-x',
+    'pan-y',
+    {
+      rule: 'pan-x pan-y',
+      selectors: [
+        'pan-x pan-y',
+        'pan-y pan-x'
+      ]
+    },
+    'manipulation'
+  ];
+  var styles = '';
+  // only install stylesheet if the browser has touch action support
+  var hasTouchAction = typeof document.head.style.touchAction === 'string';
+  // only add shadow selectors if shadowdom is supported
+  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
+
+  if (hasTouchAction) {
+    attrib2css.forEach(function(r) {
+      if (String(r) === r) {
+        styles += selector(r) + rule(r) + '\n';
+        if (hasShadowRoot) {
+          styles += shadowSelector(r) + rule(r) + '\n';
+        }
+      } else {
+        styles += r.selectors.map(selector) + rule(r.rule) + '\n';
+        if (hasShadowRoot) {
+          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
+        }
+      }
+    });
+
+    var el = document.createElement('style');
+    el.textContent = styles;
+    document.head.appendChild(el);
+  }
+})();
+
+/**
+ * This is the constructor for new PointerEvents.
+ *
+ * New Pointer Events must be given a type, and an optional dictionary of
+ * initialization properties.
+ *
+ * Due to certain platform requirements, events returned from the constructor
+ * identify as MouseEvents.
+ *
+ * @constructor
+ * @param {String} inType The type of the event to create.
+ * @param {Object} [inDict] An optional dictionary of initial event properties.
+ * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
+ */
+(function(scope) {
+
+  var MOUSE_PROPS = [
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    'pageX',
+    'pageY'
+  ];
+
+  var MOUSE_DEFAULTS = [
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    0,
+    0
+  ];
+
+  var NOP_FACTORY = function(){ return function(){}; };
+
+  var eventFactory = {
+    // TODO(dfreedm): this is overridden by tap recognizer, needs review
+    preventTap: NOP_FACTORY,
+    makeBaseEvent: function(inType, inDict) {
+      var e = document.createEvent('Event');
+      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
+      e.preventTap = eventFactory.preventTap(e);
+      return e;
+    },
+    makeGestureEvent: function(inType, inDict) {
+      inDict = inDict || Object.create(null);
+
+      var e = this.makeBaseEvent(inType, inDict);
+      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {
+        k = keys[i];
+        e[k] = inDict[k];
+      }
+      return e;
+    },
+    makePointerEvent: function(inType, inDict) {
+      inDict = inDict || Object.create(null);
+
+      var e = this.makeBaseEvent(inType, inDict);
+      // define inherited MouseEvent properties
+      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {
+        p = MOUSE_PROPS[i];
+        e[p] = inDict[p] || MOUSE_DEFAULTS[i];
+      }
+      e.buttons = inDict.buttons || 0;
+
+      // Spec requires that pointers without pressure specified use 0.5 for down
+      // state and 0 for up state.
+      var pressure = 0;
+      if (inDict.pressure) {
+        pressure = inDict.pressure;
+      } else {
+        pressure = e.buttons ? 0.5 : 0;
+      }
+
+      // add x/y properties aliased to clientX/Y
+      e.x = e.clientX;
+      e.y = e.clientY;
+
+      // define the properties of the PointerEvent interface
+      e.pointerId = inDict.pointerId || 0;
+      e.width = inDict.width || 0;
+      e.height = inDict.height || 0;
+      e.pressure = pressure;
+      e.tiltX = inDict.tiltX || 0;
+      e.tiltY = inDict.tiltY || 0;
+      e.pointerType = inDict.pointerType || '';
+      e.hwTimestamp = inDict.hwTimestamp || 0;
+      e.isPrimary = inDict.isPrimary || false;
+      e._source = inDict._source || '';
+      return e;
+    }
+  };
+
+  scope.eventFactory = eventFactory;
+})(window.PolymerGestures);
+
+/**
+ * This module implements an map of pointer states
+ */
+(function(scope) {
+  var USE_MAP = window.Map && window.Map.prototype.forEach;
+  var POINTERS_FN = function(){ return this.size; };
+  function PointerMap() {
+    if (USE_MAP) {
+      var m = new Map();
+      m.pointers = POINTERS_FN;
+      return m;
+    } else {
+      this.keys = [];
+      this.values = [];
+    }
+  }
+
+  PointerMap.prototype = {
+    set: function(inId, inEvent) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.values[i] = inEvent;
+      } else {
+        this.keys.push(inId);
+        this.values.push(inEvent);
+      }
+    },
+    has: function(inId) {
+      return this.keys.indexOf(inId) > -1;
+    },
+    'delete': function(inId) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.keys.splice(i, 1);
+        this.values.splice(i, 1);
+      }
+    },
+    get: function(inId) {
+      var i = this.keys.indexOf(inId);
+      return this.values[i];
+    },
+    clear: function() {
+      this.keys.length = 0;
+      this.values.length = 0;
+    },
+    // return value, key, map
+    forEach: function(callback, thisArg) {
+      this.values.forEach(function(v, i) {
+        callback.call(thisArg, v, this.keys[i], this);
+      }, this);
+    },
+    pointers: function() {
+      return this.keys.length;
+    }
+  };
+
+  scope.PointerMap = PointerMap;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var CLONE_PROPS = [
+    // MouseEvent
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    // DOM Level 3
+    'buttons',
+    // PointerEvent
+    'pointerId',
+    'width',
+    'height',
+    'pressure',
+    'tiltX',
+    'tiltY',
+    'pointerType',
+    'hwTimestamp',
+    'isPrimary',
+    // event instance
+    'type',
+    'target',
+    'currentTarget',
+    'which',
+    'pageX',
+    'pageY',
+    'timeStamp',
+    // gesture addons
+    'preventTap',
+    'tapPrevented',
+    '_source'
+  ];
+
+  var CLONE_DEFAULTS = [
+    // MouseEvent
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    // DOM Level 3
+    0,
+    // PointerEvent
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    '',
+    0,
+    false,
+    // event instance
+    '',
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    function(){},
+    false
+  ];
+
+  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
+
+  var eventFactory = scope.eventFactory;
+
+  // set of recognizers to run for the currently handled event
+  var currentGestures;
+
+  /**
+   * This module is for normalizing events. Mouse and Touch events will be
+   * collected here, and fire PointerEvents that have the same semantics, no
+   * matter the source.
+   * Events fired:
+   *   - pointerdown: a pointing is added
+   *   - pointerup: a pointer is removed
+   *   - pointermove: a pointer is moved
+   *   - pointerover: a pointer crosses into an element
+   *   - pointerout: a pointer leaves an element
+   *   - 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),
+    // Scope objects for native events.
+    // This exists for ease of testing.
+    eventSources: Object.create(null),
+    eventSourceList: [],
+    gestures: [],
+    // map gesture event -> {listeners: int, index: gestures[int]}
+    dependencyMap: {
+      // make sure down and up are in the map to trigger "register"
+      down: {listeners: 0, index: -1},
+      up: {listeners: 0, index: -1}
+    },
+    gestureQueue: [],
+    /**
+     * Add a new event source that will generate pointer events.
+     *
+     * `inSource` must contain an array of event names named `events`, and
+     * functions with the names specified in the `events` array.
+     * @param {string} name A name for the event source
+     * @param {Object} source A new source of platform events.
+     */
+    registerSource: function(name, source) {
+      var s = source;
+      var newEvents = s.events;
+      if (newEvents) {
+        newEvents.forEach(function(e) {
+          if (s[e]) {
+            this.eventMap[e] = s[e].bind(s);
+          }
+        }, this);
+        this.eventSources[name] = s;
+        this.eventSourceList.push(s);
+      }
+    },
+    registerGesture: function(name, source) {
+      var obj = Object.create(null);
+      obj.listeners = 0;
+      obj.index = this.gestures.length;
+      for (var i = 0, g; i < source.exposes.length; i++) {
+        g = source.exposes[i].toLowerCase();
+        this.dependencyMap[g] = obj;
+      }
+      this.gestures.push(source);
+    },
+    register: function(element, initial) {
+      var l = this.eventSourceList.length;
+      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+        // call eventsource register
+        es.register.call(es, element, initial);
+      }
+    },
+    unregister: function(element) {
+      var l = this.eventSourceList.length;
+      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+        // call eventsource register
+        es.unregister.call(es, element);
+      }
+    },
+    // EVENTS
+    down: function(inEvent) {
+      this.requiredGestures.set(inEvent.pointerId, currentGestures);
+      this.fireEvent('down', inEvent);
+    },
+    move: function(inEvent) {
+      // pipe move events into gesture queue directly
+      inEvent.type = 'move';
+      this.fillGestureQueue(inEvent);
+    },
+    up: function(inEvent) {
+      this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
+    },
+    cancel: function(inEvent) {
+      inEvent.tapPrevented = true;
+      this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
+    },
+    addGestureDependency: function(node, currentGestures) {
+      var gesturesWanted = node._pgEvents;
+      if (gesturesWanted && currentGestures) {
+        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
+      // platform events. This can happen when two elements in different scopes
+      // are set up to create pointer events, which is relevant to Shadow DOM.
+
+      var type = inEvent.type;
+
+      // only generate the list of desired events on "down"
+      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {
+        if (!inEvent._handledByPG) {
+          currentGestures = {};
+        }
+
+        // in IOS mode, there is only a listener on the document, so this is not re-entrant
+        if (this.IS_IOS) {
+          var ev = inEvent;
+          if (type === 'touchstart') {
+            var ct = inEvent.changedTouches[0];
+            // set up a fake event to give to the path builder
+            ev = {target: inEvent.target, clientX: ct.clientX, clientY: ct.clientY, path: inEvent.path};
+          }
+          // use event path if available, otherwise build a path from target finding
+          var nodes = inEvent.path || scope.targetFinding.path(ev);
+          for (var i = 0, n; i < nodes.length; i++) {
+            n = nodes[i];
+            this.addGestureDependency(n, currentGestures);
+          }
+        } else {
+          this.addGestureDependency(inEvent.currentTarget, currentGestures);
+        }
+      }
+
+      if (inEvent._handledByPG) {
+        return;
+      }
+      var fn = this.eventMap && this.eventMap[type];
+      if (fn) {
+        fn(inEvent);
+      }
+      inEvent._handledByPG = true;
+    },
+    // set up event listeners
+    listen: function(target, events) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
+        this.addEvent(target, e);
+      }
+    },
+    // remove event listeners
+    unlisten: function(target, events) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
+        this.removeEvent(target, e);
+      }
+    },
+    addEvent: function(target, eventName) {
+      target.addEventListener(eventName, this.boundHandler);
+    },
+    removeEvent: function(target, eventName) {
+      target.removeEventListener(eventName, this.boundHandler);
+    },
+    // EVENT CREATION AND TRACKING
+    /**
+     * Creates a new Event of type `inType`, based on the information in
+     * `inEvent`.
+     *
+     * @param {string} inType A string representing the type of event to create
+     * @param {Event} inEvent A platform event with a target
+     * @return {Event} A PointerEvent of type `inType`
+     */
+    makeEvent: function(inType, inEvent) {
+      var e = eventFactory.makePointerEvent(inType, inEvent);
+      e.preventDefault = inEvent.preventDefault;
+      e.tapPrevented = inEvent.tapPrevented;
+      e._target = e._target || inEvent.target;
+      return e;
+    },
+    // make and dispatch an event in one call
+    fireEvent: function(inType, inEvent) {
+      var e = this.makeEvent(inType, inEvent);
+      return this.dispatchEvent(e);
+    },
+    /**
+     * Returns a snapshot of inEvent, with writable properties.
+     *
+     * @param {Event} inEvent An event that contains properties to copy.
+     * @return {Object} An object containing shallow copies of `inEvent`'s
+     *    properties.
+     */
+    cloneEvent: function(inEvent) {
+      var eventCopy = Object.create(null), p;
+      for (var i = 0; i < CLONE_PROPS.length; i++) {
+        p = CLONE_PROPS[i];
+        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
+        // Work around SVGInstanceElement shadow tree
+        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.
+        // This is the behavior implemented by Firefox.
+        if (p === 'target' || p === 'relatedTarget') {
+          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {
+            eventCopy[p] = eventCopy[p].correspondingUseElement;
+          }
+        }
+      }
+      // keep the semantics of preventDefault
+      eventCopy.preventDefault = function() {
+        inEvent.preventDefault();
+      };
+      return eventCopy;
+    },
+    /**
+     * Dispatches the event to its target.
+     *
+     * @param {Event} inEvent The event to be dispatched.
+     * @return {Boolean} True if an event handler returns true, false otherwise.
+     */
+    dispatchEvent: function(inEvent) {
+      var t = inEvent._target;
+      if (t) {
+        t.dispatchEvent(inEvent);
+        // clone the event for the gesture system to process
+        // clone after dispatch to pick up gesture prevention code
+        var clone = this.cloneEvent(inEvent);
+        clone.target = t;
+        this.fillGestureQueue(clone);
+      }
+    },
+    gestureTrigger: function() {
+      // process the gesture queue
+      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {
+        e = this.gestureQueue[i];
+        rg = e._requiredGestures;
+        if (rg) {
+          for (var j = 0, g, fn; j < this.gestures.length; j++) {
+            // only run recognizer if an element in the source event's path is listening for those gestures
+            if (rg[j]) {
+              g = this.gestures[j];
+              fn = g[e.type];
+              if (fn) {
+                fn.call(g, e);
+              }
+            }
+          }
+        }
+      }
+      this.gestureQueue.length = 0;
+    },
+    fillGestureQueue: function(ev) {
+      // only trigger the gesture queue once
+      if (!this.gestureQueue.length) {
+        requestAnimationFrame(this.boundGestureTrigger);
+      }
+      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);
+      this.gestureQueue.push(ev);
+    }
+  };
+  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
+  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
+  scope.dispatcher = dispatcher;
+
+  /**
+   * Listen for `gesture` on `node` with the `handler` function
+   *
+   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.activateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      var recognizer = dispatcher.gestures[dep.index];
+      if (!node._pgListeners) {
+        dispatcher.register(node);
+        node._pgListeners = 0;
+      }
+      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes
+      if (recognizer) {
+        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];
+        var actionNode;
+        switch(node.nodeType) {
+          case Node.ELEMENT_NODE:
+            actionNode = node;
+          break;
+          case Node.DOCUMENT_FRAGMENT_NODE:
+            actionNode = node.host;
+          break;
+          default:
+            actionNode = null;
+          break;
+        }
+        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {
+          actionNode.setAttribute('touch-action', touchAction);
+        }
+      }
+      if (!node._pgEvents) {
+        node._pgEvents = {};
+      }
+      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;
+      node._pgListeners++;
+    }
+    return Boolean(dep);
+  };
+
+  /**
+   *
+   * Listen for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.addEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.activateGesture(node, gesture);
+      node.addEventListener(gesture, handler, capture);
+    }
+  };
+
+  /**
+   * Tears down the gesture configuration for `node`
+   *
+   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.deactivateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      if (node._pgListeners > 0) {
+        node._pgListeners--;
+      }
+      if (node._pgListeners === 0) {
+        dispatcher.unregister(node);
+      }
+      if (node._pgEvents) {
+        if (node._pgEvents[g] > 0) {
+          node._pgEvents[g]--;
+        } else {
+          node._pgEvents[g] = 0;
+        }
+      }
+    }
+    return Boolean(dep);
+  };
+
+  /**
+   * Stop listening for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.removeEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.deactivateGesture(node, gesture);
+      node.removeEventListener(gesture, handler, capture);
+    }
+  };
+})(window.PolymerGestures);
+
+(function (scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  // radius around touchend that swallows mouse events
+  var DEDUP_DIST = 25;
+
+  var WHICH_TO_BUTTONS = [0, 1, 4, 2];
+
+  var CURRENT_BUTTONS = 0;
+  var HAS_BUTTONS = false;
+  try {
+    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;
+  } catch (e) {}
+
+  // handler block for native mouse events
+  var mouseEvents = {
+    POINTER_ID: 1,
+    POINTER_TYPE: 'mouse',
+    events: [
+      'mousedown',
+      'mousemove',
+      'mouseup'
+    ],
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    lastTouches: [],
+    // collide with the global mouse listener
+    isEventSimulatedFromTouch: function(inEvent) {
+      var lts = this.lastTouches;
+      var x = inEvent.clientX, y = inEvent.clientY;
+      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
+        // simulated mouse events will be swallowed near a primary touchend
+        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
+        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {
+          return true;
+        }
+      }
+    },
+    prepareEvent: function(inEvent) {
+      var e = dispatcher.cloneEvent(inEvent);
+      e.pointerId = this.POINTER_ID;
+      e.isPrimary = true;
+      e.pointerType = this.POINTER_TYPE;
+      e._source = 'mouse';
+      if (!HAS_BUTTONS) {
+        var type = inEvent.type;
+        var bit = WHICH_TO_BUTTONS[inEvent.which] || 0;
+        if (type === 'mousedown') {
+          CURRENT_BUTTONS |= bit;
+        } else if (type === 'mouseup') {
+          CURRENT_BUTTONS &= ~bit;
+        }
+        e.buttons = CURRENT_BUTTONS;
+      }
+      return e;
+    },
+    mousedown: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var p = pointermap.has(this.POINTER_ID);
+        var e = this.prepareEvent(inEvent);
+        e.target = scope.findTarget(inEvent);
+        pointermap.set(this.POINTER_ID, e.target);
+        dispatcher.down(e);
+      }
+    },
+    mousemove: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var target = pointermap.get(this.POINTER_ID);
+        if (target) {
+          var e = this.prepareEvent(inEvent);
+          e.target = target;
+          // handle case where we missed a mouseup
+          if ((HAS_BUTTONS ? e.buttons : e.which) === 0) {
+            if (!HAS_BUTTONS) {
+              CURRENT_BUTTONS = e.buttons = 0;
+            }
+            dispatcher.cancel(e);
+            this.cleanupMouse(e.buttons);
+          } else {
+            dispatcher.move(e);
+          }
+        }
+      }
+    },
+    mouseup: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var e = this.prepareEvent(inEvent);
+        e.relatedTarget = scope.findTarget(inEvent);
+        e.target = pointermap.get(this.POINTER_ID);
+        dispatcher.up(e);
+        this.cleanupMouse(e.buttons);
+      }
+    },
+    cleanupMouse: function(buttons) {
+      if (buttons === 0) {
+        pointermap.delete(this.POINTER_ID);
+      }
+    }
+  };
+
+  scope.mouseEvents = mouseEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
+  var pointermap = dispatcher.pointermap;
+  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
+  // This should be long enough to ignore compat mouse events made by touch
+  var DEDUP_TIMEOUT = 2500;
+  var DEDUP_DIST = 25;
+  var CLICK_COUNT_TIMEOUT = 200;
+  var HYSTERESIS = 20;
+  var ATTRIB = 'touch-action';
+  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved
+  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;
+  var HAS_TOUCH_ACTION = false;
+
+  // handler block for native touch events
+  var touchEvents = {
+    IS_IOS: false,
+    events: [
+      'touchstart',
+      'touchmove',
+      'touchend',
+      'touchcancel'
+    ],
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
+    register: function(target, initial) {
+      if (this.IS_IOS ? initial : !initial) {
+        dispatcher.listen(target, this.events);
+      }
+    },
+    unregister: function(target) {
+      if (!this.IS_IOS) {
+        dispatcher.unlisten(target, this.events);
+      }
+    },
+    scrollTypes: {
+      EMITTER: 'none',
+      XSCROLLER: 'pan-x',
+      YSCROLLER: 'pan-y',
+    },
+    touchActionToScrollType: function(touchAction) {
+      var t = touchAction;
+      var st = this.scrollTypes;
+      if (t === st.EMITTER) {
+        return 'none';
+      } else if (t === st.XSCROLLER) {
+        return 'X';
+      } else if (t === st.YSCROLLER) {
+        return 'Y';
+      } else {
+        return 'XY';
+      }
+    },
+    POINTER_TYPE: 'touch',
+    firstTouch: null,
+    isPrimaryTouch: function(inTouch) {
+      return this.firstTouch === inTouch.identifier;
+    },
+    setPrimaryTouch: function(inTouch) {
+      // set primary touch if there no pointers, or the only pointer is the mouse
+      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
+        this.firstTouch = inTouch.identifier;
+        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
+        this.firstTarget = inTouch.target;
+        this.scrolling = null;
+        this.cancelResetClickCount();
+      }
+    },
+    removePrimaryPointer: function(inPointer) {
+      if (inPointer.isPrimary) {
+        this.firstTouch = null;
+        this.firstXY = null;
+        this.resetClickCount();
+      }
+    },
+    clickCount: 0,
+    resetId: null,
+    resetClickCount: function() {
+      var fn = function() {
+        this.clickCount = 0;
+        this.resetId = null;
+      }.bind(this);
+      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
+    },
+    cancelResetClickCount: function() {
+      if (this.resetId) {
+        clearTimeout(this.resetId);
+      }
+    },
+    typeToButtons: function(type) {
+      var ret = 0;
+      if (type === 'touchstart' || type === 'touchmove') {
+        ret = 1;
+      }
+      return ret;
+    },
+    findTarget: function(touch, id) {
+      if (this.currentTouchEvent.type === 'touchstart') {
+        if (this.isPrimaryTouch(touch)) {
+          var fastPath = {
+            clientX: touch.clientX,
+            clientY: touch.clientY,
+            path: this.currentTouchEvent.path,
+            target: this.currentTouchEvent.target
+          };
+          return scope.findTarget(fastPath);
+        } else {
+          return scope.findTarget(touch);
+        }
+      }
+      // reuse target we found in touchstart
+      return pointermap.get(id);
+    },
+    touchToPointer: function(inTouch) {
+      var cte = this.currentTouchEvent;
+      var e = dispatcher.cloneEvent(inTouch);
+      // Spec specifies that pointerId 1 is reserved for Mouse.
+      // Touch identifiers can start at 0.
+      // Add 2 to the touch identifier for compatibility.
+      var id = e.pointerId = inTouch.identifier + 2;
+      e.target = this.findTarget(inTouch, id);
+      e.bubbles = true;
+      e.cancelable = true;
+      e.detail = this.clickCount;
+      e.buttons = this.typeToButtons(cte.type);
+      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
+      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
+      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
+      e.isPrimary = this.isPrimaryTouch(inTouch);
+      e.pointerType = this.POINTER_TYPE;
+      e._source = 'touch';
+      // forward touch preventDefaults
+      var self = this;
+      e.preventDefault = function() {
+        self.scrolling = false;
+        self.firstXY = null;
+        cte.preventDefault();
+      };
+      return e;
+    },
+    processTouches: function(inEvent, inFunction) {
+      var tl = inEvent.changedTouches;
+      this.currentTouchEvent = inEvent;
+      for (var i = 0, t, p; i < tl.length; i++) {
+        t = tl[i];
+        p = this.touchToPointer(t);
+        if (inEvent.type === 'touchstart') {
+          pointermap.set(p.pointerId, p.target);
+        }
+        if (pointermap.has(p.pointerId)) {
+          inFunction.call(this, p);
+        }
+        if (inEvent.type === 'touchend' || inEvent._cancel) {
+          this.cleanUpPointer(p);
+        }
+      }
+    },
+    // For single axis scrollers, determines whether the element should emit
+    // pointer events or behave as a scroller
+    shouldScroll: function(inEvent) {
+      if (this.firstXY) {
+        var ret;
+        var touchAction = scope.targetFinding.findTouchAction(inEvent);
+        var scrollAxis = this.touchActionToScrollType(touchAction);
+        if (scrollAxis === 'none') {
+          // this element is a touch-action: none, should never scroll
+          ret = false;
+        } else if (scrollAxis === 'XY') {
+          // this element should always scroll
+          ret = true;
+        } else {
+          var t = inEvent.changedTouches[0];
+          // check the intended scroll axis, and other axis
+          var a = scrollAxis;
+          var oa = scrollAxis === 'Y' ? 'X' : 'Y';
+          var da = Math.abs(t['client' + a] - this.firstXY[a]);
+          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
+          // if delta in the scroll axis > delta other axis, scroll instead of
+          // making events
+          ret = da >= doa;
+        }
+        return ret;
+      }
+    },
+    findTouch: function(inTL, inId) {
+      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
+        if (t.identifier === inId) {
+          return true;
+        }
+      }
+    },
+    // In some instances, a touchstart can happen without a touchend. This
+    // leaves the pointermap in a broken state.
+    // Therefore, on every touchstart, we remove the touches that did not fire a
+    // touchend event.
+    // To keep state globally consistent, we fire a
+    // pointercancel for this "abandoned" touch
+    vacuumTouches: function(inEvent) {
+      var tl = inEvent.touches;
+      // pointermap.pointers() should be < tl.length here, as the touchstart has not
+      // been processed yet.
+      if (pointermap.pointers() >= tl.length) {
+        var d = [];
+        pointermap.forEach(function(value, key) {
+          // Never remove pointerId == 1, which is mouse.
+          // Touch identifiers are 2 smaller than their pointerId, which is the
+          // index in pointermap.
+          if (key !== 1 && !this.findTouch(tl, key - 2)) {
+            var p = value;
+            d.push(p);
+          }
+        }, this);
+        d.forEach(function(p) {
+          this.cancel(p);
+          pointermap.delete(p.pointerId);
+        });
+      }
+    },
+    touchstart: function(inEvent) {
+      this.vacuumTouches(inEvent);
+      this.setPrimaryTouch(inEvent.changedTouches[0]);
+      this.dedupSynthMouse(inEvent);
+      if (!this.scrolling) {
+        this.clickCount++;
+        this.processTouches(inEvent, this.down);
+      }
+    },
+    down: function(inPointer) {
+      dispatcher.down(inPointer);
+    },
+    touchmove: function(inEvent) {
+      if (HAS_TOUCH_ACTION) {
+        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36
+        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ
+        if (inEvent.cancelable) {
+          this.processTouches(inEvent, this.move);
+        }
+      } else {
+        if (!this.scrolling) {
+          if (this.scrolling === null && this.shouldScroll(inEvent)) {
+            this.scrolling = true;
+          } else {
+            this.scrolling = false;
+            inEvent.preventDefault();
+            this.processTouches(inEvent, this.move);
+          }
+        } else if (this.firstXY) {
+          var t = inEvent.changedTouches[0];
+          var dx = t.clientX - this.firstXY.X;
+          var dy = t.clientY - this.firstXY.Y;
+          var dd = Math.sqrt(dx * dx + dy * dy);
+          if (dd >= HYSTERESIS) {
+            this.touchcancel(inEvent);
+            this.scrolling = true;
+            this.firstXY = null;
+          }
+        }
+      }
+    },
+    move: function(inPointer) {
+      dispatcher.move(inPointer);
+    },
+    touchend: function(inEvent) {
+      this.dedupSynthMouse(inEvent);
+      this.processTouches(inEvent, this.up);
+    },
+    up: function(inPointer) {
+      inPointer.relatedTarget = scope.findTarget(inPointer);
+      dispatcher.up(inPointer);
+    },
+    cancel: function(inPointer) {
+      dispatcher.cancel(inPointer);
+    },
+    touchcancel: function(inEvent) {
+      inEvent._cancel = true;
+      this.processTouches(inEvent, this.cancel);
+    },
+    cleanUpPointer: function(inPointer) {
+      pointermap['delete'](inPointer.pointerId);
+      this.removePrimaryPointer(inPointer);
+    },
+    // prevent synth mouse events from creating pointer events
+    dedupSynthMouse: function(inEvent) {
+      var lts = scope.mouseEvents.lastTouches;
+      var t = inEvent.changedTouches[0];
+      // only the primary finger will synth mouse events
+      if (this.isPrimaryTouch(t)) {
+        // remember x/y of last touch
+        var lt = {x: t.clientX, y: t.clientY};
+        lts.push(lt);
+        var fn = (function(lts, lt){
+          var i = lts.indexOf(lt);
+          if (i > -1) {
+            lts.splice(i, 1);
+          }
+        }).bind(null, lts, lt);
+        setTimeout(fn, DEDUP_TIMEOUT);
+      }
+    }
+  };
+
+  // prevent "ghost clicks" that come from elements that were removed in a touch handler
+  var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation;
+  document.addEventListener('click', function(ev) {
+    var x = ev.clientX, y = ev.clientY;
+    // check if a click is within DEDUP_DIST px radius of the touchstart
+    var closeTo = function(touch) {
+      var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y);
+      return (dx <= DEDUP_DIST && dy <= DEDUP_DIST);
+    };
+    // if click coordinates are close to touch coordinates, assume the click came from a touch
+    var wasTouched = scope.mouseEvents.lastTouches.some(closeTo);
+    // if the click came from touch, and the touchstart target is not in the path of the click event,
+    // then the touchstart target was probably removed, and the click should be "busted"
+    var path = scope.targetFinding.path(ev);
+    if (wasTouched) {
+      for (var i = 0; i < path.length; i++) {
+        if (path[i] === touchEvents.firstTarget) {
+          return;
+        }
+      }
+      ev.preventDefault();
+      STOP_PROP_FN.call(ev);
+    }
+  }, true);
+
+  scope.touchEvents = touchEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';
+  var msEvents = {
+    events: [
+      'MSPointerDown',
+      'MSPointerMove',
+      'MSPointerUp',
+      'MSPointerCancel',
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    POINTER_TYPES: [
+      '',
+      'unavailable',
+      'touch',
+      'pen',
+      'mouse'
+    ],
+    prepareEvent: function(inEvent) {
+      var e = inEvent;
+      e = dispatcher.cloneEvent(inEvent);
+      if (HAS_BITMAP_TYPE) {
+        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
+      }
+      e._source = 'ms';
+      return e;
+    },
+    cleanup: function(id) {
+      pointermap['delete'](id);
+    },
+    MSPointerDown: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.target = scope.findTarget(inEvent);
+      pointermap.set(inEvent.pointerId, e.target);
+      dispatcher.down(e);
+    },
+    MSPointerMove: function(inEvent) {
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
+    },
+    MSPointerUp: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.up(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    MSPointerCancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.cancel(e);
+      this.cleanup(inEvent.pointerId);
+    }
+  };
+
+  scope.msEvents = msEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  var pointerEvents = {
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel'
+    ],
+    prepareEvent: function(inEvent) {
+      var e = dispatcher.cloneEvent(inEvent);
+      e._source = 'pointer';
+      return e;
+    },
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    cleanup: function(id) {
+      pointermap['delete'](id);
+    },
+    pointerdown: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.target = scope.findTarget(inEvent);
+      pointermap.set(e.pointerId, e.target);
+      dispatcher.down(e);
+    },
+    pointermove: function(inEvent) {
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
+    },
+    pointerup: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.up(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    pointercancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.cancel(e);
+      this.cleanup(inEvent.pointerId);
+    }
+  };
+
+  scope.pointerEvents = pointerEvents;
+})(window.PolymerGestures);
+
+/**
+ * This module contains the handlers for native platform events.
+ * From here, the dispatcher is called to create unified pointer events.
+ * Included are touch events (v1), mouse events, and MSPointerEvents.
+ */
+(function(scope) {
+
+  var dispatcher = scope.dispatcher;
+  var nav = window.navigator;
+
+  if (window.PointerEvent) {
+    dispatcher.registerSource('pointer', scope.pointerEvents);
+  } else if (nav.msPointerEnabled) {
+    dispatcher.registerSource('ms', scope.msEvents);
+  } else {
+    dispatcher.registerSource('mouse', scope.mouseEvents);
+    if (window.ontouchstart !== undefined) {
+      dispatcher.registerSource('touch', scope.touchEvents);
+    }
+  }
+
+  // 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);
+
+/**
+ * This event denotes the beginning of a series of tracking events.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class trackstart
+ */
+/**
+ * Pixels moved in the x direction since trackstart.
+ * @type Number
+ * @property dx
+ */
+/**
+ * Pixes moved in the y direction since trackstart.
+ * @type Number
+ * @property dy
+ */
+/**
+ * Pixels moved in the x direction since the last track.
+ * @type Number
+ * @property ddx
+ */
+/**
+ * Pixles moved in the y direction since the last track.
+ * @type Number
+ * @property ddy
+ */
+/**
+ * The clientX position of the track gesture.
+ * @type Number
+ * @property clientX
+ */
+/**
+ * The clientY position of the track gesture.
+ * @type Number
+ * @property clientY
+ */
+/**
+ * The pageX position of the track gesture.
+ * @type Number
+ * @property pageX
+ */
+/**
+ * The pageY position of the track gesture.
+ * @type Number
+ * @property pageY
+ */
+/**
+ * The screenX position of the track gesture.
+ * @type Number
+ * @property screenX
+ */
+/**
+ * The screenY position of the track gesture.
+ * @type Number
+ * @property screenY
+ */
+/**
+ * The last x axis direction of the pointer.
+ * @type Number
+ * @property xDirection
+ */
+/**
+ * The last y axis direction of the pointer.
+ * @type Number
+ * @property yDirection
+ */
+/**
+ * A shared object between all tracking events.
+ * @type Object
+ * @property trackInfo
+ */
+/**
+ * The element currently under the pointer.
+ * @type Element
+ * @property relatedTarget
+ */
+/**
+ * The type of pointer that make the track gesture.
+ * @type String
+ * @property pointerType
+ */
+/**
+ *
+ * This event fires for all pointer movement being tracked.
+ *
+ * @class track
+ * @extends trackstart
+ */
+/**
+ * This event fires when the pointer is no longer being tracked.
+ *
+ * @class trackend
+ * @extends trackstart
+ */
+
+ (function(scope) {
+   var dispatcher = scope.dispatcher;
+   var eventFactory = scope.eventFactory;
+   var pointermap = new scope.PointerMap();
+   var track = {
+     events: [
+       'down',
+       'move',
+       'up',
+     ],
+     exposes: [
+      'trackstart',
+      'track',
+      'trackx',
+      'tracky',
+      'trackend'
+     ],
+     defaultActions: {
+       'track': 'none',
+       'trackx': 'pan-y',
+       'tracky': 'pan-x'
+     },
+     WIGGLE_THRESHOLD: 4,
+     clampDir: function(inDelta) {
+       return inDelta > 0 ? 1 : -1;
+     },
+     calcPositionDelta: function(inA, inB) {
+       var x = 0, y = 0;
+       if (inA && inB) {
+         x = inB.pageX - inA.pageX;
+         y = inB.pageY - inA.pageY;
+       }
+       return {x: x, y: y};
+     },
+     fireTrack: function(inType, inEvent, inTrackingData) {
+       var t = inTrackingData;
+       var d = this.calcPositionDelta(t.downEvent, inEvent);
+       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
+       if (dd.x) {
+         t.xDirection = this.clampDir(dd.x);
+       } else if (inType === 'trackx') {
+         return;
+       }
+       if (dd.y) {
+         t.yDirection = this.clampDir(dd.y);
+       } else if (inType === 'tracky') {
+         return;
+       }
+       var gestureProto = {
+         bubbles: true,
+         cancelable: true,
+         trackInfo: t.trackInfo,
+         relatedTarget: inEvent.relatedTarget,
+         pointerType: inEvent.pointerType,
+         pointerId: inEvent.pointerId,
+         _source: 'track'
+       };
+       if (inType !== 'tracky') {
+         gestureProto.x = inEvent.x;
+         gestureProto.dx = d.x;
+         gestureProto.ddx = dd.x;
+         gestureProto.clientX = inEvent.clientX;
+         gestureProto.pageX = inEvent.pageX;
+         gestureProto.screenX = inEvent.screenX;
+         gestureProto.xDirection = t.xDirection;
+       }
+       if (inType !== 'trackx') {
+         gestureProto.dy = d.y;
+         gestureProto.ddy = dd.y;
+         gestureProto.y = inEvent.y;
+         gestureProto.clientY = inEvent.clientY;
+         gestureProto.pageY = inEvent.pageY;
+         gestureProto.screenY = inEvent.screenY;
+         gestureProto.yDirection = t.yDirection;
+       }
+       var e = eventFactory.makeGestureEvent(inType, gestureProto);
+       t.downTarget.dispatchEvent(e);
+     },
+     down: function(inEvent) {
+       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {
+         var p = {
+           downEvent: inEvent,
+           downTarget: inEvent.target,
+           trackInfo: {},
+           lastMoveEvent: null,
+           xDirection: 0,
+           yDirection: 0,
+           tracking: false
+         };
+         pointermap.set(inEvent.pointerId, p);
+       }
+     },
+     move: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (!p.tracking) {
+           var d = this.calcPositionDelta(p.downEvent, inEvent);
+           var move = d.x * d.x + d.y * d.y;
+           // start tracking only if finger moves more than WIGGLE_THRESHOLD
+           if (move > this.WIGGLE_THRESHOLD) {
+             p.tracking = true;
+             p.lastMoveEvent = p.downEvent;
+             this.fireTrack('trackstart', inEvent, p);
+           }
+         }
+         if (p.tracking) {
+           this.fireTrack('track', inEvent, p);
+           this.fireTrack('trackx', inEvent, p);
+           this.fireTrack('tracky', inEvent, p);
+         }
+         p.lastMoveEvent = inEvent;
+       }
+     },
+     up: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (p.tracking) {
+           this.fireTrack('trackend', inEvent, p);
+         }
+         pointermap.delete(inEvent.pointerId);
+       }
+     }
+   };
+   dispatcher.registerGesture('track', track);
+ })(window.PolymerGestures);
+
+/**
+ * This event is fired when a pointer is held down for 200ms.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class hold
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * Screen X axis position of the held pointer
+ * @type Number
+ * @property clientX
+ */
+/**
+ * Screen Y axis position of the held pointer
+ * @type Number
+ * @property clientY
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * This event is fired every 200ms while a pointer is held down.
+ *
+ * @class holdpulse
+ * @extends hold
+ */
+/**
+ * Milliseconds pointer has been held down.
+ * @type Number
+ * @property holdTime
+ */
+/**
+ * This event is fired when a held pointer is released or moved.
+ *
+ * @class release
+ */
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var hold = {
+    // wait at least HOLD_DELAY ms between hold and pulse events
+    HOLD_DELAY: 200,
+    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold
+    WIGGLE_THRESHOLD: 16,
+    events: [
+      'down',
+      'move',
+      'up',
+    ],
+    exposes: [
+      'hold',
+      'holdpulse',
+      'release'
+    ],
+    heldPointer: null,
+    holdJob: null,
+    pulse: function() {
+      var hold = Date.now() - this.heldPointer.timeStamp;
+      var type = this.held ? 'holdpulse' : 'hold';
+      this.fireHold(type, hold);
+      this.held = true;
+    },
+    cancel: function() {
+      clearInterval(this.holdJob);
+      if (this.held) {
+        this.fireHold('release');
+      }
+      this.held = false;
+      this.heldPointer = null;
+      this.target = null;
+      this.holdJob = null;
+    },
+    down: function(inEvent) {
+      if (inEvent.isPrimary && !this.heldPointer) {
+        this.heldPointer = inEvent;
+        this.target = inEvent.target;
+        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
+      }
+    },
+    up: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        this.cancel();
+      }
+    },
+    move: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        var x = inEvent.clientX - this.heldPointer.clientX;
+        var y = inEvent.clientY - this.heldPointer.clientY;
+        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {
+          this.cancel();
+        }
+      }
+    },
+    fireHold: function(inType, inHoldTime) {
+      var p = {
+        bubbles: true,
+        cancelable: true,
+        pointerType: this.heldPointer.pointerType,
+        pointerId: this.heldPointer.pointerId,
+        x: this.heldPointer.clientX,
+        y: this.heldPointer.clientY,
+        _source: 'hold'
+      };
+      if (inHoldTime) {
+        p.holdTime = inHoldTime;
+      }
+      var e = eventFactory.makeGestureEvent(inType, p);
+      this.target.dispatchEvent(e);
+    }
+  };
+  dispatcher.registerGesture('hold', hold);
+})(window.PolymerGestures);
+
+/**
+ * This event is fired when a pointer quickly goes down and up, and is used to
+ * denote activation.
+ *
+ * Any gesture event can prevent the tap event from being created by calling
+ * `event.preventTap`.
+ *
+ * Any pointer event can prevent the tap by setting the `tapPrevented` property
+ * on itself.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class tap
+ */
+/**
+ * X axis position of the tap.
+ * @property x
+ * @type Number
+ */
+/**
+ * Y axis position of the tap.
+ * @property y
+ * @type Number
+ */
+/**
+ * Type of the pointer that made the tap.
+ * @property pointerType
+ * @type String
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var pointermap = new scope.PointerMap();
+  var tap = {
+    events: [
+      'down',
+      'up'
+    ],
+    exposes: [
+      'tap'
+    ],
+    down: function(inEvent) {
+      if (inEvent.isPrimary && !inEvent.tapPrevented) {
+        pointermap.set(inEvent.pointerId, {
+          target: inEvent.target,
+          buttons: inEvent.buttons,
+          x: inEvent.clientX,
+          y: inEvent.clientY
+        });
+      }
+    },
+    shouldTap: function(e, downState) {
+      var tap = true;
+      if (e.pointerType === 'mouse') {
+        // only allow left click to tap for mouse
+        tap = (e.buttons ^ 1) && (downState.buttons & 1);
+      }
+      return tap && !e.tapPrevented;
+    },
+    up: function(inEvent) {
+      var start = pointermap.get(inEvent.pointerId);
+      if (start && this.shouldTap(inEvent, start)) {
+        // up.relatedTarget is target currently under finger
+        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);
+        if (t) {
+          var e = eventFactory.makeGestureEvent('tap', {
+            bubbles: true,
+            cancelable: true,
+            x: inEvent.clientX,
+            y: inEvent.clientY,
+            detail: inEvent.detail,
+            pointerType: inEvent.pointerType,
+            pointerId: inEvent.pointerId,
+            altKey: inEvent.altKey,
+            ctrlKey: inEvent.ctrlKey,
+            metaKey: inEvent.metaKey,
+            shiftKey: inEvent.shiftKey,
+            _source: 'tap'
+          });
+          t.dispatchEvent(e);
+        }
+      }
+      pointermap.delete(inEvent.pointerId);
+    }
+  };
+  // patch eventFactory to remove id from tap's pointermap for preventTap calls
+  eventFactory.preventTap = function(e) {
+    return function() {
+      e.tapPrevented = true;
+      pointermap.delete(e.pointerId);
+    };
+  };
+  dispatcher.registerGesture('tap', tap);
+})(window.PolymerGestures);
+
+/*
+ * Basic strategy: find the farthest apart points, use as diameter of circle
+ * react to size change and rotation of the chord
+ */
+
+/**
+ * @module pointer-gestures
+ * @submodule Events
+ * @class pinch
+ */
+/**
+ * Scale of the pinch zoom gesture
+ * @property scale
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing pinch
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing pinch
+ * @property centerY
+ * @type Number
+ */
+
+/**
+ * @module pointer-gestures
+ * @submodule Events
+ * @class rotate
+ */
+/**
+ * Angle (in degrees) of rotation. Measured from starting positions of pointers.
+ * @property angle
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing rotation
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing rotation
+ * @property centerY
+ * @type Number
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var pointermap = new scope.PointerMap();
+  var RAD_TO_DEG = 180 / Math.PI;
+  var pinch = {
+    events: [
+      'down',
+      'up',
+      'move',
+      'cancel'
+    ],
+    exposes: [
+      'pinch',
+      'rotate'
+    ],
+    defaultActions: {
+      'pinch': 'none',
+      'rotate': 'none'
+    },
+    reference: {},
+    down: function(inEvent) {
+      pointermap.set(inEvent.pointerId, inEvent);
+      if (pointermap.pointers() == 2) {
+        var points = this.calcChord();
+        var angle = this.calcAngle(points);
+        this.reference = {
+          angle: angle,
+          diameter: points.diameter,
+          target: scope.targetFinding.LCA(points.a.target, points.b.target)
+        };
+      }
+    },
+    up: function(inEvent) {
+      var p = pointermap.get(inEvent.pointerId);
+      if (p) {
+        pointermap.delete(inEvent.pointerId);
+      }
+    },
+    move: function(inEvent) {
+      if (pointermap.has(inEvent.pointerId)) {
+        pointermap.set(inEvent.pointerId, inEvent);
+        if (pointermap.pointers() > 1) {
+          this.calcPinchRotate();
+        }
+      }
+    },
+    cancel: function(inEvent) {
+        this.up(inEvent);
+    },
+    firePinch: function(diameter, points) {
+      var zoom = diameter / this.reference.diameter;
+      var e = eventFactory.makeGestureEvent('pinch', {
+        bubbles: true,
+        cancelable: true,
+        scale: zoom,
+        centerX: points.center.x,
+        centerY: points.center.y,
+        _source: 'pinch'
+      });
+      this.reference.target.dispatchEvent(e);
+    },
+    fireRotate: function(angle, points) {
+      var diff = Math.round((angle - this.reference.angle) % 360);
+      var e = eventFactory.makeGestureEvent('rotate', {
+        bubbles: true,
+        cancelable: true,
+        angle: diff,
+        centerX: points.center.x,
+        centerY: points.center.y,
+        _source: 'pinch'
+      });
+      this.reference.target.dispatchEvent(e);
+    },
+    calcPinchRotate: function() {
+      var points = this.calcChord();
+      var diameter = points.diameter;
+      var angle = this.calcAngle(points);
+      if (diameter != this.reference.diameter) {
+        this.firePinch(diameter, points);
+      }
+      if (angle != this.reference.angle) {
+        this.fireRotate(angle, points);
+      }
+    },
+    calcChord: function() {
+      var pointers = [];
+      pointermap.forEach(function(p) {
+        pointers.push(p);
+      });
+      var dist = 0;
+      // start with at least two pointers
+      var points = {a: pointers[0], b: pointers[1]};
+      var x, y, d;
+      for (var i = 0; i < pointers.length; i++) {
+        var a = pointers[i];
+        for (var j = i + 1; j < pointers.length; j++) {
+          var b = pointers[j];
+          x = Math.abs(a.clientX - b.clientX);
+          y = Math.abs(a.clientY - b.clientY);
+          d = x + y;
+          if (d > dist) {
+            dist = d;
+            points = {a: a, b: b};
+          }
+        }
+      }
+      x = Math.abs(points.a.clientX + points.b.clientX) / 2;
+      y = Math.abs(points.a.clientY + points.b.clientY) / 2;
+      points.center = { x: x, y: y };
+      points.diameter = dist;
+      return points;
+    },
+    calcAngle: function(points) {
+      var x = points.a.clientX - points.b.clientX;
+      var y = points.a.clientY - points.b.clientY;
+      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;
+    }
+  };
+  dispatcher.registerGesture('pinch', pinch);
+})(window.PolymerGestures);
+
+(function (global) {
+    'use strict';
+
+    var Token,
+        TokenName,
+        Syntax,
+        Messages,
+        source,
+        index,
+        length,
+        delegate,
+        lookahead,
+        state;
+
+    Token = {
+        BooleanLiteral: 1,
+        EOF: 2,
+        Identifier: 3,
+        Keyword: 4,
+        NullLiteral: 5,
+        NumericLiteral: 6,
+        Punctuator: 7,
+        StringLiteral: 8
+    };
+
+    TokenName = {};
+    TokenName[Token.BooleanLiteral] = 'Boolean';
+    TokenName[Token.EOF] = '<end>';
+    TokenName[Token.Identifier] = 'Identifier';
+    TokenName[Token.Keyword] = 'Keyword';
+    TokenName[Token.NullLiteral] = 'Null';
+    TokenName[Token.NumericLiteral] = 'Numeric';
+    TokenName[Token.Punctuator] = 'Punctuator';
+    TokenName[Token.StringLiteral] = 'String';
+
+    Syntax = {
+        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'
+    };
+
+    // Error messages should be identical to V8.
+    Messages = {
+        UnexpectedToken:  'Unexpected token %0',
+        UnknownLabel: 'Undefined label \'%0\'',
+        Redeclaration: '%0 \'%1\' has already been declared'
+    };
+
+    // Ensure the condition is true, otherwise throw an error.
+    // This is only to have a better contract semantic, i.e. another safety net
+    // to catch a logic error. The condition shall be fulfilled in normal case.
+    // Do NOT use this to enforce a certain condition on any user input.
+
+    function assert(condition, message) {
+        if (!condition) {
+            throw new Error('ASSERT: ' + message);
+        }
+    }
+
+    function isDecimalDigit(ch) {
+        return (ch >= 48 && ch <= 57);   // 0..9
+    }
+
+
+    // 7.2 White Space
+
+    function isWhiteSpace(ch) {
+        return (ch === 32) ||  // space
+            (ch === 9) ||      // tab
+            (ch === 0xB) ||
+            (ch === 0xC) ||
+            (ch === 0xA0) ||
+            (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);
+    }
+
+    // 7.3 Line Terminators
+
+    function isLineTerminator(ch) {
+        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);
+    }
+
+    // 7.6 Identifier Names and Identifiers
+
+    function isIdentifierStart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122);          // a..z
+    }
+
+    function isIdentifierPart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122) ||        // a..z
+            (ch >= 48 && ch <= 57);           // 0..9
+    }
+
+    // 7.6.1.1 Keywords
+
+    function isKeyword(id) {
+        return (id === 'this')
+    }
+
+    // 7.4 Comments
+
+    function skipWhitespace() {
+        while (index < length && isWhiteSpace(source.charCodeAt(index))) {
+           ++index;
+        }
+    }
+
+    function getIdentifier() {
+        var start, ch;
+
+        start = index++;
+        while (index < length) {
+            ch = source.charCodeAt(index);
+            if (isIdentifierPart(ch)) {
+                ++index;
+            } else {
+                break;
+            }
+        }
+
+        return source.slice(start, index);
+    }
+
+    function scanIdentifier() {
+        var start, id, type;
+
+        start = index;
+
+        id = getIdentifier();
+
+        // There is no keyword or literal with only one character.
+        // Thus, it must be an identifier.
+        if (id.length === 1) {
+            type = Token.Identifier;
+        } else if (isKeyword(id)) {
+            type = Token.Keyword;
+        } else if (id === 'null') {
+            type = Token.NullLiteral;
+        } else if (id === 'true' || id === 'false') {
+            type = Token.BooleanLiteral;
+        } else {
+            type = Token.Identifier;
+        }
+
+        return {
+            type: type,
+            value: id,
+            range: [start, index]
+        };
+    }
+
+
+    // 7.7 Punctuators
+
+    function scanPunctuator() {
+        var start = index,
+            code = source.charCodeAt(index),
+            code2,
+            ch1 = source[index],
+            ch2;
+
+        switch (code) {
+
+        // Check for most common single-character punctuators.
+        case 46:   // . dot
+        case 40:   // ( open bracket
+        case 41:   // ) close bracket
+        case 59:   // ; semicolon
+        case 44:   // , comma
+        case 123:  // { open curly brace
+        case 125:  // } close curly brace
+        case 91:   // [
+        case 93:   // ]
+        case 58:   // :
+        case 63:   // ?
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: String.fromCharCode(code),
+                range: [start, index]
+            };
+
+        default:
+            code2 = source.charCodeAt(index + 1);
+
+            // '=' (char #61) marks an assignment or comparison operator.
+            if (code2 === 61) {
+                switch (code) {
+                case 37:  // %
+                case 38:  // &
+                case 42:  // *:
+                case 43:  // +
+                case 45:  // -
+                case 47:  // /
+                case 60:  // <
+                case 62:  // >
+                case 124: // |
+                    index += 2;
+                    return {
+                        type: Token.Punctuator,
+                        value: String.fromCharCode(code) + String.fromCharCode(code2),
+                        range: [start, index]
+                    };
+
+                case 33: // !
+                case 61: // =
+                    index += 2;
+
+                    // !== and ===
+                    if (source.charCodeAt(index) === 61) {
+                        ++index;
+                    }
+                    return {
+                        type: Token.Punctuator,
+                        value: source.slice(start, index),
+                        range: [start, index]
+                    };
+                default:
+                    break;
+                }
+            }
+            break;
+        }
+
+        // Peek more characters.
+
+        ch2 = source[index + 1];
+
+        // Other 2-character punctuators: && ||
+
+        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
+            index += 2;
+            return {
+                type: Token.Punctuator,
+                value: ch1 + ch2,
+                range: [start, index]
+            };
+        }
+
+        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: ch1,
+                range: [start, index]
+            };
+        }
+
+        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+    }
+
+    // 7.8.3 Numeric Literals
+    function scanNumericLiteral() {
+        var number, start, ch;
+
+        ch = source[index];
+        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
+            'Numeric literal must start with a decimal digit or a decimal point');
+
+        start = index;
+        number = '';
+        if (ch !== '.') {
+            number = source[index++];
+            ch = source[index];
+
+            // Hex number starts with '0x'.
+            // Octal number starts with '0'.
+            if (number === '0') {
+                // decimal number starts with '0' such as '09' is illegal.
+                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
+                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+                }
+            }
+
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === '.') {
+            number += source[index++];
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === 'e' || ch === 'E') {
+            number += source[index++];
+
+            ch = source[index];
+            if (ch === '+' || ch === '-') {
+                number += source[index++];
+            }
+            if (isDecimalDigit(source.charCodeAt(index))) {
+                while (isDecimalDigit(source.charCodeAt(index))) {
+                    number += source[index++];
+                }
+            } else {
+                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+            }
+        }
+
+        if (isIdentifierStart(source.charCodeAt(index))) {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.NumericLiteral,
+            value: parseFloat(number),
+            range: [start, index]
+        };
+    }
+
+    // 7.8.4 String Literals
+
+    function scanStringLiteral() {
+        var str = '', quote, start, ch, octal = false;
+
+        quote = source[index];
+        assert((quote === '\'' || quote === '"'),
+            'String literal must starts with a quote');
+
+        start = index;
+        ++index;
+
+        while (index < length) {
+            ch = source[index++];
+
+            if (ch === quote) {
+                quote = '';
+                break;
+            } else if (ch === '\\') {
+                ch = source[index++];
+                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
+                    switch (ch) {
+                    case 'n':
+                        str += '\n';
+                        break;
+                    case 'r':
+                        str += '\r';
+                        break;
+                    case 't':
+                        str += '\t';
+                        break;
+                    case 'b':
+                        str += '\b';
+                        break;
+                    case 'f':
+                        str += '\f';
+                        break;
+                    case 'v':
+                        str += '\x0B';
+                        break;
+
+                    default:
+                        str += ch;
+                        break;
+                    }
+                } else {
+                    if (ch ===  '\r' && source[index] === '\n') {
+                        ++index;
+                    }
+                }
+            } else if (isLineTerminator(ch.charCodeAt(0))) {
+                break;
+            } else {
+                str += ch;
+            }
+        }
+
+        if (quote !== '') {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.StringLiteral,
+            value: str,
+            octal: octal,
+            range: [start, index]
+        };
+    }
+
+    function isIdentifierName(token) {
+        return token.type === Token.Identifier ||
+            token.type === Token.Keyword ||
+            token.type === Token.BooleanLiteral ||
+            token.type === Token.NullLiteral;
+    }
+
+    function advance() {
+        var ch;
+
+        skipWhitespace();
+
+        if (index >= length) {
+            return {
+                type: Token.EOF,
+                range: [index, index]
+            };
+        }
+
+        ch = source.charCodeAt(index);
+
+        // Very common: ( and ) and ;
+        if (ch === 40 || ch === 41 || ch === 58) {
+            return scanPunctuator();
+        }
+
+        // String literal starts with single quote (#39) or double quote (#34).
+        if (ch === 39 || ch === 34) {
+            return scanStringLiteral();
+        }
+
+        if (isIdentifierStart(ch)) {
+            return scanIdentifier();
+        }
+
+        // Dot (.) char #46 can also start a floating-point number, hence the need
+        // to check the next character.
+        if (ch === 46) {
+            if (isDecimalDigit(source.charCodeAt(index + 1))) {
+                return scanNumericLiteral();
+            }
+            return scanPunctuator();
+        }
+
+        if (isDecimalDigit(ch)) {
+            return scanNumericLiteral();
+        }
+
+        return scanPunctuator();
+    }
+
+    function lex() {
+        var token;
+
+        token = lookahead;
+        index = token.range[1];
+
+        lookahead = advance();
+
+        index = token.range[1];
+
+        return token;
+    }
+
+    function peek() {
+        var pos;
+
+        pos = index;
+        lookahead = advance();
+        index = pos;
+    }
+
+    // Throw an exception
+
+    function throwError(token, messageFormat) {
+        var error,
+            args = Array.prototype.slice.call(arguments, 2),
+            msg = messageFormat.replace(
+                /%(\d)/g,
+                function (whole, index) {
+                    assert(index < args.length, 'Message reference must be in range');
+                    return args[index];
+                }
+            );
+
+        error = new Error(msg);
+        error.index = index;
+        error.description = msg;
+        throw error;
+    }
+
+    // Throw an exception because of the token.
+
+    function throwUnexpected(token) {
+        throwError(token, Messages.UnexpectedToken, token.value);
+    }
+
+    // Expect the next token to match the specified punctuator.
+    // If not, an exception will be thrown.
+
+    function expect(value) {
+        var token = lex();
+        if (token.type !== Token.Punctuator || token.value !== value) {
+            throwUnexpected(token);
+        }
+    }
+
+    // Return true if the next token matches the specified punctuator.
+
+    function match(value) {
+        return lookahead.type === Token.Punctuator && lookahead.value === value;
+    }
+
+    // Return true if the next token matches the specified keyword
+
+    function matchKeyword(keyword) {
+        return lookahead.type === Token.Keyword && lookahead.value === keyword;
+    }
+
+    function consumeSemicolon() {
+        // Catch the very common case first: immediately a semicolon (char #59).
+        if (source.charCodeAt(index) === 59) {
+            lex();
+            return;
+        }
+
+        skipWhitespace();
+
+        if (match(';')) {
+            lex();
+            return;
+        }
+
+        if (lookahead.type !== Token.EOF && !match('}')) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    // 11.1.4 Array Initialiser
+
+    function parseArrayInitialiser() {
+        var elements = [];
+
+        expect('[');
+
+        while (!match(']')) {
+            if (match(',')) {
+                lex();
+                elements.push(null);
+            } else {
+                elements.push(parseExpression());
+
+                if (!match(']')) {
+                    expect(',');
+                }
+            }
+        }
+
+        expect(']');
+
+        return delegate.createArrayExpression(elements);
+    }
+
+    // 11.1.5 Object Initialiser
+
+    function parseObjectPropertyKey() {
+        var token;
+
+        skipWhitespace();
+        token = lex();
+
+        // Note: This function is called only from parseObjectProperty(), where
+        // EOF and Punctuator tokens are already filtered out.
+        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
+            return delegate.createLiteral(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseObjectProperty() {
+        var token, key;
+
+        token = lookahead;
+        skipWhitespace();
+
+        if (token.type === Token.EOF || token.type === Token.Punctuator) {
+            throwUnexpected(token);
+        }
+
+        key = parseObjectPropertyKey();
+        expect(':');
+        return delegate.createProperty('init', key, parseExpression());
+    }
+
+    function parseObjectInitialiser() {
+        var properties = [];
+
+        expect('{');
+
+        while (!match('}')) {
+            properties.push(parseObjectProperty());
+
+            if (!match('}')) {
+                expect(',');
+            }
+        }
+
+        expect('}');
+
+        return delegate.createObjectExpression(properties);
+    }
+
+    // 11.1.6 The Grouping Operator
+
+    function parseGroupExpression() {
+        var expr;
+
+        expect('(');
+
+        expr = parseExpression();
+
+        expect(')');
+
+        return expr;
+    }
+
+
+    // 11.1 Primary Expressions
+
+    function parsePrimaryExpression() {
+        var type, token, expr;
+
+        if (match('(')) {
+            return parseGroupExpression();
+        }
+
+        type = lookahead.type;
+
+        if (type === Token.Identifier) {
+            expr = delegate.createIdentifier(lex().value);
+        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
+            expr = delegate.createLiteral(lex());
+        } else if (type === Token.Keyword) {
+            if (matchKeyword('this')) {
+                lex();
+                expr = delegate.createThisExpression();
+            }
+        } else if (type === Token.BooleanLiteral) {
+            token = lex();
+            token.value = (token.value === 'true');
+            expr = delegate.createLiteral(token);
+        } else if (type === Token.NullLiteral) {
+            token = lex();
+            token.value = null;
+            expr = delegate.createLiteral(token);
+        } else if (match('[')) {
+            expr = parseArrayInitialiser();
+        } else if (match('{')) {
+            expr = parseObjectInitialiser();
+        }
+
+        if (expr) {
+            return expr;
+        }
+
+        throwUnexpected(lex());
+    }
+
+    // 11.2 Left-Hand-Side Expressions
+
+    function parseArguments() {
+        var args = [];
+
+        expect('(');
+
+        if (!match(')')) {
+            while (index < length) {
+                args.push(parseExpression());
+                if (match(')')) {
+                    break;
+                }
+                expect(',');
+            }
+        }
+
+        expect(')');
+
+        return args;
+    }
+
+    function parseNonComputedProperty() {
+        var token;
+
+        token = lex();
+
+        if (!isIdentifierName(token)) {
+            throwUnexpected(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseNonComputedMember() {
+        expect('.');
+
+        return parseNonComputedProperty();
+    }
+
+    function parseComputedMember() {
+        var expr;
+
+        expect('[');
+
+        expr = parseExpression();
+
+        expect(']');
+
+        return expr;
+    }
+
+    function parseLeftHandSideExpression() {
+        var expr, args, property;
+
+        expr = parsePrimaryExpression();
+
+        while (true) {
+            if (match('[')) {
+                property = parseComputedMember();
+                expr = delegate.createMemberExpression('[', expr, property);
+            } else if (match('.')) {
+                property = parseNonComputedMember();
+                expr = delegate.createMemberExpression('.', expr, property);
+            } else if (match('(')) {
+                args = parseArguments();
+                expr = delegate.createCallExpression(expr, args);
+            } else {
+                break;
+            }
+        }
+
+        return expr;
+    }
+
+    // 11.3 Postfix Expressions
+
+    var parsePostfixExpression = parseLeftHandSideExpression;
+
+    // 11.4 Unary Operators
+
+    function parseUnaryExpression() {
+        var token, expr;
+
+        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
+            expr = parsePostfixExpression();
+        } else if (match('+') || match('-') || match('!')) {
+            token = lex();
+            expr = parseUnaryExpression();
+            expr = delegate.createUnaryExpression(token.value, expr);
+        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
+            throwError({}, Messages.UnexpectedToken);
+        } else {
+            expr = parsePostfixExpression();
+        }
+
+        return expr;
+    }
+
+    function binaryPrecedence(token) {
+        var prec = 0;
+
+        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
+            return 0;
+        }
+
+        switch (token.value) {
+        case '||':
+            prec = 1;
+            break;
+
+        case '&&':
+            prec = 2;
+            break;
+
+        case '==':
+        case '!=':
+        case '===':
+        case '!==':
+            prec = 6;
+            break;
+
+        case '<':
+        case '>':
+        case '<=':
+        case '>=':
+        case 'instanceof':
+            prec = 7;
+            break;
+
+        case 'in':
+            prec = 7;
+            break;
+
+        case '+':
+        case '-':
+            prec = 9;
+            break;
+
+        case '*':
+        case '/':
+        case '%':
+            prec = 11;
+            break;
+
+        default:
+            break;
+        }
+
+        return prec;
+    }
+
+    // 11.5 Multiplicative Operators
+    // 11.6 Additive Operators
+    // 11.7 Bitwise Shift Operators
+    // 11.8 Relational Operators
+    // 11.9 Equality Operators
+    // 11.10 Binary Bitwise Operators
+    // 11.11 Binary Logical Operators
+
+    function parseBinaryExpression() {
+        var expr, token, prec, stack, right, operator, left, i;
+
+        left = parseUnaryExpression();
+
+        token = lookahead;
+        prec = binaryPrecedence(token);
+        if (prec === 0) {
+            return left;
+        }
+        token.prec = prec;
+        lex();
+
+        right = parseUnaryExpression();
+
+        stack = [left, token, right];
+
+        while ((prec = binaryPrecedence(lookahead)) > 0) {
+
+            // Reduce: make a binary expression from the three topmost entries.
+            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
+                right = stack.pop();
+                operator = stack.pop().value;
+                left = stack.pop();
+                expr = delegate.createBinaryExpression(operator, left, right);
+                stack.push(expr);
+            }
+
+            // Shift.
+            token = lex();
+            token.prec = prec;
+            stack.push(token);
+            expr = parseUnaryExpression();
+            stack.push(expr);
+        }
+
+        // Final reduce to clean-up the stack.
+        i = stack.length - 1;
+        expr = stack[i];
+        while (i > 1) {
+            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
+            i -= 2;
+        }
+
+        return expr;
+    }
+
+
+    // 11.12 Conditional Operator
+
+    function parseConditionalExpression() {
+        var expr, consequent, alternate;
+
+        expr = parseBinaryExpression();
+
+        if (match('?')) {
+            lex();
+            consequent = parseConditionalExpression();
+            expect(':');
+            alternate = parseConditionalExpression();
+
+            expr = delegate.createConditionalExpression(expr, consequent, alternate);
+        }
+
+        return expr;
+    }
+
+    // Simplification since we do not support AssignmentExpression.
+    var parseExpression = parseConditionalExpression;
+
+    // Polymer Syntax extensions
+
+    // Filter ::
+    //   Identifier
+    //   Identifier "(" ")"
+    //   Identifier "(" FilterArguments ")"
+
+    function parseFilter() {
+        var identifier, args;
+
+        identifier = lex();
+
+        if (identifier.type !== Token.Identifier) {
+            throwUnexpected(identifier);
+        }
+
+        args = match('(') ? parseArguments() : [];
+
+        return delegate.createFilter(identifier.value, args);
+    }
+
+    // Filters ::
+    //   "|" Filter
+    //   Filters "|" Filter
+
+    function parseFilters() {
+        while (match('|')) {
+            lex();
+            parseFilter();
+        }
+    }
+
+    // TopLevel ::
+    //   LabelledExpressions
+    //   AsExpression
+    //   InExpression
+    //   FilterExpression
+
+    // AsExpression ::
+    //   FilterExpression as Identifier
+
+    // InExpression ::
+    //   Identifier, Identifier in FilterExpression
+    //   Identifier in FilterExpression
+
+    // FilterExpression ::
+    //   Expression
+    //   Expression Filters
+
+    function parseTopLevel() {
+        skipWhitespace();
+        peek();
+
+        var expr = parseExpression();
+        if (expr) {
+            if (lookahead.value === ',' || lookahead.value == 'in' &&
+                       expr.type === Syntax.Identifier) {
+                parseInExpression(expr);
+            } else {
+                parseFilters();
+                if (lookahead.value === 'as') {
+                    parseAsExpression(expr);
+                } else {
+                    delegate.createTopLevel(expr);
+                }
+            }
+        }
+
+        if (lookahead.type !== Token.EOF) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    function parseAsExpression(expr) {
+        lex();  // as
+        var identifier = lex().value;
+        delegate.createAsExpression(expr, identifier);
+    }
+
+    function parseInExpression(identifier) {
+        var indexName;
+        if (lookahead.value === ',') {
+            lex();
+            if (lookahead.type !== Token.Identifier)
+                throwUnexpected(lookahead);
+            indexName = lex().value;
+        }
+
+        lex();  // in
+        var expr = parseExpression();
+        parseFilters();
+        delegate.createInExpression(identifier.name, indexName, expr);
+    }
+
+    function parse(code, inDelegate) {
+        delegate = inDelegate;
+        source = code;
+        index = 0;
+        length = source.length;
+        lookahead = null;
+        state = {
+            labelSet: {}
+        };
+
+        return parseTopLevel();
+    }
+
+    global.esprima = {
+        parse: parse
+    };
+})(this);
+
+// 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';
+
+  function prepareBinding(expressionText, name, node, filterRegistry) {
+    var expression;
+    try {
+      expression = getExpression(expressionText);
+      if (expression.scopeIdent &&
+          (node.nodeType !== Node.ELEMENT_NODE ||
+           node.tagName !== 'TEMPLATE' ||
+           (name !== 'bind' && name !== 'repeat'))) {
+        throw Error('as and in can only be used within <template bind/repeat>');
+      }
+    } catch (ex) {
+      console.error('Invalid expression syntax: ' + expressionText, ex);
+      return;
+    }
+
+    return function(model, node, oneTime) {
+      var binding = expression.getBinding(model, filterRegistry, oneTime);
+      if (expression.scopeIdent && binding) {
+        node.polymerExpressionScopeIdent_ = expression.scopeIdent;
+        if (expression.indexIdent)
+          node.polymerExpressionIndexIdent_ = expression.indexIdent;
+      }
+
+      return binding;
+    }
+  }
+
+  // TODO(rafaelw): Implement simple LRU.
+  var expressionParseCache = Object.create(null);
+
+  function getExpression(expressionText) {
+    var expression = expressionParseCache[expressionText];
+    if (!expression) {
+      var delegate = new ASTDelegate();
+      esprima.parse(expressionText, delegate);
+      expression = new Expression(delegate);
+      expressionParseCache[expressionText] = expression;
+    }
+    return expression;
+  }
+
+  function Literal(value) {
+    this.value = value;
+    this.valueFn_ = undefined;
+  }
+
+  Literal.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var value = this.value;
+        this.valueFn_ = function() {
+          return value;
+        }
+      }
+
+      return this.valueFn_;
+    }
+  }
+
+  function IdentPath(name) {
+    this.name = name;
+    this.path = Path.get(name);
+  }
+
+  IdentPath.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var name = this.name;
+        var path = this.path;
+        this.valueFn_ = function(model, observer) {
+          if (observer)
+            observer.addPath(model, path);
+
+          return path.getValueFrom(model);
+        }
+      }
+
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.path.length == 1);
+        model = findScope(model, this.path[0]);
+
+      return this.path.setValueFrom(model, newValue);
+    }
+  };
+
+  function MemberExpression(object, property, accessor) {
+    this.computed = accessor == '[';
+
+    this.dynamicDeps = typeof object == 'function' ||
+                       object.dynamicDeps ||
+                       (this.computed && !(property instanceof Literal));
+
+    this.simplePath =
+        !this.dynamicDeps &&
+        (property instanceof IdentPath || property instanceof Literal) &&
+        (object instanceof MemberExpression || object instanceof IdentPath);
+
+    this.object = this.simplePath ? object : getFn(object);
+    this.property = !this.computed || this.simplePath ?
+        property : getFn(property);
+  }
+
+  MemberExpression.prototype = {
+    get fullPath() {
+      if (!this.fullPath_) {
+
+        var parts = this.object instanceof MemberExpression ?
+            this.object.fullPath.slice() : [this.object.name];
+        parts.push(this.property instanceof IdentPath ?
+            this.property.name : this.property.value);
+        this.fullPath_ = Path.get(parts);
+      }
+
+      return this.fullPath_;
+    },
+
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var object = this.object;
+
+        if (this.simplePath) {
+          var path = this.fullPath;
+
+          this.valueFn_ = function(model, observer) {
+            if (observer)
+              observer.addPath(model, path);
+
+            return path.getValueFrom(model);
+          };
+        } else if (!this.computed) {
+          var path = Path.get(this.property.name);
+
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+
+            if (observer)
+              observer.addPath(context, path);
+
+            return path.getValueFrom(context);
+          }
+        } else {
+          // Computed property.
+          var property = this.property;
+
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+            var propName = property(model, observer, filterRegistry);
+            if (observer)
+              observer.addPath(context, [propName]);
+
+            return context ? context[propName] : undefined;
+          };
+        }
+      }
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.simplePath) {
+        this.fullPath.setValueFrom(model, newValue);
+        return newValue;
+      }
+
+      var object = this.object(model);
+      var propName = this.property instanceof IdentPath ? this.property.name :
+          this.property(model);
+      return object[propName] = newValue;
+    }
+  };
+
+  function Filter(name, args) {
+    this.name = name;
+    this.args = [];
+    for (var i = 0; i < args.length; i++) {
+      this.args[i] = getFn(args[i]);
+    }
+  }
+
+  Filter.prototype = {
+    transform: function(model, observer, filterRegistry, toModelDirection,
+                        initialArgs) {
+      var fn = filterRegistry[this.name];
+      var context = model;
+      if (fn) {
+        context = undefined;
+      } else {
+        fn = context[this.name];
+        if (!fn) {
+          console.error('Cannot find function or filter: ' + this.name);
+          return;
+        }
+      }
+
+      // If toModelDirection is falsey, then the "normal" (dom-bound) direction
+      // is used. Otherwise, it looks for a 'toModel' property function on the
+      // object.
+      if (toModelDirection) {
+        fn = fn.toModel;
+      } else if (typeof fn.toDOM == 'function') {
+        fn = fn.toDOM;
+      }
+
+      if (typeof fn != 'function') {
+        console.error('Cannot find function or filter: ' + this.name);
+        return;
+      }
+
+      var args = initialArgs || [];
+      for (var i = 0; i < this.args.length; i++) {
+        args.push(getFn(this.args[i])(model, observer, filterRegistry));
+      }
+
+      return fn.apply(context, args);
+    }
+  };
+
+  function notImplemented() { throw Error('Not Implemented'); }
+
+  var unaryOperators = {
+    '+': function(v) { return +v; },
+    '-': function(v) { return -v; },
+    '!': function(v) { return !v; }
+  };
+
+  var binaryOperators = {
+    '+': function(l, r) { return l+r; },
+    '-': function(l, r) { return l-r; },
+    '*': function(l, r) { return l*r; },
+    '/': function(l, r) { return l/r; },
+    '%': function(l, r) { return l%r; },
+    '<': function(l, r) { return l<r; },
+    '>': function(l, r) { return l>r; },
+    '<=': function(l, r) { return l<=r; },
+    '>=': function(l, r) { return l>=r; },
+    '==': function(l, r) { return l==r; },
+    '!=': function(l, r) { return l!=r; },
+    '===': function(l, r) { return l===r; },
+    '!==': function(l, r) { return l!==r; },
+    '&&': function(l, r) { return l&&r; },
+    '||': function(l, r) { return l||r; },
+  };
+
+  function getFn(arg) {
+    return typeof arg == 'function' ? arg : arg.valueFn();
+  }
+
+  function ASTDelegate() {
+    this.expression = null;
+    this.filters = [];
+    this.deps = {};
+    this.currentPath = undefined;
+    this.scopeIdent = undefined;
+    this.indexIdent = undefined;
+    this.dynamicDeps = false;
+  }
+
+  ASTDelegate.prototype = {
+    createUnaryExpression: function(op, argument) {
+      if (!unaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      argument = getFn(argument);
+
+      return function(model, observer, filterRegistry) {
+        return unaryOperators[op](argument(model, observer, filterRegistry));
+      };
+    },
+
+    createBinaryExpression: function(op, left, right) {
+      if (!binaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      left = getFn(left);
+      right = getFn(right);
+
+      switch (op) {
+        case '||':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) ||
+                right(model, observer, filterRegistry);
+          };
+        case '&&':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) &&
+                right(model, observer, filterRegistry);
+          };
+      }
+
+      return function(model, observer, filterRegistry) {
+        return binaryOperators[op](left(model, observer, filterRegistry),
+                                   right(model, observer, filterRegistry));
+      };
+    },
+
+    createConditionalExpression: function(test, consequent, alternate) {
+      test = getFn(test);
+      consequent = getFn(consequent);
+      alternate = getFn(alternate);
+
+      this.dynamicDeps = true;
+
+      return function(model, observer, filterRegistry) {
+        return test(model, observer, filterRegistry) ?
+            consequent(model, observer, filterRegistry) :
+            alternate(model, observer, filterRegistry);
+      }
+    },
+
+    createIdentifier: function(name) {
+      var ident = new IdentPath(name);
+      ident.type = 'Identifier';
+      return ident;
+    },
+
+    createMemberExpression: function(accessor, object, property) {
+      var ex = new MemberExpression(object, property, accessor);
+      if (ex.dynamicDeps)
+        this.dynamicDeps = true;
+      return ex;
+    },
+
+    createCallExpression: function(expression, args) {
+      if (!(expression instanceof IdentPath))
+        throw Error('Only identifier function invocations are allowed');
+
+      var filter = new Filter(expression.name, args);
+
+      return function(model, observer, filterRegistry) {
+        return filter.transform(model, observer, filterRegistry, false);
+      };
+    },
+
+    createLiteral: function(token) {
+      return new Literal(token.value);
+    },
+
+    createArrayExpression: function(elements) {
+      for (var i = 0; i < elements.length; i++)
+        elements[i] = getFn(elements[i]);
+
+      return function(model, observer, filterRegistry) {
+        var arr = []
+        for (var i = 0; i < elements.length; i++)
+          arr.push(elements[i](model, observer, filterRegistry));
+        return arr;
+      }
+    },
+
+    createProperty: function(kind, key, value) {
+      return {
+        key: key instanceof IdentPath ? key.name : key.value,
+        value: value
+      };
+    },
+
+    createObjectExpression: function(properties) {
+      for (var i = 0; i < properties.length; i++)
+        properties[i].value = getFn(properties[i].value);
+
+      return function(model, observer, filterRegistry) {
+        var obj = {};
+        for (var i = 0; i < properties.length; i++)
+          obj[properties[i].key] =
+              properties[i].value(model, observer, filterRegistry);
+        return obj;
+      }
+    },
+
+    createFilter: function(name, args) {
+      this.filters.push(new Filter(name, args));
+    },
+
+    createAsExpression: function(expression, scopeIdent) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+    },
+
+    createInExpression: function(scopeIdent, indexIdent, expression) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+      this.indexIdent = indexIdent;
+    },
+
+    createTopLevel: function(expression) {
+      this.expression = expression;
+    },
+
+    createThisExpression: notImplemented
+  }
+
+  function ConstantObservable(value) {
+    this.value_ = value;
+  }
+
+  ConstantObservable.prototype = {
+    open: function() { return this.value_; },
+    discardChanges: function() { return this.value_; },
+    deliver: function() {},
+    close: function() {},
+  }
+
+  function Expression(delegate) {
+    this.scopeIdent = delegate.scopeIdent;
+    this.indexIdent = delegate.indexIdent;
+
+    if (!delegate.expression)
+      throw Error('No expression found.');
+
+    this.expression = delegate.expression;
+    getFn(this.expression); // forces enumeration of path dependencies
+
+    this.filters = delegate.filters;
+    this.dynamicDeps = delegate.dynamicDeps;
+  }
+
+  Expression.prototype = {
+    getBinding: function(model, filterRegistry, oneTime) {
+      if (oneTime)
+        return this.getValue(model, undefined, filterRegistry);
+
+      var observer = new CompoundObserver();
+      // captures deps.
+      var firstValue = this.getValue(model, observer, filterRegistry);
+      var firstTime = true;
+      var self = this;
+
+      function valueFn() {
+        // deps cannot have changed on first value retrieval.
+        if (firstTime) {
+          firstTime = false;
+          return firstValue;
+        }
+
+        if (self.dynamicDeps)
+          observer.startReset();
+
+        var value = self.getValue(model,
+                                  self.dynamicDeps ? observer : undefined,
+                                  filterRegistry);
+        if (self.dynamicDeps)
+          observer.finishReset();
+
+        return value;
+      }
+
+      function setValueFn(newValue) {
+        self.setValue(model, newValue, filterRegistry);
+        return newValue;
+      }
+
+      return new ObserverTransform(observer, valueFn, setValueFn, true);
+    },
+
+    getValue: function(model, observer, filterRegistry) {
+      var value = getFn(this.expression)(model, observer, filterRegistry);
+      for (var i = 0; i < this.filters.length; i++) {
+        value = this.filters[i].transform(model, observer, filterRegistry,
+            false, [value]);
+      }
+
+      return value;
+    },
+
+    setValue: function(model, newValue, filterRegistry) {
+      var count = this.filters ? this.filters.length : 0;
+      while (count-- > 0) {
+        newValue = this.filters[count].transform(model, undefined,
+            filterRegistry, true, [newValue]);
+      }
+
+      if (this.expression.setValue)
+        return this.expression.setValue(model, newValue);
+    }
+  }
+
+  /**
+   * Converts a style property name to a css property name. For example:
+   * "WebkitUserSelect" to "-webkit-user-select"
+   */
+  function convertStylePropertyName(name) {
+    return String(name).replace(/[A-Z]/g, function(c) {
+      return '-' + c.toLowerCase();
+    });
+  }
+
+  var parentScopeName = '@' + Math.random().toString(36).slice(2);
+
+  // Single ident paths must bind directly to the appropriate scope object.
+  // I.e. Pushed values in two-bindings need to be assigned to the actual model
+  // object.
+  function findScope(model, prop) {
+    while (model[parentScopeName] &&
+           !Object.prototype.hasOwnProperty.call(model, prop)) {
+      model = model[parentScopeName];
+    }
+
+    return model;
+  }
+
+  function isLiteralExpression(pathString) {
+    switch (pathString) {
+      case '':
+        return false;
+
+      case 'false':
+      case 'null':
+      case 'true':
+        return true;
+    }
+
+    if (!isNaN(Number(pathString)))
+      return true;
+
+    return false;
+  };
+
+  function PolymerExpressions() {}
+
+  PolymerExpressions.prototype = {
+    // "built-in" filters
+    styleObject: function(value) {
+      var parts = [];
+      for (var key in value) {
+        parts.push(convertStylePropertyName(key) + ': ' + value[key]);
+      }
+      return parts.join('; ');
+    },
+
+    tokenList: function(value) {
+      var tokens = [];
+      for (var key in value) {
+        if (value[key])
+          tokens.push(key);
+      }
+      return tokens.join(' ');
+    },
+
+    // binding delegate API
+    prepareInstancePositionChanged: function(template) {
+      var indexIdent = template.polymerExpressionIndexIdent_;
+      if (!indexIdent)
+        return;
+
+      return function(templateInstance, index) {
+        templateInstance.model[indexIdent] = index;
+      };
+    },
+
+    prepareBinding: function(pathString, name, node) {
+      var path = Path.get(pathString);
+
+      if (!isLiteralExpression(pathString) && path.valid) {
+        if (path.length == 1) {
+          return function(model, node, oneTime) {
+            if (oneTime)
+              return path.getValueFrom(model);
+
+            var scope = findScope(model, path[0]);
+            return new PathObserver(scope, path);
+          };
+        }
+        return; // bail out early if pathString is simple path.
+      }
+
+      return prepareBinding(pathString, name, node, this);
+    },
+
+    prepareInstanceModel: function(template) {
+      var scopeName = template.polymerExpressionScopeIdent_;
+      if (!scopeName)
+        return;
+
+      var parentScope = template.templateInstance ?
+          template.templateInstance.model :
+          template.model;
+
+      var indexName = template.polymerExpressionIndexIdent_;
+
+      return function(model) {
+        return createScopeObject(parentScope, model, scopeName, indexName);
+      };
+    }
+  };
+
+  var createScopeObject = ('__proto__' in {}) ?
+    function(parentScope, model, scopeName, indexName) {
+      var scope = {};
+      scope[scopeName] = model;
+      scope[indexName] = undefined;
+      scope[parentScopeName] = parentScope;
+      scope.__proto__ = parentScope;
+      return scope;
+    } :
+    function(parentScope, model, scopeName, indexName) {
+      var scope = Object.create(parentScope);
+      Object.defineProperty(scope, scopeName,
+          { value: model, configurable: true, writable: true });
+      Object.defineProperty(scope, indexName,
+          { value: undefined, configurable: true, writable: true });
+      Object.defineProperty(scope, parentScopeName,
+          { value: parentScope, configurable: true, writable: true });
+      return scope;
+    };
+
+  global.PolymerExpressions = PolymerExpressions;
+  PolymerExpressions.getExpression = getExpression;
+})(this);
+
+Polymer = {
+  version: '0.5.1'
+};
+
+// TODO(sorvell): this ensures Polymer is an object and not a function
+// Platform is currently defining it as a function to allow for async loading
+// of polymer; once we refine the loading process this likely goes away.
+if (typeof window.Polymer === 'function') {
+  Polymer = {};
+}
+
+
+(function(scope) {
+
+  function withDependencies(task, depends) {
+    depends = depends || [];
+    if (!depends.map) {
+      depends = [depends];
+    }
+    return task.apply(this, depends.map(marshal));
+  }
+
+  function module(name, dependsOrFactory, moduleFactory) {
+    var module;
+    switch (arguments.length) {
+      case 0:
+        return;
+      case 1:
+        module = null;
+        break;
+      case 2:
+        // dependsOrFactory is `factory` in this case
+        module = dependsOrFactory.apply(this);
+        break;
+      default:
+        // dependsOrFactory is `depends` in this case
+        module = withDependencies(moduleFactory, dependsOrFactory);
+        break;
+    }
+    modules[name] = module;
+  };
+
+  function marshal(name) {
+    return modules[name];
+  }
+
+  var modules = {};
+
+  function using(depends, task) {
+    HTMLImports.whenImportsReady(function() {
+      withDependencies(task, depends);
+    });
+  };
+
+  // exports
+
+  scope.marshal = marshal;
+  // `module` confuses commonjs detectors
+  scope.modularize = module;
+  scope.using = using;
+
+})(window);
+
+/*
+	Build only script.
+
+  Ensures scripts needed for basic x-platform compatibility
+  will be run when platform.js is not loaded.
+ */
+if (!window.WebComponents) {
+
+/*
+	On supported platforms, platform.js is not needed. To retain compatibility
+	with the polyfills, we stub out minimal functionality.
+ */
+if (!window.WebComponents) {
+
+  WebComponents = {
+  	flush: function() {},
+    flags: {log: {}}
+  };
+
+  Platform = WebComponents;
+
+  CustomElements = {
+  	useNative: true,
+    ready: true,
+    takeRecords: function() {},
+    instanceof: function(obj, base) {
+      return obj instanceof base;
+    }
+  };
+  
+  HTMLImports = {
+  	useNative: true
+  };
+
+  
+  addEventListener('HTMLImportsLoaded', function() {
+    document.dispatchEvent(
+      new CustomEvent('WebComponentsReady', {bubbles: true})
+    );
+  });
+
+
+  // ShadowDOM
+  ShadowDOMPolyfill = null;
+  wrap = unwrap = function(n){
+    return n;
+  };
+
+}
+
+/*
+  Create polyfill scope and feature detect native support.
+*/
+window.HTMLImports = window.HTMLImports || {flags:{}};
+
+(function(scope) {
+
+/**
+  Basic setup and simple module executer. We collect modules and then execute
+  the code later, only if it's necessary for polyfilling.
+*/
+var IMPORT_LINK_TYPE = 'import';
+var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement('link'));
+
+/**
+  Support `currentScript` on all browsers as `document._currentScript.`
+
+  NOTE: We cannot polyfill `document.currentScript` because it's not possible
+  both to override and maintain the ability to capture the native value.
+  Therefore we choose to expose `_currentScript` both when native imports
+  and the polyfill are in use.
+*/
+// NOTE: ShadowDOMPolyfill intrusion.
+var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
+var wrap = function(node) {
+  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
+};
+var rootDocument = wrap(document);
+
+var currentScriptDescriptor = {
+  get: function() {
+    var script = HTMLImports.currentScript || document.currentScript ||
+        // NOTE: only works when called in synchronously executing code.
+        // readyState should check if `loading` but IE10 is
+        // interactive when scripts run so we cheat.
+        (document.readyState !== 'complete' ?
+        document.scripts[document.scripts.length - 1] : null);
+    return wrap(script);
+  },
+  configurable: true
+};
+
+Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
+Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor);
+
+/**
+  Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`
+  method. This api is necessary because unlike the native implementation,
+  script elements do not force imports to resolve. Instead, users should wrap
+  code in either an `HTMLImportsLoaded` hander or after load time in an
+  `HTMLImports.whenReady(callback)` call.
+
+  NOTE: This module also supports these apis under the native implementation.
+  Therefore, if this file is loaded, the same code can be used under both
+  the polyfill and native implementation.
+ */
+
+var isIE = /Trident/.test(navigator.userAgent);
+
+// call a callback when all HTMLImports in the document at call time
+// (or at least document ready) have loaded.
+// 1. ensure the document is in a ready state (has dom), then
+// 2. watch for loading of imports and call callback when done
+function whenReady(callback, doc) {
+  doc = doc || rootDocument;
+  // if document is loading, wait and try again
+  whenDocumentReady(function() {
+    watchImportsLoad(callback, doc);
+  }, doc);
+}
+
+// call the callback when the document is in a ready state (has dom)
+var requiredReadyState = isIE ? 'complete' : 'interactive';
+var READY_EVENT = 'readystatechange';
+function isDocumentReady(doc) {
+  return (doc.readyState === 'complete' ||
+      doc.readyState === requiredReadyState);
+}
+
+// call <callback> when we ensure the document is in a ready state
+function whenDocumentReady(callback, doc) {
+  if (!isDocumentReady(doc)) {
+    var checkReady = function() {
+      if (doc.readyState === 'complete' ||
+          doc.readyState === requiredReadyState) {
+        doc.removeEventListener(READY_EVENT, checkReady);
+        whenDocumentReady(callback, doc);
+      }
+    };
+    doc.addEventListener(READY_EVENT, checkReady);
+  } else if (callback) {
+    callback();
+  }
+}
+
+function markTargetLoaded(event) {
+  event.target.__loaded = true;
+}
+
+// call <callback> when we ensure all imports have loaded
+function watchImportsLoad(callback, doc) {
+  var imports = doc.querySelectorAll('link[rel=import]');
+  var loaded = 0, l = imports.length;
+  function checkDone(d) {
+    if ((loaded == l) && callback) {
+       callback();
+    }
+  }
+  function loadedImport(e) {
+    markTargetLoaded(e);
+    loaded++;
+    checkDone();
+  }
+  if (l) {
+    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
+      if (isImportLoaded(imp)) {
+        loadedImport.call(imp, {target: imp});
+      } else {
+        imp.addEventListener('load', loadedImport);
+        imp.addEventListener('error', loadedImport);
+      }
+    }
+  } else {
+    checkDone();
+  }
+}
+
+// NOTE: test for native imports loading is based on explicitly watching
+// all imports (see below).
+// However, 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.import && link.import.readyState !== 'loading') :
+      link.__importParsed;
+}
+
+// TODO(sorvell): Workaround for
+// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when
+// this bug is addressed.
+// (1) Install a mutation observer to see when HTMLImports have loaded
+// (2) if this script is run during document load it will watch any existing
+// imports for loading.
+//
+// NOTE: The workaround has restricted functionality: (1) it's only compatible
+// with imports that are added to document.head since the mutation observer
+// watches only head for perf reasons, (2) it requires this script
+// to run before any imports have completed loading.
+if (useNative) {
+  new MutationObserver(function(mxns) {
+    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
+      if (m.addedNodes) {
+        handleImports(m.addedNodes);
+      }
+    }
+  }).observe(document.head, {childList: true});
+
+  function handleImports(nodes) {
+    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+      if (isImport(n)) {
+        handleImport(n);
+      }
+    }
+  }
+
+  function isImport(element) {
+    return element.localName === 'link' && element.rel === 'import';
+  }
+
+  function handleImport(element) {
+    var loaded = element.import;
+    if (loaded) {
+      markTargetLoaded({target: element});
+    } else {
+      element.addEventListener('load', markTargetLoaded);
+      element.addEventListener('error', markTargetLoaded);
+    }
+  }
+
+  // make sure to catch any imports that are in the process of loading
+  // when this script is run.
+  (function() {
+    if (document.readyState === 'loading') {
+      var imports = document.querySelectorAll('link[rel=import]');
+      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {
+        handleImport(imp);
+      }
+    }
+  })();
+
+}
+
+// Fire the 'HTMLImportsLoaded' event when imports in document at load time
+// have loaded. This event is required to simulate the script blocking
+// behavior of native imports. A main document script that needs to be sure
+// imports have loaded should wait for this event.
+whenReady(function() {
+  HTMLImports.ready = true;
+  HTMLImports.readyTime = new Date().getTime();
+  rootDocument.dispatchEvent(
+    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
+  );
+});
+
+// exports
+scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+scope.useNative = useNative;
+scope.rootDocument = rootDocument;
+scope.whenReady = whenReady;
+scope.isIE = isIE;
+
+})(HTMLImports);
+
+(function(scope) {
+
+  // TODO(sorvell): 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.
+  var style = document.createElement('style');
+  style.textContent = ''
+      + 'body {'
+      + 'transition: opacity ease-in 0.2s;' 
+      + ' } \n'
+      + 'body[unresolved] {'
+      + 'opacity: 0; display: block; overflow: hidden;' 
+      + ' } \n'
+      ;
+  var head = document.querySelector('head');
+  head.insertBefore(style, head.firstChild);
+
+})(Platform);
+
+/*
+	Build only script.
+
+  Ensures scripts needed for basic x-platform compatibility
+  will be run when platform.js is not loaded.
+ */
+}
+(function(global) {
+  'use strict';
+
+  var testingExposeCycleCount = global.testingExposeCycleCount;
+
+  // Detect and do basic sanity checking on Object/Array.observe.
+  function detectObjectObserve() {
+    if (typeof Object.observe !== 'function' ||
+        typeof Array.observe !== 'function') {
+      return false;
+    }
+
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
+    }
+
+    var test = {};
+    var arr = [];
+    Object.observe(test, callback);
+    Array.observe(arr, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 5)
+      return false;
+
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
+      return false;
+    }
+
+    Object.unobserve(test, callback);
+    Array.unobserve(arr, callback);
+
+    return true;
+  }
+
+  var hasObserve = detectObjectObserve();
+
+  function detectEval() {
+    // Don't test for eval if we're running in a Chrome App environment.
+    // We check for APIs set that only exist in a Chrome App context.
+    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
+      return false;
+    }
+
+    // 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 (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
+      return false;
+    }
+
+    try {
+      var f = new Function('', 'return true;');
+      return f();
+    } catch (ex) {
+      return false;
+    }
+  }
+
+  var hasEval = detectEval();
+
+  function isIndex(s) {
+    return +s === s >>> 0 && s !== '';
+  }
+
+  function toNumber(s) {
+    return +s;
+  }
+
+  function isObject(obj) {
+    return obj === Object(obj);
+  }
+
+  var numberIsNaN = global.Number.isNaN || function(value) {
+    return typeof value === 'number' && global.isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  var createObject = ('__proto__' in {}) ?
+    function(obj) { return obj; } :
+    function(obj) {
+      var proto = obj.__proto__;
+      if (!proto)
+        return obj;
+      var newObject = Object.create(proto);
+      Object.getOwnPropertyNames(obj).forEach(function(name) {
+        Object.defineProperty(newObject, name,
+                             Object.getOwnPropertyDescriptor(obj, name));
+      });
+      return newObject;
+    };
+
+  var identStart = '[\$_a-zA-Z]';
+  var identPart = '[\$_a-zA-Z0-9]';
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
+
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
+
+    var code = char.charCodeAt(0);
+
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
+
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  var 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']
+    }
+  }
+
+  function noop() {}
+
+  function parsePath(path) {
+    var keys = [];
+    var index = -1;
+    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
+
+    var actions = {
+      push: function() {
+        if (key === undefined)
+          return;
+
+        keys.push(key);
+        key = undefined;
+      },
+
+      append: function() {
+        if (key === undefined)
+          key = newChar
+        else
+          key += newChar;
+      }
+    };
+
+    function maybeUnescapeQuote() {
+      if (index >= path.length)
+        return;
+
+      var nextChar = path[index + 1];
+      if ((mode == 'inSingleQuote' && nextChar == "'") ||
+          (mode == 'inDoubleQuote' && nextChar == '"')) {
+        index++;
+        newChar = nextChar;
+        actions.append();
+        return true;
+      }
+    }
+
+    while (mode) {
+      index++;
+      c = path[index];
+
+      if (c == '\\' && maybeUnescapeQuote(mode))
+        continue;
+
+      type = getPathCharType(c);
+      typeMap = pathStateMachine[mode];
+      transition = typeMap[type] || typeMap['else'] || 'error';
+
+      if (transition == 'error')
+        return; // parse error;
+
+      mode = transition[0];
+      action = actions[transition[1]] || noop;
+      newChar = transition[2] === undefined ? c : transition[2];
+      action();
+
+      if (mode === 'afterPath') {
+        return keys;
+      }
+    }
+
+    return; // parse error
+  }
+
+  function isIdent(s) {
+    return identRegExp.test(s);
+  }
+
+  var constructorIsPrivate = {};
+
+  function Path(parts, privateToken) {
+    if (privateToken !== constructorIsPrivate)
+      throw Error('Use Path.get to retrieve path objects');
+
+    for (var i = 0; i < parts.length; i++) {
+      this.push(String(parts[i]));
+    }
+
+    if (hasEval && this.length) {
+      this.getValueFrom = this.compiledGetValueFromFn();
+    }
+  }
+
+  // TODO(rafaelw): Make simple LRU cache
+  var pathCache = {};
+
+  function getPath(pathString) {
+    if (pathString instanceof Path)
+      return pathString;
+
+    if (pathString == null || pathString.length == 0)
+      pathString = '';
+
+    if (typeof pathString != 'string') {
+      if (isIndex(pathString.length)) {
+        // Constructed with array-like (pre-parsed) keys
+        return new Path(pathString, constructorIsPrivate);
+      }
+
+      pathString = String(pathString);
+    }
+
+    var path = pathCache[pathString];
+    if (path)
+      return path;
+
+    var parts = parsePath(pathString);
+    if (!parts)
+      return invalidPath;
+
+    var path = new Path(parts, constructorIsPrivate);
+    pathCache[pathString] = path;
+    return path;
+  }
+
+  Path.get = getPath;
+
+  function formatAccessor(key) {
+    if (isIndex(key)) {
+      return '[' + key + ']';
+    } else {
+      return '["' + key.replace(/"/g, '\\"') + '"]';
+    }
+  }
+
+  Path.prototype = createObject({
+    __proto__: [],
+    valid: true,
+
+    toString: function() {
+      var pathString = '';
+      for (var i = 0; i < this.length; i++) {
+        var key = this[i];
+        if (isIdent(key)) {
+          pathString += i ? '.' + key : key;
+        } else {
+          pathString += formatAccessor(key);
+        }
+      }
+
+      return pathString;
+    },
+
+    getValueFrom: function(obj, directObserver) {
+      for (var i = 0; i < this.length; i++) {
+        if (obj == null)
+          return;
+        obj = obj[this[i]];
+      }
+      return obj;
+    },
+
+    iterateObjects: function(obj, observe) {
+      for (var i = 0; i < this.length; i++) {
+        if (i)
+          obj = obj[this[i - 1]];
+        if (!isObject(obj))
+          return;
+        observe(obj, this[i]);
+      }
+    },
+
+    compiledGetValueFromFn: function() {
+      var str = '';
+      var pathString = 'obj';
+      str += 'if (obj != null';
+      var i = 0;
+      var key;
+      for (; i < (this.length - 1); i++) {
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+        str += ' &&\n     ' + pathString + ' != null';
+      }
+      str += ')\n';
+
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+
+      str += '  return ' + pathString + ';\nelse\n  return undefined;';
+      return new Function('obj', str);
+    },
+
+    setValueFrom: function(obj, value) {
+      if (!this.length)
+        return false;
+
+      for (var i = 0; i < this.length - 1; i++) {
+        if (!isObject(obj))
+          return false;
+        obj = obj[this[i]];
+      }
+
+      if (!isObject(obj))
+        return false;
+
+      obj[this[i]] = value;
+      return true;
+    }
+  });
+
+  var invalidPath = new Path('', constructorIsPrivate);
+  invalidPath.valid = false;
+  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
+
+  var MAX_DIRTY_CHECK_CYCLES = 1000;
+
+  function dirtyCheck(observer) {
+    var cycles = 0;
+    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
+      cycles++;
+    }
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    return cycles > 0;
+  }
+
+  function objectIsEmpty(object) {
+    for (var prop in object)
+      return false;
+    return true;
+  }
+
+  function diffIsEmpty(diff) {
+    return objectIsEmpty(diff.added) &&
+           objectIsEmpty(diff.removed) &&
+           objectIsEmpty(diff.changed);
+  }
+
+  function diffObjectFromOldObject(object, oldObject) {
+    var added = {};
+    var removed = {};
+    var changed = {};
+
+    for (var prop in oldObject) {
+      var newValue = object[prop];
+
+      if (newValue !== undefined && newValue === oldObject[prop])
+        continue;
+
+      if (!(prop in object)) {
+        removed[prop] = undefined;
+        continue;
+      }
+
+      if (newValue !== oldObject[prop])
+        changed[prop] = newValue;
+    }
+
+    for (var prop in object) {
+      if (prop in oldObject)
+        continue;
+
+      added[prop] = object[prop];
+    }
+
+    if (Array.isArray(object) && object.length !== oldObject.length)
+      changed.length = object.length;
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  var eomTasks = [];
+  function runEOMTasks() {
+    if (!eomTasks.length)
+      return false;
+
+    for (var i = 0; i < eomTasks.length; i++) {
+      eomTasks[i]();
+    }
+    eomTasks.length = 0;
+    return true;
+  }
+
+  var runEOM = hasObserve ? (function(){
+    return function(fn) {
+      return Promise.resolve().then(fn);
+    }
+  })() :
+  (function() {
+    return function(fn) {
+      eomTasks.push(fn);
+    };
+  })();
+
+  var observedObjectCache = [];
+
+  function newObservedObject() {
+    var observer;
+    var object;
+    var discardRecords = false;
+    var first = true;
+
+    function callback(records) {
+      if (observer && observer.state_ === OPENED && !discardRecords)
+        observer.check_(records);
+    }
+
+    return {
+      open: function(obs) {
+        if (observer)
+          throw Error('ObservedObject in use');
+
+        if (!first)
+          Object.deliverChangeRecords(callback);
+
+        observer = obs;
+        first = false;
+      },
+      observe: function(obj, arrayObserve) {
+        object = obj;
+        if (arrayObserve)
+          Array.observe(object, callback);
+        else
+          Object.observe(object, callback);
+      },
+      deliver: function(discard) {
+        discardRecords = discard;
+        Object.deliverChangeRecords(callback);
+        discardRecords = false;
+      },
+      close: function() {
+        observer = undefined;
+        Object.unobserve(object, callback);
+        observedObjectCache.push(this);
+      }
+    };
+  }
+
+  /*
+   * The observedSet abstraction is a perf optimization which reduces the total
+   * number of Object.observe observations of a set of objects. The idea is that
+   * groups of Observers will have some object dependencies in common and this
+   * observed set ensures that each object in the transitive closure of
+   * dependencies is only observed once. The observedSet acts as a write barrier
+   * such that whenever any change comes through, all Observers are checked for
+   * changed values.
+   *
+   * Note that this optimization is explicitly moving work from setup-time to
+   * change-time.
+   *
+   * TODO(rafaelw): Implement "garbage collection". In order to move work off
+   * the critical path, when Observers are closed, their observed objects are
+   * not Object.unobserve(d). As a result, it's possible that if the observedSet
+   * is kept open, but some Observers have been closed, it could cause "leaks"
+   * (prevent otherwise collectable objects from being collected). At some
+   * point, we should implement incremental "gc" which keeps a list of
+   * observedSets which may need clean-up and does small amounts of cleanup on a
+   * timeout until all is clean.
+   */
+
+  function getObservedObject(observer, object, arrayObserve) {
+    var dir = observedObjectCache.pop() || newObservedObject();
+    dir.open(observer);
+    dir.observe(object, arrayObserve);
+    return dir;
+  }
+
+  var observedSetCache = [];
+
+  function newObservedSet() {
+    var observerCount = 0;
+    var observers = [];
+    var objects = [];
+    var rootObj;
+    var rootObjProps;
+
+    function observe(obj, prop) {
+      if (!obj)
+        return;
+
+      if (obj === rootObj)
+        rootObjProps[prop] = true;
+
+      if (objects.indexOf(obj) < 0) {
+        objects.push(obj);
+        Object.observe(obj, callback);
+      }
+
+      observe(Object.getPrototypeOf(obj), prop);
+    }
+
+    function allRootObjNonObservedProps(recs) {
+      for (var i = 0; i < recs.length; i++) {
+        var rec = recs[i];
+        if (rec.object !== rootObj ||
+            rootObjProps[rec.name] ||
+            rec.type === 'setPrototype') {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    function callback(recs) {
+      if (allRootObjNonObservedProps(recs))
+        return;
+
+      var observer;
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.iterateObjects_(observe);
+        }
+      }
+
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.check_();
+        }
+      }
+    }
+
+    var record = {
+      objects: objects,
+      get rootObject() { return rootObj; },
+      set rootObject(value) {
+        rootObj = value;
+        rootObjProps = {};
+      },
+      open: function(obs, object) {
+        observers.push(obs);
+        observerCount++;
+        obs.iterateObjects_(observe);
+      },
+      close: function(obs) {
+        observerCount--;
+        if (observerCount > 0) {
+          return;
+        }
+
+        for (var i = 0; i < objects.length; i++) {
+          Object.unobserve(objects[i], callback);
+          Observer.unobservedCount++;
+        }
+
+        observers.length = 0;
+        objects.length = 0;
+        rootObj = undefined;
+        rootObjProps = undefined;
+        observedSetCache.push(this);
+        if (lastObservedSet === this)
+          lastObservedSet = null;
+      },
+    };
+
+    return record;
+  }
+
+  var lastObservedSet;
+
+  function getObservedSet(observer, obj) {
+    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {
+      lastObservedSet = observedSetCache.pop() || newObservedSet();
+      lastObservedSet.rootObject = obj;
+    }
+    lastObservedSet.open(observer, obj);
+    return lastObservedSet;
+  }
+
+  var UNOPENED = 0;
+  var OPENED = 1;
+  var CLOSED = 2;
+  var RESETTING = 3;
+
+  var nextObserverId = 1;
+
+  function Observer() {
+    this.state_ = UNOPENED;
+    this.callback_ = undefined;
+    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
+    this.directObserver_ = undefined;
+    this.value_ = undefined;
+    this.id_ = nextObserverId++;
+  }
+
+  Observer.prototype = {
+    open: function(callback, target) {
+      if (this.state_ != UNOPENED)
+        throw Error('Observer has already been opened.');
+
+      addToAll(this);
+      this.callback_ = callback;
+      this.target_ = target;
+      this.connect_();
+      this.state_ = OPENED;
+      return this.value_;
+    },
+
+    close: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      removeFromAll(this);
+      this.disconnect_();
+      this.value_ = undefined;
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.state_ = CLOSED;
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      dirtyCheck(this);
+    },
+
+    report_: function(changes) {
+      try {
+        this.callback_.apply(this.target_, changes);
+      } catch (ex) {
+        Observer._errorThrownDuringCallback = true;
+        console.error('Exception caught during observer callback: ' +
+                       (ex.stack || ex));
+      }
+    },
+
+    discardChanges: function() {
+      this.check_(undefined, true);
+      return this.value_;
+    }
+  }
+
+  var collectObservers = !hasObserve;
+  var allObservers;
+  Observer._allObserversCount = 0;
+
+  if (collectObservers) {
+    allObservers = [];
+  }
+
+  function addToAll(observer) {
+    Observer._allObserversCount++;
+    if (!collectObservers)
+      return;
+
+    allObservers.push(observer);
+  }
+
+  function removeFromAll(observer) {
+    Observer._allObserversCount--;
+  }
+
+  var runningMicrotaskCheckpoint = false;
+
+  global.Platform = global.Platform || {};
+
+  global.Platform.performMicrotaskCheckpoint = function() {
+    if (runningMicrotaskCheckpoint)
+      return;
+
+    if (!collectObservers)
+      return;
+
+    runningMicrotaskCheckpoint = true;
+
+    var cycles = 0;
+    var anyChanged, toCheck;
+
+    do {
+      cycles++;
+      toCheck = allObservers;
+      allObservers = [];
+      anyChanged = false;
+
+      for (var i = 0; i < toCheck.length; i++) {
+        var observer = toCheck[i];
+        if (observer.state_ != OPENED)
+          continue;
+
+        if (observer.check_())
+          anyChanged = true;
+
+        allObservers.push(observer);
+      }
+      if (runEOMTasks())
+        anyChanged = true;
+    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
+
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    runningMicrotaskCheckpoint = false;
+  };
+
+  if (collectObservers) {
+    global.Platform.clearObservers = function() {
+      allObservers = [];
+    };
+  }
+
+  function ObjectObserver(object) {
+    Observer.call(this);
+    this.value_ = object;
+    this.oldObject_ = undefined;
+  }
+
+  ObjectObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    arrayObserve: false,
+
+    connect_: function(callback, target) {
+      if (hasObserve) {
+        this.directObserver_ = getObservedObject(this, this.value_,
+                                                 this.arrayObserve);
+      } else {
+        this.oldObject_ = this.copyObject(this.value_);
+      }
+
+    },
+
+    copyObject: function(object) {
+      var copy = Array.isArray(object) ? [] : {};
+      for (var prop in object) {
+        copy[prop] = object[prop];
+      };
+      if (Array.isArray(object))
+        copy.length = object.length;
+      return copy;
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var diff;
+      var oldValues;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+
+        oldValues = {};
+        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
+                                           oldValues);
+      } else {
+        oldValues = this.oldObject_;
+        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
+      }
+
+      if (diffIsEmpty(diff))
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([
+        diff.added || {},
+        diff.removed || {},
+        diff.changed || {},
+        function(property) {
+          return oldValues[property];
+        }
+      ]);
+
+      return true;
+    },
+
+    disconnect_: function() {
+      if (hasObserve) {
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+      } else {
+        this.oldObject_ = undefined;
+      }
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      if (hasObserve)
+        this.directObserver_.deliver(false);
+      else
+        dirtyCheck(this);
+    },
+
+    discardChanges: function() {
+      if (this.directObserver_)
+        this.directObserver_.deliver(true);
+      else
+        this.oldObject_ = this.copyObject(this.value_);
+
+      return this.value_;
+    }
+  });
+
+  function ArrayObserver(array) {
+    if (!Array.isArray(array))
+      throw Error('Provided object is not an Array');
+    ObjectObserver.call(this, array);
+  }
+
+  ArrayObserver.prototype = createObject({
+
+    __proto__: ObjectObserver.prototype,
+
+    arrayObserve: true,
+
+    copyObject: function(arr) {
+      return arr.slice();
+    },
+
+    check_: function(changeRecords) {
+      var splices;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+        splices = projectArraySplices(this.value_, changeRecords);
+      } else {
+        splices = calcSplices(this.value_, 0, this.value_.length,
+                              this.oldObject_, 0, this.oldObject_.length);
+      }
+
+      if (!splices || !splices.length)
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([splices]);
+      return true;
+    }
+  });
+
+  ArrayObserver.applySplices = function(previous, current, splices) {
+    splices.forEach(function(splice) {
+      var spliceArgs = [splice.index, splice.removed.length];
+      var addIndex = splice.index;
+      while (addIndex < splice.index + splice.addedCount) {
+        spliceArgs.push(current[addIndex]);
+        addIndex++;
+      }
+
+      Array.prototype.splice.apply(previous, spliceArgs);
+    });
+  };
+
+  function PathObserver(object, path) {
+    Observer.call(this);
+
+    this.object_ = object;
+    this.path_ = getPath(path);
+    this.directObserver_ = undefined;
+  }
+
+  PathObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    get path() {
+      return this.path_;
+    },
+
+    connect_: function() {
+      if (hasObserve)
+        this.directObserver_ = getObservedSet(this, this.object_);
+
+      this.check_(undefined, true);
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    iterateObjects_: function(observe) {
+      this.path_.iterateObjects(this.object_, observe);
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValue = this.value_;
+      this.value_ = this.path_.getValueFrom(this.object_);
+      if (skipChanges || areSameValue(this.value_, oldValue))
+        return false;
+
+      this.report_([this.value_, oldValue, this]);
+      return true;
+    },
+
+    setValue: function(newValue) {
+      if (this.path_)
+        this.path_.setValueFrom(this.object_, newValue);
+    }
+  });
+
+  function CompoundObserver(reportChangesOnOpen) {
+    Observer.call(this);
+
+    this.reportChangesOnOpen_ = reportChangesOnOpen;
+    this.value_ = [];
+    this.directObserver_ = undefined;
+    this.observed_ = [];
+  }
+
+  var observerSentinel = {};
+
+  CompoundObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      if (hasObserve) {
+        var object;
+        var needsDirectObserver = false;
+        for (var i = 0; i < this.observed_.length; i += 2) {
+          object = this.observed_[i]
+          if (object !== observerSentinel) {
+            needsDirectObserver = true;
+            break;
+          }
+        }
+
+        if (needsDirectObserver)
+          this.directObserver_ = getObservedSet(this, object);
+      }
+
+      this.check_(undefined, !this.reportChangesOnOpen_);
+    },
+
+    disconnect_: function() {
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        if (this.observed_[i] === observerSentinel)
+          this.observed_[i + 1].close();
+      }
+      this.observed_.length = 0;
+      this.value_.length = 0;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    addPath: function(object, path) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add paths once started.');
+
+      var path = getPath(path);
+      this.observed_.push(object, path);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = path.getValueFrom(object);
+    },
+
+    addObserver: function(observer) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add observers once started.');
+
+      this.observed_.push(observerSentinel, observer);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = observer.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');
+      this.state_ = OPENED;
+      this.connect_();
+
+      return this.value_;
+    },
+
+    iterateObjects_: function(observe) {
+      var object;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel)
+          this.observed_[i + 1].iterateObjects(object, observe)
+      }
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValues;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        var object = this.observed_[i];
+        var path = this.observed_[i+1];
+        var value;
+        if (object === observerSentinel) {
+          var observable = path;
+          value = this.state_ === UNOPENED ?
+              observable.open(this.deliver, this) :
+              observable.discardChanges();
+        } else {
+          value = path.getValueFrom(object);
+        }
+
+        if (skipChanges) {
+          this.value_[i / 2] = value;
+          continue;
+        }
+
+        if (areSameValue(value, this.value_[i / 2]))
+          continue;
+
+        oldValues = oldValues || [];
+        oldValues[i / 2] = this.value_[i / 2];
+        this.value_[i / 2] = value;
+      }
+
+      if (!oldValues)
+        return false;
+
+      // TODO(rafaelw): Having observed_ as the third callback arg here is
+      // pretty lame API. Fix.
+      this.report_([this.value_, oldValues, this.observed_]);
+      return true;
+    }
+  });
+
+  function identFn(value) { return value; }
+
+  function ObserverTransform(observable, getValueFn, setValueFn,
+                             dontPassThroughSet) {
+    this.callback_ = undefined;
+    this.target_ = undefined;
+    this.value_ = undefined;
+    this.observable_ = observable;
+    this.getValueFn_ = getValueFn || identFn;
+    this.setValueFn_ = setValueFn || identFn;
+    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
+    // at the moment because of a bug in it's dependency tracking.
+    this.dontPassThroughSet_ = dontPassThroughSet;
+  }
+
+  ObserverTransform.prototype = {
+    open: function(callback, target) {
+      this.callback_ = callback;
+      this.target_ = target;
+      this.value_ =
+          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
+      return this.value_;
+    },
+
+    observedCallback_: function(value) {
+      value = this.getValueFn_(value);
+      if (areSameValue(value, this.value_))
+        return;
+      var oldValue = this.value_;
+      this.value_ = value;
+      this.callback_.call(this.target_, this.value_, oldValue);
+    },
+
+    discardChanges: function() {
+      this.value_ = this.getValueFn_(this.observable_.discardChanges());
+      return this.value_;
+    },
+
+    deliver: function() {
+      return this.observable_.deliver();
+    },
+
+    setValue: function(value) {
+      value = this.setValueFn_(value);
+      if (!this.dontPassThroughSet_ && this.observable_.setValue)
+        return this.observable_.setValue(value);
+    },
+
+    close: function() {
+      if (this.observable_)
+        this.observable_.close();
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.observable_ = undefined;
+      this.value_ = undefined;
+      this.getValueFn_ = undefined;
+      this.setValueFn_ = undefined;
+    }
+  }
+
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
+
+  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
+    var added = {};
+    var removed = {};
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      if (!expectedRecordTypes[record.type]) {
+        console.error('Unknown changeRecord type: ' + record.type);
+        console.error(record);
+        continue;
+      }
+
+      if (!(record.name in oldValues))
+        oldValues[record.name] = record.oldValue;
+
+      if (record.type == 'update')
+        continue;
+
+      if (record.type == 'add') {
+        if (record.name in removed)
+          delete removed[record.name];
+        else
+          added[record.name] = true;
+
+        continue;
+      }
+
+      // type = 'delete'
+      if (record.name in added) {
+        delete added[record.name];
+        delete oldValues[record.name];
+      } else {
+        removed[record.name] = true;
+      }
+    }
+
+    for (var prop in added)
+      added[prop] = object[prop];
+
+    for (var prop in removed)
+      removed[prop] = undefined;
+
+    var changed = {};
+    for (var prop in oldValues) {
+      if (prop in added || prop in removed)
+        continue;
+
+      var newValue = object[prop];
+      if (oldValues[prop] !== newValue)
+        changed[prop] = newValue;
+    }
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  function newSplice(index, removed, addedCount) {
+    return {
+      index: index,
+      removed: removed,
+      addedCount: addedCount
+    };
+  }
+
+  var EDIT_LEAVE = 0;
+  var EDIT_UPDATE = 1;
+  var EDIT_ADD = 2;
+  var EDIT_DELETE = 3;
+
+  function ArraySplice() {}
+
+  ArraySplice.prototype = {
+
+    // Note: This function is *based* on the computation of the Levenshtein
+    // "edit" distance. The one change is that "updates" are treated as two
+    // edits - not one. With Array splices, an update is really a delete
+    // followed by an add. By retaining this, we optimize for "keeping" the
+    // maximum array items in the original array. For example:
+    //
+    //   'xxxx123' -> '123yyyy'
+    //
+    // With 1-edit updates, the shortest path would be just to update all seven
+    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+    // leaves the substring '123' intact.
+    calcEditDistances: function(current, currentStart, currentEnd,
+                                old, oldStart, oldEnd) {
+      // "Deletion" columns
+      var rowCount = oldEnd - oldStart + 1;
+      var columnCount = currentEnd - currentStart + 1;
+      var distances = new Array(rowCount);
+
+      // "Addition" rows. Initialize null column.
+      for (var i = 0; i < rowCount; i++) {
+        distances[i] = new Array(columnCount);
+        distances[i][0] = i;
+      }
+
+      // Initialize null row
+      for (var j = 0; j < columnCount; j++)
+        distances[0][j] = j;
+
+      for (var i = 1; i < rowCount; i++) {
+        for (var j = 1; j < columnCount; j++) {
+          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+            distances[i][j] = distances[i - 1][j - 1];
+          else {
+            var north = distances[i - 1][j] + 1;
+            var west = distances[i][j - 1] + 1;
+            distances[i][j] = north < west ? north : west;
+          }
+        }
+      }
+
+      return distances;
+    },
+
+    // This starts at the final weight, and walks "backward" by finding
+    // the minimum previous weight recursively until the origin of the weight
+    // matrix.
+    spliceOperationsFromEditDistances: function(distances) {
+      var i = distances.length - 1;
+      var j = distances[0].length - 1;
+      var current = distances[i][j];
+      var edits = [];
+      while (i > 0 || j > 0) {
+        if (i == 0) {
+          edits.push(EDIT_ADD);
+          j--;
+          continue;
+        }
+        if (j == 0) {
+          edits.push(EDIT_DELETE);
+          i--;
+          continue;
+        }
+        var northWest = distances[i - 1][j - 1];
+        var west = distances[i - 1][j];
+        var north = distances[i][j - 1];
+
+        var min;
+        if (west < north)
+          min = west < northWest ? west : northWest;
+        else
+          min = north < northWest ? north : northWest;
+
+        if (min == northWest) {
+          if (northWest == current) {
+            edits.push(EDIT_LEAVE);
+          } else {
+            edits.push(EDIT_UPDATE);
+            current = northWest;
+          }
+          i--;
+          j--;
+        } else if (min == west) {
+          edits.push(EDIT_DELETE);
+          i--;
+          current = west;
+        } else {
+          edits.push(EDIT_ADD);
+          j--;
+          current = north;
+        }
+      }
+
+      edits.reverse();
+      return edits;
+    },
+
+    /**
+     * Splice Projection functions:
+     *
+     * A splice map is a representation of how a previous array of items
+     * was transformed into a new array of items. Conceptually it is a list of
+     * tuples of
+     *
+     *   <index, removed, addedCount>
+     *
+     * which are kept in ascending index order of. The tuple represents that at
+     * the |index|, |removed| sequence of items were removed, and counting forward
+     * from |index|, |addedCount| items were added.
+     */
+
+    /**
+     * Lacking individual splice mutation information, the minimal set of
+     * splices can be synthesized given the previous state and final state of an
+     * array. The basic approach is to calculate the edit distance matrix and
+     * choose the shortest path through it.
+     *
+     * Complexity: O(l * p)
+     *   l: The length of the current array
+     *   p: The length of the old array
+     */
+    calcSplices: function(current, currentStart, currentEnd,
+                          old, oldStart, oldEnd) {
+      var prefixCount = 0;
+      var suffixCount = 0;
+
+      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+      if (currentStart == 0 && oldStart == 0)
+        prefixCount = this.sharedPrefix(current, old, minLength);
+
+      if (currentEnd == current.length && oldEnd == old.length)
+        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+
+      currentStart += prefixCount;
+      oldStart += prefixCount;
+      currentEnd -= suffixCount;
+      oldEnd -= suffixCount;
+
+      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+        return [];
+
+      if (currentStart == currentEnd) {
+        var splice = newSplice(currentStart, [], 0);
+        while (oldStart < oldEnd)
+          splice.removed.push(old[oldStart++]);
+
+        return [ splice ];
+      } else if (oldStart == oldEnd)
+        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+      var ops = this.spliceOperationsFromEditDistances(
+          this.calcEditDistances(current, currentStart, currentEnd,
+                                 old, oldStart, oldEnd));
+
+      var splice = undefined;
+      var splices = [];
+      var index = currentStart;
+      var oldIndex = oldStart;
+      for (var i = 0; i < ops.length; i++) {
+        switch(ops[i]) {
+          case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+
+            index++;
+            oldIndex++;
+            break;
+          case EDIT_UPDATE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          case EDIT_ADD:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+            break;
+          case EDIT_DELETE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+        }
+      }
+
+      if (splice) {
+        splices.push(splice);
+      }
+      return splices;
+    },
+
+    sharedPrefix: function(current, old, searchLength) {
+      for (var i = 0; i < searchLength; i++)
+        if (!this.equals(current[i], old[i]))
+          return i;
+      return searchLength;
+    },
+
+    sharedSuffix: function(current, old, searchLength) {
+      var index1 = current.length;
+      var index2 = old.length;
+      var count = 0;
+      while (count < searchLength && this.equals(current[--index1], old[--index2]))
+        count++;
+
+      return count;
+    },
+
+    calculateSplices: function(current, previous) {
+      return this.calcSplices(current, 0, current.length, previous, 0,
+                              previous.length);
+    },
+
+    equals: function(currentValue, previousValue) {
+      return currentValue === previousValue;
+    }
+  };
+
+  var arraySplice = new ArraySplice();
+
+  function calcSplices(current, currentStart, currentEnd,
+                       old, oldStart, oldEnd) {
+    return arraySplice.calcSplices(current, currentStart, currentEnd,
+                                   old, oldStart, oldEnd);
+  }
+
+  function intersect(start1, end1, start2, end2) {
+    // Disjoint
+    if (end1 < start2 || end2 < start1)
+      return -1;
+
+    // Adjacent
+    if (end1 == start2 || end2 == start1)
+      return 0;
+
+    // Non-zero intersect, span1 first
+    if (start1 < start2) {
+      if (end1 < end2)
+        return end1 - start2; // Overlap
+      else
+        return end2 - start2; // Contained
+    } else {
+      // Non-zero intersect, span2 first
+      if (end2 < end1)
+        return end2 - start1; // Overlap
+      else
+        return end1 - start1; // Contained
+    }
+  }
+
+  function mergeSplice(splices, index, removed, addedCount) {
+
+    var splice = newSplice(index, removed, addedCount);
+
+    var inserted = false;
+    var insertionOffset = 0;
+
+    for (var i = 0; i < splices.length; i++) {
+      var current = splices[i];
+      current.index += insertionOffset;
+
+      if (inserted)
+        continue;
+
+      var intersectCount = intersect(splice.index,
+                                     splice.index + splice.removed.length,
+                                     current.index,
+                                     current.index + current.addedCount);
+
+      if (intersectCount >= 0) {
+        // Merge the two splices
+
+        splices.splice(i, 1);
+        i--;
+
+        insertionOffset -= current.addedCount - current.removed.length;
+
+        splice.addedCount += current.addedCount - intersectCount;
+        var deleteCount = splice.removed.length +
+                          current.removed.length - intersectCount;
+
+        if (!splice.addedCount && !deleteCount) {
+          // merged splice is a noop. discard.
+          inserted = true;
+        } else {
+          var removed = current.removed;
+
+          if (splice.index < current.index) {
+            // some prefix of splice.removed is prepended to current.removed.
+            var prepend = splice.removed.slice(0, current.index - splice.index);
+            Array.prototype.push.apply(prepend, removed);
+            removed = prepend;
+          }
+
+          if (splice.index + splice.removed.length > current.index + current.addedCount) {
+            // some suffix of splice.removed is appended to current.removed.
+            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
+            Array.prototype.push.apply(removed, append);
+          }
+
+          splice.removed = removed;
+          if (current.index < splice.index) {
+            splice.index = current.index;
+          }
+        }
+      } else if (splice.index < current.index) {
+        // Insert splice here.
+
+        inserted = true;
+
+        splices.splice(i, 0, splice);
+        i++;
+
+        var offset = splice.addedCount - splice.removed.length
+        current.index += offset;
+        insertionOffset += offset;
+      }
+    }
+
+    if (!inserted)
+      splices.push(splice);
+  }
+
+  function createInitialSplices(array, changeRecords) {
+    var splices = [];
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      switch(record.type) {
+        case 'splice':
+          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
+          break;
+        case 'add':
+        case 'update':
+        case 'delete':
+          if (!isIndex(record.name))
+            continue;
+          var index = toNumber(record.name);
+          if (index < 0)
+            continue;
+          mergeSplice(splices, index, [record.oldValue], 1);
+          break;
+        default:
+          console.error('Unexpected record type: ' + JSON.stringify(record));
+          break;
+      }
+    }
+
+    return splices;
+  }
+
+  function projectArraySplices(array, changeRecords) {
+    var splices = [];
+
+    createInitialSplices(array, changeRecords).forEach(function(splice) {
+      if (splice.addedCount == 1 && splice.removed.length == 1) {
+        if (splice.removed[0] !== array[splice.index])
+          splices.push(splice);
+
+        return
+      };
+
+      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
+                                           splice.removed, 0, splice.removed.length));
+    });
+
+    return splices;
+  }
+
+  // Export the observe-js object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, export as a global object.
+
+  var expose = global;
+
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      expose = exports = module.exports;
+    }
+    expose = exports;
+  } 
+
+  expose.Observer = Observer;
+  expose.Observer.runEOM_ = runEOM;
+  expose.Observer.observerSentinel_ = observerSentinel; // for testing.
+  expose.Observer.hasObjectObserve = hasObserve;
+  expose.ArrayObserver = ArrayObserver;
+  expose.ArrayObserver.calculateSplices = function(current, previous) {
+    return arraySplice.calculateSplices(current, previous);
+  };
+
+  expose.ArraySplice = ArraySplice;
+  expose.ObjectObserver = ObjectObserver;
+  expose.PathObserver = PathObserver;
+  expose.CompoundObserver = CompoundObserver;
+  expose.Path = Path;
+  expose.ObserverTransform = ObserverTransform;
+  
+})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
+
+// 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';
+
+  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
+
+  function getTreeScope(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+
+    return typeof node.getElementById === 'function' ? node : null;
+  }
+
+  Node.prototype.bind = function(name, observable) {
+    console.error('Unhandled binding to Node: ', this, name, observable);
+  };
+
+  Node.prototype.bindFinished = function() {};
+
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
+
+    if (bindings[name])
+      binding[name].close();
+
+    return bindings[name] = binding;
+  }
+
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
+
+  function sanitizeValue(value) {
+    return value == null ? '' : value;
+  }
+
+  function updateText(node, value) {
+    node.data = sanitizeValue(value);
+  }
+
+  function textBinding(node) {
+    return function(value) {
+      return updateText(node, value);
+    };
+  }
+
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
+  Text.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'textContent')
+      return Node.prototype.bind.call(this, name, value, oneTime);
+
+    if (oneTime)
+      return updateText(this, value);
+
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
+  }
+
+  function updateAttribute(el, name, conditional, value) {
+    if (conditional) {
+      if (value)
+        el.setAttribute(name, '');
+      else
+        el.removeAttribute(name);
+      return;
+    }
+
+    el.setAttribute(name, sanitizeValue(value));
+  }
+
+  function attributeBinding(el, name, conditional) {
+    return function(value) {
+      updateAttribute(el, name, conditional, value);
+    };
+  }
+
+  Element.prototype.bind = function(name, value, oneTime) {
+    var conditional = name[name.length - 1] == '?';
+    if (conditional) {
+      this.removeAttribute(name);
+      name = name.slice(0, -1);
+    }
+
+    if (oneTime)
+      return updateAttribute(this, name, conditional, value);
+
+
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
+  };
+
+  var checkboxEventType;
+  (function() {
+    // Attempt to feature-detect which event (change or click) is fired first
+    // for checkboxes.
+    var div = document.createElement('div');
+    var checkbox = div.appendChild(document.createElement('input'));
+    checkbox.setAttribute('type', 'checkbox');
+    var first;
+    var count = 0;
+    checkbox.addEventListener('click', function(e) {
+      count++;
+      first = first || 'click';
+    });
+    checkbox.addEventListener('change', function() {
+      count++;
+      first = first || 'change';
+    });
+
+    var event = document.createEvent('MouseEvent');
+    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    checkbox.dispatchEvent(event);
+    // WebKit/Blink don't fire the change event if the element is outside the
+    // document, so assume 'change' for that case.
+    checkboxEventType = count == 1 ? 'change' : first;
+  })();
+
+  function getEventForInputType(element) {
+    switch (element.type) {
+      case 'checkbox':
+        return checkboxEventType;
+      case 'radio':
+      case 'select-multiple':
+      case 'select-one':
+        return 'change';
+      case 'range':
+        if (/Trident|MSIE/.test(navigator.userAgent))
+          return 'change';
+      default:
+        return 'input';
+    }
+  }
+
+  function updateInput(input, property, value, santizeFn) {
+    input[property] = (santizeFn || sanitizeValue)(value);
+  }
+
+  function inputBinding(input, property, santizeFn) {
+    return function(value) {
+      return updateInput(input, property, value, santizeFn);
+    }
+  }
+
+  function noop() {}
+
+  function bindInputEvent(input, property, observable, postEventFn) {
+    var eventType = getEventForInputType(input);
+
+    function eventHandler() {
+      observable.setValue(input[property]);
+      observable.discardChanges();
+      (postEventFn || noop)(input);
+      Platform.performMicrotaskCheckpoint();
+    }
+    input.addEventListener(eventType, eventHandler);
+
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
+
+      observable_: observable
+    }
+  }
+
+  function booleanSanitize(value) {
+    return Boolean(value);
+  }
+
+  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
+  // Returns an array containing all radio buttons other than |element| that
+  // have the same |name|, either in the form that |element| belongs to or,
+  // if no form, in the document tree to which |element| belongs.
+  //
+  // This implementation is based upon the HTML spec definition of a
+  // "radio button group":
+  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
+  //
+  function getAssociatedRadioButtons(element) {
+    if (element.form) {
+      return filter(element.form.elements, function(el) {
+        return el != element &&
+            el.tagName == 'INPUT' &&
+            el.type == 'radio' &&
+            el.name == element.name;
+      });
+    } else {
+      var treeScope = getTreeScope(element);
+      if (!treeScope)
+        return [];
+      var radios = treeScope.querySelectorAll(
+          'input[type="radio"][name="' + element.name + '"]');
+      return filter(radios, function(el) {
+        return el != element && !el.form;
+      });
+    }
+  }
+
+  function checkedPostEvent(input) {
+    // Only the radio button that is getting checked gets an event. We
+    // therefore find all the associated radio buttons and update their
+    // check binding manually.
+    if (input.tagName === 'INPUT' &&
+        input.type === 'radio') {
+      getAssociatedRadioButtons(input).forEach(function(radio) {
+        var checkedBinding = radio.bindings_.checked;
+        if (checkedBinding) {
+          // Set the value directly to avoid an infinite call stack.
+          checkedBinding.observable_.setValue(false);
+        }
+      });
+    }
+  }
+
+  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value' && name !== 'checked')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
+    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
+
+    if (oneTime)
+      return updateInput(this, name, value, sanitizeFn);
+
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name, sanitizeFn)),
+                sanitizeFn);
+
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
+  }
+
+  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateInput(this, 'value', value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateInput(this, 'value',
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  function updateOption(option, value) {
+    var parentNode = option.parentNode;;
+    var select;
+    var selectBinding;
+    var oldValue;
+    if (parentNode instanceof HTMLSelectElement &&
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
+      select = parentNode;
+      selectBinding = select.bindings_.value;
+      oldValue = select.value;
+    }
+
+    option.value = sanitizeValue(value);
+
+    if (select && select.value != oldValue) {
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
+      Platform.performMicrotaskCheckpoint();
+    }
+  }
+
+  function optionBinding(option) {
+    return function(value) {
+      updateOption(option, value);
+    }
+  }
+
+  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateOption(this, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
+    if (name === 'selectedindex')
+      name = 'selectedIndex';
+
+    if (name !== 'selectedIndex' && name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+
+    if (oneTime)
+      return updateInput(this, name, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
+  }
+})(this);
+
+// 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';
+
+  function assert(v) {
+    if (!v)
+      throw new Error('Assertion failed');
+  }
+
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+  function getFragmentRoot(node) {
+    var p;
+    while (p = node.parentNode) {
+      node = p;
+    }
+
+    return node;
+  }
+
+  function searchRefId(node, id) {
+    if (!id)
+      return;
+
+    var ref;
+    var selector = '#' + id;
+    while (!ref) {
+      node = getFragmentRoot(node);
+
+      if (node.protoContent_)
+        ref = node.protoContent_.querySelector(selector);
+      else if (node.getElementById)
+        ref = node.getElementById(id);
+
+      if (ref || !node.templateCreator_)
+        break
+
+      node = node.templateCreator_;
+    }
+
+    return ref;
+  }
+
+  function getInstanceRoot(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+    return node.templateCreator_ ? node : null;
+  }
+
+  var Map;
+  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
+    Map = global.Map;
+  } else {
+    Map = function() {
+      this.keys = [];
+      this.values = [];
+    };
+
+    Map.prototype = {
+      set: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0) {
+          this.keys.push(key);
+          this.values.push(value);
+        } else {
+          this.values[index] = value;
+        }
+      },
+
+      get: function(key) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return;
+
+        return this.values[index];
+      },
+
+      delete: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return false;
+
+        this.keys.splice(index, 1);
+        this.values.splice(index, 1);
+        return true;
+      },
+
+      forEach: function(f, opt_this) {
+        for (var i = 0; i < this.keys.length; i++)
+          f.call(opt_this || this, this.values[i], this.keys[i], this);
+      }
+    };
+  }
+
+  // JScript does not have __proto__. We wrap all object literals with
+  // createObject which uses Object.create, Object.defineProperty and
+  // Object.getOwnPropertyDescriptor to create a new object that does the exact
+  // same thing. The main downside to this solution is that we have to extract
+  // all those property descriptors for IE.
+  var createObject = ('__proto__' in {}) ?
+      function(obj) { return obj; } :
+      function(obj) {
+        var proto = obj.__proto__;
+        if (!proto)
+          return obj;
+        var newObject = Object.create(proto);
+        Object.getOwnPropertyNames(obj).forEach(function(name) {
+          Object.defineProperty(newObject, name,
+                               Object.getOwnPropertyDescriptor(obj, name));
+        });
+        return newObject;
+      };
+
+  // IE does not support have Document.prototype.contains.
+  if (typeof document.contains != 'function') {
+    Document.prototype.contains = function(node) {
+      if (node === this || node.parentNode === this)
+        return true;
+      return this.documentElement.contains(node);
+    }
+  }
+
+  var BIND = 'bind';
+  var REPEAT = 'repeat';
+  var IF = 'if';
+
+  var templateAttributeDirectives = {
+    'template': true,
+    'repeat': true,
+    'bind': true,
+    'ref': true
+  };
+
+  var semanticTemplateElements = {
+    'THEAD': true,
+    'TBODY': true,
+    'TFOOT': true,
+    'TH': true,
+    'TR': true,
+    'TD': true,
+    'COLGROUP': true,
+    'COL': true,
+    'CAPTION': true,
+    'OPTION': true,
+    'OPTGROUP': true
+  };
+
+  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
+  if (hasTemplateElement) {
+    // TODO(rafaelw): Remove when fix for
+    // https://codereview.chromium.org/164803002/
+    // makes it to Chrome release.
+    (function() {
+      var t = document.createElement('template');
+      var d = t.content.ownerDocument;
+      var html = d.appendChild(d.createElement('html'));
+      var head = html.appendChild(d.createElement('head'));
+      var base = d.createElement('base');
+      base.href = document.baseURI;
+      head.appendChild(base);
+    })();
+  }
+
+  var allTemplatesSelectors = 'template, ' +
+      Object.keys(semanticTemplateElements).map(function(tagName) {
+        return tagName.toLowerCase() + '[template]';
+      }).join(', ');
+
+  function isSVGTemplate(el) {
+    return el.tagName == 'template' &&
+           el.namespaceURI == 'http://www.w3.org/2000/svg';
+  }
+
+  function isHTMLTemplate(el) {
+    return el.tagName == 'TEMPLATE' &&
+           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
+  }
+
+  function isAttributeTemplate(el) {
+    return Boolean(semanticTemplateElements[el.tagName] &&
+                   el.hasAttribute('template'));
+  }
+
+  function isTemplate(el) {
+    if (el.isTemplate_ === undefined)
+      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
+
+    return el.isTemplate_;
+  }
+
+  // FIXME: Observe templates being added/removed from documents
+  // FIXME: Expose imperative API to decorate and observe templates in
+  // "disconnected tress" (e.g. ShadowRoot)
+  document.addEventListener('DOMContentLoaded', function(e) {
+    bootstrapTemplatesRecursivelyFrom(document);
+    // FIXME: Is this needed? Seems like it shouldn't be.
+    Platform.performMicrotaskCheckpoint();
+  }, false);
+
+  function forAllTemplatesFrom(node, fn) {
+    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
+
+    if (isTemplate(node))
+      fn(node)
+    forEach(subTemplates, fn);
+  }
+
+  function bootstrapTemplatesRecursivelyFrom(node) {
+    function bootstrap(template) {
+      if (!HTMLTemplateElement.decorate(template))
+        bootstrapTemplatesRecursivelyFrom(template.content);
+    }
+
+    forAllTemplatesFrom(node, bootstrap);
+  }
+
+  if (!hasTemplateElement) {
+    /**
+     * This represents a <template> element.
+     * @constructor
+     * @extends {HTMLElement}
+     */
+    global.HTMLTemplateElement = function() {
+      throw TypeError('Illegal constructor');
+    };
+  }
+
+  var hasProto = '__proto__' in {};
+
+  function mixin(to, from) {
+    Object.getOwnPropertyNames(from).forEach(function(name) {
+      Object.defineProperty(to, name,
+                            Object.getOwnPropertyDescriptor(from, name));
+    });
+  }
+
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
+  function getOrCreateTemplateContentsOwner(template) {
+    var doc = template.ownerDocument
+    if (!doc.defaultView)
+      return doc;
+    var d = doc.templateContentsOwner_;
+    if (!d) {
+      // TODO(arv): This should either be a Document or HTMLDocument depending
+      // on doc.
+      d = doc.implementation.createHTMLDocument('');
+      while (d.lastChild) {
+        d.removeChild(d.lastChild);
+      }
+      doc.templateContentsOwner_ = d;
+    }
+    return d;
+  }
+
+  function getTemplateStagingDocument(template) {
+    if (!template.stagingDocument_) {
+      var owner = template.ownerDocument;
+      if (!owner.stagingDocument_) {
+        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
+        owner.stagingDocument_.isStagingDocument = true;
+        // TODO(rafaelw): Remove when fix for
+        // https://codereview.chromium.org/164803002/
+        // makes it to Chrome release.
+        var base = owner.stagingDocument_.createElement('base');
+        base.href = document.baseURI;
+        owner.stagingDocument_.head.appendChild(base);
+
+        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
+      }
+
+      template.stagingDocument_ = owner.stagingDocument_;
+    }
+
+    return template.stagingDocument_;
+  }
+
+  // For non-template browsers, the parser will disallow <template> in certain
+  // locations, so we allow "attribute templates" which combine the template
+  // element with the top-level container node of the content, e.g.
+  //
+  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
+  //
+  // becomes
+  //
+  //   <template repeat="{{ foo }}">
+  //   + #document-fragment
+  //     + <tr class="bar">
+  //       + <td>Bar</td>
+  //
+  function extractTemplateFromAttributeTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      if (templateAttributeDirectives[attrib.name]) {
+        if (attrib.name !== 'template')
+          template.setAttribute(attrib.name, attrib.value);
+        el.removeAttribute(attrib.name);
+      }
+    }
+
+    return template;
+  }
+
+  function extractTemplateFromSVGTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      template.setAttribute(attrib.name, attrib.value);
+      el.removeAttribute(attrib.name);
+    }
+
+    el.parentNode.removeChild(el);
+    return template;
+  }
+
+  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
+    var content = template.content;
+    if (useRoot) {
+      content.appendChild(el);
+      return;
+    }
+
+    var child;
+    while (child = el.firstChild) {
+      content.appendChild(child);
+    }
+  }
+
+  var templateObserver;
+  if (typeof MutationObserver == 'function') {
+    templateObserver = new MutationObserver(function(records) {
+      for (var i = 0; i < records.length; i++) {
+        records[i].target.refChanged_();
+      }
+    });
+  }
+
+  /**
+   * Ensures proper API and content model for template elements.
+   * @param {HTMLTemplateElement} opt_instanceRef The template element which
+   *     |el| template element will return as the value of its ref(), and whose
+   *     content will be used as source when createInstance() is invoked.
+   */
+  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
+    if (el.templateIsDecorated_)
+      return false;
+
+    var templateElement = el;
+    templateElement.templateIsDecorated_ = true;
+
+    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
+                               hasTemplateElement;
+    var bootstrapContents = isNativeHTMLTemplate;
+    var liftContents = !isNativeHTMLTemplate;
+    var liftRoot = false;
+
+    if (!isNativeHTMLTemplate) {
+      if (isAttributeTemplate(templateElement)) {
+        assert(!opt_instanceRef);
+        templateElement = extractTemplateFromAttributeTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+        liftRoot = true;
+      } else if (isSVGTemplate(templateElement)) {
+        templateElement = extractTemplateFromSVGTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+      }
+    }
+
+    if (!isNativeHTMLTemplate) {
+      fixTemplateElementPrototype(templateElement);
+      var doc = getOrCreateTemplateContentsOwner(templateElement);
+      templateElement.content_ = doc.createDocumentFragment();
+    }
+
+    if (opt_instanceRef) {
+      // template is contained within an instance, its direct content must be
+      // empty
+      templateElement.instanceRef_ = opt_instanceRef;
+    } else if (liftContents) {
+      liftNonNativeTemplateChildrenIntoContent(templateElement,
+                                               el,
+                                               liftRoot);
+    } else if (bootstrapContents) {
+      bootstrapTemplatesRecursivelyFrom(templateElement.content);
+    }
+
+    return true;
+  };
+
+  // TODO(rafaelw): This used to decorate recursively all templates from a given
+  // node. This happens by default on 'DOMContentLoaded', but may be needed
+  // in subtrees not descendent from document (e.g. ShadowRoot).
+  // Review whether this is the right public API.
+  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
+
+  var htmlElement = global.HTMLUnknownElement || HTMLElement;
+
+  var contentDescriptor = {
+    get: function() {
+      return this.content_;
+    },
+    enumerable: true,
+    configurable: true
+  };
+
+  if (!hasTemplateElement) {
+    // Gecko is more picky with the prototype than WebKit. Make sure to use the
+    // same prototype as created in the constructor.
+    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
+
+    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
+                          contentDescriptor);
+  }
+
+  function fixTemplateElementPrototype(el) {
+    if (hasProto)
+      el.__proto__ = HTMLTemplateElement.prototype;
+    else
+      mixin(el, HTMLTemplateElement.prototype);
+  }
+
+  function ensureSetModelScheduled(template) {
+    if (!template.setModelFn_) {
+      template.setModelFn_ = function() {
+        template.setModelFnScheduled_ = false;
+        var map = getBindings(template,
+            template.delegate_ && template.delegate_.prepareBinding);
+        processBindings(template, map, template.model_);
+      };
+    }
+
+    if (!template.setModelFnScheduled_) {
+      template.setModelFnScheduled_ = true;
+      Observer.runEOM_(template.setModelFn_);
+    }
+  }
+
+  mixin(HTMLTemplateElement.prototype, {
+    bind: function(name, value, oneTime) {
+      if (name != 'ref')
+        return Element.prototype.bind.call(this, name, value, oneTime);
+
+      var self = this;
+      var ref = oneTime ? value : value.open(function(ref) {
+        self.setAttribute('ref', ref);
+        self.refChanged_();
+      });
+
+      this.setAttribute('ref', ref);
+      this.refChanged_();
+      if (oneTime)
+        return;
+
+      if (!this.bindings_) {
+        this.bindings_ = { ref: value };
+      } else {
+        this.bindings_.ref = value;
+      }
+
+      return value;
+    },
+
+    processBindingDirectives_: function(directives) {
+      if (this.iterator_)
+        this.iterator_.closeDeps();
+
+      if (!directives.if && !directives.bind && !directives.repeat) {
+        if (this.iterator_) {
+          this.iterator_.close();
+          this.iterator_ = undefined;
+        }
+
+        return;
+      }
+
+      if (!this.iterator_) {
+        this.iterator_ = new TemplateIterator(this);
+      }
+
+      this.iterator_.updateDependencies(directives, this.model_);
+
+      if (templateObserver) {
+        templateObserver.observe(this, { attributes: true,
+                                         attributeFilter: ['ref'] });
+      }
+
+      return this.iterator_;
+    },
+
+    createInstance: function(model, bindingDelegate, delegate_) {
+      if (bindingDelegate)
+        delegate_ = this.newDelegate_(bindingDelegate);
+      else if (!delegate_)
+        delegate_ = this.delegate_;
+
+      if (!this.refContent_)
+        this.refContent_ = this.ref_.content;
+      var content = this.refContent_;
+      if (content.firstChild === null)
+        return emptyInstance;
+
+      var map = getInstanceBindingMap(content, delegate_);
+      var stagingDocument = getTemplateStagingDocument(this);
+      var instance = stagingDocument.createDocumentFragment();
+      instance.templateCreator_ = this;
+      instance.protoContent_ = content;
+      instance.bindings_ = [];
+      instance.terminator_ = null;
+      var instanceRecord = instance.templateInstance_ = {
+        firstNode: null,
+        lastNode: null,
+        model: model
+      };
+
+      var i = 0;
+      var collectTerminator = false;
+      for (var child = content.firstChild; child; child = child.nextSibling) {
+        // The terminator of the instance is the clone of the last child of the
+        // content. If the last child is an active template, it may produce
+        // instances as a result of production, so simply collecting the last
+        // child of the instance after it has finished producing may be wrong.
+        if (child.nextSibling === null)
+          collectTerminator = true;
+
+        var clone = cloneAndBindInstance(child, instance, stagingDocument,
+                                         map.children[i++],
+                                         model,
+                                         delegate_,
+                                         instance.bindings_);
+        clone.templateInstance_ = instanceRecord;
+        if (collectTerminator)
+          instance.terminator_ = clone;
+      }
+
+      instanceRecord.firstNode = instance.firstChild;
+      instanceRecord.lastNode = instance.lastChild;
+      instance.templateCreator_ = undefined;
+      instance.protoContent_ = undefined;
+      return instance;
+    },
+
+    get model() {
+      return this.model_;
+    },
+
+    set model(model) {
+      this.model_ = model;
+      ensureSetModelScheduled(this);
+    },
+
+    get bindingDelegate() {
+      return this.delegate_ && this.delegate_.raw;
+    },
+
+    refChanged_: function() {
+      if (!this.iterator_ || this.refContent_ === this.ref_.content)
+        return;
+
+      this.refContent_ = undefined;
+      this.iterator_.valueChanged();
+      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
+    },
+
+    clear: function() {
+      this.model_ = undefined;
+      this.delegate_ = undefined;
+      if (this.bindings_ && this.bindings_.ref)
+        this.bindings_.ref.close()
+      this.refContent_ = undefined;
+      if (!this.iterator_)
+        return;
+      this.iterator_.valueChanged();
+      this.iterator_.close()
+      this.iterator_ = undefined;
+    },
+
+    setDelegate_: function(delegate) {
+      this.delegate_ = delegate;
+      this.bindingMap_ = undefined;
+      if (this.iterator_) {
+        this.iterator_.instancePositionChangedFn_ = undefined;
+        this.iterator_.instanceModelFn_ = undefined;
+      }
+    },
+
+    newDelegate_: function(bindingDelegate) {
+      if (!bindingDelegate)
+        return;
+
+      function delegateFn(name) {
+        var fn = bindingDelegate && bindingDelegate[name];
+        if (typeof fn != 'function')
+          return;
+
+        return function() {
+          return fn.apply(bindingDelegate, arguments);
+        };
+      }
+
+      return {
+        bindingMaps: {},
+        raw: bindingDelegate,
+        prepareBinding: delegateFn('prepareBinding'),
+        prepareInstanceModel: delegateFn('prepareInstanceModel'),
+        prepareInstancePositionChanged:
+            delegateFn('prepareInstancePositionChanged')
+      };
+    },
+
+    set bindingDelegate(bindingDelegate) {
+      if (this.delegate_) {
+        throw Error('Template must be cleared before a new bindingDelegate ' +
+                    'can be assigned');
+      }
+
+      this.setDelegate_(this.newDelegate_(bindingDelegate));
+    },
+
+    get ref_() {
+      var ref = searchRefId(this, this.getAttribute('ref'));
+      if (!ref)
+        ref = this.instanceRef_;
+
+      if (!ref)
+        return this;
+
+      var nextRef = ref.ref_;
+      return nextRef ? nextRef : ref;
+    }
+  });
+
+  // Returns
+  //   a) undefined if there are no mustaches.
+  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
+  function parseMustaches(s, name, node, prepareBindingFn) {
+    if (!s || !s.length)
+      return;
+
+    var tokens;
+    var length = s.length;
+    var startIndex = 0, lastIndex = 0, endIndex = 0;
+    var onlyOneTime = true;
+    while (lastIndex < length) {
+      var startIndex = s.indexOf('{{', lastIndex);
+      var oneTimeStart = s.indexOf('[[', lastIndex);
+      var oneTime = false;
+      var terminator = '}}';
+
+      if (oneTimeStart >= 0 &&
+          (startIndex < 0 || oneTimeStart < startIndex)) {
+        startIndex = oneTimeStart;
+        oneTime = true;
+        terminator = ']]';
+      }
+
+      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
+
+      if (endIndex < 0) {
+        if (!tokens)
+          return;
+
+        tokens.push(s.slice(lastIndex)); // TEXT
+        break;
+      }
+
+      tokens = tokens || [];
+      tokens.push(s.slice(lastIndex, startIndex)); // TEXT
+      var pathString = s.slice(startIndex + 2, endIndex).trim();
+      tokens.push(oneTime); // ONE_TIME?
+      onlyOneTime = onlyOneTime && oneTime;
+      var delegateFn = prepareBindingFn &&
+                       prepareBindingFn(pathString, name, node);
+      // Don't try to parse the expression if there's a prepareBinding function
+      if (delegateFn == null) {
+        tokens.push(Path.get(pathString)); // PATH
+      } else {
+        tokens.push(null);
+      }
+      tokens.push(delegateFn); // DELEGATE_FN
+      lastIndex = endIndex + 2;
+    }
+
+    if (lastIndex === length)
+      tokens.push(''); // TEXT
+
+    tokens.hasOnePath = tokens.length === 5;
+    tokens.isSimplePath = tokens.hasOnePath &&
+                          tokens[0] == '' &&
+                          tokens[4] == '';
+    tokens.onlyOneTime = onlyOneTime;
+
+    tokens.combinator = function(values) {
+      var newValue = tokens[0];
+
+      for (var i = 1; i < tokens.length; i += 4) {
+        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];
+        if (value !== undefined)
+          newValue += value;
+        newValue += tokens[i + 3];
+      }
+
+      return newValue;
+    }
+
+    return tokens;
+  };
+
+  function processOneTimeBinding(name, tokens, node, model) {
+    if (tokens.hasOnePath) {
+      var delegateFn = tokens[3];
+      var value = delegateFn ? delegateFn(model, node, true) :
+                               tokens[2].getValueFrom(model);
+      return tokens.isSimplePath ? value : tokens.combinator(value);
+    }
+
+    var values = [];
+    for (var i = 1; i < tokens.length; i += 4) {
+      var delegateFn = tokens[i + 2];
+      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :
+          tokens[i + 1].getValueFrom(model);
+    }
+
+    return tokens.combinator(values);
+  }
+
+  function processSinglePathBinding(name, tokens, node, model) {
+    var delegateFn = tokens[3];
+    var observer = delegateFn ? delegateFn(model, node, false) :
+        new PathObserver(model, tokens[2]);
+
+    return tokens.isSimplePath ? observer :
+        new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBinding(name, tokens, node, model) {
+    if (tokens.onlyOneTime)
+      return processOneTimeBinding(name, tokens, node, model);
+
+    if (tokens.hasOnePath)
+      return processSinglePathBinding(name, tokens, node, model);
+
+    var observer = new CompoundObserver();
+
+    for (var i = 1; i < tokens.length; i += 4) {
+      var oneTime = tokens[i];
+      var delegateFn = tokens[i + 2];
+
+      if (delegateFn) {
+        var value = delegateFn(model, node, oneTime);
+        if (oneTime)
+          observer.addPath(value)
+        else
+          observer.addObserver(value);
+        continue;
+      }
+
+      var path = tokens[i + 1];
+      if (oneTime)
+        observer.addPath(path.getValueFrom(model))
+      else
+        observer.addPath(model, path);
+    }
+
+    return new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBindings(node, bindings, model, instanceBindings) {
+    for (var i = 0; i < bindings.length; i += 2) {
+      var name = bindings[i]
+      var tokens = bindings[i + 1];
+      var value = processBinding(name, tokens, node, model);
+      var binding = node.bind(name, value, tokens.onlyOneTime);
+      if (binding && instanceBindings)
+        instanceBindings.push(binding);
+    }
+
+    node.bindFinished();
+    if (!bindings.isTemplate)
+      return;
+
+    node.model_ = model;
+    var iter = node.processBindingDirectives_(bindings);
+    if (instanceBindings && iter)
+      instanceBindings.push(iter);
+  }
+
+  function parseWithDefault(el, name, prepareBindingFn) {
+    var v = el.getAttribute(name);
+    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
+  }
+
+  function parseAttributeBindings(element, prepareBindingFn) {
+    assert(element);
+
+    var bindings = [];
+    var ifFound = false;
+    var bindFound = false;
+
+    for (var i = 0; i < element.attributes.length; i++) {
+      var attr = element.attributes[i];
+      var name = attr.name;
+      var value = attr.value;
+
+      // Allow bindings expressed in attributes to be prefixed with underbars.
+      // We do this to allow correct semantics for browsers that don't implement
+      // <template> where certain attributes might trigger side-effects -- and
+      // for IE which sanitizes certain attributes, disallowing mustache
+      // replacements in their text.
+      while (name[0] === '_') {
+        name = name.substring(1);
+      }
+
+      if (isTemplate(element) &&
+          (name === IF || name === BIND || name === REPEAT)) {
+        continue;
+      }
+
+      var tokens = parseMustaches(value, name, element,
+                                  prepareBindingFn);
+      if (!tokens)
+        continue;
+
+      bindings.push(name, tokens);
+    }
+
+    if (isTemplate(element)) {
+      bindings.isTemplate = true;
+      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
+      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
+      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
+
+      if (bindings.if && !bindings.bind && !bindings.repeat)
+        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
+    }
+
+    return bindings;
+  }
+
+  function getBindings(node, prepareBindingFn) {
+    if (node.nodeType === Node.ELEMENT_NODE)
+      return parseAttributeBindings(node, prepareBindingFn);
+
+    if (node.nodeType === Node.TEXT_NODE) {
+      var tokens = parseMustaches(node.data, 'textContent', node,
+                                  prepareBindingFn);
+      if (tokens)
+        return ['textContent', tokens];
+    }
+
+    return [];
+  }
+
+  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
+                                delegate,
+                                instanceBindings,
+                                instanceRecord) {
+    var clone = parent.appendChild(stagingDocument.importNode(node, false));
+
+    var i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      cloneAndBindInstance(child, clone, stagingDocument,
+                            bindings.children[i++],
+                            model,
+                            delegate,
+                            instanceBindings);
+    }
+
+    if (bindings.isTemplate) {
+      HTMLTemplateElement.decorate(clone, node);
+      if (delegate)
+        clone.setDelegate_(delegate);
+    }
+
+    processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  }
+
+  function createInstanceBindingMap(node, prepareBindingFn) {
+    var map = getBindings(node, prepareBindingFn);
+    map.children = {};
+    var index = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
+    }
+
+    return map;
+  }
+
+  var contentUidCounter = 1;
+
+  // TODO(rafaelw): Setup a MutationObserver on content which clears the id
+  // so that bindingMaps regenerate when the template.content changes.
+  function getContentUid(content) {
+    var id = content.id_;
+    if (!id)
+      id = content.id_ = contentUidCounter++;
+    return id;
+  }
+
+  // Each delegate is associated with a set of bindingMaps, one for each
+  // content which may be used by a template. The intent is that each binding
+  // delegate gets the opportunity to prepare the instance (via the prepare*
+  // delegate calls) once across all uses.
+  // TODO(rafaelw): Separate out the parse map from the binding map. In the
+  // current implementation, if two delegates need a binding map for the same
+  // content, the second will have to reparse.
+  function getInstanceBindingMap(content, delegate_) {
+    var contentId = getContentUid(content);
+    if (delegate_) {
+      var map = delegate_.bindingMaps[contentId];
+      if (!map) {
+        map = delegate_.bindingMaps[contentId] =
+            createInstanceBindingMap(content, delegate_.prepareBinding) || [];
+      }
+      return map;
+    }
+
+    var map = content.bindingMap_;
+    if (!map) {
+      map = content.bindingMap_ =
+          createInstanceBindingMap(content, undefined) || [];
+    }
+    return map;
+  }
+
+  Object.defineProperty(Node.prototype, 'templateInstance', {
+    get: function() {
+      var instance = this.templateInstance_;
+      return instance ? instance :
+          (this.parentNode ? this.parentNode.templateInstance : undefined);
+    }
+  });
+
+  var emptyInstance = document.createDocumentFragment();
+  emptyInstance.bindings_ = [];
+  emptyInstance.terminator_ = null;
+
+  function TemplateIterator(templateElement) {
+    this.closed = false;
+    this.templateElement_ = templateElement;
+    this.instances = [];
+    this.deps = undefined;
+    this.iteratedValue = [];
+    this.presentValue = undefined;
+    this.arrayObserver = undefined;
+  }
+
+  TemplateIterator.prototype = {
+    closeDeps: function() {
+      var deps = this.deps;
+      if (deps) {
+        if (deps.ifOneTime === false)
+          deps.ifValue.close();
+        if (deps.oneTime === false)
+          deps.value.close();
+      }
+    },
+
+    updateDependencies: function(directives, model) {
+      this.closeDeps();
+
+      var deps = this.deps = {};
+      var template = this.templateElement_;
+
+      var ifValue = true;
+      if (directives.if) {
+        deps.hasIf = true;
+        deps.ifOneTime = directives.if.onlyOneTime;
+        deps.ifValue = processBinding(IF, directives.if, template, model);
+
+        ifValue = deps.ifValue;
+
+        // oneTime if & predicate is false. nothing else to do.
+        if (deps.ifOneTime && !ifValue) {
+          this.valueChanged();
+          return;
+        }
+
+        if (!deps.ifOneTime)
+          ifValue = ifValue.open(this.updateIfValue, this);
+      }
+
+      if (directives.repeat) {
+        deps.repeat = true;
+        deps.oneTime = directives.repeat.onlyOneTime;
+        deps.value = processBinding(REPEAT, directives.repeat, template, model);
+      } else {
+        deps.repeat = false;
+        deps.oneTime = directives.bind.onlyOneTime;
+        deps.value = processBinding(BIND, directives.bind, template, model);
+      }
+
+      var value = deps.value;
+      if (!deps.oneTime)
+        value = value.open(this.updateIteratedValue, this);
+
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(value);
+    },
+
+    /**
+     * Gets the updated value of the bind/repeat. This can potentially call
+     * user code (if a bindingDelegate is set up) so we try to avoid it if we
+     * already have the value in hand (from Observer.open).
+     */
+    getUpdatedValue: function() {
+      var value = this.deps.value;
+      if (!this.deps.oneTime)
+        value = value.discardChanges();
+      return value;
+    },
+
+    updateIfValue: function(ifValue) {
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(this.getUpdatedValue());
+    },
+
+    updateIteratedValue: function(value) {
+      if (this.deps.hasIf) {
+        var ifValue = this.deps.ifValue;
+        if (!this.deps.ifOneTime)
+          ifValue = ifValue.discardChanges();
+        if (!ifValue) {
+          this.valueChanged();
+          return;
+        }
+      }
+
+      this.updateValue(value);
+    },
+
+    updateValue: function(value) {
+      if (!this.deps.repeat)
+        value = [value];
+      var observe = this.deps.repeat &&
+                    !this.deps.oneTime &&
+                    Array.isArray(value);
+      this.valueChanged(value, observe);
+    },
+
+    valueChanged: function(value, observeValue) {
+      if (!Array.isArray(value))
+        value = [];
+
+      if (value === this.iteratedValue)
+        return;
+
+      this.unobserve();
+      this.presentValue = value;
+      if (observeValue) {
+        this.arrayObserver = new ArrayObserver(this.presentValue);
+        this.arrayObserver.open(this.handleSplices, this);
+      }
+
+      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
+                                                        this.iteratedValue));
+    },
+
+    getLastInstanceNode: function(index) {
+      if (index == -1)
+        return this.templateElement_;
+      var instance = this.instances[index];
+      var terminator = instance.terminator_;
+      if (!terminator)
+        return this.getLastInstanceNode(index - 1);
+
+      if (terminator.nodeType !== Node.ELEMENT_NODE ||
+          this.templateElement_ === terminator) {
+        return terminator;
+      }
+
+      var subtemplateIterator = terminator.iterator_;
+      if (!subtemplateIterator)
+        return terminator;
+
+      return subtemplateIterator.getLastTemplateNode();
+    },
+
+    getLastTemplateNode: function() {
+      return this.getLastInstanceNode(this.instances.length - 1);
+    },
+
+    insertInstanceAt: function(index, fragment) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var parent = this.templateElement_.parentNode;
+      this.instances.splice(index, 0, fragment);
+
+      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
+    },
+
+    extractInstanceAt: function(index) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var lastNode = this.getLastInstanceNode(index);
+      var parent = this.templateElement_.parentNode;
+      var instance = this.instances.splice(index, 1)[0];
+
+      while (lastNode !== previousInstanceLast) {
+        var node = previousInstanceLast.nextSibling;
+        if (node == lastNode)
+          lastNode = previousInstanceLast;
+
+        instance.appendChild(parent.removeChild(node));
+      }
+
+      return instance;
+    },
+
+    getDelegateFn: function(fn) {
+      fn = fn && fn(this.templateElement_);
+      return typeof fn === 'function' ? fn : null;
+    },
+
+    handleSplices: function(splices) {
+      if (this.closed || !splices.length)
+        return;
+
+      var template = this.templateElement_;
+
+      if (!template.parentNode) {
+        this.close();
+        return;
+      }
+
+      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
+                                 splices);
+
+      var delegate = template.delegate_;
+      if (this.instanceModelFn_ === undefined) {
+        this.instanceModelFn_ =
+            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
+      }
+
+      if (this.instancePositionChangedFn_ === undefined) {
+        this.instancePositionChangedFn_ =
+            this.getDelegateFn(delegate &&
+                               delegate.prepareInstancePositionChanged);
+      }
+
+      // Instance Removals
+      var instanceCache = new Map;
+      var removeDelta = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var removed = splice.removed;
+        for (var j = 0; j < removed.length; j++) {
+          var model = removed[j];
+          var instance = this.extractInstanceAt(splice.index + removeDelta);
+          if (instance !== emptyInstance) {
+            instanceCache.set(model, instance);
+          }
+        }
+
+        removeDelta -= splice.addedCount;
+      }
+
+      // Instance Insertions
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var addIndex = splice.index;
+        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
+          var model = this.iteratedValue[addIndex];
+          var instance = instanceCache.get(model);
+          if (instance) {
+            instanceCache.delete(model);
+          } else {
+            if (this.instanceModelFn_) {
+              model = this.instanceModelFn_(model);
+            }
+
+            if (model === undefined) {
+              instance = emptyInstance;
+            } else {
+              instance = template.createInstance(model, undefined, delegate);
+            }
+          }
+
+          this.insertInstanceAt(addIndex, instance);
+        }
+      }
+
+      instanceCache.forEach(function(instance) {
+        this.closeInstanceBindings(instance);
+      }, this);
+
+      if (this.instancePositionChangedFn_)
+        this.reportInstancesMoved(splices);
+    },
+
+    reportInstanceMoved: function(index) {
+      var instance = this.instances[index];
+      if (instance === emptyInstance)
+        return;
+
+      this.instancePositionChangedFn_(instance.templateInstance_, index);
+    },
+
+    reportInstancesMoved: function(splices) {
+      var index = 0;
+      var offset = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        if (offset != 0) {
+          while (index < splice.index) {
+            this.reportInstanceMoved(index);
+            index++;
+          }
+        } else {
+          index = splice.index;
+        }
+
+        while (index < splice.index + splice.addedCount) {
+          this.reportInstanceMoved(index);
+          index++;
+        }
+
+        offset += splice.addedCount - splice.removed.length;
+      }
+
+      if (offset == 0)
+        return;
+
+      var length = this.instances.length;
+      while (index < length) {
+        this.reportInstanceMoved(index);
+        index++;
+      }
+    },
+
+    closeInstanceBindings: function(instance) {
+      var bindings = instance.bindings_;
+      for (var i = 0; i < bindings.length; i++) {
+        bindings[i].close();
+      }
+    },
+
+    unobserve: function() {
+      if (!this.arrayObserver)
+        return;
+
+      this.arrayObserver.close();
+      this.arrayObserver = undefined;
+    },
+
+    close: function() {
+      if (this.closed)
+        return;
+      this.unobserve();
+      for (var i = 0; i < this.instances.length; i++) {
+        this.closeInstanceBindings(this.instances[i]);
+      }
+
+      this.instances.length = 0;
+      this.closeDeps();
+      this.templateElement_.iterator_ = undefined;
+      this.closed = true;
+    }
+  };
+
+  // Polyfill-specific API.
+  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
+})(this);
+
+(function(scope) {
+  'use strict';
+
+  // feature detect for URL constructor
+  var hasWorkingUrl = false;
+  if (!scope.forceJURL) {
+    try {
+      var u = new URL('b', 'http://a');
+      hasWorkingUrl = u.href === 'http://a/b';
+    } catch(e) {}
+  }
+
+  if (hasWorkingUrl)
+    return;
+
+  var relative = Object.create(null);
+  relative['ftp'] = 21;
+  relative['file'] = 0;
+  relative['gopher'] = 70;
+  relative['http'] = 80;
+  relative['https'] = 443;
+  relative['ws'] = 80;
+  relative['wss'] = 443;
+
+  var relativePathDotMapping = Object.create(null);
+  relativePathDotMapping['%2e'] = '.';
+  relativePathDotMapping['.%2e'] = '..';
+  relativePathDotMapping['%2e.'] = '..';
+  relativePathDotMapping['%2e%2e'] = '..';
+
+  function isRelativeScheme(scheme) {
+    return relative[scheme] !== undefined;
+  }
+
+  function invalid() {
+    clear.call(this);
+    this._isInvalid = true;
+  }
+
+  function IDNAToASCII(h) {
+    if ('' == h) {
+      invalid.call(this)
+    }
+    // XXX
+    return h.toLowerCase()
+  }
+
+  function percentEscape(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ? `
+       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  function percentEscapeQuery(c) {
+    // XXX This actually needs to encode c using encoding and then
+    // convert the bytes one-by-one.
+
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ` (do not escape '?')
+       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  var EOF = undefined,
+      ALPHA = /[a-zA-Z]/,
+      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
+
+  function parse(input, stateOverride, base) {
+    function err(message) {
+      errors.push(message)
+    }
+
+    var state = stateOverride || 'scheme start',
+        cursor = 0,
+        buffer = '',
+        seenAt = false,
+        seenBracket = false,
+        errors = [];
+
+    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
+      var c = input[cursor];
+      switch (state) {
+        case 'scheme start':
+          if (c && ALPHA.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+            state = 'scheme';
+          } else if (!stateOverride) {
+            buffer = '';
+            state = 'no scheme';
+            continue;
+          } else {
+            err('Invalid scheme.');
+            break loop;
+          }
+          break;
+
+        case 'scheme':
+          if (c && ALPHANUMERIC.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+          } else if (':' == c) {
+            this._scheme = buffer;
+            buffer = '';
+            if (stateOverride) {
+              break loop;
+            }
+            if (isRelativeScheme(this._scheme)) {
+              this._isRelative = true;
+            }
+            if ('file' == this._scheme) {
+              state = 'relative';
+            } else if (this._isRelative && base && base._scheme == this._scheme) {
+              state = 'relative or authority';
+            } else if (this._isRelative) {
+              state = 'authority first slash';
+            } else {
+              state = 'scheme data';
+            }
+          } else if (!stateOverride) {
+            buffer = '';
+            cursor = 0;
+            state = 'no scheme';
+            continue;
+          } else if (EOF == c) {
+            break loop;
+          } else {
+            err('Code point not allowed in scheme: ' + c)
+            break loop;
+          }
+          break;
+
+        case 'scheme data':
+          if ('?' == c) {
+            query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            // XXX error handling
+            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+              this._schemeData += percentEscape(c);
+            }
+          }
+          break;
+
+        case 'no scheme':
+          if (!base || !(isRelativeScheme(base._scheme))) {
+            err('Missing scheme.');
+            invalid.call(this);
+          } else {
+            state = 'relative';
+            continue;
+          }
+          break;
+
+        case 'relative or authority':
+          if ('/' == c && '/' == input[cursor+1]) {
+            state = 'authority ignore slashes';
+          } else {
+            err('Expected /, got: ' + c);
+            state = 'relative';
+            continue
+          }
+          break;
+
+        case 'relative':
+          this._isRelative = true;
+          if ('file' != this._scheme)
+            this._scheme = base._scheme;
+          if (EOF == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            break loop;
+          } else if ('/' == c || '\\' == c) {
+            if ('\\' == c)
+              err('\\ is an invalid code point.');
+            state = 'relative slash';
+          } else if ('?' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            var nextC = input[cursor+1]
+            var nextNextC = input[cursor+2]
+            if (
+              'file' != this._scheme || !ALPHA.test(c) ||
+              (nextC != ':' && nextC != '|') ||
+              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {
+              this._host = base._host;
+              this._port = base._port;
+              this._path = base._path.slice();
+              this._path.pop();
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'relative slash':
+          if ('/' == c || '\\' == c) {
+            if ('\\' == c) {
+              err('\\ is an invalid code point.');
+            }
+            if ('file' == this._scheme) {
+              state = 'file host';
+            } else {
+              state = 'authority ignore slashes';
+            }
+          } else {
+            if ('file' != this._scheme) {
+              this._host = base._host;
+              this._port = base._port;
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'authority first slash':
+          if ('/' == c) {
+            state = 'authority second slash';
+          } else {
+            err("Expected '/', got: " + c);
+            state = 'authority ignore slashes';
+            continue;
+          }
+          break;
+
+        case 'authority second slash':
+          state = 'authority ignore slashes';
+          if ('/' != c) {
+            err("Expected '/', got: " + c);
+            continue;
+          }
+          break;
+
+        case 'authority ignore slashes':
+          if ('/' != c && '\\' != c) {
+            state = 'authority';
+            continue;
+          } else {
+            err('Expected authority, got: ' + c);
+          }
+          break;
+
+        case 'authority':
+          if ('@' == c) {
+            if (seenAt) {
+              err('@ already seen.');
+              buffer += '%40';
+            }
+            seenAt = true;
+            for (var i = 0; i < buffer.length; i++) {
+              var cp = buffer[i];
+              if ('\t' == cp || '\n' == cp || '\r' == cp) {
+                err('Invalid whitespace in authority.');
+                continue;
+              }
+              // XXX check URL code points
+              if (':' == cp && null === this._password) {
+                this._password = '';
+                continue;
+              }
+              var tempC = percentEscape(cp);
+              (null !== this._password) ? this._password += tempC : this._username += tempC;
+            }
+            buffer = '';
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            cursor -= buffer.length;
+            buffer = '';
+            state = 'host';
+            continue;
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'file host':
+          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
+              state = 'relative path';
+            } else if (buffer.length == 0) {
+              state = 'relative path start';
+            } else {
+              this._host = IDNAToASCII.call(this, buffer);
+              buffer = '';
+              state = 'relative path start';
+            }
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid whitespace in file host.');
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'host':
+        case 'hostname':
+          if (':' == c && !seenBracket) {
+            // XXX host parsing
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'port';
+            if ('hostname' == stateOverride) {
+              break loop;
+            }
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'relative path start';
+            if (stateOverride) {
+              break loop;
+            }
+            continue;
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            if ('[' == c) {
+              seenBracket = true;
+            } else if (']' == c) {
+              seenBracket = false;
+            }
+            buffer += c;
+          } else {
+            err('Invalid code point in host/hostname: ' + c);
+          }
+          break;
+
+        case 'port':
+          if (/[0-9]/.test(c)) {
+            buffer += c;
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
+            if ('' != buffer) {
+              var temp = parseInt(buffer, 10);
+              if (temp != relative[this._scheme]) {
+                this._port = temp + '';
+              }
+              buffer = '';
+            }
+            if (stateOverride) {
+              break loop;
+            }
+            state = 'relative path start';
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid code point in port: ' + c);
+          } else {
+            invalid.call(this);
+          }
+          break;
+
+        case 'relative path start':
+          if ('\\' == c)
+            err("'\\' not allowed in path.");
+          state = 'relative path';
+          if ('/' != c && '\\' != c) {
+            continue;
+          }
+          break;
+
+        case 'relative path':
+          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {
+            if ('\\' == c) {
+              err('\\ not allowed in relative path.');
+            }
+            var tmp;
+            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
+              buffer = tmp;
+            }
+            if ('..' == buffer) {
+              this._path.pop();
+              if ('/' != c && '\\' != c) {
+                this._path.push('');
+              }
+            } else if ('.' == buffer && '/' != c && '\\' != c) {
+              this._path.push('');
+            } else if ('.' != buffer) {
+              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
+                buffer = buffer[0] + ':';
+              }
+              this._path.push(buffer);
+            }
+            buffer = '';
+            if ('?' == c) {
+              this._query = '?';
+              state = 'query';
+            } else if ('#' == c) {
+              this._fragment = '#';
+              state = 'fragment';
+            }
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            buffer += percentEscape(c);
+          }
+          break;
+
+        case 'query':
+          if (!stateOverride && '#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._query += percentEscapeQuery(c);
+          }
+          break;
+
+        case 'fragment':
+          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._fragment += c;
+          }
+          break;
+      }
+
+      cursor++;
+    }
+  }
+
+  function clear() {
+    this._scheme = '';
+    this._schemeData = '';
+    this._username = '';
+    this._password = null;
+    this._host = '';
+    this._port = '';
+    this._path = [];
+    this._query = '';
+    this._fragment = '';
+    this._isInvalid = false;
+    this._isRelative = false;
+  }
+
+  // Does not process domain names or IP addresses.
+  // Does not handle encoding for the query parameter.
+  function jURL(url, base /* , encoding */) {
+    if (base !== undefined && !(base instanceof jURL))
+      base = new jURL(String(base));
+
+    this._url = url;
+    clear.call(this);
+
+    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
+    // encoding = encoding || 'utf-8'
+
+    parse.call(this, input, null, base);
+  }
+
+  jURL.prototype = {
+    get href() {
+      if (this._isInvalid)
+        return this._url;
+
+      var authority = '';
+      if ('' != this._username || null != this._password) {
+        authority = this._username +
+            (null != this._password ? ':' + this._password : '') + '@';
+      }
+
+      return this.protocol +
+          (this._isRelative ? '//' + authority + this.host : '') +
+          this.pathname + this._query + this._fragment;
+    },
+    set href(href) {
+      clear.call(this);
+      parse.call(this, href);
+    },
+
+    get protocol() {
+      return this._scheme + ':';
+    },
+    set protocol(protocol) {
+      if (this._isInvalid)
+        return;
+      parse.call(this, protocol + ':', 'scheme start');
+    },
+
+    get host() {
+      return this._isInvalid ? '' : this._port ?
+          this._host + ':' + this._port : this._host;
+    },
+    set host(host) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, host, 'host');
+    },
+
+    get hostname() {
+      return this._host;
+    },
+    set hostname(hostname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, hostname, 'hostname');
+    },
+
+    get port() {
+      return this._port;
+    },
+    set port(port) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, port, 'port');
+    },
+
+    get pathname() {
+      return this._isInvalid ? '' : this._isRelative ?
+          '/' + this._path.join('/') : this._schemeData;
+    },
+    set pathname(pathname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._path = [];
+      parse.call(this, pathname, 'relative path start');
+    },
+
+    get search() {
+      return this._isInvalid || !this._query || '?' == this._query ?
+          '' : this._query;
+    },
+    set search(search) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._query = '?';
+      if ('?' == search[0])
+        search = search.slice(1);
+      parse.call(this, search, 'query');
+    },
+
+    get hash() {
+      return this._isInvalid || !this._fragment || '#' == this._fragment ?
+          '' : this._fragment;
+    },
+    set hash(hash) {
+      if (this._isInvalid)
+        return;
+      this._fragment = '#';
+      if ('#' == hash[0])
+        hash = hash.slice(1);
+      parse.call(this, hash, 'fragment');
+    },
+
+    get origin() {
+      var host;
+      if (this._isInvalid || !this._scheme) {
+        return '';
+      }
+      // javascript: Gecko returns String(""), WebKit/Blink String("null")
+      // Gecko throws error for "data://"
+      // data: Gecko returns "", Blink returns "data://", WebKit returns "null"
+      // Gecko returns String("") for file: mailto:
+      // WebKit/Blink returns String("SCHEME://") for file: mailto:
+      switch (this._scheme) {
+        case 'data':
+        case 'file':
+        case 'javascript':
+        case 'mailto':
+          return 'null';
+      }
+      host = this.host;
+      if (!host) {
+        return '';
+      }
+      return this._scheme + '://' + host;
+    }
+  };
+
+  // Copy over the static methods
+  var OriginalURL = scope.URL;
+  if (OriginalURL) {
+    jURL.createObjectURL = function(blob) {
+      // IE extension allows a second optional options argument.
+      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx
+      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
+    };
+    jURL.revokeObjectURL = function(url) {
+      OriginalURL.revokeObjectURL(url);
+    };
+  }
+
+  scope.URL = jURL;
+
+})(this);
+
+(function(scope) {
+
+var iterations = 0;
+var callbacks = [];
+var twiddle = document.createTextNode('');
+
+function endOfMicrotask(callback) {
+  twiddle.textContent = iterations++;
+  callbacks.push(callback);
+}
+
+function atEndOfMicrotask() {
+  while (callbacks.length) {
+    callbacks.shift()();
+  }
+}
+
+new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
+  .observe(twiddle, {characterData: true})
+  ;
+
+// exports
+scope.endOfMicrotask = endOfMicrotask;
+// bc 
+Platform.endOfMicrotask = endOfMicrotask;
+
+})(Polymer);
+
+
+(function(scope) {
+
+/**
+ * @class Polymer
+ */
+
+// imports
+var endOfMicrotask = scope.endOfMicrotask;
+
+// logging
+var log = window.WebComponents ? WebComponents.flags.log : {};
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+
+/**
+ * Force any pending data changes to be observed before 
+ * the next task. Data changes are processed asynchronously but are guaranteed
+ * to be processed, for example, before paintin. This method should rarely be 
+ * needed. It does nothing when Object.observe is available; 
+ * when Object.observe is not available, Polymer automatically flushes data 
+ * changes approximately every 1/10 second. 
+ * Therefore, `flush` should only be used when a data mutation should be 
+ * observed sooner than this.
+ * 
+ * @method flush
+ */
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    endOfMicrotask(function() {
+      flushing = false;
+      log.data && console.group('flush');
+      Platform.performMicrotaskCheckpoint();
+      log.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    // watch document visiblity to toggle dirty-checking
+    var visibilityHandler = function() {
+      // only flush if the page is visibile
+      if (document.visibilityState === 'hidden') {
+        if (scope.flushPoll) {
+          clearInterval(scope.flushPoll);
+        }
+      } else {
+        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+      }
+    };
+    if (typeof document.visibilityState === 'string') {
+      document.addEventListener('visibilitychange', visibilityHandler);
+    }
+    visibilityHandler();
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  };
+}
+
+// exports
+scope.flush = flush;
+// bc
+Platform.flush = flush;
+
+})(window.Polymer);
+
+
+(function(scope) {
+
+var urlResolver = {
+  resolveDom: function(root, url) {
+    url = url || baseUrl(root);
+    this.resolveAttributes(root, url);
+    this.resolveStyles(root, url);
+    // handle template.content
+    var templates = root.querySelectorAll('template');
+    if (templates) {
+      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
+        if (t.content) {
+          this.resolveDom(t.content, url);
+        }
+      }
+    }
+  },
+  resolveTemplate: function(template) {
+    this.resolveDom(template.content, baseUrl(template));
+  },
+  resolveStyles: function(root, url) {
+    var styles = root.querySelectorAll('style');
+    if (styles) {
+      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
+        this.resolveStyle(s, url);
+      }
+    }
+  },
+  resolveStyle: function(style, url) {
+    url = url || baseUrl(style);
+    style.textContent = this.resolveCssText(style.textContent, url);
+  },
+  resolveCssText: function(cssText, baseUrl, keepAbsolute) {
+    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);
+    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);
+  },
+  resolveAttributes: function(root, url) {
+    if (root.hasAttributes && root.hasAttributes()) {
+      this.resolveElementAttributes(root, url);
+    }
+    // search for attributes that host urls
+    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
+    if (nodes) {
+      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
+        this.resolveElementAttributes(n, url);
+      }
+    }
+  },
+  resolveElementAttributes: function(node, url) {
+    url = url || baseUrl(node);
+    URL_ATTRS.forEach(function(v) {
+      var attr = node.attributes[v];
+      var value = attr && attr.value;
+      var replacement;
+      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
+        if (v === 'style') {
+          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
+        } else {
+          replacement = resolveRelativeUrl(url, value);
+        }
+        attr.value = replacement;
+      }
+    });
+  }
+};
+
+var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
+var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
+var URL_TEMPLATE_SEARCH = '{{.*}}';
+var URL_HASH = '#';
+
+function baseUrl(node) {
+  var u = new URL(node.ownerDocument.baseURI);
+  u.search = '';
+  u.hash = '';
+  return u;
+}
+
+function replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {
+  return cssText.replace(regexp, function(m, pre, url, post) {
+    var urlPath = url.replace(/["']/g, '');
+    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);
+    return pre + '\'' + urlPath + '\'' + post;
+  });
+}
+
+function resolveRelativeUrl(baseUrl, url, keepAbsolute) {
+  // do not resolve '/' absolute urls
+  if (url && url[0] === '/') {
+    return url;
+  }
+  var u = new URL(url, baseUrl);
+  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);
+}
+
+function makeDocumentRelPath(url) {
+  var root = baseUrl(document.documentElement);
+  var u = new URL(url, root);
+  if (u.host === root.host && u.port === root.port &&
+      u.protocol === root.protocol) {
+    return makeRelPath(root, u);
+  } else {
+    return url;
+  }
+}
+
+// make a relative path from source to target
+function makeRelPath(sourceUrl, targetUrl) {
+  var source = sourceUrl.pathname;
+  var target = targetUrl.pathname;
+  var s = source.split('/');
+  var t = target.split('/');
+  while (s.length && s[0] === t[0]){
+    s.shift();
+    t.shift();
+  }
+  for (var i = 0, l = s.length - 1; i < l; i++) {
+    t.unshift('..');
+  }
+  // empty '#' is discarded but we need to preserve it.
+  var hash = (targetUrl.href.slice(-1) === URL_HASH) ? URL_HASH : targetUrl.hash;
+  return t.join('/') + targetUrl.search + hash;
+}
+
+// exports
+scope.urlResolver = urlResolver;
+
+})(Polymer);
+
+(function(scope) {
+  var endOfMicrotask = Polymer.endOfMicrotask;
+
+  // Generic url loader
+  function Loader(regex) {
+    this.cache = Object.create(null);
+    this.map = Object.create(null);
+    this.requests = 0;
+    this.regex = regex;
+  }
+  Loader.prototype = {
+
+    // TODO(dfreedm): there may be a better factoring here
+    // extract absolute urls from the text (full of relative urls)
+    extractUrls: function(text, base) {
+      var matches = [];
+      var matched, u;
+      while ((matched = this.regex.exec(text))) {
+        u = new URL(matched[1], base);
+        matches.push({matched: matched[0], url: u.href});
+      }
+      return matches;
+    },
+    // take a text blob, a root url, and a callback and load all the urls found within the text
+    // returns a map of absolute url to text
+    process: function(text, root, callback) {
+      var matches = this.extractUrls(text, root);
+
+      // every call to process returns all the text this loader has ever received
+      var done = callback.bind(null, this.map);
+      this.fetch(matches, done);
+    },
+    // build a mapping of url -> text from matches
+    fetch: function(matches, callback) {
+      var inflight = matches.length;
+
+      // return early if there is no fetching to be done
+      if (!inflight) {
+        return callback();
+      }
+
+      // wait for all subrequests to return
+      var done = function() {
+        if (--inflight === 0) {
+          callback();
+        }
+      };
+
+      // start fetching all subrequests
+      var m, req, url;
+      for (var i = 0; i < inflight; i++) {
+        m = matches[i];
+        url = m.url;
+        req = this.cache[url];
+        // if this url has already been requested, skip requesting it again
+        if (!req) {
+          req = this.xhr(url);
+          req.match = m;
+          this.cache[url] = req;
+        }
+        // wait for the request to process its subrequests
+        req.wait(done);
+      }
+    },
+    handleXhr: function(request) {
+      var match = request.match;
+      var url = match.url;
+
+      // handle errors with an empty string
+      var response = request.response || request.responseText || '';
+      this.map[url] = response;
+      this.fetch(this.extractUrls(response, url), request.resolve);
+    },
+    xhr: function(url) {
+      this.requests++;
+      var request = new XMLHttpRequest();
+      request.open('GET', url, true);
+      request.send();
+      request.onerror = request.onload = this.handleXhr.bind(this, request);
+
+      // queue of tasks to run after XHR returns
+      request.pending = [];
+      request.resolve = function() {
+        var pending = request.pending;
+        for(var i = 0; i < pending.length; i++) {
+          pending[i]();
+        }
+        request.pending = null;
+      };
+
+      // if we have already resolved, pending is null, async call the callback
+      request.wait = function(fn) {
+        if (request.pending) {
+          request.pending.push(fn);
+        } else {
+          endOfMicrotask(fn);
+        }
+      };
+
+      return request;
+    }
+  };
+
+  scope.Loader = Loader;
+})(Polymer);
+
+(function(scope) {
+
+var urlResolver = scope.urlResolver;
+var Loader = scope.Loader;
+
+function StyleResolver() {
+  this.loader = new Loader(this.regex);
+}
+StyleResolver.prototype = {
+  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
+  // Recursively replace @imports with the text at that url
+  resolve: function(text, url, callback) {
+    var done = function(map) {
+      callback(this.flatten(text, url, map));
+    }.bind(this);
+    this.loader.process(text, url, done);
+  },
+  // resolve the textContent of a style node
+  resolveNode: function(style, url, callback) {
+    var text = style.textContent;
+    var done = function(text) {
+      style.textContent = text;
+      callback(style);
+    };
+    this.resolve(text, url, done);
+  },
+  // flatten all the @imports to text
+  flatten: function(text, base, map) {
+    var matches = this.loader.extractUrls(text, base);
+    var match, url, intermediate;
+    for (var i = 0; i < matches.length; i++) {
+      match = matches[i];
+      url = match.url;
+      // resolve any css text to be relative to the importer, keep absolute url
+      intermediate = urlResolver.resolveCssText(map[url], url, true);
+      // flatten intermediate @imports
+      intermediate = this.flatten(intermediate, base, map);
+      text = text.replace(match.matched, intermediate);
+    }
+    return text;
+  },
+  loadStyles: function(styles, base, callback) {
+    var loaded=0, l = styles.length;
+    // called in the context of the style
+    function loadedStyle(style) {
+      loaded++;
+      if (loaded === l && callback) {
+        callback();
+      }
+    }
+    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
+      this.resolveNode(s, base, loadedStyle);
+    }
+  }
+};
+
+var styleResolver = new StyleResolver();
+
+// exports
+scope.styleResolver = styleResolver;
+
+})(Polymer);
+
+(function(scope) {
+
+  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
+  function extend(prototype, api) {
+    if (prototype && api) {
+      // use only own properties of 'api'
+      Object.getOwnPropertyNames(api).forEach(function(n) {
+        // acquire property descriptor
+        var pd = Object.getOwnPropertyDescriptor(api, n);
+        if (pd) {
+          // clone property via descriptor
+          Object.defineProperty(prototype, n, pd);
+          // cache name-of-method for 'super' engine
+          if (typeof pd.value == 'function') {
+            // hint the 'super' engine
+            pd.value.nom = n;
+          }
+        }
+      });
+    }
+    return prototype;
+  }
+
+
+  // mixin
+
+  // copy all properties from inProps (et al) to inObj
+  function mixin(inObj/*, inProps, inMoreProps, ...*/) {
+    var obj = inObj || {};
+    for (var i = 1; i < arguments.length; i++) {
+      var p = arguments[i];
+      try {
+        for (var n in p) {
+          copyProperty(n, p, obj);
+        }
+      } catch(x) {
+      }
+    }
+    return obj;
+  }
+
+  // copy property inName from inSource object to inTarget object
+  function copyProperty(inName, inSource, inTarget) {
+    var pd = getPropertyDescriptor(inSource, inName);
+    Object.defineProperty(inTarget, inName, pd);
+  }
+
+  // get property descriptor for inName on inObject, even if
+  // inName exists on some link in inObject's prototype chain
+  function getPropertyDescriptor(inObject, inName) {
+    if (inObject) {
+      var pd = Object.getOwnPropertyDescriptor(inObject, inName);
+      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);
+    }
+  }
+
+  // exports
+
+  scope.extend = extend;
+  scope.mixin = mixin;
+
+  // for bc
+  Platform.mixin = mixin;
+
+})(Polymer);
+
+(function(scope) {
+  
+  // usage
+  
+  // invoke cb.call(this) in 100ms, unless the job is re-registered,
+  // which resets the timer
+  // 
+  // this.myJob = this.job(this.myJob, cb, 100)
+  //
+  // returns a job handle which can be used to re-register a job
+
+  var Job = function(inContext) {
+    this.context = inContext;
+    this.boundComplete = this.complete.bind(this)
+  };
+  Job.prototype = {
+    go: function(callback, wait) {
+      this.callback = callback;
+      var h;
+      if (!wait) {
+        h = requestAnimationFrame(this.boundComplete);
+        this.handle = function() {
+          cancelAnimationFrame(h);
+        }
+      } else {
+        h = setTimeout(this.boundComplete, wait);
+        this.handle = function() {
+          clearTimeout(h);
+        }
+      }
+    },
+    stop: function() {
+      if (this.handle) {
+        this.handle();
+        this.handle = null;
+      }
+    },
+    complete: function() {
+      if (this.handle) {
+        this.stop();
+        this.callback.call(this.context);
+      }
+    }
+  };
+  
+  function job(job, callback, wait) {
+    if (job) {
+      job.stop();
+    } else {
+      job = new Job(this);
+    }
+    job.go(callback, wait);
+    return job;
+  }
+  
+  // exports 
+
+  scope.job = job;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // dom polyfill, additions, and utility methods
+
+  var registry = {};
+
+  HTMLElement.register = function(tag, prototype) {
+    registry[tag] = prototype;
+  };
+
+  // get prototype mapped to node <tag>
+  HTMLElement.getPrototypeForTag = function(tag) {
+    var prototype = !tag ? HTMLElement.prototype : registry[tag];
+    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
+    return prototype || Object.getPrototypeOf(document.createElement(tag));
+  };
+
+  // we have to flag propagation stoppage for the event dispatcher
+  var originalStopPropagation = Event.prototype.stopPropagation;
+  Event.prototype.stopPropagation = function() {
+    this.cancelBubble = true;
+    originalStopPropagation.apply(this, arguments);
+  };
+  
+  
+  // polyfill DOMTokenList
+  // * add/remove: allow these methods to take multiple classNames
+  // * toggle: add a 2nd argument which forces the given state rather
+  //  than toggling.
+
+  var add = DOMTokenList.prototype.add;
+  var remove = DOMTokenList.prototype.remove;
+  DOMTokenList.prototype.add = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      add.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.remove = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      remove.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.toggle = function(name, bool) {
+    if (arguments.length == 1) {
+      bool = !this.contains(name);
+    }
+    bool ? this.add(name) : this.remove(name);
+  };
+  DOMTokenList.prototype.switch = function(oldName, newName) {
+    oldName && this.remove(oldName);
+    newName && this.add(newName);
+  };
+
+  // add array() to NodeList, NamedNodeMap, HTMLCollection
+
+  var ArraySlice = function() {
+    return Array.prototype.slice.call(this);
+  };
+
+  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});
+
+  NodeList.prototype.array = ArraySlice;
+  namedNodeMap.prototype.array = ArraySlice;
+  HTMLCollection.prototype.array = ArraySlice;
+
+  // utility
+
+  function createDOM(inTagOrNode, inHTML, inAttrs) {
+    var dom = typeof inTagOrNode == 'string' ?
+        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);
+    dom.innerHTML = inHTML;
+    if (inAttrs) {
+      for (var n in inAttrs) {
+        dom.setAttribute(n, inAttrs[n]);
+      }
+    }
+    return dom;
+  }
+
+  // exports
+
+  scope.createDOM = createDOM;
+
+})(Polymer);
+
+(function(scope) {

+    // super

+

+    // `arrayOfArgs` is an optional array of args like one might pass

+    // to `Function.apply`

+

+    // TODO(sjmiles):

+    //    $super must be installed on an instance or prototype chain

+    //    as `super`, and invoked via `this`, e.g.

+    //      `this.super();`

+

+    //    will not work if function objects are not unique, for example,

+    //    when using mixins.

+    //    The memoization strategy assumes each function exists on only one 

+    //    prototype chain i.e. we use the function object for memoizing)

+    //    perhaps we can bookkeep on the prototype itself instead

+    function $super(arrayOfArgs) {

+      // since we are thunking a method call, performance is important here: 

+      // memoize all lookups, once memoized the fast path calls no other 

+      // functions

+      //

+      // find the caller (cannot be `strict` because of 'caller')

+      var caller = $super.caller;

+      // memoized 'name of method' 

+      var nom = caller.nom;

+      // memoized next implementation prototype

+      var _super = caller._super;

+      if (!_super) {

+        if (!nom) {

+          nom = caller.nom = nameInThis.call(this, caller);

+        }

+        if (!nom) {

+          console.warn('called super() on a method not installed declaratively (has no .nom property)');

+        }

+        // super prototype is either cached or we have to find it

+        // by searching __proto__ (at the 'top')

+        // invariant: because we cache _super on fn below, we never reach 

+        // here from inside a series of calls to super(), so it's ok to 

+        // start searching from the prototype of 'this' (at the 'top')

+        // we must never memoize a null super for this reason

+        _super = memoizeSuper(caller, nom, getPrototypeOf(this));

+      }

+      // our super function

+      var fn = _super[nom];

+      if (fn) {

+        // memoize information so 'fn' can call 'super'

+        if (!fn._super) {

+          // must not memoize null, or we lose our invariant above

+          memoizeSuper(fn, nom, _super);

+        }

+        // invoke the inherited method

+        // if 'fn' is not function valued, this will throw

+        return fn.apply(this, arrayOfArgs || []);

+      }

+    }

+

+    function nameInThis(value) {

+      var p = this.__proto__;

+      while (p && p !== HTMLElement.prototype) {

+        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive

+        var n$ = Object.getOwnPropertyNames(p);

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

+          var d = Object.getOwnPropertyDescriptor(p, n);

+          if (typeof d.value === 'function' && d.value === value) {

+            return n;

+          }

+        }

+        p = p.__proto__;

+      }

+    }

+

+    function memoizeSuper(method, name, proto) {

+      // find and cache next prototype containing `name`

+      // we need the prototype so we can do another lookup

+      // from here

+      var s = nextSuper(proto, name, method);

+      if (s[name]) {

+        // `s` is a prototype, the actual method is `s[name]`

+        // tag super method with it's name for quicker lookups

+        s[name].nom = name;

+      }

+      return method._super = s;

+    }

+

+    function nextSuper(proto, name, caller) {

+      // look for an inherited prototype that implements name

+      while (proto) {

+        if ((proto[name] !== caller) && proto[name]) {

+          return proto;

+        }

+        proto = getPrototypeOf(proto);

+      }

+      // must not return null, or we lose our invariant above

+      // in this case, a super() call was invoked where no superclass

+      // method exists

+      // TODO(sjmiles): thow an exception?

+      return Object;

+    }

+

+    // NOTE: In some platforms (IE10) the prototype chain is faked via 

+    // __proto__. Therefore, always get prototype via __proto__ instead of

+    // the more standard Object.getPrototypeOf.

+    function getPrototypeOf(prototype) {

+      return prototype.__proto__;

+    }

+

+    // utility function to precompute name tags for functions

+    // in a (unchained) prototype

+    function hintSuper(prototype) {

+      // tag functions with their prototype name to optimize

+      // super call invocations

+      for (var n in prototype) {

+        var pd = Object.getOwnPropertyDescriptor(prototype, n);

+        if (pd && typeof pd.value === 'function') {

+          pd.value.nom = n;

+        }

+      }

+    }

+

+    // exports

+

+    scope.super = $super;

+

+})(Polymer);

+
+(function(scope) {
+
+  function noopHandler(value) {
+    return value;
+  }
+
+  // helper for deserializing properties of various types to strings
+  var typeHandlers = {
+    string: noopHandler,
+    'undefined': noopHandler,
+    date: function(value) {
+      return new Date(Date.parse(value) || Date.now());
+    },
+    boolean: function(value) {
+      if (value === '') {
+        return true;
+      }
+      return value === 'false' ? false : !!value;
+    },
+    number: function(value) {
+      var n = parseFloat(value);
+      // hex values like "0xFFFF" parseFloat as 0
+      if (n === 0) {
+        n = parseInt(value);
+      }
+      return isNaN(n) ? value : n;
+      // this code disabled because encoded values (like "0xFFFF")
+      // do not round trip to their original format
+      //return (String(floatVal) === value) ? floatVal : value;
+    },
+    object: function(value, currentValue) {
+      if (currentValue === null) {
+        return value;
+      }
+      try {
+        // If the string is an object, we can parse is with the JSON library.
+        // include convenience replace for single-quotes. If the author omits
+        // quotes altogether, parse will fail.
+        return JSON.parse(value.replace(/'/g, '"'));
+      } catch(e) {
+        // The object isn't valid JSON, return the raw value
+        return value;
+      }
+    },
+    // avoid deserialization of functions
+    'function': function(value, currentValue) {
+      return currentValue;
+    }
+  };
+
+  function deserializeValue(value, currentValue) {
+    // attempt to infer type from default value
+    var inferredType = typeof currentValue;
+    // invent 'date' type value for Date
+    if (currentValue instanceof Date) {
+      inferredType = 'date';
+    }
+    // delegate deserialization via type string
+    return typeHandlers[inferredType](value, currentValue);
+  }
+
+  // exports
+
+  scope.deserializeValue = deserializeValue;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+
+  // module
+
+  var api = {};
+
+  api.declaration = {};
+  api.instance = {};
+
+  api.publish = function(apis, prototype) {
+    for (var n in apis) {
+      extend(prototype, apis[n]);
+    }
+  };
+
+  // exports
+
+  scope.api = api;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  var utils = {
+
+    /**
+      * Invokes a function asynchronously. The context of the callback
+      * function is bound to 'this' automatically. Returns a handle which may 
+      * be passed to <a href="#cancelAsync">cancelAsync</a> to cancel the 
+      * asynchronous call.
+      *
+      * @method async
+      * @param {Function|String} method
+      * @param {any|Array} args
+      * @param {number} timeout
+      */
+    async: function(method, args, timeout) {
+      // when polyfilling Object.observe, ensure changes 
+      // propagate before executing the async method
+      Polymer.flush();
+      // second argument to `apply` must be an array
+      args = (args && args.length) ? args : [args];
+      // function to invoke
+      var fn = function() {
+        (this[method] || method).apply(this, args);
+      }.bind(this);
+      // execute `fn` sooner or later
+      var handle = timeout ? setTimeout(fn, timeout) :
+          requestAnimationFrame(fn);
+      // NOTE: switch on inverting handle to determine which time is used.
+      return timeout ? handle : ~handle;
+    },
+
+    /**
+      * Cancels a pending callback that was scheduled via 
+      * <a href="#async">async</a>. 
+      *
+      * @method cancelAsync
+      * @param {handle} handle Handle of the `async` to cancel.
+      */
+    cancelAsync: function(handle) {
+      if (handle < 0) {
+        cancelAnimationFrame(~handle);
+      } else {
+        clearTimeout(handle);
+      }
+    },
+
+    /**
+      * Fire an event.
+      *
+      * @method fire
+      * @returns {Object} event
+      * @param {string} type An event name.
+      * @param {any} detail
+      * @param {Node} onNode Target node.
+      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true
+      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true
+      */
+    fire: function(type, detail, onNode, bubbles, cancelable) {
+      var node = onNode || this;
+      var detail = detail === null || detail === undefined ? {} : detail;
+      var event = new CustomEvent(type, {
+        bubbles: bubbles !== undefined ? bubbles : true,
+        cancelable: cancelable !== undefined ? cancelable : true,
+        detail: detail
+      });
+      node.dispatchEvent(event);
+      return event;
+    },
+
+    /**
+      * Fire an event asynchronously.
+      *
+      * @method asyncFire
+      * @param {string} type An event name.
+      * @param detail
+      * @param {Node} toNode Target node.
+      */
+    asyncFire: function(/*inType, inDetail*/) {
+      this.async("fire", arguments);
+    },
+
+    /**
+      * Remove class from old, add class to anew, if they exist.
+      *
+      * @param classFollows
+      * @param anew A node.
+      * @param old A node
+      * @param className
+      */
+    classFollows: function(anew, old, className) {
+      if (old) {
+        old.classList.remove(className);
+      }
+      if (anew) {
+        anew.classList.add(className);
+      }
+    },
+
+    /**
+      * Inject HTML which contains markup bound to this element into
+      * a target element (replacing target element content).
+      *
+      * @param String html to inject
+      * @param Element target element
+      */
+    injectBoundHTML: function(html, element) {
+      var template = document.createElement('template');
+      template.innerHTML = html;
+      var fragment = this.instanceTemplate(template);
+      if (element) {
+        element.textContent = '';
+        element.appendChild(fragment);
+      }
+      return fragment;
+    }
+  };
+
+  // no-operation function for handy stubs
+  var nop = function() {};
+
+  // null-object for handy stubs
+  var nob = {};
+
+  // deprecated
+
+  utils.asyncMethod = utils.async;
+
+  // exports
+
+  scope.api.instance.utils = utils;
+  scope.nop = nop;
+  scope.nob = nob;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var EVENT_PREFIX = 'on-';
+
+  // instance events api
+  var events = {
+    // read-only
+    EVENT_PREFIX: EVENT_PREFIX,
+    // event listeners on host
+    addHostListeners: function() {
+      var events = this.eventDelegates;
+      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
+      // NOTE: host events look like bindings but really are not;
+      // (1) we don't want the attribute to be set and (2) we want to support
+      // multiple event listeners ('host' and 'instance') and Node.bind
+      // by default supports 1 thing being bound.
+      for (var type in events) {
+        var methodName = events[type];
+        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));
+      }
+    },
+    // call 'method' or function method on 'obj' with 'args', if the method exists
+    dispatchMethod: function(obj, method, args) {
+      if (obj) {
+        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
+        var fn = typeof method === 'function' ? method : obj[method];
+        if (fn) {
+          fn[args ? 'apply' : 'call'](obj, args);
+        }
+        log.events && console.groupEnd();
+        // NOTE: dirty check right after calling method to ensure 
+        // changes apply quickly; in a very complicated app using high 
+        // frequency events, this can be a perf concern; in this case,
+        // imperative handlers can be used to avoid flushing.
+        Polymer.flush();
+      }
+    }
+  };
+
+  // exports
+
+  scope.api.instance.events = events;
+
+  /**
+   * @class Polymer
+   */
+
+  /**
+   * Add a gesture aware event handler to the given `node`. Can be used 
+   * in place of `element.addEventListener` and ensures gestures will function
+   * as expected on mobile platforms. Please note that Polymer's declarative
+   * event handlers include this functionality by default.
+   * 
+   * @method addEventListener
+   * @param {Node} node node on which to listen
+   * @param {String} eventType name of the event
+   * @param {Function} handlerFn event handler function
+   * @param {Boolean} capture set to true to invoke event capturing
+   * @type Function
+   */
+  // alias PolymerGestures event listener logic
+  scope.addEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);
+  };
+
+  /**
+   * Remove a gesture aware event handler on the given `node`. To remove an
+   * event listener, the exact same arguments are required that were passed
+   * to `Polymer.addEventListener`.
+   * 
+   * @method removeEventListener
+   * @param {Node} node node on which to listen
+   * @param {String} eventType name of the event
+   * @param {Function} handlerFn event handler function
+   * @param {Boolean} capture set to true to invoke event capturing
+   * @type Function
+   */
+  scope.removeEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);
+  };
+
+})(Polymer);
+
+(function(scope) {

+

+  // instance api for attributes

+

+  var attributes = {

+    // copy attributes defined in the element declaration to the instance

+    // e.g. <polymer-element name="x-foo" tabIndex="0"> tabIndex is copied

+    // to the element instance here.

+    copyInstanceAttributes: function () {

+      var a$ = this._instanceAttributes;

+      for (var k in a$) {

+        if (!this.hasAttribute(k)) {

+          this.setAttribute(k, a$[k]);

+        }

+      }

+    },

+    // for each attribute on this, deserialize value to property as needed

+    takeAttributes: function() {

+      // if we have no publish lookup table, we have no attributes to take

+      // TODO(sjmiles): ad hoc

+      if (this._publishLC) {

+        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

+          this.attributeToProperty(a.name, a.value);

+        }

+      }

+    },

+    // if attribute 'name' is mapped to a property, deserialize

+    // 'value' into that property

+    attributeToProperty: function(name, value) {

+      // try to match this attribute to a property (attributes are

+      // all lower-case, so this is case-insensitive search)

+      var name = this.propertyForAttribute(name);

+      if (name) {

+        // filter out 'mustached' values, these are to be

+        // replaced with bound-data and are not yet values

+        // themselves

+        if (value && value.search(scope.bindPattern) >= 0) {

+          return;

+        }

+        // get original value

+        var currentValue = this[name];

+        // deserialize Boolean or Number values from attribute

+        var value = this.deserializeValue(value, currentValue);

+        // only act if the value has changed

+        if (value !== currentValue) {

+          // install new value (has side-effects)

+          this[name] = value;

+        }

+      }

+    },

+    // return the published property matching name, or undefined

+    propertyForAttribute: function(name) {

+      var match = this._publishLC && this._publishLC[name];

+      return match;

+    },

+    // convert representation of `stringValue` based on type of `currentValue`

+    deserializeValue: function(stringValue, currentValue) {

+      return scope.deserializeValue(stringValue, currentValue);

+    },

+    // convert to a string value based on the type of `inferredType`

+    serializeValue: function(value, inferredType) {

+      if (inferredType === 'boolean') {

+        return value ? '' : undefined;

+      } else if (inferredType !== 'object' && inferredType !== 'function'

+          && value !== undefined) {

+        return value;

+      }

+    },

+    // serializes `name` property value and updates the corresponding attribute

+    // note that reflection is opt-in.

+    reflectPropertyToAttribute: function(name) {

+      var inferredType = typeof this[name];

+      // try to intelligently serialize property value

+      var serializedValue = this.serializeValue(this[name], inferredType);

+      // boolean properties must reflect as boolean attributes

+      if (serializedValue !== undefined) {

+        this.setAttribute(name, serializedValue);

+        // TODO(sorvell): we should remove attr for all properties

+        // that have undefined serialization; however, we will need to

+        // refine the attr reflection system to achieve this; pica, for example,

+        // relies on having inferredType object properties not removed as

+        // attrs.

+      } else if (inferredType === 'boolean') {

+        this.removeAttribute(name);

+      }

+    }

+  };

+

+  // exports

+

+  scope.api.instance.attributes = attributes;

+

+})(Polymer);

+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+
+  // magic words
+
+  var OBSERVE_SUFFIX = 'Changed';
+
+  // element api
+
+  var empty = [];
+
+  var updateRecord = {
+    object: undefined,
+    type: 'update',
+    name: undefined,
+    oldValue: undefined
+  };
+
+  var numberIsNaN = Number.isNaN || function(value) {
+    return typeof value === 'number' && isNaN(value);
+  };
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+    return left !== left && right !== right;
+  }
+
+  // capture A's value if B's value is null or undefined,
+  // otherwise use B's value
+  function resolveBindingValue(oldValue, value) {
+    if (value === undefined && oldValue === null) {
+      return value;
+    }
+    return (value === null || value === undefined) ? oldValue : value;
+  }
+
+  var properties = {
+
+    // creates a CompoundObserver to observe property changes
+    // NOTE, this is only done there are any properties in the `observe` object
+    createPropertyObserver: function() {
+      var n$ = this._observeNames;
+      if (n$ && n$.length) {
+        var o = this._propertyObserver = new CompoundObserver(true);
+        this.registerObserver(o);
+        // TODO(sorvell): may not be kosher to access the value here (this[n]);
+        // previously we looked at the descriptor on the prototype
+        // this doesn't work for inheritance and not for accessors without
+        // a value property
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          o.addPath(this, n);
+          this.observeArrayValue(n, this[n], null);
+        }
+      }
+    },
+
+    // start observing property changes
+    openPropertyObserver: function() {
+      if (this._propertyObserver) {
+        this._propertyObserver.open(this.notifyPropertyChanges, this);
+      }
+    },
+
+    // handler for property changes; routes changes to observing methods
+    // note: array valued properties are observed for array splices
+    notifyPropertyChanges: function(newValues, oldValues, paths) {
+      var name, method, called = {};
+      for (var i in oldValues) {
+        // note: paths is of form [object, path, object, path]
+        name = paths[2 * i + 1];
+        method = this.observe[name];
+        if (method) {
+          var ov = oldValues[i], nv = newValues[i];
+          // observes the value if it is an array
+          this.observeArrayValue(name, nv, ov);
+          if (!called[method]) {
+            // only invoke change method if one of ov or nv is not (undefined | null)
+            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {
+              called[method] = true;
+              // TODO(sorvell): call method with the set of values it's expecting;
+              // e.g. 'foo bar': 'invalidate' expects the new and old values for
+              // foo and bar. Currently we give only one of these and then
+              // deliver all the arguments.
+              this.invokeMethod(method, [ov, nv, arguments]);
+            }
+          }
+        }
+      }
+    },
+
+    // call method iff it exists.
+    invokeMethod: function(method, args) {
+      var fn = this[method] || method;
+      if (typeof fn === 'function') {
+        fn.apply(this, args);
+      }
+    },
+
+    /**
+     * Force any pending property changes to synchronously deliver to
+     * handlers specified in the `observe` object.
+     * Note, normally changes are processed at microtask time.
+     *
+     * @method deliverChanges
+     */
+    deliverChanges: function() {
+      if (this._propertyObserver) {
+        this._propertyObserver.deliver();
+      }
+    },
+
+    observeArrayValue: function(name, value, old) {
+      // we only care if there are registered side-effects
+      var callbackName = this.observe[name];
+      if (callbackName) {
+        // if we are observing the previous value, stop
+        if (Array.isArray(old)) {
+          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
+          this.closeNamedObserver(name + '__array');
+        }
+        // if the new value is an array, being observing it
+        if (Array.isArray(value)) {
+          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
+          var observer = new ArrayObserver(value);
+          observer.open(function(splices) {
+            this.invokeMethod(callbackName, [splices]);
+          }, this);
+          this.registerNamedObserver(name + '__array', observer);
+        }
+      }
+    },
+
+    emitPropertyChangeRecord: function(name, value, oldValue) {
+      var object = this;
+      if (areSameValue(value, oldValue)) {
+        return;
+      }
+      // invoke property change side effects
+      this._propertyChanged(name, value, oldValue);
+      // emit change record
+      if (!Observer.hasObjectObserve) {
+        return;
+      }
+      var notifier = this._objectNotifier;
+      if (!notifier) {
+        notifier = this._objectNotifier = Object.getNotifier(this);
+      }
+      updateRecord.object = this;
+      updateRecord.name = name;
+      updateRecord.oldValue = oldValue;
+      notifier.notify(updateRecord);
+    },
+
+    _propertyChanged: function(name, value, oldValue) {
+      if (this.reflect[name]) {
+        this.reflectPropertyToAttribute(name);
+      }
+    },
+
+    // creates a property binding (called via bind) to a published property.
+    bindProperty: function(property, observable, oneTime) {
+      if (oneTime) {
+        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);
+    },
+
+    // NOTE property `name` must be published. This makes it an accessor.
+    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];
+      // observable callback
+      var self = this;
+      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);
+      }
+      // resolve initial value
+      var value = observable.open(updateValue);
+      if (resolveFn && !areSameValue(oldValue, value)) {
+        var resolvedValue = resolveFn(oldValue, value);
+        if (!areSameValue(value, resolvedValue)) {
+          value = resolvedValue;
+          if (observable.setValue) {
+            observable.setValue(value);
+          }
+        }
+      }
+      updateValue(value, oldValue);
+      // register and return observable
+      var observer = {
+        close: function() {
+          observable.close();
+          self[privateObservable] = undefined;
+          self[privateComputedBoundValue] = undefined;
+        }
+      };
+      this.registerObserver(observer);
+      return observer;
+    },
+
+    createComputedProperties: function() {
+      if (!this._computedNames) {
+        return;
+      }
+      for (var i = 0; i < this._computedNames.length; i++) {
+        var name = this._computedNames[i];
+        var expressionText = this.computed[name];
+        try {
+          var expression = PolymerExpressions.getExpression(expressionText);
+          var observable = expression.getBinding(this, this.element.syntax);
+          this.bindToAccessor(name, observable);
+        } catch (ex) {
+          console.error('Failed to create computed property', ex);
+        }
+      }
+    },
+
+    // property bookkeeping
+    registerObserver: function(observer) {
+      if (!this._observers) {
+        this._observers = [observer];
+        return;
+      }
+      this._observers.push(observer);
+    },
+
+    closeObservers: function() {
+      if (!this._observers) {
+        return;
+      }
+      // observer array items are arrays of observers.
+      var observers = this._observers;
+      for (var i = 0; i < observers.length; i++) {
+        var observer = observers[i];
+        if (observer && typeof observer.close == 'function') {
+          observer.close();
+        }
+      }
+      this._observers = [];
+    },
+
+    // bookkeeping observers for memory management
+    registerNamedObserver: function(name, observer) {
+      var o$ = this._namedObservers || (this._namedObservers = {});
+      o$[name] = observer;
+    },
+
+    closeNamedObserver: function(name) {
+      var o$ = this._namedObservers;
+      if (o$ && o$[name]) {
+        o$[name].close();
+        o$[name] = null;
+        return true;
+      }
+    },
+
+    closeNamedObservers: function() {
+      if (this._namedObservers) {
+        for (var i in this._namedObservers) {
+          this.closeNamedObserver(i);
+        }
+        this._namedObservers = {};
+      }
+    }
+
+  };
+
+  // logging
+  var LOG_OBSERVE = '[%s] watching [%s]';
+  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
+  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
+
+  // exports
+
+  scope.api.instance.properties = properties;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+
+  // element api supporting mdv
+  var mdv = {
+
+    /**
+     * Creates dom cloned from the given template, instantiating bindings
+     * with this element as the template model and `PolymerExpressions` as the
+     * binding delegate.
+     *
+     * @method instanceTemplate
+     * @param {Template} template source template from which to create dom.
+     */
+    instanceTemplate: function(template) {
+      // ensure template is decorated (lets' things like <tr template ...> work)
+      HTMLTemplateElement.decorate(template);
+      // ensure a default bindingDelegate
+      var syntax = this.syntax || (!template.bindingDelegate &&
+          this.element.syntax);
+      var dom = template.createInstance(this, syntax);
+      var observers = dom.bindings_;
+      for (var i = 0; i < observers.length; i++) {
+        this.registerObserver(observers[i]);
+      }
+      return dom;
+    },
+
+    // Called by TemplateBinding/NodeBind to setup a binding to the given
+    // property. It's overridden here to support property bindings
+    // in addition to attribute bindings that are supported by default.
+    bind: function(name, observable, oneTime) {
+      var property = this.propertyForAttribute(name);
+      if (!property) {
+        // TODO(sjmiles): this mixin method must use the special form
+        // of `super` installed by `mixinMethod` in declaration/prototype.js
+        return this.mixinSuper(arguments);
+      } else {
+        // use n-way Polymer binding
+        var observer = this.bindProperty(property, observable, oneTime);
+        // NOTE: reflecting binding information is typically required only for
+        // tooling. It has a performance cost so it's opt-in in Node.bind.
+        if (Platform.enableBindingsReflection && observer) {
+          observer.path = observable.path_;
+          this._recordBinding(property, observer);
+        }
+        if (this.reflect[property]) {
+          this.reflectPropertyToAttribute(property);
+        }
+        return observer;
+      }
+    },
+
+    _recordBinding: function(name, observer) {
+      this.bindings_ = this.bindings_ || {};
+      this.bindings_[name] = observer;
+    },
+
+    // Called by TemplateBinding when all bindings on an element have been 
+    // executed. This signals that all element inputs have been gathered
+    // and it's safe to ready the element, create shadow-root and start
+    // data-observation.
+    bindFinished: function() {
+      this.makeElementReady();
+    },
+
+    // called at detached time to signal that an element's bindings should be
+    // cleaned up. This is done asynchronously so that users have the chance
+    // to call `cancelUnbindAll` to prevent unbinding.
+    asyncUnbindAll: function() {
+      if (!this._unbound) {
+        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
+        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
+      }
+    },
+    
+    /**
+     * This method should rarely be used and only if 
+     * <a href="#cancelUnbindAll">`cancelUnbindAll`</a> has been called to 
+     * prevent element unbinding. In this case, the element's bindings will 
+     * not be automatically cleaned up and it cannot be garbage collected 
+     * by the system. If memory pressure is a concern or a 
+     * large amount of elements need to be managed in this way, `unbindAll`
+     * can be called to deactivate the element's bindings and allow its 
+     * memory to be reclaimed.
+     *
+     * @method unbindAll
+     */
+    unbindAll: function() {
+      if (!this._unbound) {
+        this.closeObservers();
+        this.closeNamedObservers();
+        this._unbound = true;
+      }
+    },
+
+    /**
+     * Call in `detached` to prevent the element from unbinding when it is 
+     * detached from the dom. The element is unbound as a cleanup step that 
+     * allows its memory to be reclaimed. 
+     * If `cancelUnbindAll` is used, consider calling 
+     * <a href="#unbindAll">`unbindAll`</a> when the element is no longer
+     * needed. This will allow its memory to be reclaimed.
+     * 
+     * @method cancelUnbindAll
+     */
+    cancelUnbindAll: function() {
+      if (this._unbound) {
+        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
+        return;
+      }
+      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
+      if (this._unbindAllJob) {
+        this._unbindAllJob = this._unbindAllJob.stop();
+      }
+    }
+
+  };
+
+  function unbindNodeTree(node) {
+    forNodeTree(node, _nodeUnbindAll);
+  }
+
+  function _nodeUnbindAll(node) {
+    node.unbindAll();
+  }
+
+  function forNodeTree(node, callback) {
+    if (node) {
+      callback(node);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        forNodeTree(child, callback);
+      }
+    }
+  }
+
+  var mustachePattern = /\{\{([^{}]*)}}/;
+
+  // exports
+
+  scope.bindPattern = mustachePattern;
+  scope.api.instance.mdv = mdv;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * Common prototype for all Polymer Elements.
+   * 
+   * @class polymer-base
+   * @homepage polymer.github.io
+   */
+  var base = {
+    /**
+     * Tags this object as the canonical Base prototype.
+     *
+     * @property PolymerBase
+     * @type boolean
+     * @default true
+     */
+    PolymerBase: true,
+
+    /**
+     * Debounce signals. 
+     * 
+     * Call `job` to defer a named signal, and all subsequent matching signals, 
+     * until a wait time has elapsed with no new signal.
+     * 
+     *     debouncedClickAction: function(e) {
+     *       // processClick only when it's been 100ms since the last click
+     *       this.job('click', function() {
+     *        this.processClick;
+     *       }, 100);
+     *     }
+     *
+     * @method job
+     * @param String {String} job A string identifier for the job to debounce.
+     * @param Function {Function} callback A function that is called (with `this` context) when the wait time elapses.
+     * @param Number {Number} wait Time in milliseconds (ms) after the last signal that must elapse before invoking `callback`
+     * @type Handle
+     */
+    job: function(job, callback, wait) {
+      if (typeof job === 'string') {
+        var n = '___' + job;
+        this[n] = Polymer.job.call(this, this[n], callback, wait);
+      } else {
+        // TODO(sjmiles): suggest we deprecate this call signature
+        return Polymer.job.call(this, job, callback, wait);
+      }
+    },
+
+    /**
+     * Invoke a superclass method. 
+     * 
+     * Use `super()` to invoke the most recently overridden call to the 
+     * currently executing function. 
+     * 
+     * To pass arguments through, use the literal `arguments` as the parameter 
+     * to `super()`.
+     *
+     *     nextPageAction: function(e) {
+     *       // invoke the superclass version of `nextPageAction`
+     *       this.super(arguments); 
+     *     }
+     *
+     * To pass custom arguments, arrange them in an array.
+     *
+     *     appendSerialNo: function(value, serial) {
+     *       // prefix the superclass serial number with our lot # before
+     *       // invoking the superlcass
+     *       return this.super([value, this.lotNo + serial])
+     *     }
+     *
+     * @method super
+     * @type Any
+     * @param {args) An array of arguments to use when calling the superclass method, or null.
+     */
+    super: Polymer.super,
+
+    /**
+     * Lifecycle method called when the element is instantiated.
+     * 
+     * Override `created` to perform custom create-time tasks. No need to call 
+     * super-class `created` unless you are extending another Polymer element.
+     * Created is called before the element creates `shadowRoot` or prepares
+     * data-observation.
+     * 
+     * @method created
+     * @type void
+     */
+    created: function() {
+    },
+
+    /**
+     * Lifecycle method called when the element has populated it's `shadowRoot`,
+     * prepared data-observation, and made itself ready for API interaction.
+     * 
+     * @method ready
+     * @type void
+     */
+    ready: function() {
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `created` 
+     * instead, which is called immediately after `createdCallback`. 
+     * 
+     * @method createdCallback
+     */
+    createdCallback: function() {
+      if (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();
+      if (!this.ownerDocument.isStagingDocument) {
+        this.makeElementReady();
+      }
+    },
+
+    // system entry point, do not override
+    prepareElement: function() {
+      if (this._elementPrepared) {
+        console.warn('Element already prepared', this.localName);
+        return;
+      }
+      this._elementPrepared = true;
+      // storage for shadowRoots info
+      this.shadowRoots = {};
+      // install property observers
+      this.createPropertyObserver();
+      this.openPropertyObserver();
+      // install boilerplate attributes
+      this.copyInstanceAttributes();
+      // process input attributes
+      this.takeAttributes();
+      // add event listeners
+      this.addHostListeners();
+    },
+
+    // system entry point, do not override
+    makeElementReady: function() {
+      if (this._readied) {
+        return;
+      }
+      this._readied = true;
+      this.createComputedProperties();
+      this.parseDeclarations(this.__proto__);
+      // NOTE: Support use of the `unresolved` attribute to help polyfill
+      // custom elements' `:unresolved` feature.
+      this.removeAttribute('unresolved');
+      // user entry point
+      this.ready();
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom tasks in your element, implement `attributeChanged` 
+     * instead, which is called immediately after `attributeChangedCallback`. 
+     * 
+     * @method attributeChangedCallback
+     */
+    attributeChangedCallback: function(name, oldValue) {
+      // TODO(sjmiles): adhoc filter
+      if (name !== 'class' && name !== 'style') {
+        this.attributeToProperty(name, this.getAttribute(name));
+      }
+      if (this.attributeChanged) {
+        this.attributeChanged.apply(this, arguments);
+      }
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `attached` 
+     * instead, which is called immediately after `attachedCallback`. 
+     * 
+     * @method attachedCallback
+     */
+     attachedCallback: function() {
+      // when the element is attached, prevent it from unbinding.
+      this.cancelUnbindAll();
+      // invoke user action
+      if (this.attached) {
+        this.attached();
+      }
+      if (!this.hasBeenAttached) {
+        this.hasBeenAttached = true;
+        if (this.domReady) {
+          this.async('domReady');
+        }
+      }
+    },
+
+     /**
+     * Implement to access custom elements in dom descendants, ancestors, 
+     * or siblings. Because custom elements upgrade in document order, 
+     * elements accessed in `ready` or `attached` may not be upgraded. When
+     * `domReady` is called, all registered custom elements are guaranteed
+     * to have been upgraded.
+     * 
+     * @method domReady
+     */
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `detached` 
+     * instead, which is called immediately after `detachedCallback`. 
+     * 
+     * @method detachedCallback
+     */
+    detachedCallback: function() {
+      if (!this.preventDispose) {
+        this.asyncUnbindAll();
+      }
+      // invoke user action
+      if (this.detached) {
+        this.detached();
+      }
+      // TODO(sorvell): bc
+      if (this.leftView) {
+        this.leftView();
+      }
+    },
+
+    /**
+     * Walks the prototype-chain of this element and allows specific
+     * classes a chance to process static declarations.
+     * 
+     * In particular, each polymer-element has it's own `template`.
+     * `parseDeclarations` is used to accumulate all element `template`s
+     * from an inheritance chain.
+     *
+     * `parseDeclaration` static methods implemented in the chain are called
+     * recursively, oldest first, with the `<polymer-element>` associated
+     * with the current prototype passed as an argument.
+     * 
+     * An element may override this method to customize shadow-root generation. 
+     * 
+     * @method parseDeclarations
+     */
+    parseDeclarations: function(p) {
+      if (p && p.element) {
+        this.parseDeclarations(p.__proto__);
+        p.parseDeclaration.call(this, p.element);
+      }
+    },
+
+    /**
+     * Perform init-time actions based on static information in the
+     * `<polymer-element>` instance argument.
+     *
+     * For example, the standard implementation locates the template associated
+     * with the given `<polymer-element>` and stamps it into a shadow-root to
+     * implement shadow inheritance.
+     *  
+     * An element may override this method for custom behavior. 
+     * 
+     * @method parseDeclaration
+     */
+    parseDeclaration: function(elementElement) {
+      var template = this.fetchTemplate(elementElement);
+      if (template) {
+        var root = this.shadowFromTemplate(template);
+        this.shadowRoots[elementElement.name] = root;
+      }
+    },
+
+    /**
+     * Given a `<polymer-element>`, find an associated template (if any) to be
+     * used for shadow-root generation.
+     *
+     * An element may override this method for custom behavior. 
+     * 
+     * @method fetchTemplate
+     */
+    fetchTemplate: function(elementElement) {
+      return elementElement.querySelector('template');
+    },
+
+    /**
+     * Create a shadow-root in this host and stamp `template` as it's 
+     * content. 
+     *
+     * An element may override this method for custom behavior. 
+     * 
+     * @method shadowFromTemplate
+     */
+    shadowFromTemplate: function(template) {
+      if (template) {
+        // make a shadow root
+        var root = this.createShadowRoot();
+        // stamp template
+        // which includes parsing and applying MDV bindings before being
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        root.appendChild(dom);
+        // perform post-construction initialization tasks on shadow root
+        this.shadowRootReady(root, template);
+        // return the created shadow root
+        return root;
+      }
+    },
+
+    // utility function that stamps a <template> into light-dom
+    lightFromTemplate: function(template, refNode) {
+      if (template) {
+        // TODO(sorvell): mark this element as an eventController so that
+        // event listeners on bound nodes inside it will be called on it.
+        // Note, the expectation here is that events on all descendants
+        // should be handled by this element.
+        this.eventController = this;
+        // stamp template
+        // which includes parsing and applying MDV bindings before being
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        if (refNode) {
+          this.insertBefore(dom, refNode);
+        } else {
+          this.appendChild(dom);
+        }
+        // perform post-construction initialization tasks on ahem, light root
+        this.shadowRootReady(this);
+        // return the created shadow root
+        return dom;
+      }
+    },
+
+    shadowRootReady: function(root) {
+      // locate nodes with id and store references to them in this.$ hash
+      this.marshalNodeReferences(root);
+    },
+
+    // locate nodes with id and store references to them in this.$ hash
+    marshalNodeReferences: function(root) {
+      // establish $ instance variable
+      var $ = this.$ = this.$ || {};
+      // populate $ from nodes with ID from the LOCAL tree
+      if (root) {
+        var n$ = root.querySelectorAll("[id]");
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          $[n.id] = n;
+        };
+      }
+    },
+
+    /**
+     * Register a one-time callback when a child-list or sub-tree mutation
+     * occurs on node. 
+     *
+     * For persistent callbacks, call onMutation from your listener. 
+     * 
+     * @method onMutation
+     * @param Node {Node} node Node to watch for mutations.
+     * @param Function {Function} listener Function to call on mutation. The function is invoked as `listener.call(this, observer, mutations);` where `observer` is the MutationObserver that triggered the notification, and `mutations` is the native mutation list.
+     */
+    onMutation: function(node, listener) {
+      var observer = new MutationObserver(function(mutations) {
+        listener.call(this, observer, mutations);
+        observer.disconnect();
+      }.bind(this));
+      observer.observe(node, {childList: true, subtree: true});
+    }
+  };
+
+  /**
+   * @class Polymer
+   */
+  
+  /**
+   * Returns true if the object includes <a href="#polymer-base">polymer-base</a> in it's prototype chain.
+   * 
+   * @method isBase
+   * @param Object {Object} object Object to test.
+   * @type Boolean
+   */
+  function isBase(object) {
+    return object.hasOwnProperty('PolymerBase')
+  }
+
+  // name a base constructor for dev tools
+
+  /**
+   * The Polymer base-class constructor.
+   * 
+   * @property Base
+   * @type Function
+   */
+  function PolymerBase() {};
+  PolymerBase.prototype = base;
+  base.constructor = PolymerBase;
+
+  // exports
+
+  scope.Base = PolymerBase;
+  scope.isBase = isBase;
+  scope.api.instance.base = base;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // magic words
+  
+  var STYLE_SCOPE_ATTRIBUTE = 'element';
+  var STYLE_CONTROLLER_SCOPE = 'controller';
+  
+  var styles = {
+    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
+    /**
+     * Installs external stylesheets and <style> elements with the attribute 
+     * polymer-scope='controller' into the scope of element. This is intended
+     * to be a called during custom element construction.
+    */
+    installControllerStyles: function() {
+      // apply controller styles, but only if they are not yet applied
+      var scope = this.findStyleScope();
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
+        // allow inherited controller styles
+        var proto = getPrototypeOf(this), cssText = '';
+        while (proto && proto.element) {
+          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
+          proto = getPrototypeOf(proto);
+        }
+        if (cssText) {
+          this.installScopeCssText(cssText, scope);
+        }
+      }
+    },
+    installScopeStyle: function(style, name, scope) {
+      var scope = scope || this.findStyleScope(), name = name || '';
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
+        var cssText = '';
+        if (style instanceof Array) {
+          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
+            cssText += s.textContent + '\n\n';
+          }
+        } else {
+          cssText = style.textContent;
+        }
+        this.installScopeCssText(cssText, scope, name);
+      }
+    },
+    installScopeCssText: function(cssText, scope, name) {
+      scope = scope || this.findStyleScope();
+      name = name || '';
+      if (!scope) {
+        return;
+      }
+      if (hasShadowDOMPolyfill) {
+        cssText = shimCssText(cssText, scope.host);
+      }
+      var style = this.element.cssTextToScopeStyle(cssText,
+          STYLE_CONTROLLER_SCOPE);
+      Polymer.applyStyleToScope(style, scope);
+      // cache that this style has been applied
+      this.styleCacheForScope(scope)[this.localName + name] = true;
+    },
+    findStyleScope: function(node) {
+      // find the shadow root that contains this element
+      var n = node || this;
+      while (n.parentNode) {
+        n = n.parentNode;
+      }
+      return n;
+    },
+    scopeHasNamedStyle: function(scope, name) {
+      var cache = this.styleCacheForScope(scope);
+      return cache[name];
+    },
+    styleCacheForScope: function(scope) {
+      if (hasShadowDOMPolyfill) {
+        var scopeName = scope.host ? scope.host.localName : scope.localName;
+        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
+      } else {
+        return scope._scopeStyles = (scope._scopeStyles || {});
+      }
+    }
+  };
+
+  var polyfillScopeStyleCache = {};
+  
+  // NOTE: use raw prototype traversal so that we ensure correct traversal
+  // on platforms where the protoype chain is simulated via __proto__ (IE10)
+  function getPrototypeOf(prototype) {
+    return prototype.__proto__;
+  }
+
+  function shimCssText(cssText, host) {
+    var name = '', is = false;
+    if (host) {
+      name = host.localName;
+      is = host.hasAttribute('is');
+    }
+    var selector = WebComponents.ShadowCSS.makeScopeSelector(name, is);
+    return WebComponents.ShadowCSS.shimCssText(cssText, selector);
+  }
+
+  // exports
+
+  scope.api.instance.styles = styles;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+
+  // imperative implementation: Polymer()
+
+  // specify an 'own' prototype for tag `name`
+  function element(name, prototype) {
+    if (typeof name !== 'string') {
+      var script = prototype || document._currentScript;
+      prototype = name;
+      name = script && script.parentNode && script.parentNode.getAttribute ?
+          script.parentNode.getAttribute('name') : '';
+      if (!name) {
+        throw 'Element name could not be inferred.';
+      }
+    }
+    if (getRegisteredPrototype(name)) {
+      throw 'Already registered (Polymer) prototype for element ' + name;
+    }
+    // cache the prototype
+    registerPrototype(name, prototype);
+    // notify the registrar waiting for 'name', if any
+    notifyPrototype(name);
+  }
+
+  // async prototype source
+
+  function waitingForPrototype(name, client) {
+    waitPrototype[name] = client;
+  }
+
+  var waitPrototype = {};
+
+  function notifyPrototype(name) {
+    if (waitPrototype[name]) {
+      waitPrototype[name].registerWhenReady();
+      delete waitPrototype[name];
+    }
+  }
+
+  // utility and bookkeeping
+
+  // maps tag names to prototypes, as registered with
+  // Polymer. Prototypes associated with a tag name
+  // using document.registerElement are available from
+  // HTMLElement.getPrototypeForTag().
+  // If an element was fully registered by Polymer, then
+  // Polymer.getRegisteredPrototype(name) === 
+  //   HTMLElement.getPrototypeForTag(name)
+
+  var prototypesByName = {};
+
+  function registerPrototype(name, prototype) {
+    return prototypesByName[name] = prototype || {};
+  }
+
+  function getRegisteredPrototype(name) {
+    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
+
+  // make window.Polymer reference `element()`
+
+  window.Polymer = element;
+
+  // TODO(sjmiles): find a way to do this that is less terrible
+  // copy window.Polymer properties onto `element()`
+
+  extend(Polymer, scope);
+
+  // Under the HTMLImports polyfill, scripts in the main document
+  // do not block on imports; we want to allow calls to Polymer in the main
+  // document. WebComponents collects those calls until we can process them, which
+  // we do here.
+
+  if (WebComponents.consumeDeclarations) {
+    WebComponents.consumeDeclarations(function(declarations) {
+      if (declarations) {
+        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
+          element.apply(null, d);
+        }
+      }
+    });
+  }
+
+})(Polymer);
+
+(function(scope) {
+
+/**
+ * @class polymer-base
+ */
+
+ /**
+  * Resolve a url path to be relative to a `base` url. If unspecified, `base`
+  * defaults to the element's ownerDocument url. Can be used to resolve
+  * paths from element's in templates loaded in HTMLImports to be relative
+  * to the document containing the element. Polymer automatically does this for
+  * url attributes in element templates; however, if a url, for
+  * example, contains a binding, then `resolvePath` can be used to ensure it is 
+  * relative to the element document. For example, in an element's template,
+  *
+  *     <a href="{{resolvePath(path)}}">Resolved</a>
+  * 
+  * @method resolvePath
+  * @param {String} url Url path to resolve.
+  * @param {String} base Optional base url against which to resolve, defaults
+  * to the element's ownerDocument url.
+  * returns {String} resolved url.
+  */
+
+var path = {
+  resolveElementPaths: function(node) {
+    Polymer.urlResolver.resolveDom(node);
+  },
+  addResolvePathApi: function() {
+    // let assetpath attribute modify the resolve path
+    var assetPath = this.getAttribute('assetpath') || '';
+    var root = new URL(assetPath, this.ownerDocument.baseURI);
+    this.prototype.resolvePath = function(urlPath, base) {
+      var u = new URL(urlPath, base || root);
+      return u.href;
+    };
+  }
+};
+
+// exports
+scope.api.declaration.path = path;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var api = scope.api.instance.styles;
+  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
+
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // magic words
+
+  var STYLE_SELECTOR = 'style';
+  var STYLE_LOADABLE_MATCH = '@import';
+  var SHEET_SELECTOR = 'link[rel=stylesheet]';
+  var STYLE_GLOBAL_SCOPE = 'global';
+  var SCOPE_ATTR = 'polymer-scope';
+
+  var styles = {
+    // returns true if resources are loading
+    loadStyles: function(callback) {
+      var template = this.fetchTemplate();
+      var content = template && this.templateContent();
+      if (content) {
+        this.convertSheetsToStyles(content);
+        var styles = this.findLoadableStyles(content);
+        if (styles.length) {
+          var templateUrl = template.ownerDocument.baseURI;
+          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);
+        }
+      }
+      if (callback) {
+        callback();
+      }
+    },
+    convertSheetsToStyles: function(root) {
+      var s$ = root.querySelectorAll(SHEET_SELECTOR);
+      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
+        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
+            this.ownerDocument);
+        this.copySheetAttributes(c, s);
+        s.parentNode.replaceChild(c, s);
+      }
+    },
+    copySheetAttributes: function(style, link) {
+      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
+        if (a.name !== 'rel' && a.name !== 'href') {
+          style.setAttribute(a.name, a.value);
+        }
+      }
+    },
+    findLoadableStyles: function(root) {
+      var loadables = [];
+      if (root) {
+        var s$ = root.querySelectorAll(STYLE_SELECTOR);
+        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
+          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
+            loadables.push(s);
+          }
+        }
+      }
+      return loadables;
+    },
+    /**
+     * Install external stylesheets loaded in <polymer-element> elements into the 
+     * element's template.
+     * @param elementElement The <element> element to style.
+     */
+    installSheets: function() {
+      this.cacheSheets();
+      this.cacheStyles();
+      this.installLocalSheets();
+      this.installGlobalStyles();
+    },
+    /**
+     * Remove all sheets from element and store for later use.
+     */
+    cacheSheets: function() {
+      this.sheets = this.findNodes(SHEET_SELECTOR);
+      this.sheets.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    cacheStyles: function() {
+      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
+      this.styles.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    /**
+     * Takes external stylesheets loaded in an <element> element and moves
+     * their content into a <style> element inside the <element>'s template.
+     * The sheet is then removed from the <element>. This is done only so 
+     * that if the element is loaded in the main document, the sheet does
+     * not become active.
+     * Note, ignores sheets with the attribute 'polymer-scope'.
+     * @param elementElement The <element> element to style.
+     */
+    installLocalSheets: function () {
+      var sheets = this.sheets.filter(function(s) {
+        return !s.hasAttribute(SCOPE_ATTR);
+      });
+      var content = this.templateContent();
+      if (content) {
+        var cssText = '';
+        sheets.forEach(function(sheet) {
+          cssText += cssTextFromSheet(sheet) + '\n';
+        });
+        if (cssText) {
+          var style = createStyleElement(cssText, this.ownerDocument);
+          content.insertBefore(style, content.firstChild);
+        }
+      }
+    },
+    findNodes: function(selector, matcher) {
+      var nodes = this.querySelectorAll(selector).array();
+      var content = this.templateContent();
+      if (content) {
+        var templateNodes = content.querySelectorAll(selector).array();
+        nodes = nodes.concat(templateNodes);
+      }
+      return matcher ? nodes.filter(matcher) : nodes;
+    },
+    /**
+     * Promotes external stylesheets and <style> elements with the attribute 
+     * polymer-scope='global' into global scope.
+     * This is particularly useful for defining @keyframe rules which 
+     * currently do not function in scoped or shadow style elements.
+     * (See wkb.ug/72462)
+     * @param elementElement The <element> element to style.
+    */
+    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
+    installGlobalStyles: function() {
+      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
+      applyStyleToScope(style, document.head);
+    },
+    cssTextForScope: function(scopeDescriptor) {
+      var cssText = '';
+      // handle stylesheets
+      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
+      var matcher = function(s) {
+        return matchesSelector(s, selector);
+      };
+      var sheets = this.sheets.filter(matcher);
+      sheets.forEach(function(sheet) {
+        cssText += cssTextFromSheet(sheet) + '\n\n';
+      });
+      // handle cached style elements
+      var styles = this.styles.filter(matcher);
+      styles.forEach(function(style) {
+        cssText += style.textContent + '\n\n';
+      });
+      return cssText;
+    },
+    styleForScope: function(scopeDescriptor) {
+      var cssText = this.cssTextForScope(scopeDescriptor);
+      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
+    },
+    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
+      if (cssText) {
+        var style = createStyleElement(cssText);
+        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
+            '-' + scopeDescriptor);
+        return style;
+      }
+    }
+  };
+
+  function importRuleForSheet(sheet, baseUrl) {
+    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
+    return '@import \'' + href + '\';';
+  }
+
+  function applyStyleToScope(style, scope) {
+    if (style) {
+      if (scope === document) {
+        scope = document.head;
+      }
+      if (hasShadowDOMPolyfill) {
+        scope = document.head;
+      }
+      // TODO(sorvell): necessary for IE
+      // see https://connect.microsoft.com/IE/feedback/details/790212/
+      // cloning-a-style-element-and-adding-to-document-produces
+      // -unexpected-result#details
+      // var clone = style.cloneNode(true);
+      var clone = createStyleElement(style.textContent);
+      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
+      if (attr) {
+        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
+      }
+      // TODO(sorvell): probably too brittle; try to figure out 
+      // where to put the element.
+      var refNode = scope.firstElementChild;
+      if (scope === document.head) {
+        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
+        var s$ = document.head.querySelectorAll(selector);
+        if (s$.length) {
+          refNode = s$[s$.length-1].nextElementSibling;
+        }
+      }
+      scope.insertBefore(clone, refNode);
+    }
+  }
+
+  function createStyleElement(cssText, scope) {
+    scope = scope || document;
+    scope = scope.createElement ? scope : scope.ownerDocument;
+    var style = scope.createElement('style');
+    style.textContent = cssText;
+    return style;
+  }
+
+  function cssTextFromSheet(sheet) {
+    return (sheet && sheet.__resource) || '';
+  }
+
+  function matchesSelector(node, inSelector) {
+    if (matches) {
+      return matches.call(node, inSelector);
+    }
+  }
+  var p = HTMLElement.prototype;
+  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
+      || p.mozMatchesSelector;
+  
+  // exports
+
+  scope.api.declaration.styles = styles;
+  scope.applyStyleToScope = applyStyleToScope;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var api = scope.api.instance.events;
+  var EVENT_PREFIX = api.EVENT_PREFIX;
+
+  var mixedCaseEventTypes = {};
+  [
+    'webkitAnimationStart',
+    'webkitAnimationEnd',
+    'webkitTransitionEnd',
+    'DOMFocusOut',
+    'DOMFocusIn',
+    'DOMMouseScroll'
+  ].forEach(function(e) {
+    mixedCaseEventTypes[e.toLowerCase()] = e;
+  });
+
+  // polymer-element declarative api: events feature
+  var events = {
+    parseHostEvents: function() {
+      // our delegates map
+      var delegates = this.prototype.eventDelegates;
+      // extract data from attributes into delegates
+      this.addAttributeDelegates(delegates);
+    },
+    addAttributeDelegates: function(delegates) {
+      // for each attribute
+      for (var i=0, a; a=this.attributes[i]; i++) {
+        // does it have magic marker identifying it as an event delegate?
+        if (this.hasEventPrefix(a.name)) {
+          // if so, add the info to delegates
+          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
+              .replace('}}', '').trim();
+        }
+      }
+    },
+    // starts with 'on-'
+    hasEventPrefix: function (n) {
+      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
+    },
+    removeEventPrefix: function(n) {
+      return n.slice(prefixLength);
+    },
+    findController: function(node) {
+      while (node.parentNode) {
+        if (node.eventController) {
+          return node.eventController;
+        }
+        node = node.parentNode;
+      }
+      return node.host;
+    },
+    getEventHandler: function(controller, target, method) {
+      var events = this;
+      return function(e) {
+        if (!controller || !controller.PolymerBase) {
+          controller = events.findController(target);
+        }
+
+        var args = [e, e.detail, e.currentTarget];
+        controller.dispatchMethod(controller, method, args);
+      };
+    },
+    prepareEventBinding: function(pathString, name, node) {
+      if (!this.hasEventPrefix(name))
+        return;
+
+      var eventType = this.removeEventPrefix(name);
+      eventType = mixedCaseEventTypes[eventType] || eventType;
+
+      var events = this;
+
+      return function(model, node, oneTime) {
+        var handler = events.getEventHandler(undefined, node, pathString);
+        PolymerGestures.addEventListener(node, eventType, handler);
+
+        if (oneTime)
+          return;
+
+        // TODO(rafaelw): This is really pointless work. Aside from the cost
+        // of these allocations, NodeBind is going to setAttribute back to its
+        // current value. Fixing this would mean changing the TemplateBinding
+        // binding delegate API.
+        function bindingValue() {
+          return '{{ ' + pathString + ' }}';
+        }
+
+        return {
+          open: bindingValue,
+          discardChanges: bindingValue,
+          close: function() {
+            PolymerGestures.removeEventListener(node, eventType, handler);
+          }
+        };
+      };
+    }
+  };
+
+  var prefixLength = EVENT_PREFIX.length;
+
+  // exports
+  scope.api.declaration.events = events;
+
+})(Polymer);
+
+(function(scope) {
+
+  // element api
+
+  var observationBlacklist = ['attribute'];
+
+  var properties = {
+    inferObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var observe = prototype.observe, property;
+      for (var n in prototype) {
+        if (n.slice(-7) === 'Changed') {
+          property = n.slice(0, -7);
+          if (this.canObserveProperty(property)) {
+            if (!observe) {
+              observe  = (prototype.observe = {});
+            }
+            observe[property] = observe[property] || n;
+          }
+        }
+      }
+    },
+    canObserveProperty: function(property) {
+      return (observationBlacklist.indexOf(property) < 0);
+    },
+    explodeObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var o = prototype.observe;
+      if (o) {
+        var exploded = {};
+        for (var n in o) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            exploded[ni] = o[n];
+          }
+        }
+        prototype.observe = exploded;
+      }
+    },
+    optimizePropertyMaps: function(prototype) {
+      if (prototype.observe) {
+        // construct name list
+        var a = prototype._observeNames = [];
+        for (var n in prototype.observe) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            a.push(ni);
+          }
+        }
+      }
+      if (prototype.publish) {
+        // construct name list
+        var a = prototype._publishNames = [];
+        for (var n in prototype.publish) {
+          a.push(n);
+        }
+      }
+      if (prototype.computed) {
+        // construct name list
+        var a = prototype._computedNames = [];
+        for (var n in prototype.computed) {
+          a.push(n);
+        }
+      }
+    },
+    publishProperties: function(prototype, base) {
+      // if we have any properties to publish
+      var publish = prototype.publish;
+      if (publish) {
+        // transcribe `publish` entries onto own prototype
+        this.requireProperties(publish, prototype, base);
+        // warn and remove accessor names that are broken on some browsers
+        this.filterInvalidAccessorNames(publish);
+        // construct map of lower-cased property names
+        prototype._publishLC = this.lowerCaseMap(publish);
+      }
+      var computed = prototype.computed;
+      if (computed) {
+        // warn and remove accessor names that are broken on some browsers
+        this.filterInvalidAccessorNames(computed);
+      }
+    },
+    // Publishing/computing a property where the name might conflict with a
+    // browser property is not currently supported to help users of Polymer
+    // avoid browser bugs:
+    //
+    // https://code.google.com/p/chromium/issues/detail?id=43394
+    // https://bugs.webkit.org/show_bug.cgi?id=49739
+    //
+    // We can lift this restriction when those bugs are fixed.
+    filterInvalidAccessorNames: function(propertyNames) {
+      for (var name in propertyNames) {
+        // Check if the name is in our blacklist.
+        if (this.propertyNameBlacklist[name]) {
+          console.warn('Cannot define property "' + name + '" for element "' +
+            this.name + '" because it has the same name as an HTMLElement ' +
+            'property, and not all browsers support overriding that. ' +
+            'Consider giving it a different name.');
+          // Remove the invalid accessor from the list.
+          delete propertyNames[name];
+        }
+      }
+    },
+    //
+    // `name: value` entries in the `publish` object may need to generate 
+    // matching properties on the prototype.
+    //
+    // Values that are objects may have a `reflect` property, which
+    // signals that the value describes property control metadata.
+    // In metadata objects, the prototype default value (if any)
+    // is encoded in the `value` property.
+    //
+    // publish: {
+    //   foo: 5, 
+    //   bar: {value: true, reflect: true},
+    //   zot: {}
+    // }
+    //
+    // `reflect` metadata property controls whether changes to the property
+    // are reflected back to the attribute (default false). 
+    //
+    // A value is stored on the prototype unless it's === `undefined`,
+    // in which case the base chain is checked for a value.
+    // If the basal value is also undefined, `null` is stored on the prototype.
+    //
+    // The reflection data is stored on another prototype object, `reflect`
+    // which also can be specified directly.
+    //
+    // reflect: {
+    //   foo: true
+    // }
+    //
+    requireProperties: function(propertyInfos, prototype, base) {
+      // per-prototype storage for reflected properties
+      prototype.reflect = prototype.reflect || {};
+      // ensure a prototype value for each property
+      // and update the property's reflect to attribute status
+      for (var n in propertyInfos) {
+        var value = propertyInfos[n];
+        // value has metadata if it has a `reflect` property
+        if (value && value.reflect !== undefined) {
+          prototype.reflect[n] = Boolean(value.reflect);
+          value = value.value;
+        }
+        // only set a value if one is specified
+        if (value !== undefined) {
+          prototype[n] = value;
+        }
+      }
+    },
+    lowerCaseMap: function(properties) {
+      var map = {};
+      for (var n in properties) {
+        map[n.toLowerCase()] = n;
+      }
+      return map;
+    },
+    createPropertyAccessor: function(name, ignoreWrites) {
+      var proto = this.prototype;
+
+      var privateName = name + '_';
+      var privateObservable  = name + 'Observable_';
+      proto[privateName] = proto[name];
+
+      Object.defineProperty(proto, name, {
+        get: function() {
+          var observable = this[privateObservable];
+          if (observable)
+            observable.deliver();
+
+          return this[privateName];
+        },
+        set: function(value) {
+          if (ignoreWrites) {
+            return this[privateName];
+          }
+
+          var observable = this[privateObservable];
+          if (observable) {
+            observable.setValue(value);
+            return;
+          }
+
+          var oldValue = this[privateName];
+          this[privateName] = value;
+          this.emitPropertyChangeRecord(name, value, oldValue);
+
+          return value;
+        },
+        configurable: true
+      });
+    },
+    createPropertyAccessors: function(prototype) {
+      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, 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);
+          }
+        }
+      }
+    },
+    // This list contains some property names that people commonly want to use,
+    // but won't work because of Chrome/Safari bugs. It isn't an exhaustive
+    // list. In particular it doesn't contain any property names found on
+    // subtypes of HTMLElement (e.g. name, value). Rather it attempts to catch
+    // some common cases.
+    propertyNameBlacklist: {
+      children: 1,
+      'class': 1,
+      id: 1,
+      hidden: 1,
+      style: 1,
+      title: 1,
+    }
+  };
+
+  // exports
+
+  scope.api.declaration.properties = properties;
+
+})(Polymer);
+
+(function(scope) {
+
+  // magic words
+
+  var ATTRIBUTES_ATTRIBUTE = 'attributes';
+  var ATTRIBUTES_REGEX = /\s|,/;
+
+  // attributes api
+
+  var attributes = {
+    
+    inheritAttributesObjects: function(prototype) {
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject(prototype, 'publishLC');
+      // chain our instance attributes map to the inherited version
+      this.inheritObject(prototype, '_instanceAttributes');
+    },
+
+    publishAttributes: function(prototype, base) {
+      // merge names from 'attributes' attribute into the 'publish' object
+      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
+      if (attributes) {
+        // create a `publish` object if needed.
+        // the `publish` object is only relevant to this prototype, the 
+        // publishing logic in `declaration/properties.js` is responsible for
+        // managing property values on the prototype chain.
+        // TODO(sjmiles): the `publish` object is later chained to it's 
+        //                ancestor object, presumably this is only for 
+        //                reflection or other non-library uses. 
+        var publish = prototype.publish || (prototype.publish = {}); 
+        // names='a b c' or names='a,b,c'
+        var names = attributes.split(ATTRIBUTES_REGEX);
+        // record each name for publishing
+        for (var i=0, l=names.length, n; i<l; i++) {
+          // remove excess ws
+          n = names[i].trim();
+          // looks weird, but causes n to exist on `publish` if it does not;
+          // a more careful test would need expensive `in` operator
+          if (n && publish[n] === undefined) {
+            publish[n] = undefined;
+          }
+        }
+      }
+    },
+
+    // record clonable attributes from <element>
+    accumulateInstanceAttributes: function() {
+      // inherit instance attributes
+      var clonable = this.prototype._instanceAttributes;
+      // merge attributes from element
+      var a$ = this.attributes;
+      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
+        if (this.isInstanceAttribute(a.name)) {
+          clonable[a.name] = a.value;
+        }
+      }
+    },
+
+    isInstanceAttribute: function(name) {
+      return !this.blackList[name] && name.slice(0,3) !== 'on-';
+    },
+
+    // do not clone these attributes onto instances
+    blackList: {
+      name: 1,
+      'extends': 1,
+      constructor: 1,
+      noscript: 1,
+      assetpath: 1,
+      'cache-csstext': 1
+    }
+    
+  };
+
+  // add ATTRIBUTES_ATTRIBUTE to the blacklist
+  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
+
+  // exports
+
+  scope.api.declaration.attributes = attributes;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+  var events = scope.api.declaration.events;
+
+  var syntax = new PolymerExpressions();
+  var prepareBinding = syntax.prepareBinding;
+
+  // Polymer takes a first crack at the binding to see if it's a declarative
+  // event handler.
+  syntax.prepareBinding = function(pathString, name, node) {
+    return events.prepareEventBinding(pathString, name, node) ||
+           prepareBinding.call(syntax, pathString, name, node);
+  };
+
+  // declaration api supporting mdv
+  var mdv = {
+    syntax: syntax,
+    fetchTemplate: function() {
+      return this.querySelector('template');
+    },
+    templateContent: function() {
+      var template = this.fetchTemplate();
+      return template && template.content;
+    },
+    installBindingDelegate: function(template) {
+      if (template) {
+        template.bindingDelegate = this.syntax;
+      }
+    }
+  };
+
+  // exports
+  scope.api.declaration.mdv = mdv;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+  
+  var api = scope.api;
+  var isBase = scope.isBase;
+  var extend = scope.extend;
+
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // prototype api
+
+  var prototype = {
+
+    register: function(name, extendeeName) {
+      // build prototype combining extendee, Polymer base, and named api
+      this.buildPrototype(name, extendeeName);
+      // register our custom element with the platform
+      this.registerPrototype(name, extendeeName);
+      // reference constructor in a global named by 'constructor' attribute
+      this.publishConstructor();
+    },
+
+    buildPrototype: function(name, extendeeName) {
+      // get our custom prototype (before chaining)
+      var extension = scope.getRegisteredPrototype(name);
+      // get basal prototype
+      var base = this.generateBasePrototype(extendeeName);
+      // implement declarative features
+      this.desugarBeforeChaining(extension, base);
+      // join prototypes
+      this.prototype = this.chainPrototypes(extension, base);
+      // more declarative features
+      this.desugarAfterChaining(name, extendeeName);
+    },
+
+    desugarBeforeChaining: function(prototype, base) {
+      // back reference declaration element
+      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
+      prototype.element = this;
+      // transcribe `attributes` declarations onto own prototype's `publish`
+      this.publishAttributes(prototype, base);
+      // `publish` properties to the prototype and to attribute watch
+      this.publishProperties(prototype, base);
+      // infer observers for `observe` list based on method names
+      this.inferObservers(prototype);
+      // desugar compound observer syntax, e.g. 'a b c' 
+      this.explodeObservers(prototype);
+    },
+
+    chainPrototypes: function(prototype, base) {
+      // chain various meta-data objects to inherited versions
+      this.inheritMetaData(prototype, base);
+      // chain custom api to inherited
+      var chained = this.chainObject(prototype, base);
+      // x-platform fixup
+      ensurePrototypeTraversal(chained);
+      return chained;
+    },
+
+    inheritMetaData: function(prototype, base) {
+      // chain observe object to inherited
+      this.inheritObject('observe', prototype, base);
+      // chain publish object to inherited
+      this.inheritObject('publish', prototype, base);
+      // chain reflect object to inherited
+      this.inheritObject('reflect', prototype, base);
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject('_publishLC', prototype, base);
+      // chain our instance attributes map to the inherited version
+      this.inheritObject('_instanceAttributes', prototype, base);
+      // chain our event delegates map to the inherited version
+      this.inheritObject('eventDelegates', prototype, base);
+    },
+
+    // implement various declarative features
+    desugarAfterChaining: function(name, extendee) {
+      // build side-chained lists to optimize iterations
+      this.optimizePropertyMaps(this.prototype);
+      this.createPropertyAccessors(this.prototype);
+      // install mdv delegate on template
+      this.installBindingDelegate(this.fetchTemplate());
+      // install external stylesheets as if they are inline
+      this.installSheets();
+      // adjust any paths in dom from imports
+      this.resolveElementPaths(this);
+      // compile list of attributes to copy to instances
+      this.accumulateInstanceAttributes();
+      // parse on-* delegates declared on `this` element
+      this.parseHostEvents();
+      //
+      // install a helper method this.resolvePath to aid in 
+      // setting resource urls. e.g.
+      // this.$.image.src = this.resolvePath('images/foo.png')
+      this.addResolvePathApi();
+      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
+      if (hasShadowDOMPolyfill) {
+        WebComponents.ShadowCSS.shimStyling(this.templateContent(), name,
+          extendee);
+      }
+      // allow custom element access to the declarative context
+      if (this.prototype.registerCallback) {
+        this.prototype.registerCallback(this);
+      }
+    },
+
+    // if a named constructor is requested in element, map a reference
+    // to the constructor to the given symbol
+    publishConstructor: function() {
+      var symbol = this.getAttribute('constructor');
+      if (symbol) {
+        window[symbol] = this.ctor;
+      }
+    },
+
+    // build prototype combining extendee, Polymer base, and named api
+    generateBasePrototype: function(extnds) {
+      var prototype = this.findBasePrototype(extnds);
+      if (!prototype) {
+        // create a prototype based on tag-name extension
+        var prototype = HTMLElement.getPrototypeForTag(extnds);
+        // insert base api in inheritance chain (if needed)
+        prototype = this.ensureBaseApi(prototype);
+        // memoize this base
+        memoizedBases[extnds] = prototype;
+      }
+      return prototype;
+    },
+
+    findBasePrototype: function(name) {
+      return memoizedBases[name];
+    },
+
+    // install Polymer instance api into prototype chain, as needed 
+    ensureBaseApi: function(prototype) {
+      if (prototype.PolymerBase) {
+        return prototype;
+      }
+      var extended = Object.create(prototype);
+      // we need a unique copy of base api for each base prototype
+      // therefore we 'extend' here instead of simply chaining
+      api.publish(api.instance, extended);
+      // TODO(sjmiles): sharing methods across prototype chains is
+      // not supported by 'super' implementation which optimizes
+      // by memoizing prototype relationships.
+      // Probably we should have a version of 'extend' that is 
+      // share-aware: it could study the text of each function,
+      // look for usage of 'super', and wrap those functions in
+      // closures.
+      // As of now, there is only one problematic method, so 
+      // we just patch it manually.
+      // To avoid re-entrancy problems, the special super method
+      // installed is called `mixinSuper` and the mixin method
+      // must use this method instead of the default `super`.
+      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
+      // return buffed-up prototype
+      return extended;
+    },
+
+    mixinMethod: function(extended, prototype, api, name) {
+      var $super = function(args) {
+        return prototype[name].apply(this, args);
+      };
+      extended[name] = function() {
+        this.mixinSuper = $super;
+        return api[name].apply(this, arguments);
+      }
+    },
+
+    // ensure prototype[name] inherits from a prototype.prototype[name]
+    inheritObject: function(name, prototype, base) {
+      // require an object
+      var source = prototype[name] || {};
+      // chain inherited properties onto a new object
+      prototype[name] = this.chainObject(source, base[name]);
+    },
+
+    // register 'prototype' to custom element 'name', store constructor 
+    registerPrototype: function(name, extendee) { 
+      var info = {
+        prototype: this.prototype
+      }
+      // native element must be specified in extends
+      var typeExtension = this.findTypeExtension(extendee);
+      if (typeExtension) {
+        info.extends = typeExtension;
+      }
+      // register the prototype with HTMLElement for name lookup
+      HTMLElement.register(name, this.prototype);
+      // register the custom type
+      this.ctor = document.registerElement(name, info);
+    },
+
+    findTypeExtension: function(name) {
+      if (name && name.indexOf('-') < 0) {
+        return name;
+      } else {
+        var p = this.findBasePrototype(name);
+        if (p.element) {
+          return this.findTypeExtension(p.element.extends);
+        }
+      }
+    }
+
+  };
+
+  // memoize base prototypes
+  var memoizedBases = {};
+
+  // implementation of 'chainObject' depends on support for __proto__
+  if (Object.__proto__) {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        object.__proto__ = inherited;
+      }
+      return object;
+    }
+  } else {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        var chained = Object.create(inherited);
+        object = extend(chained, object);
+      }
+      return object;
+    }
+  }
+
+  // On platforms that do not support __proto__ (versions of IE), the prototype
+  // chain of a custom element is simulated via installation of __proto__.
+  // Although custom elements manages this, we install it here so it's
+  // available during desugaring.
+  function ensurePrototypeTraversal(prototype) {
+    if (!Object.__proto__) {
+      var ancestor = Object.getPrototypeOf(prototype);
+      prototype.__proto__ = ancestor;
+      if (isBase(ancestor)) {
+        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
+      }
+    }
+  }
+
+  // exports
+
+  api.declaration.prototype = prototype;
+
+})(Polymer);
+
+(function(scope) {
+
+  /*
+
+    Elements are added to a registration queue so that they register in 
+    the proper order at the appropriate time. We do this for a few reasons:
+
+    * to enable elements to load resources (like stylesheets) 
+    asynchronously. We need to do this until the platform provides an efficient
+    alternative. One issue is that remote @import stylesheets are 
+    re-fetched whenever stamped into a shadowRoot.
+
+    * to ensure elements loaded 'at the same time' (e.g. via some set of
+    imports) are registered as a batch. This allows elements to be enured from
+    upgrade ordering as long as they query the dom tree 1 task after
+    upgrade (aka domReady). This is a performance tradeoff. On the one hand,
+    elements that could register while imports are loading are prevented from 
+    doing so. On the other, grouping upgrades into a single task means less
+    incremental work (for example style recalcs),  Also, we can ensure the 
+    document is in a known state at the single quantum of time when 
+    elements upgrade.
+
+  */
+  var queue = {
+
+    // tell the queue to wait for an element to be ready
+    wait: function(element) {
+      if (!element.__queue) {
+        element.__queue = {};
+        elements.push(element);
+      }
+    },
+
+    // enqueue an element to the next spot in the queue.
+    enqueue: function(element, check, go) {
+      var shouldAdd = element.__queue && !element.__queue.check;
+      if (shouldAdd) {
+        queueForElement(element).push(element);
+        element.__queue.check = check;
+        element.__queue.go = go;
+      }
+      return (this.indexOf(element) !== 0);
+    },
+
+    indexOf: function(element) {
+      var i = queueForElement(element).indexOf(element);
+      if (i >= 0 && document.contains(element)) {
+        i += (HTMLImports.useNative || HTMLImports.ready) ? 
+          importQueue.length : 1e9;
+      }
+      return i;  
+    },
+
+    // tell the queue an element is ready to be registered
+    go: function(element) {
+      var readied = this.remove(element);
+      if (readied) {
+        element.__queue.flushable = true;
+        this.addToFlushQueue(readied);
+        this.check();
+      }
+    },
+
+    remove: function(element) {
+      var i = this.indexOf(element);
+      if (i !== 0) {
+        //console.warn('queue order wrong', i);
+        return;
+      }
+      return queueForElement(element).shift();
+    },
+
+    check: function() {
+      // next
+      var element = this.nextElement();
+      if (element) {
+        element.__queue.check.call(element);
+      }
+      if (this.canReady()) {
+        this.ready();
+        return true;
+      }
+    },
+
+    nextElement: function() {
+      return nextQueued();
+    },
+
+    canReady: function() {
+      return !this.waitToReady && this.isEmpty();
+    },
+
+    isEmpty: function() {
+      for (var i=0, l=elements.length, e; (i<l) && 
+          (e=elements[i]); i++) {
+        if (e.__queue && !e.__queue.flushable) {
+          return;
+        }
+      }
+      return true;
+    },
+
+    addToFlushQueue: function(element) {
+      flushQueue.push(element);  
+    },
+
+    flush: function() {
+      // prevent re-entrance
+      if (this.flushing) {
+        return;
+      }
+      this.flushing = true;
+      var element;
+      while (flushQueue.length) {
+        element = flushQueue.shift();
+        element.__queue.go.call(element);
+        element.__queue = null;
+      }
+      this.flushing = false;
+    },
+
+    ready: function() {
+      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
+      // while registering. This way we avoid having to upgrade each document
+      // piecemeal per registration and can instead register all elements
+      // and upgrade once in a batch. Without this optimization, upgrade time
+      // degrades significantly when SD polyfill is used. This is mainly because
+      // querying the document tree for elements is slow under the SD polyfill.
+      var polyfillWasReady = CustomElements.ready;
+      CustomElements.ready = false;
+      this.flush();
+      if (!CustomElements.useNative) {
+        CustomElements.upgradeDocumentTree(document);
+      }
+      CustomElements.ready = polyfillWasReady;
+      Polymer.flush();
+      requestAnimationFrame(this.flushReadyCallbacks);
+    },
+
+    addReadyCallback: function(callback) {
+      if (callback) {
+        readyCallbacks.push(callback);
+      }
+    },
+
+    flushReadyCallbacks: function() {
+      if (readyCallbacks) {
+        var fn;
+        while (readyCallbacks.length) {
+          fn = readyCallbacks.shift();
+          fn();
+        }
+      }
+    },
+  
+    /**
+    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
+
+  };
+
+  var elements = [];
+  var flushQueue = [];
+  var importQueue = [];
+  var mainQueue = [];
+  var readyCallbacks = [];
+
+  function queueForElement(element) {
+    return document.contains(element) ? mainQueue : importQueue;
+  }
+
+  function nextQueued() {
+    return importQueue.length ? importQueue[0] : mainQueue[0];
+  }
+
+  function whenReady(callback) {
+    queue.waitToReady = true;
+    Polymer.endOfMicrotask(function() {
+      HTMLImports.whenReady(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);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+  var queue = scope.queue;
+  var whenReady = scope.whenReady;
+  var getRegisteredPrototype = scope.getRegisteredPrototype;
+  var waitingForPrototype = scope.waitingForPrototype;
+
+  // declarative implementation: <polymer-element>
+
+  var prototype = extend(Object.create(HTMLElement.prototype), {
+
+    createdCallback: function() {
+      if (this.getAttribute('name')) {
+        this.init();
+      }
+    },
+
+    init: function() {
+      // fetch declared values
+      this.name = this.getAttribute('name');
+      this.extends = this.getAttribute('extends');
+      queue.wait(this);
+      // initiate any async resource fetches
+      this.loadResources();
+      // register when all constraints are met
+      this.registerWhenReady();
+    },
+
+    // TODO(sorvell): we currently queue in the order the prototypes are 
+    // registered, but we should queue in the order that polymer-elements
+    // are registered. We are currently blocked from doing this based on 
+    // crbug.com/395686.
+    registerWhenReady: function() {
+     if (this.registered
+       || this.waitingForPrototype(this.name)
+       || this.waitingForQueue()
+       || this.waitingForResources()) {
+          return;
+      }
+      queue.go(this);
+    },
+
+    _register: function() {
+      //console.log('registering', this.name);
+      // warn if extending from a custom element not registered via Polymer
+      if (isCustomTag(this.extends) && !isRegistered(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 = true;
+    },
+
+    waitingForPrototype: function(name) {
+      if (!getRegisteredPrototype(name)) {
+        // then wait for a prototype
+        waitingForPrototype(name, this);
+        // emulate script if user is not supplying one
+        this.handleNoScript(name);
+        // prototype not ready yet
+        return true;
+      }
+    },
+
+    handleNoScript: function(name) {
+      // if explicitly marked as 'noscript'
+      if (this.hasAttribute('noscript') && !this.noscript) {
+        this.noscript = true;
+        // imperative element registration
+        Polymer(name);
+      }
+    },
+
+    waitingForResources: function() {
+      return this._needsResources;
+    },
+
+    // NOTE: Elements must be queued in proper order for inheritance/composition
+    // dependency resolution. Previously this was enforced for inheritance,
+    // and by rule for composition. It's now entirely by rule.
+    waitingForQueue: function() {
+      return queue.enqueue(this, this.registerWhenReady, this._register);
+    },
+
+    loadResources: function() {
+      this._needsResources = true;
+      this.loadStyles(function() {
+        this._needsResources = false;
+        this.registerWhenReady();
+      }.bind(this));
+    }
+
+  });
+
+  // semi-pluggable APIs 
+
+  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
+  // the various plugins are allowed to depend on each other directly)
+  api.publish(api.declaration, prototype);
+
+  // utility and bookkeeping
+
+  function isRegistered(name) {
+    return Boolean(HTMLElement.getPrototypeForTag(name));
+  }
+
+  function isCustomTag(name) {
+    return (name && name.indexOf('-') >= 0);
+  }
+
+  // boot tasks
+
+  whenReady(function() {
+    document.body.removeAttribute('unresolved');
+    document.dispatchEvent(
+      new CustomEvent('polymer-ready', {bubbles: true})
+    );
+  });
+
+  // register polymer-element with document
+
+  document.registerElement('polymer-element', {prototype: prototype});
+
+})(Polymer);
+
+(function(scope) {
+
+/**
+ * @class Polymer
+ */
+
+var whenReady = scope.whenReady;
+
+/**
+ * Loads the set of HTMLImports contained in `node`. Notifies when all
+ * the imports have loaded by calling the `callback` function argument.
+ * This method can be used to lazily load imports. For example, given a 
+ * template:
+ *     
+ *     <template>
+ *       <link rel="import" href="my-import1.html">
+ *       <link rel="import" href="my-import2.html">
+ *     </template>
+ *
+ *     Polymer.importElements(template.content, function() {
+ *       console.log('imports lazily loaded'); 
+ *     });
+ * 
+ * @method importElements
+ * @param {Node} node Node containing the HTMLImports to load.
+ * @param {Function} callback Callback called when all imports have loaded.
+ */
+function importElements(node, callback) {
+  if (node) {
+    document.head.appendChild(node);
+    whenReady(callback);
+  } else if (callback) {
+    callback();
+  }
+}
+
+/**
+ * Loads an HTMLImport for each url specified in the `urls` array.
+ * Notifies when all the imports have loaded by calling the `callback` 
+ * function argument. This method can be used to lazily load imports. 
+ * For example,
+ *
+ *     Polymer.import(['my-import1.html', 'my-import2.html'], function() {
+ *       console.log('imports lazily loaded'); 
+ *     });
+ * 
+ * @method import
+ * @param {Array} urls Array of urls to load as HTMLImports.
+ * @param {Function} callback Callback called when all imports have loaded.
+ */
+function _import(urls, callback) {
+  if (urls && urls.length) {
+      var frag = document.createDocumentFragment();
+      for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
+        link = document.createElement('link');
+        link.rel = 'import';
+        link.href = url;
+        frag.appendChild(link);
+      }
+      importElements(frag, callback);
+  } else if (callback) {
+    callback();
+  }
+}
+
+// exports
+scope.import = _import;
+scope.importElements = importElements;
+
+})(Polymer);
+
+/**
+ * The `auto-binding` element extends the template element. It provides a quick 
+ * and easy way to do data binding without the need to setup a model. 
+ * The `auto-binding` element itself serves as the model and controller for the 
+ * elements it contains. Both data and event handlers can be bound. 
+ *
+ * The `auto-binding` element acts just like a template that is bound to 
+ * a model. It stamps its content in the dom adjacent to itself. When the 
+ * content is stamped, the `template-bound` event is fired.
+ *
+ * Example:
+ *
+ *     <template is="auto-binding">
+ *       <div>Say something: <input value="{{value}}"></div>
+ *       <div>You said: {{value}}</div>
+ *       <button on-tap="{{buttonTap}}">Tap me!</button>
+ *     </template>
+ *     <script>
+ *       var template = document.querySelector('template');
+ *       template.value = 'something';
+ *       template.buttonTap = function() {
+ *         console.log('tap!');
+ *       };
+ *     </script>
+ *
+ * @module Polymer
+ * @status stable
+*/
+
+(function() {
+
+  var element = document.createElement('polymer-element');
+  element.setAttribute('name', 'auto-binding');
+  element.setAttribute('extends', 'template');
+  element.init();
+
+  Polymer('auto-binding', {
+
+    createdCallback: function() {
+      this.syntax = this.bindingDelegate = this.makeSyntax();
+      // delay stamping until polymer-ready so that auto-binding is not
+      // required to load last.
+      Polymer.whenPolymerReady(function() {
+        this.model = this;
+        this.setAttribute('bind', '');
+        // we don't bother with an explicit signal here, we could ust a MO
+        // if necessary
+        this.async(function() {
+          // note: this will marshall *all* the elements in the parentNode
+          // rather than just stamped ones. We'd need to use createInstance
+          // to fix this or something else fancier.
+          this.marshalNodeReferences(this.parentNode);
+          // template stamping is asynchronous so stamping isn't complete
+          // by polymer-ready; fire an event so users can use stamped elements
+          this.fire('template-bound');
+        });
+      }.bind(this));
+    },
+
+    makeSyntax: function() {
+      var events = Object.create(Polymer.api.declaration.events);
+      var self = this;
+      events.findController = function() { return self.model; };
+
+      var syntax = new PolymerExpressions();
+      var prepareBinding = syntax.prepareBinding;  
+      syntax.prepareBinding = function(pathString, name, node) {
+        return events.prepareEventBinding(pathString, name, node) ||
+               prepareBinding.call(syntax, pathString, name, node);
+      };
+      return syntax;
+    }
+
+  });
+
+})();
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
deleted file mode 100644
index 3b56988..0000000
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"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","whenReady","doc","rootDocument","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","IMPORT_LINK_TYPE","hasNative","isIE","hasShadowDOMPolyfill","wrapIfNeeded","currentScriptDescriptor","script","currentScript","scripts","MutationObserver","mxns","addedNodes","observe","childList","readyTime","getTime","withDependencies","task","depends","marshal","module","dependsOrFactory","moduleFactory","modules","using","whenImportsReady","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,GAuCV,QAAS0pB,GAAUtgB,EAAUugB,GAC3BA,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,KACFC,GAAUhf,GAAMnC,GAClBA,IAGL,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,IAvJxC,GAAIiB,GAAmB,SACnBC,EAAaD,IAAoBlrB,UAASC,cAAc,QACxD8oB,EAAYoC,EACZC,EAAO,UAAUhF,KAAKpR,UAAUM,WAGhC+V,EAAuB/pB,QAAQ3B,OAAOiG,mBACtCyjB,EAAO,SAAS/kB,GAClB,MAAO+mB,GAAuBzlB,kBAAkB0lB,aAAahnB,GAAQA,GAGnEmlB,EAAeJ,EAAKrpB,UAMpBurB,GACFxiB,IAAK,WACH,GAAIyiB,GAASpC,YAAYqC,eAAiBzrB,SAASyrB,gBAItB,aAAxBzrB,SAAS6pB,WACV7pB,SAAS0rB,QAAQ1rB,SAAS0rB,QAAQ3oB,OAAS,GAAK,KACpD,OAAOsmB,GAAKmC,IAEdjD,cAAc,EAGhBvhB,QAAOshB,eAAetoB,SAAU,iBAAkBurB,GAClDvkB,OAAOshB,eAAemB,EAAc,iBAAkB8B,EAetD,IAAIzB,GAAqBsB,EAAO,WAAa,cACzCpB,EAAc,kBA6EdjB,KACF,GAAI4C,kBAAiB,SAASC,GAC5B,IAAK,GAAwB1jB,GAApB9E,EAAE,EAAGgI,EAAEwgB,EAAK7oB,OAAgBqI,EAAJhI,IAAW8E,EAAE0jB,EAAKxoB,IAAKA,IAClD8E,EAAE2jB,YACJhB,EAAc3iB,EAAE2jB,cAGnBC,QAAQ9rB,SAASY,MAAOmrB,WAAW,IA0BtC,WACE,GAA4B,YAAxB/rB,SAAS6pB,WAEX,IAAK,GAA2BW,GAD5BF,EAAUtqB,SAASuqB,iBAAiB,oBAC/BnnB,EAAE,EAAGgI,EAAEkf,EAAQvnB,OAAgBqI,EAAFhI,IAASonB,EAAIF,EAAQlnB,IAAKA,IAC9D2nB,EAAaP,OAWrBjB,EAAU,WACRH,YAAYJ,OAAQ,EACpBI,YAAY4C,WAAY,GAAI1U,OAAO2U,UACnCxC,EAAa5oB,cACX,GAAIH,aAAY,qBAAsBC,SAAS,OAKnDd,EAAMkpB,UAAYA,EAClBlpB,EAAM4qB,eAAiBA,EACvB5qB,EAAM0pB,UAAYA,EAClB1pB,EAAM4pB,aAAeA,EACrB5pB,EAAMqrB,iBAAmBA,EACzBrrB,EAAMurB,KAAOA,GAEVzrB,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,YAAYuD,iBAAiB,WAC3BT,EAAiBC,EAAMC,KAJ3B,GAAIK,KAUJ5sB,GAAMwsB,QAAUA,EAEhBxsB,EAAM+sB,WAAaN,EACnBzsB,EAAM6sB,MAAQA,GAEb/sB,QAWH,WAQE,GAAI8F,GAAQzF,SAASC,cAAc,QACnCwF,GAAMS,YAAc,kHAQpB,IAAItF,GAAOZ,SAAS8B,cAAc,OAClClB,GAAKisB,aAAapnB,EAAO7E,EAAKksB,aAE7BnE,UAWH,SAAUpQ,GACR,YAKA,SAASwU,KAQP,QAAS9jB,GAAS+jB,GAChBC,EAAUD,EARZ,GAA8B,kBAAnBhmB,QAAO8kB,SACW,kBAAlBnc,OAAMmc,QACf,OAAO,CAGT,IAAImB,MAMA7G,KACAG,IAUJ,OATAvf,QAAO8kB,QAAQ1F,EAAMnd,GACrB0G,MAAMmc,QAAQvF,EAAKtd,GACnBmd,EAAK1U,GAAK,EACV0U,EAAK1U,GAAK,QACH0U,GAAK1U,GACZ6U,EAAIrkB,KAAK,EAAG,GACZqkB,EAAIxjB,OAAS,EAEbiE,OAAOkmB,qBAAqBjkB,GACL,IAAnBgkB,EAAQlqB,QACH,EAEc,OAAnBkqB,EAAQ,GAAGzhB,MACQ,UAAnByhB,EAAQ,GAAGzhB,MACQ,UAAnByhB,EAAQ,GAAGzhB,MACQ,UAAnByhB,EAAQ,GAAGzhB,MACQ,UAAnByhB,EAAQ,GAAGzhB,MACN,GAGTxE,OAAOmmB,UAAU/G,EAAMnd,GACvB0G,MAAMwd,UAAU5G,EAAKtd,IAEd,GAKT,QAASmkB,KAGP,GAAsB,mBAAXC,SAA0BA,OAAOC,KAAOD,OAAOC,IAAIC,QAC5D,OAAO,CAMT,IAAwB,mBAAbvY,YAA4BA,UAAUwY,iBAC/C,OAAO,CAGT,KACE,GAAIC,GAAI,GAAIC,UAAS,GAAI,eACzB,OAAOD,KACP,MAAOpM,GACP,OAAO,GAMX,QAASsM,GAAQvtB,GACf,OAAQA,IAAMA,IAAM,GAAW,KAANA,EAG3B,QAASwtB,GAASxtB,GAChB,OAAQA,EAGV,QAASytB,GAAShjB,GAChB,MAAOA,KAAQ7D,OAAO6D,GAOxB,QAASijB,GAAarpB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpCqpB,EAAYtpB,IAASspB,EAAYrpB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAqBpC,QAASspB,GAAgBC,GACvB,GAAa9Y,SAAT8Y,EACF,MAAO,KAET,IAAI/T,GAAO+T,EAAK5U,WAAW,EAE3B,QAAOa,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,MAAO+T,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,MAAa/T,IAAR,IAAwB,KAARA,GAA0BA,GAAR,IAAwB,IAARA,EAC9C,QAGGA,GAAR,IAAwB,IAARA,EACX,SAEF,OAuET,QAASgU,MAET,QAASC,GAAU3tB,GAsBjB,QAAS4tB,KACP,KAAIhkB,GAAS5J,EAAKuC,QAAlB,CAGA,GAAIsrB,GAAW7tB,EAAK4J,EAAQ,EAC5B,OAAa,iBAARkkB,GAAuC,KAAZD,GACnB,iBAARC,GAAuC,KAAZD,GAC9BjkB,IACAmkB,EAAUF,EACVG,EAAQC,UACD,GALT,QASF,IAnCA,GAEIrL,GAAGmL,EAAShb,EAAK/H,EAAMkjB,EAAYC,EAAQC,EAF3CznB,KACAiD,EAAQ,GAC4CkkB,EAAO,aAE3DE,GACFtsB,KAAM,WACQiT,SAAR5B,IAGJpM,EAAKjF,KAAKqR,GACVA,EAAM4B,SAGRsZ,OAAQ,WACMtZ,SAAR5B,EACFA,EAAMgb,EAENhb,GAAOgb,IAkBND,GAIL,GAHAlkB,IACAgZ,EAAI5iB,EAAK4J,GAEA,MAALgZ,IAAagL,EAAmBE,GAApC,CAOA,GAJA9iB,EAAOwiB,EAAgB5K,GACvBwL,EAAUC,EAAiBP,GAC3BI,EAAaE,EAAQpjB,IAASojB,EAAQ,SAAW,QAE/B,SAAdF,EACF,MAOF,IALAJ,EAAOI,EAAW,GAClBC,EAASH,EAAQE,EAAW,KAAOR,EACnCK,EAA4BpZ,SAAlBuZ,EAAW,GAAmBtL,EAAIsL,EAAW,GACvDC,IAEa,cAATL,EACF,MAAOnnB,IAOb,QAAS2nB,GAAQ1uB,GACf,MAAO2uB,GAAY3I,KAAKhmB,GAK1B,QAAS+hB,GAAKoC,EAAOyK,GACnB,GAAIA,IAAiBC,EACnB,KAAMtW,OAAM,wCAEd,KAAK,GAAIvV,GAAI,EAAGA,EAAImhB,EAAMxhB,OAAQK,IAChC3B,KAAKS,KAAK6D,OAAOwe,EAAMnhB,IAGrB8rB,IAAWztB,KAAKsB,SAClBtB,KAAKuiB,aAAeviB,KAAK0tB,0BAO7B,QAASC,GAAQ1L,GACf,GAAIA,YAAsBvB,GACxB,MAAOuB,EAKT,KAHkB,MAAdA,GAA2C,GAArBA,EAAW3gB,UACnC2gB,EAAa,IAEU,gBAAdA,GAAwB,CACjC,GAAIiK,EAAQjK,EAAW3gB,QAErB,MAAO,IAAIof,GAAKuB,EAAYuL,EAG9BvL,GAAa3d,OAAO2d,GAGtB,GAAIljB,GAAO6uB,EAAU3L,EACrB,IAAIljB,EACF,MAAOA,EAET,IAAI+jB,GAAQ4J,EAAUzK,EACtB,KAAKa,EACH,MAAO+K,EAET,IAAI9uB,GAAO,GAAI2hB,GAAKoC,EAAO0K,EAE3B,OADAI,GAAU3L,GAAcljB,EACjBA,EAKT,QAAS+uB,GAAehc,GACtB,MAAIoa,GAAQpa,GACH,IAAMA,EAAM,IAEZ,KAAOA,EAAIuI,QAAQ,KAAM,OAAS,KAqF7C,QAAS0T,GAAW1L,GAElB,IADA,GAAI2L,GAAS,EACGC,EAATD,GAAmC3L,EAAS6L,UACjDF,GAKF,OAHIG,KACFrX,EAAOsX,qBAAuBJ,GAEzBA,EAAS,EAGlB,QAASK,GAAc1N,GACrB,IAAK,GAAIkB,KAAQlB,GACf,OAAO,CACT,QAAO,EAGT,QAAS2N,GAAYC,GACnB,MAAOF,GAAcE,EAAKC,QACnBH,EAAcE,EAAKE,UACnBJ,EAAcE,EAAKG,SAG5B,QAASC,GAAwBhO,EAAQiO,GACvC,GAAIJ,MACAC,KACAC,IAEJ,KAAK,GAAI7M,KAAQ+M,GAAW,CAC1B,GAAInM,GAAW9B,EAAOkB,IAELnO,SAAb+O,GAA0BA,IAAamM,EAAU/M,MAG/CA,IAAQlB,GAKV8B,IAAamM,EAAU/M,KACzB6M,EAAQ7M,GAAQY,GALhBgM,EAAQ5M,GAAQnO,QAQpB,IAAK,GAAImO,KAAQlB,GACXkB,IAAQ+M,KAGZJ,EAAM3M,GAAQlB,EAAOkB,GAMvB,OAHI3T,OAAM2gB,QAAQlO,IAAWA,EAAOrf,SAAWstB,EAAUttB,SACvDotB,EAAQptB,OAASqf,EAAOrf,SAGxBktB,MAAOA,EACPC,QAASA,EACTC,QAASA,GAKb,QAASI,KACP,IAAKC,GAASztB,OACZ,OAAO,CAET,KAAK,GAAIK,GAAI,EAAGA,EAAIotB,GAASztB,OAAQK,IACnCotB,GAASptB,IAGX,OADAotB,IAASztB,OAAS,GACX,EA4BT,QAAS0tB,KAMP,QAASxnB,GAASgkB,GACZnJ,GAAYA,EAAS4M,SAAWC,KAAWC,GAC7C9M,EAAS6L,OAAO1C,GAPpB,GAAInJ,GACA1B,EACAwO,GAAiB,EACjBC,GAAQ,CAOZ,QACEpK,KAAM,SAASqK,GACb,GAAIhN,EACF,KAAMnL,OAAM,wBAETkY,IACH7pB,OAAOkmB,qBAAqBjkB,GAE9B6a,EAAWgN,EACXD,GAAQ,GAEV/E,QAAS,SAASjhB,EAAKkmB,GACrB3O,EAASvX,EACLkmB,EACFphB,MAAMmc,QAAQ1J,EAAQnZ,GAEtBjC,OAAO8kB,QAAQ1J,EAAQnZ,IAE3B0d,QAAS,SAASqK,GAChBJ,EAAiBI,EACjBhqB,OAAOkmB,qBAAqBjkB,GAC5B2nB,GAAiB,GAEnBhK,MAAO,WACL9C,EAAW3O,OACXnO,OAAOmmB,UAAU/K,EAAQnZ,GACzBgoB,GAAoB/uB,KAAKT,QA2B/B,QAASyvB,GAAkBpN,EAAU1B,EAAQ2O,GAC3C,GAAII,GAAMF,GAAoB3S,OAASmS,GAGvC,OAFAU,GAAI1K,KAAK3C,GACTqN,EAAIrF,QAAQ1J,EAAQ2O,GACbI,EAKT,QAASC,KAOP,QAAStF,GAAQjhB,EAAKyY,GACfzY,IAGDA,IAAQwmB,IACVC,EAAahO,IAAQ,GAEnBiO,EAAQ5oB,QAAQkC,GAAO,IACzB0mB,EAAQrvB,KAAK2I,GACb7D,OAAO8kB,QAAQjhB,EAAK5B,IAGtB6iB,EAAQ9kB,OAAOwqB,eAAe3mB,GAAMyY,IAGtC,QAASmO,GAA2BzE,GAClC,IAAK,GAAI5pB,GAAI,EAAGA,EAAI4pB,EAAKjqB,OAAQK,IAAK,CACpC,GAAIsuB,GAAM1E,EAAK5pB,EACf,IAAIsuB,EAAItP,SAAWiP,GACfC,EAAaI,EAAIlnB,OACJ,iBAAbknB,EAAIlmB,KACN,OAAO,EAGX,OAAO,EAGT,QAASvC,GAAS+jB,GAChB,IAAIyE,EAA2BzE,GAA/B,CAIA,IAAK,GADDlJ,GACK1gB,EAAI,EAAGA,EAAIuuB,EAAU5uB,OAAQK,IACpC0gB,EAAW6N,EAAUvuB,GACjB0gB,EAAS4M,QAAUC,IACrB7M,EAAS8N,gBAAgB9F,EAI7B,KAAK,GAAI1oB,GAAI,EAAGA,EAAIuuB,EAAU5uB,OAAQK,IACpC0gB,EAAW6N,EAAUvuB,GACjB0gB,EAAS4M,QAAUC,IACrB7M,EAAS6L,UAhDf,GAGI0B,GACAC,EAJAO,EAAgB,EAChBF,KACAJ,KAmDAO,GACF1P,OAAQjN,OACRoc,QAASA,EACT9K,KAAM,SAASqK,EAAK1O,GACbiP,IACHA,EAAUjP,EACVkP,MAGFK,EAAUzvB,KAAK4uB,GACfe,IACAf,EAAIc,gBAAgB9F,IAEtBlF,MAAO,WAEL,GADAiL,MACIA,EAAgB,GAApB,CAIA,IAAK,GAAIzuB,GAAI,EAAGA,EAAImuB,EAAQxuB,OAAQK,IAClC4D,OAAOmmB,UAAUoE,EAAQnuB,GAAI6F,GAC7B8oB,EAASC,iBAGXL,GAAU5uB,OAAS,EACnBwuB,EAAQxuB,OAAS,EACjBsuB,EAAUlc,OACVmc,EAAenc,OACf8c,GAAiB/vB,KAAKT,QAI1B,OAAOqwB,GAKT,QAASI,GAAepO,EAAUjZ,GAMhC,MALKsnB,IAAmBA,EAAgB/P,SAAWvX,IACjDsnB,EAAkBF,GAAiB3T,OAAS8S,IAC5Ce,EAAgB/P,OAASvX,GAE3BsnB,EAAgB1L,KAAK3C,EAAUjZ,GACxBsnB,EAUT,QAASJ,KACPtwB,KAAKivB,OAAS0B,GACd3wB,KAAK4wB,UAAYld,OACjB1T,KAAK6wB,QAAUnd,OACf1T,KAAK8wB,gBAAkBpd,OACvB1T,KAAKyhB,OAAS/N,OACd1T,KAAK+wB,IAAMC,KA2Db,QAASC,GAAS5O,GAChBiO,EAASY,qBACJC,IAGLC,GAAa3wB,KAAK4hB,GAGpB,QAASgP,KACPf,EAASY,qBAmDX,QAASI,GAAe3Q,GACtB2P,EAAS5oB,KAAK1H,MACdA,KAAKyhB,OAASd,EACd3gB,KAAKuxB,WAAa7d,OA0FpB,QAAS8d,GAAcC,GACrB,IAAKvjB,MAAM2gB,QAAQ4C,GACjB,KAAMva,OAAM,kCACdoa,GAAe5pB,KAAK1H,KAAMyxB,GAgD5B,QAASlL,GAAa5F,EAAQ5hB,GAC5BuxB,EAAS5oB,KAAK1H,MAEdA,KAAK0xB,QAAU/Q,EACf3gB,KAAK2xB,MAAQhE,EAAQ5uB,GACrBiB,KAAK8wB,gBAAkBpd,OA8CzB,QAASgS,GAAiBkM,GACxBtB,EAAS5oB,KAAK1H,MAEdA,KAAK6xB,qBAAuBD,EAC5B5xB,KAAKyhB,UACLzhB,KAAK8wB,gBAAkBpd,OACvB1T,KAAK8xB,aAgIP,QAASC,GAAQlgB,GAAS,MAAOA,GAEjC,QAAS8T,GAAkBqM,EAAYC,EAAYxM,EACxByM,GACzBlyB,KAAK4wB,UAAYld,OACjB1T,KAAK6wB,QAAUnd,OACf1T,KAAKyhB,OAAS/N,OACd1T,KAAKmyB,YAAcH,EACnBhyB,KAAKoyB,YAAcH,GAAcF,EACjC/xB,KAAKqyB,YAAc5M,GAAcsM,EAGjC/xB,KAAKsyB,oBAAsBJ,EAsD7B,QAASK,GAA4B5R,EAAQ6R,EAAeC,GAI1D,IAAK,GAHDjE,MACAC,KAEK9sB,EAAI,EAAGA,EAAI6wB,EAAclxB,OAAQK,IAAK,CAC7C,GAAI0uB,GAASmC,EAAc7wB,EACtB+wB,IAAoBrC,EAAOtmB,OAM1BsmB,EAAOtnB,OAAQ0pB,KACnBA,EAAUpC,EAAOtnB,MAAQsnB,EAAOsC,UAEf,UAAftC,EAAOtmB,OAGQ,OAAfsmB,EAAOtmB,KAUPsmB,EAAOtnB,OAAQylB,UACVA,GAAM6B,EAAOtnB,YACb0pB,GAAUpC,EAAOtnB,OAExB0lB,EAAQ4B,EAAOtnB,OAAQ,EAbnBsnB,EAAOtnB,OAAQ0lB,SACVA,GAAQ4B,EAAOtnB,MAEtBylB,EAAM6B,EAAOtnB,OAAQ,KAfvB8W,QAAQ5F,MAAM,8BAAgCoW,EAAOtmB,MACrD8V,QAAQ5F,MAAMoW,IA4BlB,IAAK,GAAIxO,KAAQ2M,GACfA,EAAM3M,GAAQlB,EAAOkB,EAEvB,KAAK,GAAIA,KAAQ4M,GACfA,EAAQ5M,GAAQnO,MAElB,IAAIgb,KACJ,KAAK,GAAI7M,KAAQ4Q,GACf,KAAI5Q,IAAQ2M,IAAS3M,IAAQ4M,IAA7B,CAGA,GAAIhM,GAAW9B,EAAOkB,EAClB4Q,GAAU5Q,KAAUY,IACtBiM,EAAQ7M,GAAQY,GAGpB,OACE+L,MAAOA,EACPC,QAASA,EACTC,QAASA,GAIb,QAASkE,GAAUjqB,EAAO8lB,EAASoE,GACjC,OACElqB,MAAOA,EACP8lB,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,EAASlrB,EAAO8lB,EAASoE,GAO5C,IAAK,GALDxrB,GAASurB,EAAUjqB,EAAO8lB,EAASoE,GAEnCiB,GAAW,EACXC,EAAkB,EAEbpyB,EAAI,EAAGA,EAAIkyB,EAAQvyB,OAAQK,IAAK,CACvC,GAAIqxB,GAAUa,EAAQlyB,EAGtB,IAFAqxB,EAAQrqB,OAASorB,GAEbD,EAAJ,CAGA,GAAIE,GAAiBT,EAAUlsB,EAAOsB,MACPtB,EAAOsB,MAAQtB,EAAOonB,QAAQntB,OAC9B0xB,EAAQrqB,MACRqqB,EAAQrqB,MAAQqqB,EAAQH,WAEvD,IAAImB,GAAkB,EAAG,CAGvBH,EAAQxsB,OAAO1F,EAAG,GAClBA,IAEAoyB,GAAmBf,EAAQH,WAAaG,EAAQvE,QAAQntB,OAExD+F,EAAOwrB,YAAcG,EAAQH,WAAamB,CAC1C,IAAIC,GAAc5sB,EAAOonB,QAAQntB,OACf0xB,EAAQvE,QAAQntB,OAAS0yB,CAE3C,IAAK3sB,EAAOwrB,YAAeoB,EAGpB,CACL,GAAIxF,GAAUuE,EAAQvE,OAEtB,IAAIpnB,EAAOsB,MAAQqqB,EAAQrqB,MAAO,CAEhC,GAAIurB,GAAU7sB,EAAOonB,QAAQ3W,MAAM,EAAGkb,EAAQrqB,MAAQtB,EAAOsB,MAC7DuF,OAAMpH,UAAUrG,KAAK6iB,MAAM4Q,EAASzF,GACpCA,EAAUyF,EAGZ,GAAI7sB,EAAOsB,MAAQtB,EAAOonB,QAAQntB,OAAS0xB,EAAQrqB,MAAQqqB,EAAQH,WAAY,CAE7E,GAAI7F,GAAS3lB,EAAOonB,QAAQ3W,MAAMkb,EAAQrqB,MAAQqqB,EAAQH,WAAaxrB,EAAOsB,MAC9EuF,OAAMpH,UAAUrG,KAAK6iB,MAAMmL,EAASzB,GAGtC3lB,EAAOonB,QAAUA,EACbuE,EAAQrqB,MAAQtB,EAAOsB,QACzBtB,EAAOsB,MAAQqqB,EAAQrqB,WAnBzBmrB,IAAW,MAsBR,IAAIzsB,EAAOsB,MAAQqqB,EAAQrqB,MAAO,CAGvCmrB,GAAW,EAEXD,EAAQxsB,OAAO1F,EAAG,EAAG0F,GACrB1F,GAEA,IAAIwyB,GAAS9sB,EAAOwrB,WAAaxrB,EAAOonB,QAAQntB,MAChD0xB,GAAQrqB,OAASwrB,EACjBJ,GAAmBI,IAIlBL,GACHD,EAAQpzB,KAAK4G,GAGjB,QAAS+sB,GAAqB3C,EAAOe,GAGnC,IAAK,GAFDqB,MAEKlyB,EAAI,EAAGA,EAAI6wB,EAAclxB,OAAQK,IAAK,CAC7C,GAAI0uB,GAASmC,EAAc7wB,EAC3B,QAAO0uB,EAAOtmB,MACZ,IAAK,SACH6pB,EAAYC,EAASxD,EAAO1nB,MAAO0nB,EAAO5B,QAAQ3W,QAASuY,EAAOwC,WAClE,MACF,KAAK,MACL,IAAK,SACL,IAAK,SACH,IAAK3G,EAAQmE,EAAOtnB,MAClB,QACF,IAAIJ,GAAQwjB,EAASkE,EAAOtnB,KAC5B,IAAY,EAARJ,EACF,QACFirB,GAAYC,EAASlrB,GAAQ0nB,EAAOsC,UAAW,EAC/C,MACF,SACE9S,QAAQ5F,MAAM,2BAA6Boa,KAAKC,UAAUjE,KAKhE,MAAOwD,GAGT,QAASU,GAAoB9C,EAAOe,GAClC,GAAIqB,KAcJ,OAZAO,GAAqB3C,EAAOe,GAAepuB,QAAQ,SAASiD,GAC1D,MAAyB,IAArBA,EAAOwrB,YAA4C,GAAzBxrB,EAAOonB,QAAQntB,YACvC+F,EAAOonB,QAAQ,KAAOgD,EAAMpqB,EAAOsB,QACrCkrB,EAAQpzB,KAAK4G,SAKjBwsB,EAAUA,EAAQW,OAAOzB,EAAYtB,EAAOpqB,EAAOsB,MAAOtB,EAAOsB,MAAQtB,EAAOwrB,WAC3CxrB,EAAOonB,QAAS,EAAGpnB,EAAOonB,QAAQntB,YAGlEuyB,EA7oDT,GAAI1F,GAA0BrX,EAAOqX,wBA2CjCsG,EAAanJ,IAwBbmC,EAAU9B,IAcVW,EAAcxV,EAAOqL,OAAOD,OAAS,SAASrQ,GAChD,MAAwB,gBAAVA,IAAsBiF,EAAOoL,MAAMrQ,IAY/C6iB,EAAgB,gBAClB,SAAStrB,GAAO,MAAOA,IACvB,SAASA,GACP,GAAIurB,GAAQvrB,EAAIwd,SAChB,KAAK+N,EACH,MAAOvrB,EACT,IAAIwrB,GAAYrvB,OAAOC,OAAOmvB,EAK9B,OAJApvB,QAAOsvB,oBAAoBzrB,GAAKhF,QAAQ,SAAS2E,GAC/CxD,OAAOshB,eAAe+N,EAAW7rB,EACZxD,OAAOuvB,yBAAyB1rB,EAAKL,MAErD6rB,GAGPG,EAAa,aACbC,EAAY,gBACZ1H,EAAc,GAAI2H,QAAO,IAAMF,EAAa,IAAMC,EAAY,MA2C9D5H,GACF8H,YACEC,IAAO,cACPvQ,OAAU,UAAW,UACrBwQ,KAAM,iBACNC,KAAQ,cAGVC,QACEH,IAAO,UACPI,KAAM,eACNH,KAAM,iBACNC,KAAQ,cAGVG,aACEL,IAAO,eACPvQ,OAAU,UAAW,WAGvB6Q,SACE7Q,OAAU,UAAW,UACrB8Q,GAAM,UAAW,UACjB1c,QAAW,UAAW,UACtBmc,IAAO,SAAU,QACjBI,KAAM,cAAe,QACrBH,KAAM,gBAAiB,QACvBC,KAAQ,YAAa,SAGvBM,eACER,IAAO,iBACPO,GAAM,YAAa,UACnB1c,QAAW,UAAW,UACtB4c,KAAM,gBAAiB,SAAU,IACjCC,KAAM,gBAAiB,SAAU,KAGnCC,WACEX,IAAO,eAAgB,QACvBY,KAAM,SAAU,SAGlBC,SACEN,GAAM,UAAW,UACjB1c,QAAW,UAAW,UACtBmc,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+BJlN,GAAKpZ,IAAMqmB,EAUXjN,EAAK5Z,UAAY4tB,GACf9N,aACAN,OAAO,EAEPR,SAAU,WAER,IAAK,GADD7D,GAAa,GACRtgB,EAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CACpC,GAAImQ,GAAM9R,KAAK2B,EAEbsgB,IADEoL,EAAQvb,GACInQ,EAAI,IAAMmQ,EAAMA,EAEhBgc,EAAehc,GAIjC,MAAOmQ,IAGTM,aAAc,SAASnZ,GACrB,IAAK,GAAIzH,GAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CACpC,GAAW,MAAPyH,EACF,MACFA,GAAMA,EAAIpJ,KAAK2B,IAEjB,MAAOyH,IAGTitB,eAAgB,SAASjtB,EAAKihB,GAC5B,IAAK,GAAI1oB,GAAI,EAAGA,EAAI3B,KAAKsB,OAAQK,IAAK,CAGpC,GAFIA,IACFyH,EAAMA,EAAIpJ,KAAK2B,EAAI,MAChByqB,EAAShjB,GACZ,MACFihB,GAAQjhB,EAAKpJ,KAAK,MAItB0tB,uBAAwB,WACtB,GAAIrU,GAAM,GACN4I,EAAa,KACjB5I,IAAO,iBAGP,KAFA,GACIvH,GADAnQ,EAAI,EAEDA,EAAK3B,KAAKsB,OAAS,EAAIK,IAC5BmQ,EAAM9R,KAAK2B,GACXsgB,GAAcoL,EAAQvb,GAAO,IAAMA,EAAMgc,EAAehc,GACxDuH,GAAO,aAAe4I,EAAa,UAErC5I,IAAO,KAEP,IAAIvH,GAAM9R,KAAK2B,EAIf,OAHAsgB,IAAcoL,EAAQvb,GAAO,IAAMA,EAAMgc,EAAehc,GAExDuH,GAAO,YAAc4I,EAAa,+BAC3B,GAAIgK,UAAS,MAAO5S,IAG7BqJ,aAAc,SAAStZ,EAAKyI,GAC1B,IAAK7R,KAAKsB,OACR,OAAO,CAET,KAAK,GAAIK,GAAI,EAAGA,EAAI3B,KAAKsB,OAAS,EAAGK,IAAK,CACxC,IAAKyqB,EAAShjB,GACZ,OAAO,CACTA,GAAMA,EAAIpJ,KAAK2B,IAGjB,MAAKyqB,GAAShjB,IAGdA,EAAIpJ,KAAK2B,IAAMkQ,GACR,IAHE,IAOb,IAAIgc,GAAc,GAAInN,GAAK,GAAI8M,EAC/BK,GAAYvH,OAAQ,EACpBuH,EAAYtL,aAAesL,EAAYnL,aAAe,YAEtD,IAqQIgO,GArQAzC,EAAyB,IA8DzBc,MAYAuH,GAAS7B,EAAa,WACxB,GAAI8B,IAAWC,UAAU,GACrBC,GAAkB,CAOtB,OALAlxB,QAAO8kB,QAAQkM,EAAQ,WACrBzH,IACA2H,GAAkB,IAGb,SAAS7rB,GACdmkB,GAAStuB,KAAKmK,GACT6rB,IACHA,GAAkB,EAClBF,EAAOC,UAAYD,EAAOC,cAIhC,WACE,MAAO,UAAS5rB,GACdmkB,GAAStuB,KAAKmK,OAId4kB,MAyEAgB,MAsGAG,GAAW,EACXzB,GAAS,EACTwH,GAAS,EACTC,GAAY,EAEZ3F,GAAiB,CAWrBV,GAASxpB,WACPke,KAAM,SAASxd,EAAUjI,GACvB,GAAIS,KAAKivB,QAAU0B,GACjB,KAAMzZ,OAAM,oCAOd,OALA+Z,GAASjxB,MACTA,KAAK4wB,UAAYppB,EACjBxH,KAAK6wB,QAAUtxB,EACfS,KAAK42B,WACL52B,KAAKivB,OAASC,GACPlvB,KAAKyhB,QAGd0D,MAAO,WACDnlB,KAAKivB,QAAUC,KAGnBmC,EAAcrxB,MACdA,KAAK62B,cACL72B,KAAKyhB,OAAS/N,OACd1T,KAAK4wB,UAAYld,OACjB1T,KAAK6wB,QAAUnd,OACf1T,KAAKivB,OAASyH,KAGhBxR,QAAS,WACHllB,KAAKivB,QAAUC,IAGnBnB,EAAW/tB,OAGb82B,QAAS,SAASC,GAChB,IACE/2B,KAAK4wB,UAAUtN,MAAMtjB,KAAK6wB,QAASkG,GACnC,MAAOnX,GACP0Q,EAAS0G,4BAA6B,EACtCnX,QAAQ5F,MAAM,+CACE2F,EAAGjD,OAASiD,MAIhCqF,eAAgB,WAEd,MADAjlB,MAAKkuB,OAAOxa,QAAW,GAChB1T,KAAKyhB,QAIhB,IACI2P,IADAD,IAAoBsD,CAExBnE,GAASY,mBAAqB,EAE1BC,KACFC,MAeF,IAAI6F,KAA6B,CAEjCngB,GAAOoQ,SAAWpQ,EAAOoQ,aAEzBpQ,EAAOoQ,SAASgQ,2BAA6B,WAC3C,IAAID,IAGC9F,GAAL,CAGA8F,IAA6B,CAE7B,IACIE,GAAYC,EADZpJ,EAAS,CAGb,GAAG,CACDA,IACAoJ,EAAUhG,GACVA,MACA+F,GAAa,CAEb,KAAK,GAAIx1B,GAAI,EAAGA,EAAIy1B,EAAQ91B,OAAQK,IAAK,CACvC,GAAI0gB,GAAW+U,EAAQz1B,EACnB0gB,GAAS4M,QAAUC,KAGnB7M,EAAS6L,WACXiJ,GAAa,GAEf/F,GAAa3wB,KAAK4hB,IAEhByM,MACFqI,GAAa,SACClJ,EAATD,GAAmCmJ,EAExChJ,KACFrX,EAAOsX,qBAAuBJ,GAEhCiJ,IAA6B,IAG3B9F,KACFra,EAAOoQ,SAASmQ,eAAiB,WAC/BjG,QAUJE,EAAexqB,UAAY4tB,GACzB9N,UAAW0J,EAASxpB,UAEpBwoB,cAAc,EAEdsH,SAAU,WACJnC,EACFz0B,KAAK8wB,gBAAkBrB,EAAkBzvB,KAAMA,KAAKyhB,OACXzhB,KAAKsvB,cAE9CtvB,KAAKuxB,WAAavxB,KAAKs3B,WAAWt3B,KAAKyhB,SAK3C6V,WAAY,SAAS3W,GACnB,GAAI4W,GAAOrpB,MAAM2gB,QAAQlO,QACzB,KAAK,GAAIkB,KAAQlB,GACf4W,EAAK1V,GAAQlB,EAAOkB,EAItB,OAFI3T,OAAM2gB,QAAQlO,KAChB4W,EAAKj2B,OAASqf,EAAOrf,QAChBi2B,GAGTrJ,OAAQ,SAASsE,GACf,GAAIjE,GACAkE,CACJ,IAAIgC,EAAY,CACd,IAAKjC,EACH,OAAO,CAETC,MACAlE,EAAOgE,EAA4BvyB,KAAKyhB,OAAQ+Q,EACbC,OAEnCA,GAAYzyB,KAAKuxB,WACjBhD,EAAOI,EAAwB3uB,KAAKyhB,OAAQzhB,KAAKuxB,WAGnD,OAAIjD,GAAYC,IACP,GAEJkG,IACHz0B,KAAKuxB,WAAavxB,KAAKs3B,WAAWt3B,KAAKyhB,SAEzCzhB,KAAK82B,SACHvI,EAAKC,UACLD,EAAKE,YACLF,EAAKG,YACL,SAASxS,GACP,MAAOuW,GAAUvW,OAId,IAGT2a,YAAa,WACPpC,GACFz0B,KAAK8wB,gBAAgB3L,QACrBnlB,KAAK8wB,gBAAkBpd,QAEvB1T,KAAKuxB,WAAa7d,QAItBwR,QAAS,WACHllB,KAAKivB,QAAUC,KAGfuF,EACFz0B,KAAK8wB,gBAAgB5L,SAAQ,GAE7B6I,EAAW/tB,QAGfilB,eAAgB,WAMd,MALIjlB,MAAK8wB,gBACP9wB,KAAK8wB,gBAAgB5L,SAAQ,GAE7BllB,KAAKuxB,WAAavxB,KAAKs3B,WAAWt3B,KAAKyhB,QAElCzhB,KAAKyhB,UAUhB+P,EAAc1qB,UAAY4tB,GAExB9N,UAAW0K,EAAexqB,UAE1BwoB,cAAc,EAEdgI,WAAY,SAASxS,GACnB,MAAOA,GAAIhN,SAGboW,OAAQ,SAASsE,GACf,GAAIqB,EACJ,IAAIY,EAAY,CACd,IAAKjC,EACH,OAAO,CACTqB,GAAUU,EAAoBv0B,KAAKyhB,OAAQ+Q,OAE3CqB,GAAUd,EAAY/yB,KAAKyhB,OAAQ,EAAGzhB,KAAKyhB,OAAOngB,OAC5BtB,KAAKuxB,WAAY,EAAGvxB,KAAKuxB,WAAWjwB,OAG5D,OAAKuyB,IAAYA,EAAQvyB,QAGpBmzB,IACHz0B,KAAKuxB,WAAavxB,KAAKs3B,WAAWt3B,KAAKyhB,SAEzCzhB,KAAK82B,SAASjD,KACP,IANE,KAUbrC,EAAcgG,aAAe,SAASC,EAAUzE,EAASa,GACvDA,EAAQzvB,QAAQ,SAASiD,GAGvB,IAFA,GAAIqwB,IAAcrwB,EAAOsB,MAAOtB,EAAOonB,QAAQntB,QAC3Cq2B,EAAWtwB,EAAOsB,MACfgvB,EAAWtwB,EAAOsB,MAAQtB,EAAOwrB,YACtC6E,EAAWj3B,KAAKuyB,EAAQ2E,IACxBA,GAGFzpB,OAAMpH,UAAUO,OAAOic,MAAMmU,EAAUC,MAY3CnR,EAAazf,UAAY4tB,GACvB9N,UAAW0J,EAASxpB,UAEpB6b,GAAI5jB,QACF,MAAOiB,MAAK2xB,OAGdiF,SAAU,WACJnC,IACFz0B,KAAK8wB,gBAAkBL,EAAezwB,KAAMA,KAAK0xB,UAEnD1xB,KAAKkuB,OAAOxa,QAAW,IAGzBmjB,YAAa,WACX72B,KAAKyhB,OAAS/N,OAEV1T,KAAK8wB,kBACP9wB,KAAK8wB,gBAAgB3L,MAAMnlB,MAC3BA,KAAK8wB,gBAAkBpd,SAI3Byc,gBAAiB,SAAS9F,GACxBrqB,KAAK2xB,MAAM0E,eAAer2B,KAAK0xB,QAASrH,IAG1C6D,OAAQ,SAASsE,EAAeoF,GAC9B,GAAIjF,GAAW3yB,KAAKyhB,MAEpB,OADAzhB,MAAKyhB,OAASzhB,KAAK2xB,MAAMpP,aAAaviB,KAAK0xB,SACvCkG,GAAevL,EAAarsB,KAAKyhB,OAAQkR,IACpC,GAET3yB,KAAK82B,SAAS92B,KAAKyhB,OAAQkR,EAAU3yB,QAC9B,IAGTwiB,SAAU,SAASC,GACbziB,KAAK2xB,OACP3xB,KAAK2xB,MAAMjP,aAAa1iB,KAAK0xB,QAASjP,KAa5C,IAAIoV,MAEJnS,GAAiB5e,UAAY4tB,GAC3B9N,UAAW0J,EAASxpB,UAEpB8vB,SAAU,WACR,GAAInC,EAAY,CAGd,IAAK,GAFD9T,GACAmX,GAAsB,EACjBn2B,EAAI,EAAGA,EAAI3B,KAAK8xB,UAAUxwB,OAAQK,GAAK,EAE9C,GADAgf,EAAS3gB,KAAK8xB,UAAUnwB,GACpBgf,IAAWkX,GAAkB,CAC/BC,GAAsB,CACtB,OAIAA,IACF93B,KAAK8wB,gBAAkBL,EAAezwB,KAAM2gB,IAGhD3gB,KAAKkuB,OAAOxa,QAAY1T,KAAK6xB,uBAG/BgF,YAAa,WACX,IAAK,GAAIl1B,GAAI,EAAGA,EAAI3B,KAAK8xB,UAAUxwB,OAAQK,GAAK,EAC1C3B,KAAK8xB,UAAUnwB,KAAOk2B,IACxB73B,KAAK8xB,UAAUnwB,EAAI,GAAGwjB,OAE1BnlB,MAAK8xB,UAAUxwB,OAAS,EACxBtB,KAAKyhB,OAAOngB,OAAS,EAEjBtB,KAAK8wB,kBACP9wB,KAAK8wB,gBAAgB3L,MAAMnlB,MAC3BA,KAAK8wB,gBAAkBpd,SAI3B4O,QAAS,SAAS3B,EAAQ5hB,GACxB,GAAIiB,KAAKivB,QAAU0B,IAAY3wB,KAAKivB,QAAU0H,GAC5C,KAAMzf,OAAM,iCAEd,IAAInY,GAAO4uB,EAAQ5uB,EAEnB,IADAiB,KAAK8xB,UAAUrxB,KAAKkgB,EAAQ5hB,GACvBiB,KAAK6xB,qBAAV,CAEA,GAAIlpB,GAAQ3I,KAAK8xB,UAAUxwB,OAAS,EAAI,CACxCtB,MAAKyhB,OAAO9Y,GAAS5J,EAAKwjB,aAAa5B,KAGzCoX,YAAa,SAAS1V,GACpB,GAAIriB,KAAKivB,QAAU0B,IAAY3wB,KAAKivB,QAAU0H,GAC5C,KAAMzf,OAAM,qCAGd,IADAlX,KAAK8xB,UAAUrxB,KAAKo3B,GAAkBxV,GACjCriB,KAAK6xB,qBAAV,CAEA,GAAIlpB,GAAQ3I,KAAK8xB,UAAUxwB,OAAS,EAAI,CACxCtB,MAAKyhB,OAAO9Y,GAAS0Z,EAAS2C,KAAKhlB,KAAKklB,QAASllB,QAGnDslB,WAAY,WACV,GAAItlB,KAAKivB,QAAUC,GACjB,KAAMhY,OAAM,4BAEdlX,MAAKivB,OAAS0H,GACd32B,KAAK62B,eAGPrR,YAAa,WACX,GAAIxlB,KAAKivB,QAAU0H,GACjB,KAAMzf,OAAM,wCAId,OAHAlX,MAAKivB,OAASC,GACdlvB,KAAK42B,WAEE52B,KAAKyhB,QAGd0O,gBAAiB,SAAS9F,GAExB,IAAK,GADD1J,GACKhf,EAAI,EAAGA,EAAI3B,KAAK8xB,UAAUxwB,OAAQK,GAAK,EAC9Cgf,EAAS3gB,KAAK8xB,UAAUnwB,GACpBgf,IAAWkX,IACb73B,KAAK8xB,UAAUnwB,EAAI,GAAG00B,eAAe1V,EAAQ0J,IAInD6D,OAAQ,SAASsE,EAAeoF,GAE9B,IAAK,GADDnF,GACK9wB,EAAI,EAAGA,EAAI3B,KAAK8xB,UAAUxwB,OAAQK,GAAK,EAAG,CACjD,GAEIkQ,GAFA8O,EAAS3gB,KAAK8xB,UAAUnwB,GACxB5C,EAAOiB,KAAK8xB,UAAUnwB,EAAE,EAE5B,IAAIgf,IAAWkX,GAAkB,CAC/B,GAAI7F,GAAajzB,CACjB8S,GAAQ7R,KAAKivB,SAAW0B,GACpBqB,EAAWhN,KAAKhlB,KAAKklB,QAASllB,MAC9BgyB,EAAW/M,qBAEfpT,GAAQ9S,EAAKwjB,aAAa5B,EAGxBiX,GACF53B,KAAKyhB,OAAO9f,EAAI,GAAKkQ,EAInBwa,EAAaxa,EAAO7R,KAAKyhB,OAAO9f,EAAI,MAGxC8wB,EAAYA,MACZA,EAAU9wB,EAAI,GAAK3B,KAAKyhB,OAAO9f,EAAI,GACnC3B,KAAKyhB,OAAO9f,EAAI,GAAKkQ,GAGvB,MAAK4gB,IAKLzyB,KAAK82B,SAAS92B,KAAKyhB,OAAQgR,EAAWzyB,KAAK8xB,aACpC,IALE,KAwBbnM,EAAkB7e,WAChBke,KAAM,SAASxd,EAAUjI,GAKvB,MAJAS,MAAK4wB,UAAYppB,EACjBxH,KAAK6wB,QAAUtxB,EACfS,KAAKyhB,OACDzhB,KAAKoyB,YAAYpyB,KAAKmyB,YAAYnN,KAAKhlB,KAAKg4B,kBAAmBh4B,OAC5DA,KAAKyhB,QAGduW,kBAAmB,SAASnmB,GAE1B,GADAA,EAAQ7R,KAAKoyB,YAAYvgB,IACrBwa,EAAaxa,EAAO7R,KAAKyhB,QAA7B,CAEA,GAAIkR,GAAW3yB,KAAKyhB,MACpBzhB,MAAKyhB,OAAS5P,EACd7R,KAAK4wB,UAAUlpB,KAAK1H,KAAK6wB,QAAS7wB,KAAKyhB,OAAQkR,KAGjD1N,eAAgB,WAEd,MADAjlB,MAAKyhB,OAASzhB,KAAKoyB,YAAYpyB,KAAKmyB,YAAYlN,kBACzCjlB,KAAKyhB,QAGdyD,QAAS,WACP,MAAOllB,MAAKmyB,YAAYjN,WAG1B1C,SAAU,SAAS3Q,GAEjB,MADAA,GAAQ7R,KAAKqyB,YAAYxgB,IACpB7R,KAAKsyB,qBAAuBtyB,KAAKmyB,YAAY3P,SACzCxiB,KAAKmyB,YAAY3P,SAAS3Q,GADnC,QAIFsT,MAAO,WACDnlB,KAAKmyB,aACPnyB,KAAKmyB,YAAYhN,QACnBnlB,KAAK4wB,UAAYld,OACjB1T,KAAK6wB,QAAUnd,OACf1T,KAAKmyB,YAAcze,OACnB1T,KAAKyhB,OAAS/N,OACd1T,KAAKoyB,YAAc1e,OACnB1T,KAAKqyB,YAAc3e,QAIvB,IAAIgf,KACFuF,KAAK,EACLC,QAAQ,EACR9wB,UAAQ,GAsEN+wB,GAAa,EACbC,GAAc,EACdC,GAAW,EACXC,GAAc,CAIlBxF,GAAYhsB,WAaVyxB,kBAAmB,SAASvF,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GAOzC,IAAK,GALDmF,GAAWnF,EAASD,EAAW,EAC/BqF,EAAcvF,EAAaD,EAAe,EAC1CyF,EAAY,GAAIxqB,OAAMsqB,GAGjB72B,EAAI,EAAO62B,EAAJ72B,EAAcA,IAC5B+2B,EAAU/2B,GAAK,GAAIuM,OAAMuqB,GACzBC,EAAU/2B,GAAG,GAAKA,CAIpB,KAAK,GAAImK,GAAI,EAAO2sB,EAAJ3sB,EAAiBA,IAC/B4sB,EAAU,GAAG5sB,GAAKA,CAEpB,KAAK,GAAInK,GAAI,EAAO62B,EAAJ72B,EAAcA,IAC5B,IAAK,GAAImK,GAAI,EAAO2sB,EAAJ3sB,EAAiBA,IAC/B,GAAI9L,KAAK24B,OAAO3F,EAAQC,EAAennB,EAAI,GAAIqnB,EAAIC,EAAWzxB,EAAI,IAChE+2B,EAAU/2B,GAAGmK,GAAK4sB,EAAU/2B,EAAI,GAAGmK,EAAI,OACpC,CACH,GAAI8sB,GAAQF,EAAU/2B,EAAI,GAAGmK,GAAK,EAC9B+sB,EAAOH,EAAU/2B,GAAGmK,EAAI,GAAK,CACjC4sB,GAAU/2B,GAAGmK,GAAa+sB,EAARD,EAAeA,EAAQC,EAK/C,MAAOH,IAMTI,kCAAmC,SAASJ,GAK1C,IAJA,GAAI/2B,GAAI+2B,EAAUp3B,OAAS,EACvBwK,EAAI4sB,EAAU,GAAGp3B,OAAS,EAC1B0xB,EAAU0F,EAAU/2B,GAAGmK,GACvBitB,KACGp3B,EAAI,GAAKmK,EAAI,GAClB,GAAS,GAALnK,EAKJ,GAAS,GAALmK,EAAJ,CAKA,GAIIktB,GAJAC,EAAYP,EAAU/2B,EAAI,GAAGmK,EAAI,GACjC+sB,EAAOH,EAAU/2B,EAAI,GAAGmK,GACxB8sB,EAAQF,EAAU/2B,GAAGmK,EAAI,EAI3BktB,GADSJ,EAAPC,EACWI,EAAPJ,EAAmBA,EAAOI,EAElBA,EAARL,EAAoBA,EAAQK,EAEhCD,GAAOC,GACLA,GAAajG,EACf+F,EAAMt4B,KAAK03B,KAEXY,EAAMt4B,KAAK23B,IACXpF,EAAUiG,GAEZt3B,IACAmK,KACSktB,GAAOH,GAChBE,EAAMt4B,KAAK63B,IACX32B,IACAqxB,EAAU6F,IAEVE,EAAMt4B,KAAK43B,IACXvsB,IACAknB,EAAU4F,OA9BVG,GAAMt4B,KAAK63B,IACX32B,QANAo3B,GAAMt4B,KAAK43B,IACXvsB,GAuCJ,OADAitB,GAAMG,UACCH,GA2BThG,YAAa,SAASC,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,GACnC,GAAI8F,GAAc,EACdC,EAAc,EAEdC,EAAY9rB,KAAKyrB,IAAI9F,EAAaD,EAAcI,EAASD,EAY7D,IAXoB,GAAhBH,GAAiC,GAAZG,IACvB+F,EAAcn5B,KAAKs5B,aAAatG,EAASG,EAAKkG,IAE5CnG,GAAcF,EAAQ1xB,QAAU+xB,GAAUF,EAAI7xB,SAChD83B,EAAcp5B,KAAKu5B,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,GAAI7rB,GAASurB,EAAUK,KAAkB,GACvBI,EAAXD,GACL/rB,EAAOonB,QAAQhuB,KAAK0yB,EAAIC,KAE1B,QAAS/rB,GACJ,GAAI+rB,GAAYC,EACrB,OAAST,EAAUK,KAAkBC,EAAaD,GAUpD,KAAK,GARDuG,GAAMx5B,KAAK84B,kCACX94B,KAAKu4B,kBAAkBvF,EAASC,EAAcC,EACvBC,EAAKC,EAAUC,IAEtChsB,EAASqM,OACTmgB,KACAlrB,EAAQsqB,EACRwG,EAAWrG,EACNzxB,EAAI,EAAGA,EAAI63B,EAAIl4B,OAAQK,IAC9B,OAAO63B,EAAI73B,IACT,IAAKw2B,IACC9wB,IACFwsB,EAAQpzB,KAAK4G,GACbA,EAASqM,QAGX/K,IACA8wB,GACA,MACF,KAAKrB,IACE/wB,IACHA,EAASurB,EAAUjqB,KAAW,IAEhCtB,EAAOwrB,aACPlqB,IAEAtB,EAAOonB,QAAQhuB,KAAK0yB,EAAIsG,IACxBA,GACA,MACF,KAAKpB,IACEhxB,IACHA,EAASurB,EAAUjqB,KAAW,IAEhCtB,EAAOwrB,aACPlqB,GACA,MACF,KAAK2vB,IACEjxB,IACHA,EAASurB,EAAUjqB,KAAW,IAEhCtB,EAAOonB,QAAQhuB,KAAK0yB,EAAIsG,IACxBA,IAQN,MAHIpyB,IACFwsB,EAAQpzB,KAAK4G,GAERwsB,GAGTyF,aAAc,SAAStG,EAASG,EAAKuG,GACnC,IAAK,GAAI/3B,GAAI,EAAO+3B,EAAJ/3B,EAAkBA,IAChC,IAAK3B,KAAK24B,OAAO3F,EAAQrxB,GAAIwxB,EAAIxxB,IAC/B,MAAOA,EACX,OAAO+3B,IAGTH,aAAc,SAASvG,EAASG,EAAKuG,GAInC,IAHA,GAAIC,GAAS3G,EAAQ1xB,OACjBs4B,EAASzG,EAAI7xB,OACbskB,EAAQ,EACG8T,EAAR9T,GAAwB5lB,KAAK24B,OAAO3F,IAAU2G,GAASxG,IAAMyG,KAClEhU,GAEF,OAAOA,IAGTiU,iBAAkB,SAAS7G,EAASyE,GAClC,MAAOz3B,MAAK+yB,YAAYC,EAAS,EAAGA,EAAQ1xB,OAAQm2B,EAAU,EACtCA,EAASn2B,SAGnCq3B,OAAQ,SAASmB,EAAcC,GAC7B,MAAOD,KAAiBC,GAI5B,IAAIzG,IAAc,GAAIR,EAuJtBhc,GAAOwZ,SAAWA,EAClBxZ,EAAOwZ,SAAS0J,QAAU1D,GAC1Bxf,EAAOwZ,SAAS2J,kBAAoBpC,GACpC/gB,EAAOwZ,SAAS4J,iBAAmBzF,EACnC3d,EAAO0a,cAAgBA,EACvB1a,EAAO0a,cAAcqI,iBAAmB,SAAS7G,EAASyE,GACxD,MAAOnE,IAAYuG,iBAAiB7G,EAASyE,IAG/C3gB,EAAOgc,YAAcA,EACrBhc,EAAOwa,eAAiBA,EACxBxa,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,SAASi8B,GAAat3B,GACpB,KAAOA,EAAKxD,YACVwD,EAAOA,EAAKxD,UAGd,OAAsC,kBAAxBwD,GAAKu3B,eAAgCv3B,EAAO,KAS5D,QAASw3B,GAAex3B,EAAMkG,EAAMiX,GAClC,GAAIsa,GAAWz3B,EAAK03B,SAOpB,OANKD,KACHA,EAAWz3B,EAAK03B,cAEdD,EAASvxB,IACXiX,EAAQjX,GAAMoc,QAETmV,EAASvxB,GAAQiX,EAG1B,QAASwa,GAAc33B,EAAMkG,EAAMiX,GACjC,MAAOA,GAGT,QAASya,GAAc5oB,GACrB,MAAgB,OAATA,EAAgB,GAAKA,EAG9B,QAAS6oB,GAAW73B,EAAMgP,GACxBhP,EAAK83B,KAAOF,EAAc5oB,GAG5B,QAAS+oB,GAAY/3B,GACnB,MAAO,UAASgP,GACd,MAAO6oB,GAAW73B,EAAMgP,IA6B5B,QAASgpB,GAAgBr2B,EAAIuE,EAAM+xB,EAAajpB,GAC9C,MAAIipB,QACEjpB,EACFrN,EAAGgI,aAAazD,EAAM,IAEtBvE,EAAGu2B,gBAAgBhyB,QAIvBvE,GAAGgI,aAAazD,EAAM0xB,EAAc5oB,IAGtC,QAASmpB,GAAiBx2B,EAAIuE,EAAM+xB,GAClC,MAAO,UAASjpB,GACdgpB,EAAgBr2B,EAAIuE,EAAM+xB,EAAajpB,IAiD3C,QAASopB,GAAqB16B,GAC5B,OAAQA,EAAQwJ,MACd,IAAK,WACH,MAAOmxB,EACT,KAAK,QACL,IAAK,kBACL,IAAK,aACH,MAAO,QACT,KAAK,QACH,GAAI,eAAevW,KAAKpR,UAAUM,WAChC,MAAO,QACX,SACE,MAAO,SAIb,QAASsnB,GAAYC,EAAOlf,EAAUrK,EAAOwpB,GAC3CD,EAAMlf,IAAamf,GAAaZ,GAAe5oB,GAGjD,QAASypB,GAAaF,EAAOlf,EAAUmf,GACrC,MAAO,UAASxpB,GACd,MAAOspB,GAAYC,EAAOlf,EAAUrK,EAAOwpB,IAI/C,QAAS5O,MAET,QAAS8O,GAAeH,EAAOlf,EAAU8V,EAAYwJ,GAGnD,QAAShxB,KACPwnB,EAAWxP,SAAS4Y,EAAMlf,IAC1B8V,EAAW/M,kBACVuW,GAAe/O,GAAM2O,GACtBlU,SAASgQ,6BANX,GAAIuE,GAAYR,EAAqBG,EAUrC,OAFAA,GAAMv8B,iBAAiB48B,EAAWjxB,IAGhC2a,MAAO,WACLiW,EAAMjwB,oBAAoBswB,EAAWjxB,GACrCwnB,EAAW7M,SAGbgN,YAAaH,GAIjB,QAAS0J,GAAgB7pB,GACvB,MAAOhS,SAAQgS,GAYjB,QAAS8pB,GAA0Bp7B,GACjC,GAAIA,EAAQq7B,KACV,MAAO/W,GAAOtkB,EAAQq7B,KAAK/gB,SAAU,SAASrW,GAC5C,MAAOA,IAAMjE,GACK,SAAdiE,EAAGmb,SACQ,SAAXnb,EAAGuF,MACHvF,EAAGuE,MAAQxI,EAAQwI,MAGzB,IAAI8yB,GAAY1B,EAAa55B,EAC7B,KAAKs7B,EACH,QACF,IAAIC,GAASD,EAAU/S,iBACnB,6BAA+BvoB,EAAQwI,KAAO,KAClD,OAAO8b,GAAOiX,EAAQ,SAASt3B,GAC7B,MAAOA,IAAMjE,IAAYiE,EAAGo3B,OAKlC,QAASG,GAAiBX,GAIF,UAAlBA,EAAMzb,SACS,UAAfyb,EAAMrxB,MACR4xB,EAA0BP,GAAOh3B,QAAQ,SAAS43B,GAChD,GAAIC,GAAiBD,EAAMzB,UAAU2B,OACjCD,IAEFA,EAAe9J,YAAY3P,UAAS,KA4C5C,QAAS2Z,GAAaC,EAAQvqB,GAC5B,GACIwqB,GACAC,EACA3J,EAHAtzB,EAAa+8B,EAAO/8B,UAIpBA,aAAsBk9B,oBACtBl9B,EAAWk7B,WACXl7B,EAAWk7B,UAAU1oB,QACvBwqB,EAASh9B,EACTi9B,EAAgBD,EAAO9B,UAAU1oB,MACjC8gB,EAAW0J,EAAOxqB,OAGpBuqB,EAAOvqB,MAAQ4oB,EAAc5oB,GAEzBwqB,GAAUA,EAAOxqB,OAAS8gB,IAC5B2J,EAAcnK,YAAY3P,SAAS6Z,EAAOxqB,OAC1CyqB,EAAcnK,YAAYlN,iBAC1BiC,SAASgQ,8BAIb,QAASsF,GAAcJ,GACrB,MAAO,UAASvqB,GACdsqB,EAAaC,EAAQvqB,IArSzB,GAAIgT,GAAS3W,MAAMpH,UAAU+d,OAAOnd,KAAKnE,KAAK2K,MAAMpH,UAAU+d,OAU9D5jB,MAAK6F,UAAUvD,KAAO,SAASwF,EAAMipB,GACnCnS,QAAQ5F,MAAM,8BAA+Bja,KAAM+I,EAAMipB,IAG3D/wB,KAAK6F,UAAU21B,aAAe,YA+B9B,IAAIC,GAAsBlC,CAE1Bj1B,QAAOshB,eAAeK,SAAU,4BAC9B5f,IAAK,WACH,MAAOo1B,KAAwBrC,GAEjCrzB,IAAK,SAAS21B,GAEZ,MADAD,GAAsBC,EAAStC,EAAiBG,EACzCmC,GAET7V,cAAc,IAGhB8V,KAAK91B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAC1C,GAAa,gBAAThX,EACF,MAAO9H,MAAK6F,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAErD,IAAIA,EACF,MAAO2a,GAAW16B,KAAM6R,EAE1B,IAAImgB,GAAangB,CAEjB,OADA6oB,GAAW16B,KAAMgyB,EAAWhN,KAAK4V,EAAY56B,QACtC08B,EAAoB18B,KAAM+I,EAAMipB,IAqBzC6K,QAAQ/1B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAC7C,GAAI+a,GAAuC,KAAzB/xB,EAAKA,EAAKzH,OAAS,EAMrC,IALIw5B,IACF96B,KAAK+6B,gBAAgBhyB,GACrBA,EAAOA,EAAK+O,MAAM,EAAG,KAGnBiI,EACF,MAAO8a,GAAgB76B,KAAM+I,EAAM+xB,EAAajpB,EAGlD,IAAImgB,GAAangB,CAIjB,OAHAgpB,GAAgB76B,KAAM+I,EAAM+xB,EACxB9I,EAAWhN,KAAKgW,EAAiBh7B,KAAM+I,EAAM+xB,KAE1C4B,EAAoB18B,KAAM+I,EAAMipB,GAGzC,IAAIkJ,IACJ,WAGE,GAAI4B,GAAMv+B,SAASC,cAAc,OAC7Bu+B,EAAWD,EAAIl+B,YAAYL,SAASC,cAAc,SACtDu+B,GAASvwB,aAAa,OAAQ,WAC9B,IAAI4iB,GACAxJ,EAAQ,CACZmX,GAASl+B,iBAAiB,QAAS,WACjC+mB,IACAwJ,EAAQA,GAAS,UAEnB2N,EAASl+B,iBAAiB,SAAU,WAClC+mB,IACAwJ,EAAQA,GAAS,UAGnB,IAAIhsB,GAAQ7E,SAAS4G,YAAY,aACjC/B,GAAM45B,eAAe,SAAS,GAAM,EAAM9+B,OAAQ,EAAG,EAAG,EAAG,EAAG,GAAG,GAC7D,GAAO,GAAO,EAAO,EAAG,MAC5B6+B,EAAS39B,cAAcgE,GAGvB83B,EAA6B,GAATtV,EAAa,SAAWwJ,KAqG9C6N,iBAAiBn2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACtD,GAAa,UAAThX,GAA6B,YAATA,EACtB,MAAOm0B,aAAYp2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAE5D/f,MAAK+6B,gBAAgBhyB,EACrB,IAAIo0B,GAAqB,WAARp0B,EAAoB2yB,EAAkBjB,EACnDe,EAAsB,WAARzyB,EAAoBgzB,EAAmBtP,CAEzD,IAAI1M,EACF,MAAOob,GAAYn7B,KAAM+I,EAAM8I,EAAOsrB,EAGxC,IAAInL,GAAangB,EACbmO,EAAUub,EAAev7B,KAAM+I,EAAMipB,EAAYwJ,EAMrD,OALAL,GAAYn7B,KAAM+I,EACNipB,EAAWhN,KAAKsW,EAAat7B,KAAM+I,EAAMo0B,IACzCA,GAGL9C,EAAer6B,KAAM+I,EAAMiX,IAGpCod,oBAAoBt2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACzD,GAAa,UAAThX,EACF,MAAOm0B,aAAYp2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK+6B,gBAAgB,SAEjBhb,EACF,MAAOob,GAAYn7B,KAAM,QAAS6R,EAEpC,IAAImgB,GAAangB,EACbmO,EAAUub,EAAev7B,KAAM,QAASgyB,EAG5C,OAFAmJ,GAAYn7B,KAAM,QACNgyB,EAAWhN,KAAKsW,EAAat7B,KAAM,QAASy6B,KACjDiC,EAAoB18B,KAAM+I,EAAMiX,IA+BzCqd,kBAAkBv2B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GACvD,GAAa,UAAThX,EACF,MAAOm0B,aAAYp2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK+6B,gBAAgB,SAEjBhb,EACF,MAAOoc,GAAan8B,KAAM6R,EAE5B,IAAImgB,GAAangB,EACbmO,EAAUub,EAAev7B,KAAM,QAASgyB,EAE5C,OADAmK,GAAan8B,KAAMgyB,EAAWhN,KAAKwX,EAAcx8B,QAC1C08B,EAAoB18B,KAAM+I,EAAMiX,IAGzCuc,kBAAkBz1B,UAAUvD,KAAO,SAASwF,EAAM8I,EAAOkO,GAIvD,GAHa,kBAAThX,IACFA,EAAO,iBAEI,kBAATA,GAAqC,UAATA,EAC9B,MAAOm0B,aAAYp2B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAI5D,IAFA/f,KAAK+6B,gBAAgBhyB,GAEjBgX,EACF,MAAOob,GAAYn7B,KAAM+I,EAAM8I,EAEjC,IAAImgB,GAAangB,EACbmO,EAAUub,EAAev7B,KAAM+I,EAAMipB,EAKzC,OAJAmJ,GAAYn7B,KAAM+I,EACNipB,EAAWhN,KAAKsW,EAAat7B,KAAM+I,KAGxCsxB,EAAer6B,KAAM+I,EAAMiX,KAEnChgB,MASH,SAAU8W,GACR,YAEA,SAASC,GAAOtT,GACd,IAAKA,EACH,KAAM,IAAIyT,OAAM,oBAKpB,QAASomB,GAAgBz6B,GAEvB,IADA,GAAIQ,GACGA,EAAIR,EAAKxD,YACdwD,EAAOQ,CAGT,OAAOR,GAGT,QAAS06B,GAAY16B,EAAMoN,GACzB,GAAKA,EAAL,CAKA,IAFA,GAAIutB,GACA95B,EAAW,IAAMuM,GACbutB,IACN36B,EAAOy6B,EAAgBz6B,GAEnBA,EAAK46B,cACPD,EAAM36B,EAAK46B,cAAcp9B,cAAcqD,GAChCb,EAAKu3B,iBACZoD,EAAM36B,EAAKu3B,eAAenqB,KAExButB,GAAQ36B,EAAK66B,mBAGjB76B,EAAOA,EAAK66B,gBAGd,OAAOF,IAiIT,QAASG,GAAcn5B,GACrB,MAAqB,YAAdA,EAAGmb,SACgB,8BAAnBnb,EAAGo5B,aAGZ,QAASC,GAAer5B,GACtB,MAAqB,YAAdA,EAAGmb,SACgB,gCAAnBnb,EAAGo5B,aAGZ,QAASE,GAAoBt5B,GAC3B,MAAO3E,SAAQk+B,EAAyBv5B,EAAGmb,UAC5Bnb,EAAG3C,aAAa,aAGjC,QAASm8B,GAAWx5B,GAIlB,MAHuBkP,UAAnBlP,EAAGy5B,cACLz5B,EAAGy5B,YAA4B,YAAdz5B,EAAGmb,SAAyBme,EAAoBt5B,IAE5DA,EAAGy5B,YAYZ,QAASC,GAAoBr7B,EAAM+H,GACjC,GAAIuzB,GAAet7B,EAAKimB,iBAAiBsV,EAErCJ,GAAWn7B,IACb+H,EAAG/H,GACLuB,EAAQ+5B,EAAcvzB,GAGxB,QAASyzB,GAAkCx7B,GACzC,QAASy7B,GAAUlY,GACZmY,oBAAoBC,SAASpY,IAChCiY,EAAkCjY,EAASqY,SAG/CP,EAAoBr7B,EAAMy7B,GAgB5B,QAASI,GAAMC,EAAIC,GACjBr5B,OAAOsvB,oBAAoB+J,GAAMx6B,QAAQ,SAAS2E,GAChDxD,OAAOshB,eAAe8X,EAAI51B,EACJxD,OAAOuvB,yBAAyB8J,EAAM71B,MAKhE,QAAS81B,GAAiCzY,GACxC,GAAI2B,GAAM3B,EAAS0Y,aACnB,KAAK/W,EAAIgX,YACP,MAAOhX,EACT,IAAIxlB,GAAIwlB,EAAIiX,sBACZ,KAAKz8B,EAAG,CAIN,IADAA,EAAIwlB,EAAIkX,eAAeC,mBAAmB,IACnC38B,EAAE48B,WACP58B,EAAEjD,YAAYiD,EAAE48B,UAElBpX,GAAIiX,uBAAyBz8B,EAE/B,MAAOA,GAGT,QAAS68B,GAA2BhZ,GAClC,IAAKA,EAASiZ,iBAAkB,CAC9B,GAAIt+B,GAAQqlB,EAAS0Y,aACrB,KAAK/9B,EAAMs+B,iBAAkB,CAC3Bt+B,EAAMs+B,iBAAmBt+B,EAAMk+B,eAAeC,mBAAmB,IACjEn+B,EAAMs+B,iBAAiBC,mBAAoB,CAI3C,IAAI5X,GAAO3mB,EAAMs+B,iBAAiB7gC,cAAc,OAChDkpB,GAAK6X,KAAOhhC,SAASihC,QACrBz+B,EAAMs+B,iBAAiBlgC,KAAKP,YAAY8oB,GAExC3mB,EAAMs+B,iBAAiBA,iBAAmBt+B,EAAMs+B,iBAGlDjZ,EAASiZ,iBAAmBt+B,EAAMs+B,iBAGpC,MAAOjZ,GAASiZ,iBAgBlB,QAASI,GAAqCj7B,GAC5C,GAAI4hB,GAAW5hB,EAAGs6B,cAActgC,cAAc,WAC9CgG,GAAGnF,WAAW+rB,aAAahF,EAAU5hB,EAIrC,KAFA,GAAIk7B,GAAUl7B,EAAGm7B,WACb/Z,EAAQ8Z,EAAQp+B,OACbskB,IAAU,GAAG,CAClB,GAAIga,GAASF,EAAQ9Z,EACjBia,GAA4BD,EAAO72B,QACjB,aAAhB62B,EAAO72B,MACTqd,EAAS5Z,aAAaozB,EAAO72B,KAAM62B,EAAO/tB,OAC5CrN,EAAGu2B,gBAAgB6E,EAAO72B,OAI9B,MAAOqd,GAGT,QAAS0Z,GAA+Bt7B,GACtC,GAAI4hB,GAAW5hB,EAAGs6B,cAActgC,cAAc,WAC9CgG,GAAGnF,WAAW+rB,aAAahF,EAAU5hB,EAIrC,KAFA,GAAIk7B,GAAUl7B,EAAGm7B,WACb/Z,EAAQ8Z,EAAQp+B,OACbskB,IAAU,GAAG,CAClB,GAAIga,GAASF,EAAQ9Z,EACrBQ,GAAS5Z,aAAaozB,EAAO72B,KAAM62B,EAAO/tB,OAC1CrN,EAAGu2B,gBAAgB6E,EAAO72B,MAI5B,MADAvE,GAAGnF,WAAWC,YAAYkF,GACnB4hB,EAGT,QAAS2Z,GAAyC3Z,EAAU5hB,EAAIw7B,GAC9D,GAAIvB,GAAUrY,EAASqY,OACvB,IAAIuB,EAEF,WADAvB,GAAQ7/B,YAAY4F,EAKtB,KADA,GAAIy7B,GACGA,EAAQz7B,EAAG6mB,YAChBoT,EAAQ7/B,YAAYqhC,GA4FxB,QAASC,GAA4B17B,GAC/B27B,EACF37B,EAAGoiB,UAAY2X,oBAAoBz3B,UAEnC43B,EAAMl6B,EAAI+5B,oBAAoBz3B,WAGlC,QAASs5B,GAAwBha,GAC1BA,EAASia,cACZja,EAASia,YAAc,WACrBja,EAASka,sBAAuB,CAChC;GAAI/7B,GAAMg8B,EAAYna,EAClBA,EAASoa,WAAapa,EAASoa,UAAUnhB,eAC7CohB,GAAgBra,EAAU7hB,EAAK6hB,EAASsa,UAIvCta,EAASka,uBACZla,EAASka,sBAAuB,EAChChQ,SAAS0J,QAAQ5T,EAASia,cAyM9B,QAASM,GAAehiC,EAAGoK,EAAMlG,EAAM+9B,GACrC,GAAKjiC,GAAMA,EAAE2C,OAAb,CAOA,IAJA,GAAI4kB,GACA5kB,EAAS3C,EAAE2C,OACXu/B,EAAa,EAAGC,EAAY,EAAGC,EAAW,EAC1CC,GAAc,EACC1/B,EAAZw/B,GAAoB,CACzB,GAAID,GAAaliC,EAAEuI,QAAQ,KAAM45B,GAC7BG,EAAetiC,EAAEuI,QAAQ,KAAM45B,GAC/B/gB,GAAU,EACVmhB,EAAa,IAWjB,IATID,GAAgB,IACF,EAAbJ,GAAiCA,EAAfI,KACrBJ,EAAaI,EACblhB,GAAU,EACVmhB,EAAa,MAGfH,EAAwB,EAAbF,EAAiB,GAAKliC,EAAEuI,QAAQg6B,EAAYL,EAAa,GAErD,EAAXE,EAAc,CAChB,IAAK7a,EACH,MAEFA,GAAOzlB,KAAK9B,EAAEmZ,MAAMgpB,GACpB,OAGF5a,EAASA,MACTA,EAAOzlB,KAAK9B,EAAEmZ,MAAMgpB,EAAWD,GAC/B,IAAI5e,GAAatjB,EAAEmZ,MAAM+oB,EAAa,EAAGE,GAAUI,MACnDjb,GAAOzlB,KAAKsf,GACZihB,EAAcA,GAAejhB,CAC7B,IAAIqhB,GAAaR,GACAA,EAAiB3e,EAAYlZ,EAAMlG,EAGlDqjB,GAAOzlB,KADS,MAAd2gC,EACU1gB,KAAKpZ,IAAI2a,GAET,MAEdiE,EAAOzlB,KAAK2gC,GACZN,EAAYC,EAAW,EAyBzB,MAtBID,KAAcx/B,GAChB4kB,EAAOzlB,KAAK,IAEdylB,EAAOmb,WAA+B,IAAlBnb,EAAO5kB,OAC3B4kB,EAAOob,aAAepb,EAAOmb,YACM,IAAbnb,EAAO,IACM,IAAbA,EAAO,GAC7BA,EAAO8a,YAAcA,EAErB9a,EAAOqb,WAAa,SAAS16B,GAG3B,IAAK,GAFD4b,GAAWyD,EAAO,GAEbvkB,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIkQ,GAAQqU,EAAOmb,WAAax6B,EAASA,GAAQlF,EAAI,GAAK,EAC5C+R,UAAV7B,IACF4Q,GAAY5Q,GACd4Q,GAAYyD,EAAOvkB,EAAI,GAGzB,MAAO8gB,IAGFyD,GAGT,QAASsb,GAAsBz4B,EAAMmd,EAAQrjB,EAAMid,GACjD,GAAIoG,EAAOmb,WAAY,CACrB,GAAID,GAAalb,EAAO,GACpBrU,EAAQuvB,EAAaA,EAAWthB,EAAOjd,GAAM,GACxBqjB,EAAO,GAAG3D,aAAazC,EAChD,OAAOoG,GAAOob,aAAezvB,EAAQqU,EAAOqb,WAAW1vB,GAIzD,IAAK,GADDhL,MACKlF,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIy/B,GAAalb,EAAOvkB,EAAI,EAC5BkF,IAAQlF,EAAI,GAAK,GAAKy/B,EAAaA,EAAWthB,EAAOjd,GACjDqjB,EAAOvkB,EAAI,GAAG4gB,aAAazC,GAGjC,MAAOoG,GAAOqb,WAAW16B,GAG3B,QAAS46B,GAAyB14B,EAAMmd,EAAQrjB,EAAMid,GACpD,GAAIshB,GAAalb,EAAO,GACpB7D,EAAW+e,EAAaA,EAAWthB,EAAOjd,GAAM,GAChD,GAAI0jB,cAAazG,EAAOoG,EAAO,GAEnC,OAAOA,GAAOob,aAAejf,EACzB,GAAIsD,mBAAkBtD,EAAU6D,EAAOqb,YAG7C,QAASG,GAAe34B,EAAMmd,EAAQrjB,EAAMid,GAC1C,GAAIoG,EAAO8a,YACT,MAAOQ,GAAsBz4B,EAAMmd,EAAQrjB,EAAMid,EAEnD,IAAIoG,EAAOmb,WACT,MAAOI,GAAyB14B,EAAMmd,EAAQrjB,EAAMid,EAItD,KAAK,GAFDuC,GAAW,GAAIqD,kBAEV/jB,EAAI,EAAGA,EAAIukB,EAAO5kB,OAAQK,GAAK,EAAG,CACzC,GAAIoe,GAAUmG,EAAOvkB,GACjBy/B,EAAalb,EAAOvkB,EAAI,EAE5B,IAAIy/B,EAAJ,CACE,GAAIvvB,GAAQuvB,EAAWthB,EAAOjd,EAAMkd,EAChCA,GACFsC,EAASC,QAAQzQ,GAEjBwQ,EAAS0V,YAAYlmB,OALzB,CASA,GAAI9S,GAAOmnB,EAAOvkB,EAAI,EAClBoe,GACFsC,EAASC,QAAQvjB,EAAKwjB,aAAazC,IAEnCuC,EAASC,QAAQxC,EAAO/gB,IAG5B,MAAO,IAAI4mB,mBAAkBtD,EAAU6D,EAAOqb,YAGhD,QAASd,GAAgB59B,EAAMy3B,EAAUxa,EAAO6hB,GAC9C,IAAK,GAAIhgC,GAAI,EAAGA,EAAI24B,EAASh5B,OAAQK,GAAK,EAAG,CAC3C,GAAIoH,GAAOuxB,EAAS34B,GAChBukB,EAASoU,EAAS34B,EAAI,GACtBkQ,EAAQ6vB,EAAe34B,EAAMmd,EAAQrjB,EAAMid,GAC3CE,EAAUnd,EAAKU,KAAKwF,EAAM8I,EAAOqU,EAAO8a,YACxChhB,IAAW2hB,GACbA,EAAiBlhC,KAAKuf,GAI1B,GADAnd,EAAK45B,eACAnC,EAAS0D,WAAd,CAGAn7B,EAAK69B,OAAS5gB,CACd,IAAI8hB,GAAO/+B,EAAKg/B,0BAA0BvH,EACtCqH,IAAoBC,GACtBD,EAAiBlhC,KAAKmhC,IAG1B,QAASE,GAAiBt9B,EAAIuE,EAAM63B,GAClC,GAAIn9B,GAAIe,EAAG1C,aAAaiH,EACxB,OAAO43B,GAAoB,IAALl9B,EAAU,OAASA,EAAGsF,EAAMvE,EAAIo8B,GAGxD,QAASmB,GAAuBxhC,EAASqgC,GACvC7pB,EAAOxW,EAMP,KAAK,GAJD+5B,MAIK34B,EAAI,EAAGA,EAAIpB,EAAQo/B,WAAWr+B,OAAQK,IAAK,CAUlD,IATA,GAAIqgC,GAAOzhC,EAAQo/B,WAAWh+B,GAC1BoH,EAAOi5B,EAAKj5B,KACZ8I,EAAQmwB,EAAKnwB,MAOE,MAAZ9I,EAAK,IACVA,EAAOA,EAAKk5B,UAAU,EAGxB,KAAIjE,EAAWz9B,IACVwI,IAASm5B,GAAMn5B,IAASo5B,GAAQp5B,IAASq5B,EAD9C,CAKA,GAAIlc,GAASya,EAAe9uB,EAAO9I,EAAMxI,EACbqgC,EACvB1a,IAGLoU,EAAS75B,KAAKsI,EAAMmd,IAatB,MAVI8X,GAAWz9B,KACb+5B,EAAS0D,YAAa,EACtB1D,EAAS+H,GAAKP,EAAiBvhC,EAAS2hC,EAAItB,GAC5CtG,EAAS/2B,KAAOu+B,EAAiBvhC,EAAS4hC,EAAMvB,GAChDtG,EAASgI,OAASR,EAAiBvhC,EAAS6hC,EAAQxB,IAEhDtG,EAAS+H,IAAO/H,EAAS/2B,MAAS+2B,EAASgI,SAC7ChI,EAAS/2B,KAAOo9B,EAAe,OAAQwB,EAAM5hC,EAASqgC,KAGnDtG,EAGT,QAASiG,GAAY19B,EAAM+9B,GACzB,GAAI/9B,EAAK7B,WAAaC,KAAKW,aACzB,MAAOmgC,GAAuBl/B,EAAM+9B,EAEtC,IAAI/9B,EAAK7B,WAAaC,KAAKshC,UAAW,CACpC,GAAIrc,GAASya,EAAe99B,EAAK83B,KAAM,cAAe93B,EAC1B+9B,EAC5B,IAAI1a,EACF,OAAQ,cAAeA,GAG3B,SAGF,QAASsc,GAAqB3/B,EAAM4/B,EAAQC,EAAiBpI,EAAUxa,EACzC/E,EACA4mB,GAK5B,IAAK,GAHDj2B,GAAQ+2B,EAAO7jC,YAAY8jC,EAAgBC,WAAW9/B,GAAM,IAE5DlB,EAAI,EACCs+B,EAAQp9B,EAAKwoB,WAAY4U,EAAOA,EAAQA,EAAM2C,YACrDJ,EAAqBvC,EAAOv0B,EAAOg3B,EACbpI,EAASuI,SAASlhC,KAClBme,EACA/E,EACA4mB,EAUxB,OAPIrH,GAAS0D,aACXO,oBAAoBC,SAAS9yB,EAAO7I,GAChCkY,GACFrP,EAAMo3B,aAAa/nB,IAGvB0lB,EAAgB/0B,EAAO4uB,EAAUxa,EAAO6hB,GACjCj2B,EAGT,QAASq3B,GAAyBlgC,EAAM+9B,GACtC,GAAIr8B,GAAMg8B,EAAY19B,EAAM+9B,EAC5Br8B,GAAIs+B,WAEJ,KAAK,GADDl6B,GAAQ,EACHs3B,EAAQp9B,EAAKwoB,WAAY4U,EAAOA,EAAQA,EAAM2C,YACrDr+B,EAAIs+B,SAASl6B,KAAWo6B,EAAyB9C,EAAOW,EAG1D,OAAOr8B,GAOT,QAASy+B,GAAcvE,GACrB,GAAIxuB,GAAKwuB,EAAQ1N,GAGjB,OAFK9gB,KACHA,EAAKwuB,EAAQ1N,IAAMkS,KACdhzB,EAUT,QAASizB,GAAsBzE,EAAS+B,GACtC,GAAI2C,GAAYH,EAAcvE,EAC9B,IAAI+B,EAAW,CACb,GAAIj8B,GAAMi8B,EAAU4C,YAAYD,EAKhC,OAJK5+B,KACHA,EAAMi8B,EAAU4C,YAAYD,GACxBJ,EAAyBtE,EAAS+B,EAAUnhB,qBAE3C9a,EAGT,GAAIA,GAAMk6B,EAAQ4E,WAKlB,OAJK9+B,KACHA,EAAMk6B,EAAQ4E,YACVN,EAAyBtE,EAAS/qB,aAEjCnP,EAeT,QAAS++B,GAAiBC,GACxBvjC,KAAKwjC,QAAS,EACdxjC,KAAKyjC,iBAAmBF,EACxBvjC,KAAK0jC,aACL1jC,KAAKshB,KAAO5N,OACZ1T,KAAK2jC,iBACL3jC,KAAK4jC,aAAelwB,OACpB1T,KAAK6jC,cAAgBnwB,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,SAAS4nB,EAAG8X,GACnB,IAAK,GAAIniC,GAAI,EAAGA,EAAI3B,KAAK0F,KAAKpE,OAAQK,IACpCqqB,EAAEtkB,KAAKo8B,GAAY9jC,KAAMA,KAAK6G,OAAOlF,GAAI3B,KAAK0F,KAAK/D,GAAI3B,QAyB/B,mBAArBzB,UAAS4D,WAClB4hC,SAASj9B,UAAU3E,SAAW,SAASU,GACrC,MAAIA,KAAS7C,MAAQ6C,EAAKxD,aAAeW,MAChC,EACFA,KAAKgkC,gBAAgB7hC,SAASU,IAIzC,IAAIs/B,GAAO,OACPC,EAAS,SACTF,EAAK,KAELrC,GACFzZ,UAAY,EACZkc,QAAU,EACV/+B,MAAQ,EACRi6B,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,GAAI9jC,GAAIvC,SAASC,cAAc,YAC3B+D,EAAIzB,EAAE29B,QAAQK,cACd+F,EAAOtiC,EAAE3D,YAAY2D,EAAE/D,cAAc,SACrCW,EAAO0lC,EAAKjmC,YAAY2D,EAAE/D,cAAc,SACxCkpB,EAAOnlB,EAAE/D,cAAc,OAC3BkpB,GAAK6X,KAAOhhC,SAASihC,QACrBrgC,EAAKP,YAAY8oB,KAIrB,IAAI0W,GAAwB,aACxB74B,OAAOG,KAAKq4B,GAA0Bx5B,IAAI,SAASob,GACjD,MAAOA,GAAQpW,cAAgB,eAC9Byc,KAAK,KA2BZznB,UAASM,iBAAiB,mBAAoB,WAC5Cw/B,EAAkC9/B,UAElC2oB,SAASgQ,+BACR,GAmBE0N,IAMH9tB,EAAOynB,oBAAsB,WAC3B,KAAMuG,WAAU,wBAIpB,IA6GIC,GA7GA5E,EAAW,eA8GgB,mBAApBjW,oBACT6a,EAAmB,GAAI7a,kBAAiB,SAASsB,GAC/C,IAAK,GAAI7pB,GAAI,EAAGA,EAAI6pB,EAAQlqB,OAAQK,IAClC6pB,EAAQ7pB,GAAGpC,OAAOylC,iBAWxBzG,oBAAoBC,SAAW,SAASh6B,EAAIygC,GAC1C,GAAIzgC,EAAG0gC,qBACL,OAAO,CAET,IAAI3B,GAAkB/+B,CACtB++B,GAAgB2B,sBAAuB,CAEvC,IAAIC,GAAuBtH,EAAe0F,IACfqB,EACvBQ,EAAoBD,EACpBE,GAAgBF,EAChBG,GAAW,CAgBf,IAdKH,IACCrH,EAAoByF,IACtBxsB,GAAQkuB,GACR1B,EAAkB9D,EAAqCj7B,GACvD++B,EAAgB2B,sBAAuB,EACvCC,EAAuBP,EACvBU,GAAW,GACF3H,EAAc4F,KACvBA,EAAkBzD,EAA+Bt7B,GACjD++B,EAAgB2B,sBAAuB,EACvCC,EAAuBP,KAItBO,EAAsB,CACzBjF,EAA4BqD,EAC5B,IAAIxb,GAAM8W,EAAiC0E,EAC3CA,GAAgBgC,SAAWxd,EAAIyd,yBAejC,MAZIP,GAGF1B,EAAgBkC,aAAeR,EACtBI,EACTtF,EAAyCwD,EACA/+B,EACA8gC,GAChCF,GACT/G,EAAkCkF,EAAgB9E,UAG7C,GAOTF,oBAAoBD,UAAYD,CAEhC,IAAIqH,GAAc5uB,EAAO6uB,oBAAsBzI,YAE3C0I,GACFt+B,IAAK,WACH,MAAOtH,MAAKulC,UAEdM,YAAY,EACZ/e,cAAc,EAGX8d,KAGHrG,oBAAoBz3B,UAAYvB,OAAOC,OAAOkgC,EAAY5+B,WAE1DvB,OAAOshB,eAAe0X,oBAAoBz3B,UAAW,UAC/B8+B,IA0BxBlH,EAAMH,oBAAoBz3B,WACxBvD,KAAM,SAASwF,EAAM8I,EAAOkO,GAC1B,GAAY,OAARhX,EACF,MAAO8zB,SAAQ/1B,UAAUvD,KAAKmE,KAAK1H,KAAM+I,EAAM8I,EAAOkO,EAExD,IAAIlP,GAAO7Q,KACPw9B,EAAMzd,EAAUlO,EAAQA,EAAMmT,KAAK,SAASwY,GAC9C3sB,EAAKrE,aAAa,MAAOgxB,GACzB3sB,EAAKm0B,eAKP,OAFAhlC,MAAKwM,aAAa,MAAOgxB,GACzBx9B,KAAKglC,cACDjlB,EAAJ,QAGK/f,KAAKu6B,UAGRv6B,KAAKu6B,UAAUiD,IAAM3rB,EAFrB7R,KAAKu6B,WAAciD,IAAK3rB,GAKnBA,IAGTgwB,0BAA2B,SAASiE,GAIlC,MAHI9lC,MAAK+lC,WACP/lC,KAAK+lC,UAAUC,YAEZF,EAAWzD,IAAOyD,EAAWviC,MAASuiC,EAAWxD,QASjDtiC,KAAK+lC,YACR/lC,KAAK+lC,UAAY,GAAIzC,GAAiBtjC,OAGxCA,KAAK+lC,UAAUE,mBAAmBH,EAAY9lC,KAAK0gC,QAE/CqE,GACFA,EAAiB1a,QAAQrqB,MAAQ2/B,YAAY,EACZuG,iBAAkB,SAG9ClmC,KAAK+lC,gBAnBN/lC,KAAK+lC,YACP/lC,KAAK+lC,UAAU5gB,QACfnlB,KAAK+lC,UAAYryB,UAoBvByyB,eAAgB,SAASrmB,EAAOsmB,EAAiB5F,GAC3C4F,EACF5F,EAAYxgC,KAAKqmC,aAAaD,GACtB5F,IACRA,EAAYxgC,KAAKwgC,WAEdxgC,KAAKsmC,cACRtmC,KAAKsmC,YAActmC,KAAKumC,KAAK9H,QAC/B,IAAIA,GAAUz+B,KAAKsmC,WACnB,IAA2B,OAAvB7H,EAAQpT,WACV,MAAOmb,EAET,IAAIjiC,GAAM2+B,EAAsBzE,EAAS+B,GACrCkC,EAAkBtD,EAA2Bp/B,MAC7CymC,EAAW/D,EAAgB8C,wBAC/BiB,GAAS/I,iBAAmB19B,KAC5BymC,EAAShJ,cAAgBgB,EACzBgI,EAASlM,aACTkM,EAASC,YAAc,IASvB,KAAK,GARDC,GAAiBF,EAASG,mBAC5BC,UAAW,KACXC,SAAU,KACVhnB,MAAOA,GAGLne,EAAI,EACJolC,GAAoB,EACf9G,EAAQxB,EAAQpT,WAAY4U,EAAOA,EAAQA,EAAM2C,YAAa,CAK3C,OAAtB3C,EAAM2C,cACRmE,GAAoB,EAEtB,IAAIr7B,GAAQ82B,EAAqBvC,EAAOwG,EAAU/D,EACjBn+B,EAAIs+B,SAASlhC,KACbme,EACA0gB,EACAiG,EAASlM,UAC1C7uB,GAAMk7B,kBAAoBD,EACtBI,IACFN,EAASC,YAAch7B,GAO3B,MAJAi7B,GAAeE,UAAYJ,EAASpb,WACpCsb,EAAeG,SAAWL,EAAStH,UACnCsH,EAAS/I,iBAAmBhqB,OAC5B+yB,EAAShJ,cAAgB/pB,OAClB+yB,GAGT9jB,GAAI7C,SACF,MAAO9f,MAAK0gC,QAGd/d,GAAI7C,OAAMA,GACR9f,KAAK0gC,OAAS5gB,EACdsgB,EAAwBpgC,OAG1B2iB,GAAIyjB,mBACF,MAAOpmC,MAAKwgC,WAAaxgC,KAAKwgC,UAAUwG,KAG1ChC,YAAa,WACNhlC,KAAK+lC,WAAa/lC,KAAKsmC,cAAgBtmC,KAAKumC,KAAK9H,UAGtDz+B,KAAKsmC,YAAc5yB,OACnB1T,KAAK+lC,UAAUkB,eACfjnC,KAAK+lC,UAAUmB,oBAAoBlnC,KAAK+lC,UAAUoB,qBAGpD5/B,MAAO,WACLvH,KAAK0gC,OAAShtB,OACd1T,KAAKwgC,UAAY9sB,OACb1T,KAAKu6B,WAAav6B,KAAKu6B,UAAUiD,KACnCx9B,KAAKu6B,UAAUiD,IAAIrY,QACrBnlB,KAAKsmC,YAAc5yB,OACd1T,KAAK+lC,YAEV/lC,KAAK+lC,UAAUkB,eACfjnC,KAAK+lC,UAAU5gB,QACfnlB,KAAK+lC,UAAYryB,SAGnBovB,aAAc,SAAS/nB,GACrB/a,KAAKwgC,UAAYzlB,EACjB/a,KAAKqjC,YAAc3vB,OACf1T,KAAK+lC,YACP/lC,KAAK+lC,UAAUqB,2BAA6B1zB,OAC5C1T,KAAK+lC,UAAUsB,iBAAmB3zB,SAItC2yB,aAAc,SAASD,GAIrB,QAAShF,GAAWr4B,GAClB,GAAI6B,GAAKw7B,GAAmBA,EAAgBr9B,EAC5C,IAAiB,kBAAN6B,GAGX,MAAO,YACL,MAAOA,GAAG0Y,MAAM8iB,EAAiBjsB,YATrC,GAAKisB,EAaL,OACEhD,eACA4D,IAAKZ,EACL/mB,eAAgB+hB,EAAW,kBAC3B5a,qBAAsB4a,EAAW,wBACjCjb,+BACIib,EAAW,oCAInBze,GAAIyjB,iBAAgBA,GAClB,GAAIpmC,KAAKwgC,UACP,KAAMtpB,OAAM,wEAIdlX,MAAK8iC,aAAa9iC,KAAKqmC,aAAaD,KAGtCzjB,GAAI4jB,QACF,GAAI/I,GAAMD,EAAYv9B,KAAMA,KAAK8B,aAAa,OAI9C,IAHK07B,IACHA,EAAMx9B,KAAKylC,eAERjI,EACH,MAAOx9B,KAET,IAAIsnC,GAAU9J,EAAI+I,IAClB,OAAOe,GAAUA,EAAU9J,IAqQ/B,IAAIyF,GAAoB,CAqCxB19B,QAAOshB,eAAe5lB,KAAK6F,UAAW,oBACpCQ,IAAK,WACH,GAAIm/B,GAAWzmC,KAAK4mC,iBACpB,OAAOH,GAAWA,EACbzmC,KAAKX,WAAaW,KAAKX,WAAWgnB,iBAAmB3S,SAI9D,IAAI8yB,GAAgBjoC,SAASinC,wBAC7BgB,GAAcjM,aACdiM,EAAcE,YAAc,KAY5BpD,EAAiBx8B,WACfk/B,UAAW,WACT,GAAI1kB,GAAOthB,KAAKshB,IACZA,KACEA,EAAKimB,aAAc,GACrBjmB,EAAKkmB,QAAQriB,QACX7D,EAAKvB,WAAY,GACnBuB,EAAKzP,MAAMsT,UAIjB8gB,mBAAoB,SAASH,EAAYhmB,GACvC9f,KAAKgmC,WAEL,IAAI1kB,GAAOthB,KAAKshB,QACZ8E,EAAWpmB,KAAKyjC,iBAEhB+D,GAAU,CACd,IAAI1B,EAAWzD,GAAI,CAQjB,GAPA/gB,EAAKmmB,OAAQ,EACbnmB,EAAKimB,UAAYzB,EAAWzD,GAAGrB,YAC/B1f,EAAKkmB,QAAU9F,EAAeQ,EAAI4D,EAAWzD,GAAIjc,EAAUtG,GAE3D0nB,EAAUlmB,EAAKkmB,QAGXlmB,EAAKimB,YAAcC,EAErB,WADAxnC,MAAKinC,cAIF3lB,GAAKimB,YACRC,EAAUA,EAAQxiB,KAAKhlB,KAAK0nC,cAAe1nC,OAG3C8lC,EAAWxD,QACbhhB,EAAKghB,QAAS,EACdhhB,EAAKvB,QAAU+lB,EAAWxD,OAAOtB,YACjC1f,EAAKzP,MAAQ6vB,EAAeU,EAAQ0D,EAAWxD,OAAQlc,EAAUtG,KAEjEwB,EAAKghB,QAAS,EACdhhB,EAAKvB,QAAU+lB,EAAWviC,KAAKy9B,YAC/B1f,EAAKzP,MAAQ6vB,EAAeS,EAAM2D,EAAWviC,KAAM6iB,EAAUtG,GAG/D,IAAIjO,GAAQyP,EAAKzP,KAIjB,OAHKyP,GAAKvB,UACRlO,EAAQA,EAAMmT,KAAKhlB,KAAKknC,oBAAqBlnC,OAE1CwnC,MAKLxnC,MAAK2nC,YAAY91B,OAJf7R,MAAKinC,gBAYTE,gBAAiB,WACf,GAAIt1B,GAAQ7R,KAAKshB,KAAKzP,KAGtB,OAFK7R,MAAKshB,KAAKvB,UACblO,EAAQA,EAAMoT,kBACTpT,GAGT61B,cAAe,SAASF,GACtB,MAAKA,OAKLxnC,MAAK2nC,YAAY3nC,KAAKmnC,uBAJpBnnC,MAAKinC,gBAOTC,oBAAqB,SAASr1B,GAC5B,GAAI7R,KAAKshB,KAAKmmB,MAAO,CACnB,GAAID,GAAUxnC,KAAKshB,KAAKkmB,OAGxB,IAFKxnC,KAAKshB,KAAKimB,YACbC,EAAUA,EAAQviB,mBACfuiB,EAEH,WADAxnC,MAAKinC,eAKTjnC,KAAK2nC,YAAY91B,IAGnB81B,YAAa,SAAS91B,GACf7R,KAAKshB,KAAKghB,SACbzwB,GAASA,GACX,IAAIwY,GAAUrqB,KAAKshB,KAAKghB,SACTtiC,KAAKshB,KAAKvB,SACX7R,MAAM2gB,QAAQhd,EAC5B7R,MAAKinC,aAAap1B,EAAOwY,IAG3B4c,aAAc,SAASp1B,EAAO+1B,GACvB15B,MAAM2gB,QAAQhd,KACjBA,MAEEA,IAAU7R,KAAK2jC,gBAGnB3jC,KAAK0rB,YACL1rB,KAAK4jC,aAAe/xB,EAChB+1B,IACF5nC,KAAK6jC,cAAgB,GAAIrS,eAAcxxB,KAAK4jC,cAC5C5jC,KAAK6jC,cAAc7e,KAAKhlB,KAAK6nC,cAAe7nC,OAG9CA,KAAK6nC,cAAcrW,cAAcqI,iBAAiB75B,KAAK4jC,aACL5jC,KAAK2jC,kBAGzDmE,oBAAqB,SAASn/B,GAC5B,GAAa,IAATA,EACF,MAAO3I,MAAKyjC,gBACd,IAAIgD,GAAWzmC,KAAK0jC,UAAU/6B,GAC1Bu4B,EAAauF,EAASC,WAC1B,KAAKxF,EACH,MAAOlhC,MAAK8nC,oBAAoBn/B,EAAQ,EAE1C,IAAIu4B,EAAWlgC,WAAaC,KAAKW,cAC7B5B,KAAKyjC,mBAAqBvC,EAC5B,MAAOA,EAGT,IAAI6G,GAAsB7G,EAAW6E,SACrC,OAAKgC,GAGEA,EAAoBC,sBAFlB9G,GAKX8G,oBAAqB,WACnB,MAAOhoC,MAAK8nC,oBAAoB9nC,KAAK0jC,UAAUpiC,OAAS,IAG1D2mC,iBAAkB,SAASt/B,EAAOu/B,GAChC,GAAIC,GAAuBnoC,KAAK8nC,oBAAoBn/B,EAAQ,GACxD85B,EAASziC,KAAKyjC,iBAAiBpkC,UACnCW,MAAK0jC,UAAUr8B,OAAOsB,EAAO,EAAGu/B,GAEhCzF,EAAOrX,aAAa8c,EAAUC,EAAqBvF,cAGrDwF,kBAAmB,SAASz/B,GAM1B,IALA,GAAIw/B,GAAuBnoC,KAAK8nC,oBAAoBn/B,EAAQ,GACxDm+B,EAAW9mC,KAAK8nC,oBAAoBn/B,GACpC85B,EAASziC,KAAKyjC,iBAAiBpkC,WAC/BonC,EAAWzmC,KAAK0jC,UAAUr8B,OAAOsB,EAAO,GAAG,GAExCm+B,IAAaqB,GAAsB,CACxC,GAAItlC,GAAOslC,EAAqBvF,WAC5B//B,IAAQikC,IACVA,EAAWqB,GAEb1B,EAAS7nC,YAAY6jC,EAAOnjC,YAAYuD,IAG1C,MAAO4jC,IAGT4B,cAAe,SAASz9B,GAEtB,MADAA,GAAKA,GAAMA,EAAG5K,KAAKyjC,kBACE,kBAAP74B,GAAoBA,EAAK,MAGzCi9B,cAAe,SAAShU,GACtB,IAAI7zB,KAAKwjC,QAAW3P,EAAQvyB,OAA5B,CAGA,GAAI8kB,GAAWpmB,KAAKyjC,gBAEpB,KAAKrd,EAAS/mB,WAEZ,WADAW,MAAKmlB,OAIPqM,eAAcgG,aAAax3B,KAAK2jC,cAAe3jC,KAAK4jC,aACzB/P,EAE3B,IAAI9Y,GAAWqL,EAASoa,SACM9sB,UAA1B1T,KAAKqnC,mBACPrnC,KAAKqnC,iBACDrnC,KAAKqoC,cAActtB,GAAYA,EAASyL,uBAGN9S,SAApC1T,KAAKonC,6BACPpnC,KAAKonC,2BACDpnC,KAAKqoC,cAActtB,GACAA,EAASoL,gCAMlC,KAAK,GAFDmiB,GAAgB,GAAI5hC,GACpB6hC,EAAc,EACT5mC,EAAI,EAAGA,EAAIkyB,EAAQvyB,OAAQK,IAAK,CAGvC,IAAK,GAFD0F,GAASwsB,EAAQlyB,GACjB8sB,EAAUpnB,EAAOonB,QACZ3iB,EAAI,EAAGA,EAAI2iB,EAAQntB,OAAQwK,IAAK,CACvC,GAAIgU,GAAQ2O,EAAQ3iB,GAChB26B,EAAWzmC,KAAKooC,kBAAkB/gC,EAAOsB,MAAQ4/B,EACjD9B,KAAaD,GACf8B,EAActhC,IAAI8Y,EAAO2mB,GAI7B8B,GAAelhC,EAAOwrB,WAIxB,IAAK,GAAIlxB,GAAI,EAAGA,EAAIkyB,EAAQvyB,OAAQK,IAGlC,IAFA,GAAI0F,GAASwsB,EAAQlyB,GACjBg2B,EAAWtwB,EAAOsB,MACfgvB,EAAWtwB,EAAOsB,MAAQtB,EAAOwrB,WAAY8E,IAAY,CAC9D,GAAI7X,GAAQ9f,KAAK2jC,cAAchM,GAC3B8O,EAAW6B,EAAchhC,IAAIwY,EAC7B2mB,GACF6B,EAAclhC,OAAO0Y,IAEjB9f,KAAKqnC,mBACPvnB,EAAQ9f,KAAKqnC,iBAAiBvnB,IAI9B2mB,EADY/yB,SAAVoM,EACS0mB,EAEApgB,EAAS+f,eAAermB,EAAOpM,OAAWqH,IAIzD/a,KAAKioC,iBAAiBtQ,EAAU8O,GAIpC6B,EAAclkC,QAAQ,SAASqiC,GAC7BzmC,KAAKwoC,sBAAsB/B,IAC1BzmC,MAECA,KAAKonC,4BACPpnC,KAAKyoC,qBAAqB5U,KAG9B6U,oBAAqB,SAAS//B,GAC5B,GAAI89B,GAAWzmC,KAAK0jC,UAAU/6B,EAC1B89B,KAAaD,GAGjBxmC,KAAKonC,2BAA2BX,EAASG,kBAAmBj+B,IAG9D8/B,qBAAsB,SAAS5U,GAG7B,IAAK,GAFDlrB,GAAQ,EACRwrB,EAAS,EACJxyB,EAAI,EAAGA,EAAIkyB,EAAQvyB,OAAQK,IAAK,CACvC,GAAI0F,GAASwsB,EAAQlyB,EACrB,IAAc,GAAVwyB,EACF,KAAOxrB,EAAQtB,EAAOsB,OACpB3I,KAAK0oC,oBAAoB//B,GACzBA,QAGFA,GAAQtB,EAAOsB,KAGjB,MAAOA,EAAQtB,EAAOsB,MAAQtB,EAAOwrB,YACnC7yB,KAAK0oC,oBAAoB//B,GACzBA,GAGFwrB,IAAU9sB,EAAOwrB,WAAaxrB,EAAOonB,QAAQntB,OAG/C,GAAc,GAAV6yB,EAIJ,IADA,GAAI7yB,GAAStB,KAAK0jC,UAAUpiC,OACbA,EAARqH,GACL3I,KAAK0oC,oBAAoB//B,GACzBA,KAIJ6/B,sBAAuB,SAAS/B,GAE9B,IAAK,GADDnM,GAAWmM,EAASlM,UACf54B,EAAI,EAAGA,EAAI24B,EAASh5B,OAAQK,IACnC24B,EAAS34B,GAAGwjB,SAIhBuG,UAAW,WACJ1rB,KAAK6jC,gBAGV7jC,KAAK6jC,cAAc1e,QACnBnlB,KAAK6jC,cAAgBnwB,SAGvByR,MAAO,WACL,IAAInlB,KAAKwjC,OAAT,CAEAxjC,KAAK0rB,WACL,KAAK,GAAI/pB,GAAI,EAAGA,EAAI3B,KAAK0jC,UAAUpiC,OAAQK,IACzC3B,KAAKwoC,sBAAsBxoC,KAAK0jC,UAAU/hC,GAG5C3B,MAAK0jC,UAAUpiC,OAAS,EACxBtB,KAAKgmC,YACLhmC,KAAKyjC,iBAAiBsC,UAAYryB,OAClC1T,KAAKwjC,QAAS,KAKlBjF,oBAAoBoK,qBAAuBzK,GAC1Cl+B,MAWH,SAAU5B,GAMV,QAASwqC,GAAephC,GACtBqhC,EAAQpkC,YAAcqkC,IACtBC,EAAUtoC,KAAK+G,GAGjB,QAASwhC,KACP,KAAOD,EAAUznC,QACfynC,EAAUE,UAXd,GAAIH,GAAa,EACbC,KACAF,EAAUtqC,SAAS2qC,eAAe,GAatC,KAAKhrC,OAAOgsB,kBAAoBif,oBAAoBH,GACjD3e,QAAQwe,GAAUO,eAAe,IAKpChrC,EAAMwqC,eAAiBA,GAEpB1hB,UAYH,SAAU9oB,GAUV,QAASgpB,KACFiiB,IACHA,GAAW,EACXjrC,EAAMwqC,eAAe,WACnBS,GAAW,EACXliB,SAASwT,MAAQ9a,QAAQypB,MAAM,oBAC/BlrC,EAAM84B,6BACN/P,SAASwT,MAAQ9a,QAAQ0pB,cAd/B,GAAIvlC,GAAQzF,SAASC,cAAc,QACnCwF,GAAMS,YAAc,oEACpB,IAAItF,GAAOZ,SAAS8B,cAAc,OAClClB,GAAKisB,aAAapnB,EAAO7E,EAAKksB,WAG9B,IAAIge,EAeJ,IAAK/Y,SAAS4J,iBAQZ9S,EAAQ,iBARsB,CAC9B,GAAIoiB,GAAsB,GAC1BtrC,QAAOW,iBAAiB,qBAAsB,WAC5CuoB,IACAhpB,EAAMqrC,UAAYtzB,YAAYiR,EAAOoiB,KAOzC,GAAItrC,OAAOmpB,iBAAmBA,eAAeC,UAAW,CACtD,GAAIoiB,GAAqB3F,SAASj9B,UAAU67B,UAC5CoB,UAASj9B,UAAU67B,WAAa,SAAS9/B,EAAM8mC,GAC7C,GAAIC,GAAWF,EAAmBhiC,KAAK1H,KAAM6C,EAAM8mC,EAEnD,OADAtiB,gBAAewiB,WAAWD,GACnBA,GAKXxrC,EAAMgpB,MAAQA,GAEXlpB,OAAOgpB,UAYV,SAAU9oB,GAwEV,QAAS0rC,GAAqBC,EAASC,EAASC,EAAcC,GAC5D,MAAOH,GAAQ1vB,QAAQ6vB,EAAQ,SAASzjC,EAAG0jC,EAAKC,EAAKC,GACnD,GAAIC,GAAUF,EAAI/vB,QAAQ,QAAS,GAEnC,OADAiwB,GAAUC,EAAmBP,EAASM,EAASL,GACxCE,EAAM,IAAOG,EAAU,IAAOD,IAIzC,QAASE,GAAmBP,EAASI,EAAKH,GAExC,GAAIG,GAAkB,MAAXA,EAAI,GACb,MAAOA,EAET,IAAI3nC,GAAI,GAAI+nC,KAAIJ,EAAKJ,EACrB,OAAOC,GAAexnC,EAAE88B,KAAOkL,EAAoBhoC,EAAE88B,MAGvD,QAASkL,GAAoBL,GAC3B,GAAIM,GAAO,GAAIF,KAAIjsC,SAASihC,SACxB/8B,EAAI,GAAI+nC,KAAIJ,EAAKM,EACrB,OAAIjoC,GAAEV,OAAS2oC,EAAK3oC,MAAQU,EAAEkoC,OAASD,EAAKC,MACxCloC,EAAEmoC,WAAaF,EAAKE,SACfC,EAAYH,EAAMjoC,GAElB2nC,EAKX,QAASS,GAAYC,EAAWC,GAK9B,IAJA,GAAI/hC,GAAS8hC,EAAUE,SACnBzrC,EAASwrC,EAAUC,SACnBrsC,EAAIqK,EAAOiiC,MAAM,KACjBnqC,EAAIvB,EAAO0rC,MAAM,KACdtsC,EAAE2C,QAAU3C,EAAE,KAAOmC,EAAE,IAC5BnC,EAAEsqC,QACFnoC,EAAEmoC,OAEJ,KAAK,GAAItnC,GAAI,EAAGgI,EAAIhL,EAAE2C,OAAS,EAAOqI,EAAJhI,EAAOA,IACvCb,EAAEoqC,QAAQ,KAEZ,OAAOpqC,GAAEklB,KAAK,KAAO+kB,EAAUI,OAASJ,EAAUK,KA/GpD,GAAIC,IACFC,WAAY,SAASZ,EAAMN,GACzBA,EAAMA,GAAOM,EAAK5L,cAAcU,QAChCx/B,KAAKurC,kBAAkBb,EAAMN,GAC7BpqC,KAAKwrC,cAAcd,EAAMN,EAEzB,IAAIqB,GAAYf,EAAK5hB,iBAAiB,WACtC,IAAI2iB,EACF,IAAK,GAAiC3qC,GAA7Ba,EAAI,EAAGgI,EAAI8hC,EAAUnqC,OAAgBqI,EAAJhI,IAAWb,EAAI2qC,EAAU9pC,IAAKA,IAClEb,EAAE29B,SACJz+B,KAAKsrC,WAAWxqC,EAAE29B,QAAS2L,IAKnCsB,gBAAiB,SAAStlB,GACxBpmB,KAAKsrC,WAAWllB,EAASqY,QAASrY,EAAS0Y,cAAcU,UAE3DgM,cAAe,SAASd,EAAMN,GAC5B,GAAItmC,GAAS4mC,EAAK5hB,iBAAiB,QACnC,IAAIhlB,EACF,IAAK,GAA8BnF,GAA1BgD,EAAI,EAAGgI,EAAI7F,EAAOxC,OAAgBqI,EAAJhI,IAAWhD,EAAImF,EAAOnC,IAAKA,IAChE3B,KAAK2rC,aAAahtC,EAAGyrC,IAI3BuB,aAAc,SAAS3nC,EAAOomC,GAC5BA,EAAMA,GAAOpmC,EAAM86B,cAAcU,QACjCx7B,EAAMS,YAAczE,KAAK4rC,eAAe5nC,EAAMS,YAAa2lC,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,iBAC7B/rC,KAAKgsC,yBAAyBtB,EAAMN,EAGtC,IAAI1/B,GAAQggC,GAAQA,EAAK5hB,iBAAiBmjB,EAC1C,IAAIvhC,EACF,IAAK,GAA6BhJ,GAAzBC,EAAI,EAAGgI,EAAIe,EAAMpJ,OAAgBqI,EAAJhI,IAAWD,EAAIgJ,EAAM/I,IAAKA,IAC9D3B,KAAKgsC,yBAAyBtqC,EAAG0oC,IAIvC4B,yBAA0B,SAASnpC,EAAMunC,GACvCA,EAAMA,GAAOvnC,EAAKi8B,cAAcU,QAChC0M,EAAU9nC,QAAQ,SAASX,GACzB,GAEI0oC,GAFAnK,EAAOn/B,EAAK88B,WAAWl8B,GACvBoO,EAAQmwB,GAAQA,EAAKnwB,KAErBA,IAASA,EAAMs5B,OAAOiB,GAAuB,IAE7CD,EADQ,UAAN1oC,EACYqmC,EAAqBj4B,EAAOu4B,GAAK,EAAOyB,GAExCtB,EAAmBH,EAAKv4B,GAExCmwB,EAAKnwB,MAAQs6B,OAMjBN,EAAiB,sBACjBC,EAAoB,qCACpBI,GAAa,OAAQ,MAAO,SAAU,QAAS,OAC/CD,EAAqB,IAAMC,EAAUlmB,KAAK,OAAS,IACnDomB,EAAsB,QA+C1BhuC,GAAMitC,YAAcA,GAEjBrkB,SAWH,SAAU5oB,GAIR,QAASiuC,GAAOC,GACdtsC,KAAKusC,MAAQhnC,OAAOC,OAAO,MAC3BxF,KAAKuE,IAAMgB,OAAOC,OAAO,MACzBxF,KAAKwsC,SAAW,EAChBxsC,KAAKssC,MAAQA,EAPf,GAAI1D,GAAiB1hB,SAAS0hB,cAS9ByD,GAAOvlC,WAIL2lC,YAAa,SAASC,EAAMhlB,GAG1B,IAFA,GACIilB,GAASlqC,EADTmqC,KAEID,EAAU3sC,KAAKssC,MAAMO,KAAKH,IAChCjqC,EAAI,GAAI+nC,KAAImC,EAAQ,GAAIjlB,GACxBklB,EAAQnsC,MAAMksC,QAASA,EAAQ,GAAIvC,IAAK3nC,EAAE88B,MAE5C,OAAOqN,IAITE,QAAS,SAASJ,EAAMhC,EAAMljC,GAC5B,GAAIolC,GAAU5sC,KAAKysC,YAAYC,EAAMhC,GAGjCqC,EAAOvlC,EAASjE,KAAK,KAAMvD,KAAKuE,IACpCvE,MAAKgtC,MAAMJ,EAASG,IAGtBC,MAAO,SAASJ,EAASplC,GACvB,GAAIylC,GAAWL,EAAQtrC,MAGvB,KAAK2rC,EACH,MAAOzlC,IAYT,KAAK,GADDf,GAAGymC,EAAK9C,EAPR2C,EAAO,WACU,MAAbE,GACJzlC,KAMK7F,EAAI,EAAOsrC,EAAJtrC,EAAcA,IAC5B8E,EAAImmC,EAAQjrC,GACZyoC,EAAM3jC,EAAE2jC,IACR8C,EAAMltC,KAAKusC,MAAMnC,GAEZ8C,IACHA,EAAMltC,KAAKmtC,IAAI/C,GACf8C,EAAIp5B,MAAQrN,EACZzG,KAAKusC,MAAMnC,GAAO8C,GAGpBA,EAAIE,KAAKL,IAGbM,UAAW,SAASC,GAClB,GAAIx5B,GAAQw5B,EAAQx5B,MAChBs2B,EAAMt2B,EAAMs2B,IAGZmD,EAAWD,EAAQC,UAAYD,EAAQE,cAAgB,EAC3DxtC,MAAKuE,IAAI6lC,GAAOmD,EAChBvtC,KAAKgtC,MAAMhtC,KAAKysC,YAAYc,EAAUnD,GAAMkD,EAAQG,UAEtDN,IAAK,SAAS/C,GACZpqC,KAAKwsC,UACL,IAAIc,GAAU,GAAII,eAwBlB,OAvBAJ,GAAQtoB,KAAK,MAAOolB,GAAK,GACzBkD,EAAQK,OACRL,EAAQM,QAAUN,EAAQO,OAAS7tC,KAAKqtC,UAAU9pC,KAAKvD,KAAMstC,GAG7DA,EAAQQ,WACRR,EAAQG,QAAU,WAEhB,IAAI,GADAK,GAAUR,EAAQQ,QACdnsC,EAAI,EAAGA,EAAImsC,EAAQxsC,OAAQK,IACjCmsC,EAAQnsC,IAEV2rC,GAAQQ,QAAU,MAIpBR,EAAQF,KAAO,SAASxiC,GAClB0iC,EAAQQ,QACVR,EAAQQ,QAAQrtC,KAAKmK,GAErBg+B,EAAeh+B,IAIZ0iC,IAIXlvC,EAAMiuC,OAASA,GACdrlB,SAWH,SAAU5oB,GAKV,QAAS2vC,KACP/tC,KAAKguC,OAAS,GAAI3B,GAAOrsC,KAAKssC,OAJhC,GAAIjB,GAAcjtC,EAAMitC,YACpBgB,EAASjuC,EAAMiuC,MAKnB0B,GAAcjnC,WACZwlC,MAAO,+CAEPmB,QAAS,SAASf,EAAMtC,EAAK5iC,GAC3B,GAAIulC,GAAO,SAASxoC,GAClBiD,EAASxH,KAAKiuC,QAAQvB,EAAMtC,EAAK7lC,KACjChB,KAAKvD,KACPA,MAAKguC,OAAOlB,QAAQJ,EAAMtC,EAAK2C,IAGjCmB,YAAa,SAASlqC,EAAOomC,EAAK5iC,GAChC,GAAIklC,GAAO1oC,EAAMS,YACbsoC,EAAO,SAASL,GAClB1oC,EAAMS,YAAcioC,EACpBllC,EAASxD,GAEXhE,MAAKytC,QAAQf,EAAMtC,EAAK2C,IAG1BkB,QAAS,SAASvB,EAAMhlB,EAAMnjB,GAG5B,IAAK,GADDuP,GAAOs2B,EAAK+D,EADZvB,EAAU5sC,KAAKguC,OAAOvB,YAAYC,EAAMhlB,GAEnC/lB,EAAI,EAAGA,EAAIirC,EAAQtrC,OAAQK,IAClCmS,EAAQ84B,EAAQjrC,GAChByoC,EAAMt2B,EAAMs2B,IAEZ+D,EAAe9C,EAAYO,eAAernC,EAAI6lC,GAAMA,GAAK,GAEzD+D,EAAenuC,KAAKiuC,QAAQE,EAAczmB,EAAMnjB,GAChDmoC,EAAOA,EAAKryB,QAAQvG,EAAM64B,QAASwB,EAErC,OAAOzB,IAET0B,WAAY,SAAStqC,EAAQ4jB,EAAMlgB,GAGjC,QAAS6mC,KACP1lB,IACIA,IAAWhf,GAAKnC,GAClBA,IAGJ,IAAK,GAAS7I,GARVgqB,EAAO,EAAGhf,EAAI7F,EAAOxC,OAQhBK,EAAE,EAASgI,EAAFhI,IAAShD,EAAEmF,EAAOnC,IAAKA,IACvC3B,KAAKkuC,YAAYvvC,EAAG+oB,EAAM2mB,IAKhC,IAAIC,GAAgB,GAAIP,EAGxB3vC,GAAMkwC,cAAgBA,GAEnBtnB,SAWH,SAAU5oB,GAGR,QAASmwC,GAAOznC,EAAW0nC,GAiBzB,MAhBI1nC,IAAa0nC,GAEfjpC,OAAOsvB,oBAAoB2Z,GAAKpqC,QAAQ,SAAS1C,GAE/C,GAAI+sC,GAAKlpC,OAAOuvB,yBAAyB0Z,EAAK9sC,EAC1C+sC,KAEFlpC,OAAOshB,eAAe/f,EAAWpF,EAAG+sC,GAEb,kBAAZA,GAAG58B,QAEZ48B,EAAG58B,MAAM68B,IAAMhtC,MAKhBoF,EAOT,QAAS43B,GAAMiQ,GAEb,IAAK,GADDvlC,GAAMulC,MACDhtC,EAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IAAK,CACzC,GAAI0B,GAAI8W,UAAUxY,EAClB,KACE,IAAK,GAAID,KAAK2B,GACZurC,EAAaltC,EAAG2B,EAAG+F,GAErB,MAAMxI,KAGV,MAAOwI,GAIT,QAASwlC,GAAaC,EAAQC,EAAUC,GACtC,GAAIN,GAAKO,EAAsBF,EAAUD,EACzCtpC,QAAOshB,eAAekoB,EAAUF,EAAQJ,GAK1C,QAASO,GAAsBC,EAAUJ,GACvC,GAAII,EAAU,CACZ,GAAIR,GAAKlpC,OAAOuvB,yBAAyBma,EAAUJ,EACnD,OAAOJ,IAAMO,EAAsBzpC,OAAOwqB,eAAekf,GAAWJ,IAMxEzwC,EAAMmwC,OAASA,EACfnwC,EAAMsgC,MAAQA,EAGdxX,SAASwX,MAAQA,GAEhB1X,SAWH,SAAU5oB,GA6CR,QAAS8wC,GAAIA,EAAK1nC,EAAU4lC,GAO1B,MANI8B,GACFA,EAAIC,OAEJD,EAAM,GAAIE,GAAIpvC,MAEhBkvC,EAAIG,GAAG7nC,EAAU4lC,GACV8B,EAzCT,GAAIE,GAAM,SAASE,GACjBtvC,KAAK+iB,QAAUusB,EACftvC,KAAKuvC,cAAgBvvC,KAAKwvC,SAASjsC,KAAKvD,MAE1CovC,GAAItoC,WACFuoC,GAAI,SAAS7nC,EAAU4lC,GACrBptC,KAAKwH,SAAWA,CAChB,IAAIioC,EACCrC,IAMHqC,EAAI7/B,WAAW5P,KAAKuvC,cAAenC,GACnCptC,KAAK0vC,OAAS,WACZ7/B,aAAa4/B,MAPfA,EAAI1jC,sBAAsB/L,KAAKuvC,eAC/BvvC,KAAK0vC,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACAnvC,KAAK0vC,SACP1vC,KAAK0vC,SACL1vC,KAAK0vC,OAAS,OAGlBF,SAAU,WACJxvC,KAAK0vC,SACP1vC,KAAKmvC,OACLnvC,KAAKwH,SAASE,KAAK1H,KAAK+iB,YAiB9B3kB,EAAM8wC,IAAMA,GAEXloB,SAWH,SAAU5oB,GAiER,QAASwxC,GAAUC,EAAaC,EAAQC,GACtC,GAAIC,GAA4B,gBAAfH,GACbtxC,SAASC,cAAcqxC,GAAeA,EAAYI,WAAU,EAEhE,IADAD,EAAIE,UAAYJ,EACZC,EACF,IAAK,GAAIruC,KAAKquC,GACZC,EAAIxjC,aAAa9K,EAAGquC,EAAQruC,GAGhC,OAAOsuC,GAxET,GAAIG,KAEJjT,aAAY1zB,SAAW,SAAS4mC,EAAKtpC,GACnCqpC,EAASC,GAAOtpC,GAIlBo2B,YAAYmT,mBAAqB,SAASD,GACxC,GAAItpC,GAAaspC,EAA8BD,EAASC,GAAjClT,YAAYp2B,SAEnC,OAAOA,IAAavB,OAAOwqB,eAAexxB,SAASC,cAAc4xC,IAInE,IAAIE,GAA0BC,MAAMzpC,UAAU9H,eAC9CuxC,OAAMzpC,UAAU9H,gBAAkB,WAChCgB,KAAKwwC,cAAe,EACpBF,EAAwBhtB,MAAMtjB,KAAMma,WAStC,IAAI8d,GAAMwY,aAAa3pC,UAAUmxB,IAC7ByY,EAASD,aAAa3pC,UAAU4pC,MACpCD,cAAa3pC,UAAUmxB,IAAM,WAC3B,IAAK,GAAIt2B,GAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IACpCs2B,EAAIvwB,KAAK1H,KAAMma,UAAUxY,KAG7B8uC,aAAa3pC,UAAU4pC,OAAS,WAC9B,IAAK,GAAI/uC,GAAI,EAAGA,EAAIwY,UAAU7Y,OAAQK,IACpC+uC,EAAOhpC,KAAK1H,KAAMma,UAAUxY,KAGhC8uC,aAAa3pC,UAAU6pC,OAAS,SAAS5nC,EAAM6nC,GACrB,GAApBz2B,UAAU7Y,SACZsvC,GAAQ5wC,KAAKmC,SAAS4G,IAExB6nC,EAAO5wC,KAAKi4B,IAAIlvB,GAAQ/I,KAAK0wC,OAAO3nC,IAEtC0nC,aAAa3pC,UAAU+pC,OAAS,SAASC,EAASC,GAChDD,GAAW9wC,KAAK0wC,OAAOI,GACvBC,GAAW/wC,KAAKi4B,IAAI8Y,GAKtB,IAAIC,GAAa,WACf,MAAO9iC,OAAMpH,UAAUgR,MAAMpQ,KAAK1H,OAGhCixC,EAAgB/yC,OAAOgzC,cAAgBhzC,OAAOizC,mBAElDC,UAAStqC,UAAU2qB,MAAQuf,EAC3BC,EAAanqC,UAAU2qB,MAAQuf,EAC/BK,eAAevqC,UAAU2qB,MAAQuf,EAkBjC5yC,EAAMwxC,UAAYA,GAEjB5oB,SAWF,SAAU5oB,GAgBP,QAASkzC,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhB9C,EAAM8C,EAAO9C,IAEb+C,EAASD,EAAOC,MACfA,KACE/C,IACHA,EAAM8C,EAAO9C,IAAMgD,EAAWhqC,KAAK1H,KAAMwxC,IAEtC9C,GACH7uB,QAAQ8xB,KAAK,iFAQfF,EAASG,EAAaJ,EAAQ9C,EAAK3e,EAAe/vB,OAGpD,IAAI4K,GAAK6mC,EAAO/C,EAChB,OAAI9jC,IAEGA,EAAG6mC,QAENG,EAAahnC,EAAI8jC,EAAK+C,GAIjB7mC,EAAG0Y,MAAMtjB,KAAMuxC,QARxB,OAYF,QAASG,GAAW7/B,GAElB,IADA,GAAIxO,GAAIrD,KAAK4mB,UACNvjB,GAAKA,IAAM65B,YAAYp2B,WAAW,CAGvC,IAAK,GAAsBpF,GADvBmwC,EAAKtsC,OAAOsvB,oBAAoBxxB,GAC3B1B,EAAE,EAAGgI,EAAEkoC,EAAGvwC,OAAaqI,EAAFhI,IAAQD,EAAEmwC,EAAGlwC,IAAKA,IAAK,CACnD,GAAIY,GAAIgD,OAAOuvB,yBAAyBzxB,EAAG3B,EAC3C,IAAuB,kBAAZa,GAAEsP,OAAwBtP,EAAEsP,QAAUA,EAC/C,MAAOnQ,GAGX2B,EAAIA,EAAEujB,WAIV,QAASgrB,GAAaE,EAAQ/oC,EAAM4rB,GAIlC,GAAIh2B,GAAIozC,EAAUpd,EAAO5rB,EAAM+oC,EAM/B,OALInzC,GAAEoK,KAGJpK,EAAEoK,GAAM2lC,IAAM3lC,GAET+oC,EAAOL,OAAS9yC,EAGzB,QAASozC,GAAUpd,EAAO5rB,EAAMyoC,GAE9B,KAAO7c,GAAO,CACZ,GAAKA,EAAM5rB,KAAUyoC,GAAW7c,EAAM5rB,GACpC,MAAO4rB,EAETA,GAAQ5E,EAAe4E,GAMzB,MAAOpvB,QAMT,QAASwqB,GAAejpB,GACtB,MAAOA,GAAU8f,UAkBnBxoB,EAAM4zC,MAAQV,GAEftqB,SAWH,SAAU5oB,GAER,QAAS6zC,GAAYpgC,GACnB,MAAOA,GA8CT,QAASqgC,GAAiBrgC,EAAOioB,GAE/B,GAAIqY,SAAsBrY,EAM1B,OAJIA,aAAwBjkB,QAC1Bs8B,EAAe,QAGVC,EAAaD,GAActgC,EAAOioB,GAnD3C,GAAIsY,IACFC,OAAQJ,EACRv+B,UAAau+B,EACbK,KAAM,SAASzgC,GACb,MAAO,IAAIgE,MAAKA,KAAKiI,MAAMjM,IAAUgE,KAAKC,QAE5Cy8B,UAAS,SAAS1gC,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvCmH,OAAQ,SAASnH,GACf,GAAInQ,GAAIwX,WAAWrH,EAKnB,OAHU,KAANnQ,IACFA,EAAI8wC,SAAS3gC,IAERqQ,MAAMxgB,GAAKmQ,EAAQnQ,GAK5Bif,OAAQ,SAAS9O,EAAOioB,GACtB,GAAqB,OAAjBA,EACF,MAAOjoB,EAET,KAIE,MAAOwiB,MAAKvW,MAAMjM,EAAMwI,QAAQ,KAAM,MACtC,MAAMnV,GAEN,MAAO2M,KAIX4gC,WAAY,SAAS5gC,EAAOioB,GAC1B,MAAOA,IAiBX17B,GAAM8zC,iBAAmBA,GAExBlrB,SAUH,SAAU5oB,GAIR,GAAImwC,GAASnwC,EAAMmwC,OAIfC,IAEJA,GAAIkE,eACJlE,EAAI/H,YAEJ+H,EAAImE,QAAU,SAASC,EAAM9rC,GAC3B,IAAK,GAAIpF,KAAKkxC,GACZrE,EAAOznC,EAAW8rC,EAAKlxC,KAM3BtD,EAAMowC,IAAMA,GAEXxnB,SAWH,SAAU5oB,GAER,GAAIy0C,IASFC,MAAO,SAAShB,EAAQ53B,EAAM64B,GAG5B7rB,SAASE,QAETlN,EAAQA,GAAQA,EAAK5Y,OAAU4Y,GAAQA,EAEvC,IAAItP,GAAK,YACN5K,KAAK8xC,IAAWA,GAAQxuB,MAAMtjB,KAAMka,IACrC3W,KAAKvD,MAEH0vC,EAASqD,EAAUnjC,WAAWhF,EAAImoC,GAClChnC,sBAAsBnB,EAE1B,OAAOmoC,GAAUrD,GAAUA,GAE7BsD,YAAa,SAAStD,GACP,EAATA,EACFC,sBAAsBD,GAEtB7/B,aAAa6/B,IAajBuD,KAAM,SAASlpC,EAAMuG,EAAQ4iC,EAAQh0C,EAASmG,GAC5C,GAAIxC,GAAOqwC,GAAUlzC,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,GAST+vC,UAAW,WACTnzC,KAAK8yC,MAAM,OAAQ34B,YASrBi5B,aAAc,SAASC,EAAMlgB,EAAKmgB,GAC5BngB,GACFA,EAAIogB,UAAU7C,OAAO4C,GAEnBD,GACFA,EAAKE,UAAUtb,IAAIqb,IASvBE,gBAAiB,SAAS3O,EAAMtkC,GAC9B,GAAI6lB,GAAW7nB,SAASC,cAAc,WACtC4nB,GAAS8pB,UAAYrL,CACrB,IAAIqD,GAAWloC,KAAKyzC,iBAAiBrtB,EAKrC,OAJI7lB,KACFA,EAAQkE,YAAc,GACtBlE,EAAQ3B,YAAYspC,IAEfA,IAKPwL,EAAM,aAGNC,IAIJd,GAAMe,YAAcf,EAAMC,MAI1B10C,EAAMowC,IAAI/H,SAASoM,MAAQA,EAC3Bz0C,EAAMs1C,IAAMA,EACZt1C,EAAMu1C,IAAMA,GAEX3sB,SAWH,SAAU5oB,GAIR,GAAIy1C,GAAM31C,OAAOipB,aACb2sB,EAAe,MAGf5qC,GAEF4qC,aAAcA,EAEdC,iBAAkB,WAChB,GAAI7qC,GAASlJ,KAAKg0C,cAClBH,GAAI3qC,QAAW3D,OAAOG,KAAKwD,GAAQ5H,OAAS,GAAMue,QAAQg0B,IAAI,yBAA0B7zC,KAAKupB,UAAWrgB,EAKxG,KAAK,GAAIa,KAAQb,GAAQ,CACvB,GAAI+qC,GAAa/qC,EAAOa,EACxB5L,iBAAgBU,iBAAiBmB,KAAM+J,EAAM/J,KAAKO,QAAQ2zC,gBAAgBl0C,KAAMA,KAAMi0C,MAI1FE,eAAgB,SAAS/qC,EAAK0oC,EAAQ53B,GACpC,GAAI9Q,EAAK,CACPyqC,EAAI3qC,QAAU2W,QAAQypB,MAAM,qBAAsBlgC,EAAImgB,UAAWuoB,EACjE,IAAIlnC,GAAuB,kBAAXknC,GAAwBA,EAAS1oC,EAAI0oC,EACjDlnC,IACFA,EAAGsP,EAAO,QAAU,QAAQ9Q,EAAK8Q,GAEnC25B,EAAI3qC,QAAU2W,QAAQ0pB,WACtBriB,SAASE,UAOfhpB,GAAMowC,IAAI/H,SAASv9B,OAASA,EAG5B9K,EAAMS,iBAAmB,SAASgE,EAAM44B,EAAW2Y,EAAW1nC,GAC5DvO,gBAAgBU,iBAAiB+oB,KAAK/kB,GAAO44B,EAAW2Y,EAAW1nC,IAErEtO,EAAM+M,oBAAsB,SAAStI,EAAM44B,EAAW2Y,EAAW1nC,GAC/DvO,gBAAgBgN,oBAAoByc,KAAK/kB,GAAO44B,EAAW2Y,EAAW1nC,KAGvEsa,SAWH,SAAU5oB,GAIR,GAAIuhC,IACF0U,uBAAwB,WACtB,GAAIC,GAAKt0C,KAAKu0C,mBACd,KAAK,GAAI9uC,KAAK6uC,GACPt0C,KAAK6B,aAAa4D,IACrBzF,KAAKwM,aAAa/G,EAAG6uC,EAAG7uC,KAK9B+uC,eAAgB,WAGd,GAAIx0C,KAAKy0C,WACP,IAAK,GAA0CxyC,GAAtCN,EAAE,EAAG2yC,EAAGt0C,KAAK2/B,WAAYh2B,EAAE2qC,EAAGhzC,QAAYW,EAAEqyC,EAAG3yC,KAASgI,EAAFhI,EAAKA,IAClE3B,KAAK00C,oBAAoBzyC,EAAE8G,KAAM9G,EAAE4P,QAMzC6iC,oBAAqB,SAAS3rC,EAAM8I,GAGlC,GAAI9I,GAAO/I,KAAK20C,qBAAqB5rC,EACrC,IAAIA,EAAM,CAIR,GAAI8I,GAASA,EAAMs5B,OAAO/sC,EAAMw2C,cAAgB,EAC9C,MAGF,IAAI9a,GAAe95B,KAAK+I,GAEpB8I,EAAQ7R,KAAKkyC,iBAAiBrgC,EAAOioB,EAErCjoB,KAAUioB,IAEZ95B,KAAK+I,GAAQ8I,KAKnB8iC,qBAAsB,SAAS5rC,GAC7B,GAAI+K,GAAQ9T,KAAKy0C,YAAcz0C,KAAKy0C,WAAW1rC,EAE/C,OAAO+K,IAGTo+B,iBAAkB,SAAS2C,EAAa/a,GACtC,MAAO17B,GAAM8zC,iBAAiB2C,EAAa/a,IAE7Cgb,eAAgB,SAASjjC,EAAOsgC,GAC9B,MAAqB,YAAjBA,EACKtgC,EAAQ,GAAK6B,OACM,WAAjBy+B,GAA8C,aAAjBA,GACvBz+B,SAAV7B,EACEA,EAFF,QAKTkjC,2BAA4B,SAAShsC,GACnC,GAAIopC,SAAsBnyC,MAAK+I,GAE3BisC,EAAkBh1C,KAAK80C,eAAe90C,KAAK+I,GAAOopC,EAE9Bz+B,UAApBshC,EACFh1C,KAAKwM,aAAazD,EAAMisC,GAME,YAAjB7C,GACTnyC,KAAK+6B,gBAAgBhyB,IAO3B3K,GAAMowC,IAAI/H,SAAS9G,WAAaA,GAE/B3Y,SAWH,SAAU5oB,GAyBR,QAASiuB,GAAarpB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpCqpB,EAAYtpB,IAASspB,EAAYrpB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAKpC,QAASgyC,GAAoBtiB,EAAU9gB,GACrC,MAAc6B,UAAV7B,GAAoC,OAAb8gB,EAClB9gB,EAES,OAAVA,GAA4B6B,SAAV7B,EAAuB8gB,EAAW9gB,EApC9D,GAAIgiC,GAAM31C,OAAOipB,aAUb+tB,GACFv0B,OAAQjN,OACR3J,KAAM,SACNhB,KAAM2K,OACNif,SAAUjf,QAGR4Y,EAAcnK,OAAOD,OAAS,SAASrQ,GACzC,MAAwB,gBAAVA,IAAsBqQ,MAAMrQ,IAqBxC0J,GACF45B,uBAAwB,WACtB,GAAItD,GAAK7xC,KAAKo1C,aACd,IAAIvD,GAAMA,EAAGvwC,OAAQ,CACnB,GAAI+zC,GAAIr1C,KAAKs1C,kBAAoB,GAAI5vB,mBAAiB,EACtD1lB,MAAKu1C,iBAAiBF,EAKtB,KAAK,GAAsB3zC,GAAlBC,EAAE,EAAGgI,EAAEkoC,EAAGvwC,OAAcqI,EAAFhI,IAASD,EAAEmwC,EAAGlwC,IAAKA,IAChD0zC,EAAE/yB,QAAQtiB,KAAM0B,GAChB1B,KAAKw1C,kBAAkB9zC,EAAG1B,KAAK0B,GAAI,QAIzC+zC,qBAAsB,WAChBz1C,KAAKs1C,mBACPt1C,KAAKs1C,kBAAkBtwB,KAAKhlB,KAAK01C,sBAAuB11C,OAG5D01C,sBAAuB,SAASC,EAAWljB,EAAWmjB,GACpD,GAAI7sC,GAAM+oC,EAAQ+D,IAClB,KAAK,GAAIl0C,KAAK8wB,GAIZ,GAFA1pB,EAAO6sC,EAAM,EAAIj0C,EAAI,GACrBmwC,EAAS9xC,KAAKqqB,QAAQthB,GACV,CACV,GAAI+sC,GAAKrjB,EAAU9wB,GAAIo0C,EAAKJ,EAAUh0C,EAEtC3B,MAAKw1C,kBAAkBzsC,EAAMgtC,EAAID,GAC5BD,EAAO/D,KAEEp+B,SAAPoiC,GAA2B,OAAPA,GAAwBpiC,SAAPqiC,GAA2B,OAAPA,KAC5DF,EAAO/D,IAAU,EAKjB9xC,KAAKg2C,aAAalE,GAASgE,EAAIC,EAAI57B,eAM7C87B,eAAgB,WACVj2C,KAAKs1C,mBACPt1C,KAAKs1C,kBAAkBpwB,WAG3BgxB,iBAAkB,SAASntC,GACrB/I,KAAKm2C,QAAQptC,IACf/I,KAAK+0C,2BAA2BhsC,IAGpCysC,kBAAmB,SAASzsC,EAAM8I,EAAOshB,GAEvC,GAAIijB,GAAep2C,KAAKqqB,QAAQthB,EAChC,IAAIqtC,IAEEloC,MAAM2gB,QAAQsE,KAChB0gB,EAAIxpB,SAAWxK,QAAQg0B,IAAI,mDAAoD7zC,KAAKupB,UAAWxgB,GAC/F/I,KAAKq2C,mBAAmBttC,EAAO,YAG7BmF,MAAM2gB,QAAQhd,IAAQ,CACxBgiC,EAAIxpB,SAAWxK,QAAQg0B,IAAI,iDAAkD7zC,KAAKupB,UAAWxgB,EAAM8I,EACnG,IAAIwQ,GAAW,GAAImP,eAAc3f,EACjCwQ,GAAS2C,KAAK,SAAS6O,GACrB7zB,KAAKg2C,aAAaI,GAAeviB,KAChC7zB,MACHA,KAAKs2C,sBAAsBvtC,EAAO,UAAWsZ,KAInDk0B,yBAA0B,SAASxtC,EAAM8I,EAAO8gB,GAE9C,IAAItG,EAAaxa,EAAO8gB,KAGxB3yB,KAAKk2C,iBAAiBntC,EAAM8I,EAAO8gB,GAE9BrC,SAAS4J,kBAAd,CAGA,GAAIsc,GAAWx2C,KAAKy2C,SACfD,KACHA,EAAWx2C,KAAKy2C,UAAYlxC,OAAOmxC,YAAY12C,OAEjDk1C,EAAav0B,OAAS3gB,KACtBk1C,EAAansC,KAAOA,EACpBmsC,EAAaviB,SAAWA,EAExB6jB,EAASG,OAAOzB,KAElB0B,eAAgB,SAAS7tC,EAAMipB,EAAY6kB,GAYzC,QAASlP,GAAY91B,EAAO8gB,GAC1B9hB,EAAKimC,GAAejlC,CAEpB,IAAIklC,GAAiBlmC,EAAKmmC,EACtBD,IAAoD,kBAA3BA,GAAev0B,UAC1Cu0B,EAAev0B,SAAS3Q,GAG1BhB,EAAK0lC,yBAAyBxtC,EAAM8I,EAAO8gB,GAnB7C,GAAImkB,GAAc/tC,EAAO,IACrBkuC,EAAqBluC,EAAO,cAG5BiuC,EAA4BjuC,EAAO,0BAEvC/I,MAAKi3C,GAAqBjlB,CAE1B,IAAIW,GAAW3yB,KAAK82C,GAEhBjmC,EAAO7Q,KAYP6R,EAAQmgB,EAAWhN,KAAK2iB,EAE5B,IAAIkP,IAAcxqB,EAAasG,EAAU9gB,GAAQ,CAC/C,GAAIqlC,GAAgBL,EAAUlkB,EAAU9gB,EACnCwa,GAAaxa,EAAOqlC,KACvBrlC,EAAQqlC,EACJllB,EAAWxP,UACbwP,EAAWxP,SAAS3Q,IAI1B81B,EAAY91B,EAAO8gB,EAEnB,IAAItQ,IACF8C,MAAO,WACL6M,EAAW7M,QACXtU,EAAKomC,GAAqBvjC,OAC1B7C,EAAKmmC,GAA6BtjC,QAItC,OADA1T,MAAKu1C,iBAAiBlzB,GACfA,GAET80B,yBAA0B,WACxB,GAAKn3C,KAAKo3C,eAIV,IAAK,GAAIz1C,GAAI,EAAGA,EAAI3B,KAAKo3C,eAAe91C,OAAQK,IAAK,CACnD,GAAIoH,GAAO/I,KAAKo3C,eAAez1C,GAC3B2d,EAAiBtf,KAAK6gB,SAAS9X,EACnC,KACE,GAAIyW,GAAa4C,mBAAmB3C,cAAcH,GAC9C0S,EAAaxS,EAAWS,WAAWjgB,KAAMA,KAAKO,QAAQ82C,OAC1Dr3C,MAAK42C,eAAe7tC,EAAMipB,GAC1B,MAAOpS,GACPC,QAAQ5F,MAAM,qCAAsC2F,MAI1D03B,aAAc,SAASp7B,EAAU8V,EAAYjS,GAC3C,GAAIA,EAEF,YADA/f,KAAKkc,GAAY8V,EAGnB,IAAInR,GAAW7gB,KAAKO,QAAQuG,UAAU+Z,QAKtC,IAAIA,GAAYA,EAAS3E,GAAW,CAClC,GAAI86B,GAA4B96B,EAAW,0BAE3C,aADAlc,KAAKg3C,GAA6BhlB,GAIpC,MAAOhyB,MAAK42C,eAAe16B,EAAU8V,EAAYijB,IAEnDe,aAAc,SAASlE,EAAQ53B,GAC7B,GAAItP,GAAK5K,KAAK8xC,IAAWA,CACP,mBAAPlnC,IACTA,EAAG0Y,MAAMtjB,KAAMka,IAGnBq7B,iBAAkB,SAASlzB,GACzB,MAAKriB,MAAKu3C,eAKVv3C,MAAKu3C,WAAW92C,KAAK4hB,QAJnBriB,KAAKu3C,YAAcl1B,KAOvBm1B,eAAgB,WACd,GAAKx3C,KAAKu3C,WAAV,CAKA,IAAK,GADDrnB,GAAYlwB,KAAKu3C,WACZ51C,EAAI,EAAGA,EAAIuuB,EAAU5uB,OAAQK,IAAK,CACzC,GAAI0gB,GAAW6N,EAAUvuB,EACrB0gB,IAAqC,kBAAlBA,GAAS8C,OAC9B9C,EAAS8C,QAIbnlB,KAAKu3C,gBAGPjB,sBAAuB,SAASvtC,EAAMsZ,GACpC,GAAIo1B,GAAKz3C,KAAK03C,kBAAoB13C,KAAK03C,mBACvCD,GAAG1uC,GAAQsZ,GAEbg0B,mBAAoB,SAASttC,GAC3B,GAAI0uC,GAAKz3C,KAAK03C,eACd,OAAID,IAAMA,EAAG1uC,IACX0uC,EAAG1uC,GAAMoc,QACTsyB,EAAG1uC,GAAQ,MACJ,GAHT,QAMF4uC,oBAAqB,WACnB,GAAI33C,KAAK03C,gBAAiB,CACxB,IAAK,GAAI/1C,KAAK3B,MAAK03C,gBACjB13C,KAAKq2C,mBAAmB10C,EAE1B3B,MAAK03C,qBAYXt5C,GAAMowC,IAAI/H,SAASlrB,WAAaA,GAE/ByL,SAWH,SAAU5oB,GAIR,GAAIy1C,GAAM31C,OAAOipB,UAAY,EAGzBywB,GACFnE,iBAAkB,SAASrtB,GAEzBmY,oBAAoBC,SAASpY,EAM7B,KAAK,GAJDixB,GAASr3C,KAAKq3C,SAAYjxB,EAASggB,iBACnCpmC,KAAKO,QAAQ82C,OACbrH,EAAM5pB,EAAS+f,eAAenmC,KAAMq3C,GACpCnnB,EAAY8f,EAAIzV,UACX54B,EAAI,EAAGA,EAAIuuB,EAAU5uB,OAAQK,IACpC3B,KAAKu1C,iBAAiBrlB,EAAUvuB,GAElC,OAAOquC,IAETzsC,KAAM,SAASwF,EAAMipB,EAAYjS,GAC/B,GAAI7D,GAAWlc,KAAK20C,qBAAqB5rC,EACzC,IAAKmT,EAIE,CAEL,GAAImG,GAAWriB,KAAKs3C,aAAap7B,EAAU8V,EAAYjS,EAUvD,OAPImH,UAAS2wB,0BAA4Bx1B,IACvCA,EAAStjB,KAAOizB,EAAWL,MAC3B3xB,KAAK83C,eAAe57B,EAAUmG,IAE5BriB,KAAKm2C,QAAQj6B,IACflc,KAAK+0C,2BAA2B74B,GAE3BmG,EAbP,MAAOriB,MAAK+3C,WAAW59B,YAgB3BsiB,aAAc,WACZz8B,KAAKg4C,oBAEPF,eAAgB,SAAS/uC,EAAMsZ,GAC7BriB,KAAKu6B,UAAYv6B,KAAKu6B,cACtBv6B,KAAKu6B,UAAUxxB,GAAQsZ,GAKzB41B,eAAgB,WACTj4C,KAAKk4C,WACRrE,EAAIsE,QAAUt4B,QAAQg0B,IAAI,sBAAuB7zC,KAAKupB,WACtDvpB,KAAKo4C,cAAgBp4C,KAAKkvC,IAAIlvC,KAAKo4C,cAAep4C,KAAKq4C,UAAW,KAGtEA,UAAW,WACJr4C,KAAKk4C,WACRl4C,KAAKw3C,iBACLx3C,KAAK23C,sBACL33C,KAAKk4C,UAAW,IAGpBI,gBAAiB,WACf,MAAIt4C,MAAKk4C,cACPrE,EAAIsE,QAAUt4B,QAAQ8xB,KAAK,gDAAiD3xC,KAAKupB,aAGnFsqB,EAAIsE,QAAUt4B,QAAQg0B,IAAI,uBAAwB7zC,KAAKupB,gBACnDvpB,KAAKo4C,gBACPp4C,KAAKo4C,cAAgBp4C,KAAKo4C,cAAcjJ,YAsB1CoJ,EAAkB,gBAItBn6C,GAAMw2C,YAAc2D,EACpBn6C,EAAMowC,IAAI/H,SAASmR,IAAMA,GAExB5wB,SAWH,SAAU5oB,GAuNR,QAASo6C,GAAO73B,GACd,MAAOA,GAAOoB,eAAe,eAK/B,QAAS02B,MA3NT,GAAI/wB,IACF+wB,aAAa,EACbvJ,IAAK,SAASA,EAAK1nC,EAAU4lC,GAC3B,GAAmB,gBAAR8B,GAIT,MAAOloB,SAAQkoB,IAAIxnC,KAAK1H,KAAMkvC,EAAK1nC,EAAU4lC,EAH7C,IAAI1rC,GAAI,MAAQwtC,CAChBlvC,MAAK0B,GAAKslB,QAAQkoB,IAAIxnC,KAAK1H,KAAMA,KAAK0B,GAAI8F,EAAU4lC,IAKxD4E,QAAOhrB,QAAQgrB,MAEf0G,QAAS,aAITnxB,MAAO,aAEPoxB,gBAAiB,WACX34C,KAAKqmB,kBAAoBrmB,KAAKqmB,iBAAiBvG,OACjDD,QAAQ8xB,KAAK,iBAAmB3xC,KAAKupB,UAAY,wGAInDvpB,KAAK04C,UACL14C,KAAK44C,iBACA54C,KAAK8+B,cAAcQ,mBACtBt/B,KAAKg4C,oBAITY,eAAgB,WACd,MAAI54C,MAAK64C,qBACPh5B,SAAQ8xB,KAAK,2BAA4B3xC,KAAKupB,YAGhDvpB,KAAK64C,kBAAmB,EAExB74C,KAAK84C,eAEL94C,KAAKm1C,yBACLn1C,KAAKy1C,uBAELz1C,KAAKq0C,yBAELr0C,KAAKw0C,qBAELx0C,MAAK+zC,qBAEPiE,iBAAkB,WACZh4C,KAAK+4C,WAGT/4C,KAAK+4C,UAAW,EAChB/4C,KAAKm3C,2BAILn3C,KAAKg5C,kBAAkBh5C,KAAK4mB,WAI5B5mB,KAAK+6B,gBAAgB,cAErB/6B,KAAKunB,UAEP0xB,iBAAkB,WAChBj5C,KAAKs4C,kBAEDt4C,KAAKk5C,UACPl5C,KAAKk5C,WAGHl5C,KAAKm5C,aACPn5C,KAAKm5C,cAMFn5C,KAAKo5C,kBACRp5C,KAAKo5C,iBAAkB,EACnBp5C,KAAKq5C,UACPr5C,KAAK8yC,MAAM,cAIjBwG,iBAAkB,WACXt5C,KAAKu5C,gBACRv5C,KAAKi4C,iBAGHj4C,KAAKw5C,UACPx5C,KAAKw5C,WAGHx5C,KAAKy5C,UACPz5C,KAAKy5C,YAITC,oBAAqB,WACnB15C,KAAKi5C,oBAGPU,iBAAkB,WAChB35C,KAAKs5C,oBAGPM,wBAAyB,WACvB55C,KAAKi5C,oBAGPY,qBAAsB,WACpB75C,KAAKs5C,oBAGPN,kBAAmB,SAAS31C,GACtBA,GAAKA,EAAE9C,UACTP,KAAKg5C,kBAAkB31C,EAAEujB,WACzBvjB,EAAEy2C,iBAAiBpyC,KAAK1H,KAAMqD,EAAE9C,WAIpCu5C,iBAAkB,SAASC,GACzB,GAAI3zB,GAAWpmB,KAAKg6C,cAAcD,EAClC,IAAI3zB,EAAU,CACZ,GAAIskB,GAAO1qC,KAAKi6C,mBAAmB7zB,EACnCpmB,MAAK84C,YAAYiB,EAAehxC,MAAQ2hC,IAI5CsP,cAAe,SAASD,GACtB,MAAOA,GAAe15C,cAAc,aAGtC45C,mBAAoB,SAAS7zB,GAC3B,GAAIA,EAAU,CAEZ,GAAIskB,GAAO1qC,KAAKvB,mBAKZuxC,EAAMhwC,KAAKyzC,iBAAiBrtB,EAMhC,OAJAskB,GAAK9rC,YAAYoxC,GAEjBhwC,KAAKk6C,gBAAgBxP,EAAMtkB,GAEpBskB,IAIXyP,kBAAmB,SAAS/zB,EAAUg0B,GACpC,GAAIh0B,EAAU,CAKZpmB,KAAKq6C,gBAAkBr6C,IAKvB,IAAIgwC,GAAMhwC,KAAKyzC,iBAAiBrtB,EAUhC,OARIg0B,GACFp6C,KAAKorB,aAAa4kB,EAAKoK,GAEvBp6C,KAAKpB,YAAYoxC,GAGnBhwC,KAAKk6C,gBAAgBl6C,MAEdgwC,IAGXkK,gBAAiB,SAASxP,GAExB1qC,KAAKs6C,sBAAsB5P,IAG7B4P,sBAAuB,SAAS5P,GAE9B,GAAI6P,GAAIv6C,KAAKu6C,EAAIv6C,KAAKu6C,KAEtB,IAAI7P,EAEF,IAAK,GAAsBhpC,GADvBmwC,EAAKnH,EAAK5hB,iBAAiB,QACtBnnB,EAAE,EAAGgI,EAAEkoC,EAAGvwC,OAAcqI,EAAFhI,IAASD,EAAEmwC,EAAGlwC,IAAKA,IAChD44C,EAAE74C,EAAEuO,IAAMvO,GAIhB84C,yBAA0B,SAASzxC,GAEpB,UAATA,GAA6B,UAATA,GACtB/I,KAAK00C,oBAAoB3rC,EAAM/I,KAAK8B,aAAaiH,IAE/C/I,KAAKy6C,kBACPz6C,KAAKy6C,iBAAiBn3B,MAAMtjB,KAAMma,YAGtCugC,WAAY,SAAS73C,EAAM83C,GACzB,GAAIt4B,GAAW,GAAI6H,kBAAiB,SAAS0wB,GAC3CD,EAASjzC,KAAK1H,KAAMqiB,EAAUu4B,GAC9Bv4B,EAASw4B,cACTt3C,KAAKvD,MACPqiB,GAASgI,QAAQxnB,GAAOynB,WAAW,EAAMwwB,SAAS,KAYtDrC,GAAY3xC,UAAY4gB,EACxBA,EAAKqzB,YAActC,EAInBr6C,EAAM48C,KAAOvC,EACbr6C,EAAMo6C,OAASA,EACfp6C,EAAMowC,IAAI/H,SAAS/e,KAAOA,GAEzBV,SAWH,SAAU5oB,GAyFR,QAAS2xB,GAAejpB,GACtB,MAAOA,GAAU8f,UAGnB,QAASq0B,GAAYlR,EAAShoC,GAC5B,GAAIgH,GAAO,GAAImyC,GAAK,CAChBn5C,KACFgH,EAAOhH,EAAKwnB,UACZ2xB,EAAKn5C,EAAKF,aAAa,MAEzB,IAAI6B,GAAWwjB,SAASi0B,UAAUC,kBAAkBryC,EAAMmyC,EAC1D,OAAOh0B,UAASi0B,UAAUF,YAAYlR,EAASrmC,GAhGjD,GACIkmB,IADM1rB,OAAOipB,aACUjpB,OAAOiG,mBAI9Bk3C,EAAwB,UACxBC,EAAyB,aAEzBx3C,GACFu3C,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAIn9C,GAAQ4B,KAAKw7C,gBACjB,IAAIp9C,IAAU4B,KAAKy7C,mBAAmBr9C,EAAO4B,KAAKupB,WAAY,CAG5D,IADA,GAAIoL,GAAQ5E,EAAe/vB,MAAO+pC,EAAU,GACrCpV,GAASA,EAAMp0B,SACpBwpC,GAAWpV,EAAMp0B,QAAQm7C,gBAAgBJ,GACzC3mB,EAAQ5E,EAAe4E,EAErBoV,IACF/pC,KAAK27C,oBAAoB5R,EAAS3rC,KAIxCw9C,kBAAmB,SAAS53C,EAAO+E,EAAM3K,GACvC,GAAIA,GAAQA,GAAS4B,KAAKw7C,iBAAkBzyC,EAAOA,GAAQ,EAC3D,IAAI3K,IAAU4B,KAAKy7C,mBAAmBr9C,EAAO4B,KAAKupB,UAAYxgB,GAAO,CACnE,GAAIghC,GAAU,EACd,IAAI/lC,YAAiBkK,OACnB,IAAK,GAAyBvP,GAArBgD,EAAE,EAAGgI,EAAE3F,EAAM1C,OAAcqI,EAAFhI,IAAShD,EAAEqF,EAAMrC,IAAKA,IACtDooC,GAAWprC,EAAE8F,YAAc,WAG7BslC,GAAU/lC,EAAMS,WAElBzE,MAAK27C,oBAAoB5R,EAAS3rC,EAAO2K,KAG7C4yC,oBAAqB,SAAS5R,EAAS3rC,EAAO2K,GAG5C,GAFA3K,EAAQA,GAAS4B,KAAKw7C,iBACtBzyC,EAAOA,GAAQ,GACV3K,EAAL,CAGIwrB,IACFmgB,EAAUkR,EAAYlR,EAAS3rC,EAAM2D,MAEvC,IAAIiC,GAAQhE,KAAKO,QAAQs7C,oBAAoB9R,EACzCuR,EACJt0B,SAAQ80B,kBAAkB93C,EAAO5F,GAEjC4B,KAAK+7C,mBAAmB39C,GAAO4B,KAAKupB,UAAYxgB,IAAQ,IAE1DyyC,eAAgB,SAAS34C,GAGvB,IADA,GAAInB,GAAImB,GAAQ7C,KACT0B,EAAErC,YACPqC,EAAIA,EAAErC,UAER,OAAOqC,IAET+5C,mBAAoB,SAASr9C,EAAO2K,GAClC,GAAIwjC,GAAQvsC,KAAK+7C,mBAAmB39C,EACpC;MAAOmuC,GAAMxjC,IAEfgzC,mBAAoB,SAAS39C,GAC3B,GAAIwrB,EAAsB,CACxB,GAAInD,GAAYroB,EAAM2D,KAAO3D,EAAM2D,KAAKwnB,UAAYnrB,EAAMmrB,SAC1D,OAAOyyB,GAAwBv1B,KAAeu1B,EAAwBv1B,OAEtE,MAAOroB,GAAM69C,aAAgB79C,EAAM69C,mBAKrCD,IAoBJ59C,GAAMowC,IAAI/H,SAAS3iC,OAASA,GAE3BkjB,SAWH,SAAU5oB,GAUR,QAASmC,GAAQwI,EAAMjC,GACrB,GAAoB,gBAATiC,GAAmB,CAC5B,GAAIghB,GAASjjB,GAAavI,SAAS29C,cAInC,IAHAp1C,EAAYiC,EACZA,EAAOghB,GAAUA,EAAO1qB,YAAc0qB,EAAO1qB,WAAWyC,aACpDioB,EAAO1qB,WAAWyC,aAAa,QAAU,IACxCiH,EACH,KAAM,sCAGV,GAAIozC,EAAuBpzC,GACzB,KAAM,sDAAwDA,CAGhEqzC,GAAkBrzC,EAAMjC,GAExBu1C,EAAgBtzC,GAKlB,QAASuzC,GAAoBvzC,EAAMwzC,GACjCC,EAAczzC,GAAQwzC,EAKxB,QAASF,GAAgBtzC,GACnByzC,EAAczzC,KAChByzC,EAAczzC,GAAM0zC,0BACbD,GAAczzC,IAgBzB,QAASqzC,GAAkBrzC,EAAMjC,GAC/B,MAAO41C,GAAiB3zC,GAAQjC,MAGlC,QAASq1C,GAAuBpzC,GAC9B,MAAO2zC,GAAiB3zC,GAG1B,QAAS4zC,GAAep8C,EAASwJ,GAC/B,GAAoB,gBAATA,GACT,OAAO,CAET,IAAI4qB,GAAQuI,YAAYmT,mBAAmBtmC,GACvC6yC,EAAOjoB,GAASA,EAAMomB,WAC1B,OAAK6B,GAGDv1B,eAAeI,WACVJ,eAAeI,WAAWlnB,EAASq8C,GAErCr8C,YAAmBq8C,IALjB,EAnEX,GAAIrO,GAASnwC,EAAMmwC,OA+BfiO,GA9BMp+C,EAAMowC,QAiDZkO,IA2BJt+C,GAAM+9C,uBAAyBA,EAC/B/9C,EAAMk+C,oBAAsBA,EAC5Bl+C,EAAMu+C,eAAiBA,EAOvBz+C,OAAO8oB,QAAUzmB,EAKjBguC,EAAOvnB,QAAS5oB,GAOZ8oB,SAAS21B,qBACX31B,SAAS21B,oBAAoB,SAASC,GACpC,GAAIA,EACF,IAAK,GAAgCv6C,GAA5BZ,EAAE,EAAGgI,EAAEmzC,EAAax7C,OAAcqI,EAAFhI,IAASY,EAAEu6C,EAAan7C,IAAKA,IACpEpB,EAAQ+iB,MAAM,KAAM/gB,MAM3BykB,SAWH,SAAU5oB,GAEV,GAAIW,IACFg+C,oBAAqB,SAASl6C,GAC5BmkB,QAAQqkB,YAAYC,WAAWzoC,IAEjCm6C,kBAAmB,WAEjB,GAAIC,GAAYj9C,KAAK8B,aAAa,cAAgB,GAC9C4oC,EAAO,GAAIF,KAAIyS,EAAWj9C,KAAK8+B,cAAcU,QACjDx/B,MAAK8G,UAAUo2C,YAAc,SAAS5S,EAAS5iB,GAC7C,GAAIjlB,GAAI,GAAI+nC,KAAIF,EAAS5iB,GAAQgjB,EACjC,OAAOjoC,GAAE88B,OAMfnhC,GAAMowC,IAAIkE,YAAY3zC,KAAOA,GAE1BioB,SAWH,SAAU5oB,GA4KR,QAAS++C,GAAmBC,EAAOpT,GACjC,GAAIzK,GAAO,GAAIiL,KAAI4S,EAAMt7C,aAAa,QAASkoC,GAASzK,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASuc,GAAkB93C,EAAO5F,GAChC,GAAI4F,EAAO,CACL5F,IAAUG,WACZH,EAAQG,SAASY,MAEfyqB,IACFxrB,EAAQG,SAASY,KAOnB,IAAIuM,GAAQ2xC,EAAmBr5C,EAAMS,aACjCu9B,EAAOh+B,EAAMlC,aAAau5C,EAC1BrZ,IACFt2B,EAAMc,aAAa6uC,EAAuBrZ,EAI5C,IAAIoY,GAAUh8C,EAAMk/C,iBACpB,IAAIl/C,IAAUG,SAASY,KAAM,CAC3B,GAAIuE,GAAW,SAAW23C,EAAwB,IAC9CkC,EAAKh/C,SAASY,KAAK2pB,iBAAiBplB,EACpC65C,GAAGj8C,SACL84C,EAAUmD,EAAGA,EAAGj8C,OAAO,GAAGk8C,oBAG9Bp/C,EAAMgtB,aAAa1f,EAAO0uC,IAI9B,QAASiD,GAAmBtT,EAAS3rC,GACnCA,EAAQA,GAASG,SACjBH,EAAQA,EAAMI,cAAgBJ,EAAQA,EAAM0gC,aAC5C,IAAI96B,GAAQ5F,EAAMI,cAAc,QAEhC,OADAwF,GAAMS,YAAcslC,EACb/lC,EAGT,QAASy5C,GAAiBL,GACxB,MAAQA,IAASA,EAAMM,YAAe,GAGxC,QAASC,GAAgB96C,EAAM+6C,GAC7B,MAAIhR,GACKA,EAAQllC,KAAK7E,EAAM+6C,GAD5B,OA1NF,GACIpP,IADMtwC,OAAOipB,aACP/oB,EAAMowC,IAAI/H,SAAS3iC,QACzBu3C,EAAwB7M,EAAI6M,sBAE5BzxB,EAAuB1rB,OAAOiG,kBAI9B05C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbn6C,GAEFsqC,WAAY,SAAS5mC,GACnB,GAAI4e,GAAWpmB,KAAKg6C,gBAChBvb,EAAUrY,GAAYpmB,KAAKk+C,iBAC/B,IAAIzf,EAAS,CACXz+B,KAAKm+C,sBAAsB1f,EAC3B,IAAI36B,GAAS9D,KAAKo+C,mBAAmB3f,EACrC,IAAI36B,EAAOxC,OAAQ,CACjB,GAAI+8C,GAAcj4B,EAAS0Y,cAAcU,OACzC,OAAOxY,SAAQsnB,cAAcF,WAAWtqC,EAAQu6C,EAAa72C,IAG7DA,GACFA,KAGJ22C,sBAAuB,SAASzT,GAE9B,IAAK,GAAsB/rC,GAAGgjB,EAD1B47B,EAAK7S,EAAK5hB,iBAAiBi1B,GACtBp8C,EAAE,EAAGgI,EAAE4zC,EAAGj8C,OAAiBqI,EAAFhI,IAAShD,EAAE4+C,EAAG57C,IAAKA,IACnDggB,EAAI07B,EAAmBF,EAAmBx+C,EAAGqB,KAAK8+B,cAAcU,SAC5Dx/B,KAAK8+B,eACT9+B,KAAKs+C,oBAAoB38B,EAAGhjB,GAC5BA,EAAEU,WAAWk/C,aAAa58B,EAAGhjB,IAGjC2/C,oBAAqB,SAASt6C,EAAOilB,GACnC,IAAK,GAA0ChnB,GAAtCN,EAAE,EAAG2yC,EAAGrrB,EAAK0W,WAAYh2B,EAAE2qC,EAAGhzC,QAAYW,EAAEqyC,EAAG3yC,KAASgI,EAAFhI,EAAKA,IACnD,QAAXM,EAAE8G,MAA6B,SAAX9G,EAAE8G,MACxB/E,EAAMwI,aAAavK,EAAE8G,KAAM9G,EAAE4P,QAInCusC,mBAAoB,SAAS1T,GAC3B,GAAI8T,KACJ,IAAI9T,EAEF,IAAK,GAAsB/rC,GADvB4+C,EAAK7S,EAAK5hB,iBAAiB+0B,GACtBl8C,EAAE,EAAGgI,EAAE4zC,EAAGj8C,OAAcqI,EAAFhI,IAAShD,EAAE4+C,EAAG57C,IAAKA,IAC5ChD,EAAE8F,YAAYqP,MAAMgqC,IACtBU,EAAU/9C,KAAK9B,EAIrB,OAAO6/C,IAOTC,cAAe,WACbz+C,KAAK0+C,cACL1+C,KAAK2+C,cACL3+C,KAAK4+C,qBACL5+C,KAAK6+C,uBAKPH,YAAa,WACX1+C,KAAK8+C,OAAS9+C,KAAK++C,UAAUhB,GAC7B/9C,KAAK8+C,OAAO16C,QAAQ,SAASzF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAI/BggD,YAAa,WACX3+C,KAAK8D,OAAS9D,KAAK++C,UAAUlB,EAAiB,IAAMI,EAAa,KACjEj+C,KAAK8D,OAAOM,QAAQ,SAASzF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAa/BigD,mBAAoB,WAClB,GAAIE,GAAS9+C,KAAK8+C,OAAOj6B,OAAO,SAASlmB,GACvC,OAAQA,EAAEkD,aAAao8C,KAErBxf,EAAUz+B,KAAKk+C,iBACnB,IAAIzf,EAAS,CACX,GAAIsL,GAAU,EAId,IAHA+U,EAAO16C,QAAQ,SAASg5C,GACtBrT,GAAW0T,EAAiBL,GAAS,OAEnCrT,EAAS,CACX,GAAI/lC,GAAQq5C,EAAmBtT,EAAS/pC,KAAK8+B,cAC7CL,GAAQrT,aAAapnB,EAAOy6B,EAAQpT,eAI1C0zB,UAAW,SAASr7C,EAAUs7C,GAC5B,GAAIt0C,GAAQ1K,KAAK8oB,iBAAiBplB,GAAU+tB,QACxCgN,EAAUz+B,KAAKk+C,iBACnB,IAAIzf,EAAS,CACX,GAAIwgB,GAAgBxgB,EAAQ3V,iBAAiBplB,GAAU+tB,OACvD/mB,GAAQA,EAAM8pB,OAAOyqB,GAEvB,MAAOD,GAAUt0C,EAAMma,OAAOm6B,GAAWt0C,GAW3Cm0C,oBAAqB,WACnB,GAAI76C,GAAQhE,KAAKk/C,cAAclB,EAC/BlC,GAAkB93C,EAAOzF,SAASY,OAEpCu8C,gBAAiB,SAASyD,GACxB,GAAIpV,GAAU,GAEVrmC,EAAW,IAAMu6C,EAAa,IAAMkB,EAAkB,IACtDH,EAAU,SAASrgD,GACrB,MAAOg/C,GAAgBh/C,EAAG+E,IAExBo7C,EAAS9+C,KAAK8+C,OAAOj6B,OAAOm6B,EAChCF,GAAO16C,QAAQ,SAASg5C,GACtBrT,GAAW0T,EAAiBL,GAAS,QAGvC,IAAIt5C,GAAS9D,KAAK8D,OAAO+gB,OAAOm6B,EAIhC,OAHAl7C,GAAOM,QAAQ,SAASJ,GACtB+lC,GAAW/lC,EAAMS,YAAc,SAE1BslC,GAETmV,cAAe,SAASC,GACtB,GAAIpV,GAAU/pC,KAAK07C,gBAAgByD,EACnC,OAAOn/C,MAAK67C,oBAAoB9R,EAASoV,IAE3CtD,oBAAqB,SAAS9R,EAASoV,GACrC,GAAIpV,EAAS,CACX,GAAI/lC,GAAQq5C,EAAmBtT,EAG/B,OAFA/lC,GAAMwI,aAAa6uC,EAAuBr7C,KAAK8B,aAAa,QACxD,IAAMq9C,GACHn7C,KA2DTX,EAAI65B,YAAYp2B,UAChB8lC,EAAUvpC,EAAEupC,SAAWvpC,EAAEs6C,iBAAmBt6C,EAAE+7C,uBAC3C/7C,EAAEg8C,kBAITjhD,GAAMowC,IAAIkE,YAAY5uC,OAASA,EAC/B1F,EAAM09C,kBAAoBA,GAEzB90B,SAWH,SAAU5oB,GAIR,GACIowC,IADMtwC,OAAOipB,aACP/oB,EAAMowC,IAAI/H,SAASv9B,QACzB4qC,EAAetF,EAAIsF,aAGnBwL,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACAl7C,QAAQ,SAASc,GACjBo6C,EAAoBp6C,EAAEqE,eAAiBrE,GAGzC,IAAIgE,IACFq2C,gBAAiB,WAEf,GAAIC,GAAYx/C,KAAK8G,UAAUktC,cAE/Bh0C,MAAKy/C,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAASv9C,GAALN,EAAE,EAAMM,EAAEjC,KAAK2/B,WAAWh+B,GAAIA,IAEjC3B,KAAK0/C,eAAez9C,EAAE8G,QAExBy2C,EAAUx/C,KAAK2/C,kBAAkB19C,EAAE8G,OAAS9G,EAAE4P,MAAMwI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI8mB,SAK7Bue,eAAgB,SAAUh+C,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErDi+C,kBAAmB,SAASj+C,GAC1B,MAAOA,GAAEoW,MAAM8nC,IAEjBC,eAAgB,SAASh9C,GACvB,KAAOA,EAAKxD,YAAY,CACtB,GAAIwD,EAAKw3C,gBACP,MAAOx3C,GAAKw3C,eAEdx3C,GAAOA,EAAKxD,WAEd,MAAOwD,GAAKd,MAEdmyC,gBAAiB,SAAS4L,EAAYvgD,EAAQuyC,GAC5C,GAAI5oC,GAASlJ,IACb,OAAO,UAASkF,GACT46C,GAAeA,EAAWrH,cAC7BqH,EAAa52C,EAAO22C,eAAetgD,GAGrC,IAAI2a,IAAQhV,EAAGA,EAAEoL,OAAQpL,EAAEyF,cAC3Bm1C,GAAW3L,eAAe2L,EAAYhO,EAAQ53B,KAGlD6lC,oBAAqB,SAAS99B,EAAYlZ,GACxC,GAAK/I,KAAK0/C,eAAe32C,GAAzB,CAGA,GAAI0yB,GAAYz7B,KAAK2/C,kBAAkB52C,EACvC0yB,GAAY6jB,EAAoB7jB,IAAcA,CAE9C,IAAIvyB,GAASlJ,IAEb,OAAO,UAAS8f,EAAOjd,EAAMkd,GAW3B,QAASigC,KACP,MAAO,MAAQ/9B,EAAa,MAX9B,GAAIxV,GAAUvD,EAAOgrC,gBAAgBxgC,OAAW7Q,EAAMof,EAGtD,OAFA9jB,iBAAgBU,iBAAiBgE,EAAM44B,EAAWhvB,GAE9CsT,EAAJ,QAYEiF,KAAMg7B,EACN/6B,eAAgB+6B,EAChB76B,MAAO,WACLhnB,gBAAgBgN,oBAAoBtI,EAAM44B,EAAWhvB,SAO3DmzC,EAAe9L,EAAaxyC,MAGhClD,GAAMowC,IAAIkE,YAAYxpC,OAASA,GAE9B8d,SAWH,SAAU5oB,GAIR,GAAImd,IACF0kC,eAAgB,SAASn5C,GAEvB,GAAiCoV,GAA7BmO,EAAUvjB,EAAUujB,OACxB,KAAK,GAAI3oB,KAAKoF,GACQ,YAAhBpF,EAAEoW,MAAM,MACLuS,IACHA,EAAYvjB,EAAUujB,YAExBnO,EAAWxa,EAAEoW,MAAM,EAAG,IACtBuS,EAAQnO,GAAYmO,EAAQnO,IAAaxa,IAI/Cw+C,iBAAkB,SAASp5C,GAEzB,GAAIuuC,GAAIvuC,EAAUujB,OAClB,IAAIgrB,EAAG,CACL,GAAI8K,KACJ,KAAK,GAAIz+C,KAAK2zC,GAEZ,IAAK,GAAS+K,GADVC,EAAQ3+C,EAAEupC,MAAM,KACXtpC,EAAE,EAAOy+C,EAAGC,EAAM1+C,GAAIA,IAC7Bw+C,EAASC,GAAM/K,EAAE3zC,EAGrBoF,GAAUujB,QAAU81B,IAGxBG,qBAAsB,SAASx5C,GAC7B,GAAIA,EAAUujB,QAAS,CAErB,GAAIpoB,GAAI6E,EAAUsuC,gBAClB,KAAK,GAAI1zC,KAAKoF,GAAUujB,QAEtB,IAAK,GAAS+1B,GADVC,EAAQ3+C,EAAEupC,MAAM,KACXtpC,EAAE,EAAOy+C,EAAGC,EAAM1+C,GAAIA,IAC7BM,EAAExB,KAAK2/C,GAIb,GAAIt5C,EAAU6rC,QAAS,CAErB,GAAI1wC,GAAI6E,EAAUy5C,gBAClB,KAAK,GAAI7+C,KAAKoF,GAAU6rC,QACtB1wC,EAAExB,KAAKiB,GAGX,GAAIoF,EAAU+Z,SAAU,CAEtB,GAAI5e,GAAI6E,EAAUswC,iBAClB,KAAK,GAAI11C,KAAKoF,GAAU+Z,SACtB5e,EAAExB,KAAKiB,KAIb8+C,kBAAmB,SAAS15C,EAAW4gB,GAErC,GAAIirB,GAAU7rC,EAAU6rC,OACpBA,KAEF3yC,KAAKygD,kBAAkB9N,EAAS7rC,EAAW4gB,GAE3C5gB,EAAU2tC,WAAaz0C,KAAK0gD,aAAa/N,KAgC7C8N,kBAAmB,SAASE,EAAe75C,GAEzCA,EAAUqvC,QAAUrvC,EAAUqvC,WAG9B,KAAK,GAAIz0C,KAAKi/C,GAAe,CAC3B,GAAI9uC,GAAQ8uC,EAAcj/C,EAEtBmQ,IAA2B6B,SAAlB7B,EAAMskC,UACjBrvC,EAAUqvC,QAAQz0C,GAAK7B,QAAQgS,EAAMskC,SACrCtkC,EAAQA,EAAMA,OAGF6B,SAAV7B,IACF/K,EAAUpF,GAAKmQ,KAIrB6uC,aAAc,SAASnlC,GACrB,GAAIhX,KACJ,KAAK,GAAI7C,KAAK6Z,GACZhX,EAAI7C,EAAE6H,eAAiB7H,CAEzB,OAAO6C,IAETq8C,uBAAwB,SAAS73C,EAAM83C,GACrC,GAAIlsB,GAAQ30B,KAAK8G,UAEbgwC,EAAc/tC,EAAO,IACrBkuC,EAAqBluC,EAAO,aAChC4rB,GAAMmiB,GAAeniB,EAAM5rB,GAE3BxD,OAAOshB,eAAe8N,EAAO5rB,GAC3BzB,IAAK,WACH,GAAI0qB,GAAahyB,KAAKi3C,EAItB,OAHIjlB,IACFA,EAAW9M,UAENllB,KAAK82C,IAEd9vC,IAAK,SAAS6K,GACZ,GAAIgvC,EACF,MAAO7gD,MAAK82C,EAGd,IAAI9kB,GAAahyB,KAAKi3C,EACtB,IAAIjlB,EAEF,WADAA,GAAWxP,SAAS3Q,EAItB,IAAI8gB,GAAW3yB,KAAK82C,EAIpB,OAHA92C,MAAK82C,GAAejlC,EACpB7R,KAAKu2C,yBAAyBxtC,EAAM8I,EAAO8gB,GAEpC9gB,GAETiV,cAAc,KAGlBg6B,wBAAyB,SAASh6C,GAChC,GAAI+qC,GAAK/qC,EAAUswC,cACnB,IAAIvF,GAAMA,EAAGvwC,OACX,IAAK,GAAsBI,GAAlBC,EAAE,EAAGgI,EAAEkoC,EAAGvwC,OAAkBqI,EAAFhI,IAASD,EAAEmwC,EAAGlwC,IAAKA,IACpD3B,KAAK4gD,uBAAuBl/C,GAAG,EAGnC,IAAImwC,GAAK/qC,EAAUy5C,aACnB,IAAI1O,GAAMA,EAAGvwC,OACX,IAAK,GAAsBI,GAAlBC,EAAE,EAAGgI,EAAEkoC,EAAGvwC,OAAkBqI,EAAFhI,IAASD,EAAEmwC,EAAGlwC,IAAKA,IAG/CmF,EAAU+Z,UAAa/Z,EAAU+Z,SAASnf,IAC7C1B,KAAK4gD,uBAAuBl/C,IAStCtD,GAAMowC,IAAIkE,YAAYn3B,WAAaA,GAElCyL,SAUH,SAAU5oB,GAIR,GAAI2iD,GAAuB,aACvBC,EAAmB,OAInBrhB,GAEFshB,yBAA0B,SAASn6C,GAEjC9G,KAAKkhD,cAAcp6C,EAAW,aAE9B9G,KAAKkhD,cAAcp6C,EAAW,wBAGhCq6C,kBAAmB,SAASr6C,GAE1B,GAAI64B,GAAa3/B,KAAK8B,aAAai/C,EACnC,IAAIphB,EAYF,IAAK,GAAyBj+B,GAJ1BixC,EAAU7rC,EAAU6rC,UAAY7rC,EAAU6rC,YAE1C0N,EAAQ1gB,EAAWsL,MAAM+V,GAEpBr/C,EAAE,EAAGgI,EAAE02C,EAAM/+C,OAAaqI,EAAFhI,EAAKA,IAEpCD,EAAI2+C,EAAM1+C,GAAGw/B,OAGTz/B,GAAoBgS,SAAfi/B,EAAQjxC,KACfixC,EAAQjxC,GAAKgS,SAOrB0tC,6BAA8B,WAK5B,IAAK,GAAsBn/C,GAHvBo/C,EAAWrhD,KAAK8G,UAAUytC,oBAE1BD,EAAKt0C,KAAK2/B,WACLh+B,EAAE,EAAGgI,EAAE2qC,EAAGhzC,OAAcqI,EAAFhI,IAASM,EAAEqyC,EAAG3yC,IAAKA,IAC5C3B,KAAKshD,oBAAoBr/C,EAAE8G,QAC7Bs4C,EAASp/C,EAAE8G,MAAQ9G,EAAE4P,QAK3ByvC,oBAAqB,SAASv4C,GAC5B,OAAQ/I,KAAKuhD,UAAUx4C,IAA6B,QAApBA,EAAK+O,MAAM,EAAE,IAI/CypC,WACEx4C,KAAM,EACNy4C,UAAW,EACXzG,YAAa,EACb0G,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrBhiB,GAAW4hB,UAAUR,GAAwB,EAI7C3iD,EAAMowC,IAAIkE,YAAY/S,WAAaA,GAElC3Y,SAWH,SAAU5oB,GAGR,GAAI8K,GAAS9K,EAAMowC,IAAIkE,YAAYxpC,OAE/BmuC,EAAS,GAAIj1B,oBACb/C,EAAiBg4B,EAAOh4B,cAI5Bg4B,GAAOh4B,eAAiB,SAAS4C,EAAYlZ,EAAMlG,GACjD,MAAOqG,GAAO62C,oBAAoB99B,EAAYlZ,EAAMlG,IAC7Cwc,EAAe3X,KAAK2vC,EAAQp1B,EAAYlZ,EAAMlG,GAIvD,IAAI+0C,IACFP,OAAQA,EACR2C,cAAe,WACb,MAAOh6C,MAAKK,cAAc,aAE5B69C,gBAAiB,WACf,GAAI93B,GAAWpmB,KAAKg6C,eACpB,OAAO5zB,IAAYA,EAASqY,SAE9BmjB,uBAAwB,SAASx7B,GAC3BA,IACFA,EAASggB,gBAAkBpmC,KAAKq3C,SAMtCj5C,GAAMowC,IAAIkE,YAAYkF,IAAMA,GAE3B5wB,SAWH,SAAU5oB,GAsOR,QAASyjD,GAAyB/6C,GAChC,IAAKvB,OAAOqhB,UAAW,CACrB,GAAIk7B,GAAWv8C,OAAOwqB,eAAejpB,EACrCA,GAAU8f,UAAYk7B,EAClBtJ,EAAOsJ,KACTA,EAASl7B,UAAYrhB,OAAOwqB,eAAe+xB,KAvOjD,GAAItT,GAAMpwC,EAAMowC,IACZgK,EAASp6C,EAAMo6C,OACfjK,EAASnwC,EAAMmwC,OAEf3kB,EAAuB1rB,OAAOiG,kBAI9B2C,GAEF0C,SAAU,SAAST,EAAMg5C,GAEvB/hD,KAAKgiD,eAAej5C,EAAMg5C,GAE1B/hD,KAAKo8C,kBAAkBrzC,EAAMg5C,GAE7B/hD,KAAKiiD,sBAGPD,eAAgB,SAASj5C,EAAMg5C,GAE7B,GAAIG,GAAY9jD,EAAM+9C,uBAAuBpzC,GAEzC2e,EAAO1nB,KAAKmiD,sBAAsBJ,EAEtC/hD,MAAKoiD,sBAAsBF,EAAWx6B,GAEtC1nB,KAAK8G,UAAY9G,KAAKqiD,gBAAgBH,EAAWx6B,GAEjD1nB,KAAKsiD,qBAAqBv5C,EAAMg5C,IAGlCK,sBAAuB,SAASt7C,EAAW4gB,GAGzC5gB,EAAUvG,QAAUP,KAEpBA,KAAKmhD,kBAAkBr6C,EAAW4gB,GAElC1nB,KAAKwgD,kBAAkB15C,EAAW4gB,GAElC1nB,KAAKigD,eAAen5C,GAEpB9G,KAAKkgD,iBAAiBp5C,IAGxBu7C,gBAAiB,SAASv7C,EAAW4gB,GAEnC1nB,KAAKuiD,gBAAgBz7C,EAAW4gB,EAEhC,IAAI86B,GAAUxiD,KAAKyiD,YAAY37C,EAAW4gB,EAG1C,OADAm6B,GAAyBW,GAClBA,GAGTD,gBAAiB,SAASz7C,EAAW4gB,GAEnC1nB,KAAKkhD,cAAc,UAAWp6C,EAAW4gB,GAEzC1nB,KAAKkhD,cAAc,UAAWp6C,EAAW4gB,GAEzC1nB,KAAKkhD,cAAc,UAAWp6C,EAAW4gB,GAEzC1nB,KAAKkhD,cAAc,aAAcp6C,EAAW4gB,GAE5C1nB,KAAKkhD,cAAc,sBAAuBp6C,EAAW4gB,GAErD1nB,KAAKkhD,cAAc,iBAAkBp6C,EAAW4gB,IAIlD46B,qBAAsB,SAASv5C,EAAM25C,GAEnC1iD,KAAKsgD,qBAAqBtgD,KAAK8G,WAC/B9G,KAAK8gD,wBAAwB9gD,KAAK8G,WAElC9G,KAAK4hD,uBAAuB5hD,KAAKg6C,iBAEjCh6C,KAAKy+C,gBAELz+C,KAAK+8C,oBAAoB/8C,MAEzBA,KAAKohD,+BAELphD,KAAKu/C,kBAKLv/C,KAAKg9C,oBAEDpzB,GACF1C,SAASi0B,UAAUwH,YAAY3iD,KAAKk+C,kBAAmBn1C,EAAM25C,GAG3D1iD,KAAK8G,UAAU87C,kBACjB5iD,KAAK8G,UAAU87C,iBAAiB5iD,OAMpCiiD,mBAAoB,WAClB,GAAIY,GAAS7iD,KAAK8B,aAAa,cAC3B+gD,KACF3kD,OAAO2kD,GAAU7iD,KAAK48C,OAK1BuF,sBAAuB,SAASW,GAC9B,GAAIh8C,GAAY9G,KAAK+iD,kBAAkBD,EACvC,KAAKh8C,EAAW,CAEd,GAAIA,GAAYo2B,YAAYmT,mBAAmByS,EAE/Ch8C,GAAY9G,KAAKgjD,cAAcl8C,GAE/Bm8C,EAAcH,GAAUh8C,EAE1B,MAAOA,IAGTi8C,kBAAmB,SAASh6C,GAC1B,MAAOk6C,GAAcl6C,IAIvBi6C,cAAe,SAASl8C,GACtB,GAAIA,EAAU2xC,YACZ,MAAO3xC,EAET,IAAIo8C,GAAW39C,OAAOC,OAAOsB,EAkB7B,OAfA0nC,GAAImE,QAAQnE,EAAI/H,SAAUyc,GAa1BljD,KAAKmjD,YAAYD,EAAUp8C,EAAW0nC,EAAI/H,SAASmR,IAAK,QAEjDsL,GAGTC,YAAa,SAASD,EAAUp8C,EAAW0nC,EAAKzlC,GAC9C,GAAIuoC,GAAS,SAASp3B,GACpB,MAAOpT,GAAUiC,GAAMua,MAAMtjB,KAAMka,GAErCgpC,GAASn6C,GAAQ,WAEf,MADA/I,MAAK+3C,WAAazG,EACX9C,EAAIzlC,GAAMua,MAAMtjB,KAAMma,aAKjC+mC,cAAe,SAASn4C,EAAMjC,EAAW4gB,GAEvC,GAAI1e,GAASlC,EAAUiC,MAEvBjC,GAAUiC,GAAQ/I,KAAKyiD,YAAYz5C,EAAQ0e,EAAK3e,KAIlDqzC,kBAAmB,SAASrzC,EAAM25C,GAChC,GAAIU,IACFt8C,UAAW9G,KAAK8G,WAGdu8C,EAAgBrjD,KAAKsjD,kBAAkBZ,EACvCW,KACFD,EAAK5B,QAAU6B,GAGjBnmB,YAAY1zB,SAAST,EAAM/I,KAAK8G,WAEhC9G,KAAK48C,KAAOr+C,SAASglD,gBAAgBx6C,EAAMq6C,IAG7CE,kBAAmB,SAASv6C,GAC1B,GAAIA,GAAQA,EAAK7B,QAAQ,KAAO,EAC9B,MAAO6B,EAEP,IAAI1F,GAAIrD,KAAK+iD,kBAAkBh6C,EAC/B,OAAI1F,GAAE9C,QACGP,KAAKsjD,kBAAkBjgD,EAAE9C,QAAQihD,SAD1C,SASFyB,IAIFn8C,GAAU27C,YADRl9C,OAAOqhB,UACe,SAASjG,EAAQ6iC,GAIvC,MAHI7iC,IAAU6iC,GAAa7iC,IAAW6iC,IACpC7iC,EAAOiG,UAAY48B,GAEd7iC,GAGe,SAASA,EAAQ6iC,GACvC,GAAI7iC,GAAU6iC,GAAa7iC,IAAW6iC,EAAW,CAC/C,GAAIhB,GAAUj9C,OAAOC,OAAOg+C,EAC5B7iC,GAAS4tB,EAAOiU,EAAS7hC,GAE3B,MAAOA,IAoBX6tB,EAAIkE,YAAY5rC,UAAYA,GAE3BkgB,SAWH,SAAU5oB,GAoLR,QAASqlD,GAAgBljD,GACvB,MAAOhC,UAAS4D,SAAS5B,GAAWmjD,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYriD,OAASqiD,EAAY,GAAKD,EAAU,GAGzD,QAAS57B,GAAUtgB,GACjBq8C,EAAMC,aAAc,EACpB58B,SAAS0hB,eAAe,WACtBjhB,YAAYG,UAAU,WACpB+7B,EAAME,iBAAiBv8C,GACvBq8C,EAAMC,aAAc,EACpBD,EAAMG,YAUZ,QAASC,GAAWlR,GAClB,GAAgBr/B,SAAZq/B,EAEF,WADA8Q,GAAMt8B,OAGR,IAAImoB,GAAS9/B,WAAW,WACtBi0C,EAAMt8B,SACLwrB,EACH/rB,SAAQc,UAAU,WAChBjY,aAAa6/B,KA9LjB,GAAImU,IAGFzW,KAAM,SAAS7sC,GACRA,EAAQ2jD,UACX3jD,EAAQ2jD,WACRrpC,EAASpa,KAAKF,KAKlB4jD,QAAS,SAAS5jD,EAASyjD,EAAO3U,GAChC,GAAI+U,GAAY7jD,EAAQ2jD,UAAY3jD,EAAQ2jD,QAAQF,KAMpD,OALII,KACFX,EAAgBljD,GAASE,KAAKF,GAC9BA,EAAQ2jD,QAAQF,MAAQA,EACxBzjD,EAAQ2jD,QAAQ7U,GAAKA,GAEW,IAA1BrvC,KAAKkH,QAAQ3G,IAGvB2G,QAAS,SAAS3G,GAChB,GAAIoB,GAAI8hD,EAAgBljD,GAAS2G,QAAQ3G,EAKzC,OAJIoB,IAAK,GAAKpD,SAAS4D,SAAS5B,KAC9BoB,GAAMgmB,YAAYL,WAAaK,YAAYJ,MACzCo8B,EAAYriD,OAAS,KAElBK,GAIT0tC,GAAI,SAAS9uC,GACX,GAAI8jD,GAAUrkD,KAAK0wC,OAAOnwC,EACtB8jD,KACF9jD,EAAQ2jD,QAAQI,WAAY,EAC5BtkD,KAAKukD,gBAAgBF,GACrBrkD,KAAKgkD,UAITtT,OAAQ,SAASnwC,GACf,GAAIoB,GAAI3B,KAAKkH,QAAQ3G,EACrB,IAAU,IAANoB,EAIJ,MAAO8hD,GAAgBljD,GAAS0oC,SAGlC+a,MAAO,WAEL,GAAIzjD,GAAUP,KAAKwkD,aAInB,OAHIjkD,IACFA,EAAQ2jD,QAAQF,MAAMt8C,KAAKnH,GAEzBP,KAAKykD,YACPzkD,KAAKunB,SACE,GAFT,QAMFi9B,YAAa,WACX,MAAOZ,MAGTa,SAAU,WACR,OAAQzkD,KAAK8jD,aAAe9jD,KAAK0kD,WAGnCA,QAAS,WACP,IAAK,GAA4Bx/C,GAAxBvD,EAAE,EAAGgI,EAAEkR,EAASvZ,OAAcqI,EAAFhI,IAChCuD,EAAE2V,EAASlZ,IAAKA,IACnB,GAAIuD,EAAEg/C,UAAYh/C,EAAEg/C,QAAQI,UAC1B,MAGJ,QAAO,GAGTC,gBAAiB,SAAShkD,GACxBokD,EAAWlkD,KAAKF,IAGlB6mB,MAAO,WAEL,IAAIpnB,KAAKqpC,SAAT,CAGArpC,KAAKqpC,UAAW,CAEhB,KADA,GAAI9oC,GACGokD,EAAWrjD,QAChBf,EAAUokD,EAAW1b,QACrB1oC,EAAQ2jD,QAAQ7U,GAAG3nC,KAAKnH,GACxBA,EAAQ2jD,QAAU,IAEpBlkD,MAAKqpC,UAAW,IAGlB9hB,MAAO,WAOL,GAAIq9B,GAAmBv9B,eAAeE,KACtCF,gBAAeE,OAAQ,EACvBvnB,KAAKonB,QACAC,eAAeC,WAClBD,eAAew9B,oBAAoBtmD,UAErC8oB,eAAeE,MAAQq9B,EACvB19B,SAASE,QACTrb,sBAAsB/L,KAAK8kD,sBAG7Bf,iBAAkB,SAASv8C,GACrBA,GACFu9C,EAAetkD,KAAK+G,IAIxBs9C,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAIn6C,GACGm6C,EAAezjD,SACpBsJ,EAAKm6C,EAAe9b,YAU1B+b,WAAY,WAEV,IAAK,GAA4B9/C,GAD7B+/C,KACKtjD,EAAE,EAAGgI,EAAEkR,EAASvZ,OAAcqI,EAAFhI,IAChCuD,EAAE2V,EAASlZ,IAAKA,IACfuD,EAAEg/C,UAAYh/C,EAAEg/C,QAAQI,WAC1BW,EAAGxkD,KAAKyE,EAGZ,OAAO+/C,IAGTnB,aAAa,GAIXjpC,KACA8pC,KACAhB,KACAD,KACAqB,IAwCJ3mD,GAAMyc,SAAWA,EACjBzc,EAAM4mD,WAAanB,EAAMmB,WAAWzhD,KAAKsgD,GACzCzlD,EAAM6lD,WAAaA,EACnB7lD,EAAMylD,MAAQA,EACdzlD,EAAM0pB,UAAY1pB,EAAM8mD,iBAAmBp9B,GAC1Cd,SAWH,SAAU5oB,GA2GR,QAAS+mD,GAAap8C,GACpB,MAAOlJ,SAAQq9B,YAAYmT,mBAAmBtnC,IAGhD,QAASq8C,GAAYr8C,GACnB,MAAQA,IAAQA,EAAK7B,QAAQ,MAAQ,EA5GvC,GAAIqnC,GAASnwC,EAAMmwC,OACfC,EAAMpwC,EAAMowC,IACZqV,EAAQzlD,EAAMylD,MACd/7B,EAAY1pB,EAAM0pB,UAClBq0B,EAAyB/9C,EAAM+9C,uBAC/BG,EAAsBl+C,EAAMk+C,oBAI5Bx1C,EAAYynC,EAAOhpC,OAAOC,OAAO03B,YAAYp2B,YAE/C6xC,gBAAiB,WACX34C,KAAK8B,aAAa,SACpB9B,KAAKqlD,QAITA,KAAM,WAEJrlD,KAAK+I,KAAO/I,KAAK8B,aAAa,QAC9B9B,KAAKwhD,QAAUxhD,KAAK8B,aAAa,WACjC+hD,EAAMzW,KAAKptC,MAEXA,KAAKslD,gBAELtlD,KAAKy8C,qBAOPA,kBAAmB,WACdz8C,KAAKulD,YACJvlD,KAAKs8C,oBAAoBt8C,KAAK+I,OAC9B/I,KAAKwlD,mBACLxlD,KAAKylD,uBAGT5B,EAAMxU,GAAGrvC,OAGX0lD,UAAW,WAGLN,EAAYplD,KAAKwhD,WAAa2D,EAAanlD,KAAKwhD,UAClD3hC,QAAQ8xB,KAAK,sGACuC3xC,KAAK+I,KACrD/I,KAAKwhD,SAEXxhD,KAAKwJ,SAASxJ,KAAK+I,KAAM/I,KAAKwhD,SAC9BxhD,KAAKulD,YAAa,GAGpBjJ,oBAAqB,SAASvzC,GAC5B,MAAKozC,GAAuBpzC,GAA5B,QAEEuzC,EAAoBvzC,EAAM/I,MAE1BA,KAAK2lD,eAAe58C,IAEb,IAIX48C,eAAgB,SAAS58C,GAEnB/I,KAAK6B,aAAa,cAAgB7B,KAAKyhD,WACzCzhD,KAAKyhD,UAAW,EAEhBz6B,QAAQje,KAIZ08C,oBAAqB,WACnB,MAAOzlD,MAAK4lD,iBAMdJ,gBAAiB,WACf,MAAO3B,GAAMM,QAAQnkD,KAAMA,KAAKy8C,kBAAmBz8C,KAAK0lD,YAG1DJ,cAAe,WACbtlD,KAAK4lD,iBAAkB,EACvB5lD,KAAKouC,WAAW,WACdpuC,KAAK4lD,iBAAkB,EACvB5lD,KAAKy8C,qBACLl5C,KAAKvD,SASXwuC,GAAImE,QAAQnE,EAAIkE,YAAa5rC,GAc7BghB,EAAU,WACRvpB,SAASsnD,KAAK9qB,gBAAgB,cAC9Bx8B,SAASa,cACP,GAAIH,aAAY,iBAAkBC,SAAS,OAM/CX,SAASglD,gBAAgB,mBAAoBz8C,UAAWA,KAEvDkgB,SAWH,SAAU5oB,GAIR,QAAS0nD,GAAeC,EAAmBv+C,GACrCu+C,GACFxnD,SAASY,KAAKP,YAAYmnD,GAC1Bb,EAAiB19C,IACRA,GACTA,IAIJ,QAASw+C,GAAWC,EAAMz+C,GACxB,GAAIy+C,GAAQA,EAAK3kD,OAAQ,CAErB,IAAK,GAAwB8oC,GAAKnhB,EAD9Bi9B,EAAO3nD,SAASinC,yBACX7jC,EAAE,EAAGgI,EAAEs8C,EAAK3kD,OAAsBqI,EAAFhI,IAASyoC,EAAI6b,EAAKtkD,IAAKA,IAC9DsnB,EAAO1qB,SAASC,cAAc,QAC9ByqB,EAAKO,IAAM,SACXP,EAAKsW,KAAO6K,EACZ8b,EAAKtnD,YAAYqqB,EAEnB68B,GAAeI,EAAM1+C,OACdA,IACTA,IAtBJ,GAAI09C,GAAmB9mD,EAAM8mD,gBA2B7B9mD,GAAM8qB,OAAS88B,EACf5nD,EAAM0nD,eAAiBA,GAEtB9+B,SAwCH,WAEE,GAAIzmB,GAAUhC,SAASC,cAAc,kBACrC+B,GAAQiM,aAAa,OAAQ,gBAC7BjM,EAAQiM,aAAa,UAAW,YAChCjM,EAAQ8kD,OAERr+B,QAAQ,gBAEN2xB,gBAAiB,WACf34C,KAAKq3C,OAASr3C,KAAKomC,gBAAkBpmC,KAAKmmD,aAG1Cn/B,QAAQk+B,iBAAiB,WACvBllD,KAAK8f,MAAQ9f,KACbA,KAAKwM,aAAa,OAAQ,IAG1BxM,KAAK8yC,MAAM,WAIT9yC,KAAKs6C,sBAAsBt6C,KAAKX,YAGhCW,KAAKizC,KAAK,qBAEZ1vC,KAAKvD,QAGTmmD,WAAY,WACV,GAAIj9C,GAAS3D,OAAOC,OAAOwhB,QAAQwnB,IAAIkE,YAAYxpC,QAC/C2H,EAAO7Q,IACXkJ,GAAO22C,eAAiB,WAAa,MAAOhvC,GAAKiP,MAEjD,IAAIu3B,GAAS,GAAIj1B,oBACb/C,EAAiBg4B,EAAOh4B,cAK5B,OAJAg4B,GAAOh4B,eAAiB,SAAS4C,EAAYlZ,EAAMlG,GACjD,MAAOqG,GAAO62C,oBAAoB99B,EAAYlZ,EAAMlG,IAC7Cwc,EAAe3X,KAAK2vC,EAAQp1B,EAAYlZ,EAAMlG,IAEhDw0C","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.2-8c339cf'\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 IMPORT_LINK_TYPE = 'import';\r\nvar hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));\r\nvar useNative = hasNative;\r\nvar isIE = /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\n\r\nvar rootDocument = 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(rootDocument, '_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 whenReady(callback, doc) {\r\n  doc = doc || rootDocument;\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) && callback) {\r\n       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\nwhenReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  rootDocument.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 = whenReady;\r\nscope.rootDocument = rootDocument;\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.isIE = isIE;\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.whenReady(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/js/polymer/polymer.min.js b/pkg/polymer/lib/src/js/polymer/polymer.min.js
new file mode 100644
index 0000000..d846037
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer.min.js
@@ -0,0 +1,14 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+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&&b)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){var e=c;if("touchstart"===d){var f=c.changedTouches[0];e={target:c.target,clientX:f.clientX,clientY:f.clientY,path:c.path}}for(var g,h=c.path||a.targetFinding.path(e),i=0;i<h.length;i++)g=h[i],this.addGestureDependency(g,b)}else this.addGestureDependency(c.currentTarget,b);if(!c._handledByPG){var j=this.eventMap&&this.eventMap[d];j&&j(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++)if(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=0,g=!1;try{g=1===new MouseEvent("test",{buttons:1}).buttons}catch(h){}var i={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);if(c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",!g){var d=a.type,h=e[a.which]||0;"mousedown"===d?f|=h:"mouseup"===d&&(f&=~h),c.buttons=f}return c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=(c.has(this.POINTER_ID),this.prepareEvent(d));e.target=a.findTarget(d),c.set(this.POINTER_ID,e.target),b.down(e)}},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===(g?e.buttons:e.which)?(g||(f=e.buttons=0),b.cancel(e),this.cleanupMouse(e.buttons)):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(e.buttons)}},cleanupMouse:function(a){0===a&&c.delete(this.POINTER_ID)}};a.mouseEvents=i}(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=25,f=200,g=20,h=!1,i={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.firstTarget=a.target,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,f)},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(h)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>=g&&(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)}}},j=Event.prototype.stopImmediatePropagation||Event.prototype.stopPropagation;document.addEventListener("click",function(b){var c=b.clientX,d=b.clientY,f=function(a){var b=Math.abs(c-a.x),f=Math.abs(d-a.y);return e>=b&&e>=f},g=a.mouseEvents.lastTouches.some(f),h=a.targetFinding.path(b);if(g){for(var k=0;k<h.length;k++)if(h[k]===i.firstTarget)return;b.preventDefault(),j.call(b)}},!0),a.touchEvents=i}(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){var c=!0;return"mouse"===a.pointerType&&(c=1^a.buttons&&1&b.buttons),c&&!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){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e=180/Math.PI,f={events:["down","up","move","cancel"],exposes:["pinch","rotate"],defaultActions:{pinch:"none",rotate:"none"},reference:{},down:function(b){if(d.set(b.pointerId,b),2==d.pointers()){var c=this.calcChord(),e=this.calcAngle(c);this.reference={angle:e,diameter:c.diameter,target:a.targetFinding.LCA(c.a.target,c.b.target)}}},up:function(a){var b=d.get(a.pointerId);b&&d.delete(a.pointerId)},move:function(a){d.has(a.pointerId)&&(d.set(a.pointerId,a),d.pointers()>1&&this.calcPinchRotate())},cancel:function(a){this.up(a)},firePinch:function(a,b){var d=a/this.reference.diameter,e=c.makeGestureEvent("pinch",{bubbles:!0,cancelable:!0,scale:d,centerX:b.center.x,centerY:b.center.y,_source:"pinch"});this.reference.target.dispatchEvent(e)},fireRotate:function(a,b){var d=Math.round((a-this.reference.angle)%360),e=c.makeGestureEvent("rotate",{bubbles:!0,cancelable:!0,angle:d,centerX:b.center.x,centerY:b.center.y,_source:"pinch"});this.reference.target.dispatchEvent(e)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.firePinch(b,a),c!=this.reference.angle&&this.fireRotate(c,a)},calcChord:function(){var a=[];d.forEach(function(b){a.push(b)});for(var b,c,e,f=0,g={a:a[0],b:a[1]},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),c=Math.abs(i.clientY-k.clientY),e=b+c,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,c=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:c},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*e)%360}};b.registerGesture("pinch",f)}(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&&" ᠎              ".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.5.1"},"function"==typeof window.Polymer&&(Polymer={}),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.WebComponents||(window.WebComponents||(WebComponents={flush:function(){},flags:{log:{}}},Platform=WebComponents,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}),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===r}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===r)&&(b.removeEventListener(s,e),d(a,b))};b.addEventListener(s,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",l=Boolean(k in document.createElement("link")),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=/Trident/.test(navigator.userAgent),r=q?"complete":"interactive",s="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.IMPORT_LINK_TYPE=k,a.useNative=l,a.rootDocument=o,a.whenReady=b,a.isIE=q}(HTMLImports),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={objects:h,get rootObject(){return d},set rootObject(a){d=a,e={}},open:function(b){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),$===this&&($=null)}}};return i}function w(a,b){return $&&$.rootObject===b||($=db.pop()||v(),$.rootObject=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[c])}},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(){return function(a){return Promise.resolve().then(a)}}():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,tb=a;"undefined"!=typeof exports&&("undefined"!=typeof module&&module.exports&&(tb=exports=module.exports),tb=exports),tb.Observer=x,tb.Observer.runEOM_=bb,tb.Observer.observerSentinel_=mb,tb.Observer.hasObjectObserve=P,tb.ArrayObserver=B,tb.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},tb.ArraySplice=I,tb.ObjectObserver=A,tb.PathObserver=C,tb.CompoundObserver=D,tb.Path=l,tb.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){"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"))},get origin(){var a;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return a=this.host,a?this._scheme+"://"+a:""}};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(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.endOfMicrotask=b}(Polymer),function(a){function b(){g||(g=!0,c(function(){g=!1,d.data&&console.group("flush"),Platform.performMicrotaskCheckpoint(),d.data&&console.groupEnd()}))}var c=a.endOfMicrotask,d=window.WebComponents?WebComponents.flags.log:{},e=document.createElement("style");e.textContent="template {display: none !important;} /* injected by platform.js */";var f=document.querySelector("head");f.insertBefore(e,f.firstChild);var g;if(Observer.hasObjectObserve)b=function(){};else{var h=125;window.addEventListener("WebComponentsReady",function(){b();var c=function(){"hidden"===document.visibilityState?a.flushPoll&&clearInterval(a.flushPoll):a.flushPoll=setInterval(b,h)};"string"==typeof document.visibilityState&&document.addEventListener("visibilitychange",c),c()})}if(window.CustomElements&&!CustomElements.useNative){var i=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=i.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b,Platform.flush=b}(window.Polymer),function(a){function b(a){var b=new URL(a.ownerDocument.baseURI);return b.search="",b.hash="",b}function c(a,b,c,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=d(b,h,c),e+"'"+h+"'"+g})}function d(a,b,c){if(b&&"/"===b[0])return b;var d=new URL(b,a);return c?d.href:e(d.href)}function e(a){var c=b(document.documentElement),d=new URL(a,c);return d.host===c.host&&d.port===c.port&&d.protocol===c.protocol?f(c,d):a}function f(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("..");var i=b.href.slice(-1)===m?m:b.hash;return f.join("/")+b.search+i}var g={resolveDom:function(a,c){c=c||b(a),this.resolveAttributes(a,c),this.resolveStyles(a,c);var d=a.querySelectorAll("template");if(d)for(var e,f=0,g=d.length;g>f&&(e=d[f]);f++)e.content&&this.resolveDom(e.content,c)},resolveTemplate:function(a){this.resolveDom(a.content,b(a))},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,c){c=c||b(a),a.textContent=this.resolveCssText(a.textContent,c)},resolveCssText:function(a,b,d){return a=c(a,b,d,h),c(a,b,d,i)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(k);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,e){e=e||b(a),j.forEach(function(b){var f,g=a.attributes[b],i=g&&g.value;i&&i.search(l)<0&&(f="style"===b?c(i,e,!1,h):d(e,i),g.value=f)})}},h=/(url\()([^)]*)(\))/g,i=/(@import[\s]+(?!url\())([^;]*)(;)/g,j=["href","src","action","style","url"],k="["+j.join("],[")+"]",l="{{.*}}",m="#";a.urlResolver=g}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Polymer.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){Polymer.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.WebComponents?WebComponents.flags.log:{},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(),Polymer.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.WebComponents?WebComponents.flags.log:{},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]))}},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},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._objectNotifier;f||(f=this._objectNotifier=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},_propertyChanged:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},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)},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)}}},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.WebComponents?WebComponents.flags.log:{},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)},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},bindFinished:function(){this.makeElementReady()},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())},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},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},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=WebComponents.ShadowCSS.makeScopeSelector(c,d);return WebComponents.ShadowCSS.shimCssText(a,e)}var d=(window.WebComponents?WebComponents.flags.log:{},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),WebComponents.consumeDeclarations&&WebComponents.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.WebComponents?WebComponents.flags.log:{},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.WebComponents?WebComponents.flags.log:{},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=["attribute"],c={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(b=d.slice(0,-7),this.canObserveProperty(b)&&(c||(c=a.observe={}),c[b]=c[b]||d))},canObserveProperty:function(a){return b.indexOf(a)<0},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),this.filterInvalidAccessorNames(c),a._publishLC=this.lowerCaseMap(c));var d=a.computed;d&&this.filterInvalidAccessorNames(d)},filterInvalidAccessorNames:function(a){for(var b in a)this.propertyNameBlacklist[b]&&(console.warn('Cannot define property "'+b+'" for element "'+this.name+'" because it has the same name as an HTMLElement property, and not all browsers support overriding that. Consider giving it a different name.'),delete a[b])},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)},propertyNameBlacklist:{children:1,"class":1,id:1,hidden:1,style:1,title:1}};a.api.declaration.properties=c}(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&&WebComponents.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,Polymer.endOfMicrotask(function(){HTMLImports.whenReady(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,Polymer.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.whenReady;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}})}();
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index ff597ad..5c40b00 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -143,7 +143,9 @@
 // console automatically if any are supplied.
 void _initializeLogging() {
   hierarchicalLoggingEnabled = true;
-  var logFlags = js.context['logFlags'];
+  var webComponents = js.context['WebComponents'];
+  var logFlags = (webComponents == null || webComponents['flags'] == null) ? {}
+      : webComponents['flags']['log'];
   if (logFlags == null) logFlags = {};
   var loggers =
       [_observeLog, _eventsLog, _unbindLog, _bindLog, _watchLog, _readyLog];
diff --git a/pkg/polymer/lib/transformer.dart b/pkg/polymer/lib/transformer.dart
index 6bcfbbe..f9573fe 100644
--- a/pkg/polymer/lib/transformer.dart
+++ b/pkg/polymer/lib/transformer.dart
@@ -44,7 +44,16 @@
   bool csp = args['csp'] == true; // defaults to false
   bool injectBuildLogs =
       !releaseMode && args['inject_build_logs_in_output'] != false;
-  bool injectPlatformJs = args['inject_platform_js'] != false;
+  bool injectWebComponentsJs = true;
+  if (args['inject_platform_js'] != null) {
+    print(
+        'Deprecated polymer transformer option `inject_platform_js`. This has '
+        'been renamed `inject_web_components_js` to match the new file name.');
+    injectWebComponentsJs = args['inject_platform_js'] != false;
+  }
+  if (args['inject_webcomponents_js'] != null) {
+    injectWebComponentsJs = args['inject_webcomponents_js'] != false;
+  }
   return new TransformOptions(
       entryPoints: readFileList(args['entry_points']),
       inlineStylesheets: _readInlineStylesheets(args['inline_stylesheets']),
@@ -53,7 +62,7 @@
       releaseMode: releaseMode,
       lint: _parseLintOption(args['lint']),
       injectBuildLogsInOutput: injectBuildLogs,
-      injectPlatformJs: injectPlatformJs);
+      injectWebComponentsJs: injectWebComponentsJs);
 }
 
 // Lint option can be empty (all files), false, true, or a map indicating
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 8cc369c..10c1ea5 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.15.1+5
+version: 0.15.3
 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
@@ -14,15 +14,19 @@
   code_transformers: '>=0.2.3 <0.3.0'
   html5lib: '>=0.12.0 <0.13.0'
   logging: '>=0.9.2 <0.10.0'
-  observe: '>=0.11.0 <0.13.0'
   path: '>=0.9.0 <2.0.0'
   polymer_expressions: '>=0.12.0 <0.14.0'
   smoke: '>=0.2.0 <0.3.0'
   source_maps: '>=0.9.4 <0.11.0'
   source_span: '>=1.0.0 <2.0.0'
-  template_binding: '>=0.12.0 <0.14.0'
-  web_components: '>=0.9.0 <0.10.0'
+  template_binding: '>=0.12.0 <0.15.0'
+  web_components: '>=0.10.0 <0.11.0'
   yaml: '>=0.9.0 <3.0.0'
+
+  # Because polymer exports observe, it needs to keep its version constraint
+  # tight to ensure that a constraint on polymer properly constraints all
+  # features it provides.
+  observe: '>=0.12.2 <0.12.3'
 dev_dependencies:
   unittest: '>=0.10.0 <0.12.0'
   markdown: '>=0.7.0 <0.8.0'
@@ -32,11 +36,7 @@
 - code_transformers/src/delete_file:
     $include:
       - lib/src/build/log_injector.css
-      - lib/src/js/polymer/polymer.concat.js
-      - lib/src/js/polymer/polymer.concat.js.map
-      - lib/src/js/polymer/polymer.js.map
-- code_transformers/src/remove_sourcemap_comment:
-    $include: lib/src/js/polymer/polymer.js
+      - lib/src/js/polymer/polymer.js
 - observe:
     files: lib/src/instance.dart
     $include: lib/src/instance.dart
diff --git a/pkg/polymer/test/attr_deserialize_test.html b/pkg/polymer/test/attr_deserialize_test.html
index b79d866..35ef320 100644
--- a/pkg/polymer/test/attr_deserialize_test.html
+++ b/pkg/polymer/test/attr_deserialize_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Polymer.dart attribute deserialization test</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>
diff --git a/pkg/polymer/test/attr_mustache_test.dart b/pkg/polymer/test/attr_mustache_test.dart
index 19fb79e..eed6c9e 100644
--- a/pkg/polymer/test/attr_mustache_test.dart
+++ b/pkg/polymer/test/attr_mustache_test.dart
@@ -20,7 +20,7 @@
   bind(name, value, {oneTime: false}) =>
       nodeBindFallback(this).bind(name, value, oneTime: oneTime);
 
-  inserted() {
+  attached() {
     testSrcForMustache();
   }
 
diff --git a/pkg/polymer/test/attr_mustache_test.html b/pkg/polymer/test/attr_mustache_test.html
index 7e4d752..42c3b3d 100644
--- a/pkg/polymer/test/attr_mustache_test.html
+++ b/pkg/polymer/test/attr_mustache_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>take attributes</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>
diff --git a/pkg/polymer/test/auto_binding_test.html b/pkg/polymer/test/auto_binding_test.html
index ba1f13f..2a7b4b4 100644
--- a/pkg/polymer/test/auto_binding_test.html
+++ b/pkg/polymer/test/auto_binding_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>auto-binding test</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>
diff --git a/pkg/polymer/test/bind_mdv_test.html b/pkg/polymer/test/bind_mdv_test.html
index 3992106..c0e3d7f 100644
--- a/pkg/polymer/test/bind_mdv_test.html
+++ b/pkg/polymer/test/bind_mdv_test.html
@@ -10,9 +10,11 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
-  <script src="/packages/polymer/src/js/polymer/polymer.concat.js"></script>
+
+  <!-- Need to hardcode in the polyfills here since this isn't a polymer test-->
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
+  <script src="/packages/polymer/src/js/polymer/polymer.js"></script>
 </head>
 <body>
   <h1> Running bind_mdv_test </h1>
diff --git a/pkg/polymer/test/bind_properties_test.html b/pkg/polymer/test/bind_properties_test.html
index 1d828627..be4028d 100644
--- a/pkg/polymer/test/bind_properties_test.html
+++ b/pkg/polymer/test/bind_properties_test.html
@@ -3,8 +3,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>port of bindProperties test</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>
diff --git a/pkg/polymer/test/bind_test.html b/pkg/polymer/test/bind_test.html
index ee310a3..7221cce 100644
--- a/pkg/polymer/test/bind_test.html
+++ b/pkg/polymer/test/bind_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>bind simple</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>
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 029b9a38..39b1602 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -42,7 +42,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script src="test.html_bootstrap.dart.js" async=""></script>'
           '</body></html>',
@@ -82,7 +82,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script src="test.html_bootstrap.dart.js" async=""></script>'
           '</body></html>',
@@ -130,7 +130,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG\n\n'
+          '$COMPATIBILITY_JS_TAGS\n\n'
           '</head><body>'
           '<div>\n</div>\n'
           '<script src="test.html_bootstrap.dart.js" async=""></script>'
@@ -200,7 +200,7 @@
     }, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<div hidden="">'
           '<polymer-element name="x-a">1</polymer-element>'
@@ -262,7 +262,7 @@
     }, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<div hidden="">'
           '<polymer-element name="x-a">1</polymer-element>'
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index 3eaa805..771e8e8 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -201,10 +201,12 @@
 
 const DART_SUPPORT_TAG =
     '<script src="packages/web_components/dart_support.js"></script>\n';
+const WEB_COMPONENTS_JS_TAG =
+    '<script src="packages/web_components/webcomponents.min.js"></script>\n';
+const COMPATIBILITY_JS_TAGS =
+    '$WEB_COMPONENTS_JS_TAG$DART_SUPPORT_TAG';
 const PLATFORM_JS_TAG =
     '<script src="packages/web_components/platform.js"></script>\n';
-const WEB_COMPONENTS_TAG =
-    '$PLATFORM_JS_TAG$DART_SUPPORT_TAG';
 
 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/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 0ad19a0..c08e5df 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -167,6 +167,30 @@
         '(web/test.html 0 21)'
       ]);
 
+    _testLinter('webcomponents unnecessary', {
+        'a|web/test.html': '<!DOCTYPE html><html>'
+            '$WEB_COMPONENTS_JS_TAG'
+            '<script type="application/dart" src="foo.dart">'
+            '</script>'
+            '</html>',
+      }, [
+        'warning: ${WEB_COMPONENTS_NO_LONGER_REQUIRED.snippet} '
+        '(web/test.html 0 21)'
+      ]);
+
+
+    _testLinter('platform.js -> webcomponents.js', {
+        'a|web/test.html':
+            '<!DOCTYPE html><html>'
+            '$PLATFORM_JS_TAG'
+            '<script type="application/dart" src="foo.dart">'
+            '</script>'
+            '</html>',
+      }, [
+        'warning: ${PLATFORM_JS_RENAMED.snippet} '
+        '(web/test.html 0 21)'
+      ]);
+
   });
 
   group('single script tag per document', () {
diff --git a/pkg/polymer/test/build/polyfill_injector_test.dart b/pkg/polymer/test/build/polyfill_injector_test.dart
index 6eba339..b68bea0 100644
--- a/pkg/polymer/test/build/polyfill_injector_test.dart
+++ b/pkg/polymer/test/build/polyfill_injector_test.dart
@@ -50,7 +50,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script ${type}src="a.dart$ext"$async></script>'
           '$dartJsTag'
@@ -60,38 +60,42 @@
   testPhases('interop/shadow dom already present', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script type="application/dart" src="a.dart"></script>'
           '$dartJsTag'
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script ${type}src="a.dart$ext"$async></script>'
           '$dartJsTag'
           '</body></html>',
     });
 
-  testPhases('dart_support.js after platform.js, platform present', phases, {
+  testPhases(
+      'dart_support.js after webcomponents.js, web_components present', phases,
+    {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$PLATFORM_JS_TAG'
+          '$WEB_COMPONENTS_JS_TAG'
           '</head><body>'
           '<script type="application/dart" src="a.dart"></script>'
           '$dartJsTag'
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script ${type}src="a.dart$ext"$async></script>'
           '$dartJsTag'
           '</body></html>',
     });
 
-  testPhases('dart_support.js after platform.js, dart_support present', phases, {
+  testPhases(
+      'dart_support.js after webcomponents.js, dart_support present', phases,
+    {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '$DART_SUPPORT_TAG'
@@ -101,17 +105,35 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$COMPATIBILITY_JS_TAGS'
           '</head><body>'
           '<script ${type}src="a.dart$ext"$async></script>'
           '$dartJsTag'
           '</body></html>',
     });
 
-  var noPlatformPhases = [[new PolyfillInjector(new TransformOptions(
-        directlyIncludeJS: js, injectPlatformJs: false))]];
+  testPhases('platform.js -> webcomponents.js', phases,
+    {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$PLATFORM_JS_TAG'
+          '</head><body>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '$dartJsTag'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$COMPATIBILITY_JS_TAGS'
+          '</head><body>'
+          '<script ${type}src="a.dart$ext"$async></script>'
+          '$dartJsTag'
+          '</body></html>',
+    });
 
-  testPhases('with no platform.js', noPlatformPhases, {
+  var noWebComponentsPhases = [[new PolyfillInjector(new TransformOptions(
+        directlyIncludeJS: js, injectWebComponentsJs: false))]];
+
+  testPhases('with no webcomponents.js', noWebComponentsPhases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
           '<script type="application/dart" src="a.dart"></script>',
diff --git a/pkg/polymer/test/computed_properties_test.html b/pkg/polymer/test/computed_properties_test.html
index 2dd7256..ec0de25 100644
--- a/pkg/polymer/test/computed_properties_test.html
+++ b/pkg/polymer/test/computed_properties_test.html
@@ -3,8 +3,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property to attribute reflection with bind</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>
diff --git a/pkg/polymer/test/custom_event_test.html b/pkg/polymer/test/custom_event_test.html
index 9fc3c89..1e071cf 100644
--- a/pkg/polymer/test/custom_event_test.html
+++ b/pkg/polymer/test/custom_event_test.html
@@ -8,8 +8,6 @@
   <head>
     <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>custom events</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>
diff --git a/pkg/polymer/test/element_import/import_a.dart b/pkg/polymer/test/element_import/import_a.dart
new file mode 100644
index 0000000..1277c63
--- /dev/null
+++ b/pkg/polymer/test/element_import/import_a.dart
@@ -0,0 +1,10 @@
+library polymer.test.element_import.import_a;
+
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-foo')
+class XFoo extends PolymerElement {
+  final bool isCustom = true;
+
+  XFoo.created() : super.created();
+}
diff --git a/pkg/polymer/test/element_import/import_a.html b/pkg/polymer/test/element_import/import_a.html
new file mode 100644
index 0000000..978cb39
--- /dev/null
+++ b/pkg/polymer/test/element_import/import_a.html
@@ -0,0 +1,16 @@
+<!--
+    @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
+-->
+<link rel="import" href="../packages/polymer/polymer.html">
+<polymer-element name="x-foo">
+  <template>
+    x-foo
+  </template>
+  <script type="application/dart" src="import_a.dart"></script>
+</polymer-element>
diff --git a/pkg/polymer/test/element_import/import_b.dart b/pkg/polymer/test/element_import/import_b.dart
new file mode 100644
index 0000000..6ef2066
--- /dev/null
+++ b/pkg/polymer/test/element_import/import_b.dart
@@ -0,0 +1,10 @@
+library polymer.test.element_import.import_b;
+
+import 'package:polymer/polymer.dart';
+
+@CustomTag('x-bar')
+class XBar extends PolymerElement {
+  final bool isCustom = true;
+
+  XBar.created() : super.created();
+}
diff --git a/pkg/polymer/test/element_import/import_b.html b/pkg/polymer/test/element_import/import_b.html
new file mode 100644
index 0000000..045c607
--- /dev/null
+++ b/pkg/polymer/test/element_import/import_b.html
@@ -0,0 +1,16 @@
+<!--
+    @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
+-->
+<link rel="import" href="../packages/polymer/polymer.html">
+<polymer-element name="x-bar">
+  <template>
+    x-bar
+  </template>
+  <script type="application/dart" src="import_b.dart"></script>
+</polymer-element>
diff --git a/pkg/polymer/test/entered_view_test.html b/pkg/polymer/test/entered_view_test.html
index 3d7068f..cb7900e 100644
--- a/pkg/polymer/test/entered_view_test.html
+++ b/pkg/polymer/test/entered_view_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>attached binding test</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>
diff --git a/pkg/polymer/test/event_binding_release_handler_test.html b/pkg/polymer/test/event_binding_release_handler_test.html
index ce0ebca..d72b1af 100644
--- a/pkg/polymer/test/event_binding_release_handler_test.html
+++ b/pkg/polymer/test/event_binding_release_handler_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
 <head>
   <title>event binding release handler test</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>
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index da9ff28..54bfa16 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -11,8 +11,6 @@
   -->
   <head>
     <title>event handlers</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>
diff --git a/pkg/polymer/test/event_path_declarative_test.html b/pkg/polymer/test/event_path_declarative_test.html
index efe28a3..4fcc3d6 100644
--- a/pkg/polymer/test/event_path_declarative_test.html
+++ b/pkg/polymer/test/event_path_declarative_test.html
@@ -7,8 +7,6 @@
 <html>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head><title>event path declarative test</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>
     <!--
diff --git a/pkg/polymer/test/event_path_test.html b/pkg/polymer/test/event_path_test.html
index dad89f9..0372815 100644
--- a/pkg/polymer/test/event_path_test.html
+++ b/pkg/polymer/test/event_path_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>event path</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>
     <!--
diff --git a/pkg/polymer/test/events_test.html b/pkg/polymer/test/events_test.html
index f0ee1fc..bfee540 100644
--- a/pkg/polymer/test/events_test.html
+++ b/pkg/polymer/test/events_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>event path</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>
     <!--
diff --git a/pkg/polymer/test/force_ready_test.html b/pkg/polymer/test/force_ready_test.html
index 36aa5f1..c5b3898 100644
--- a/pkg/polymer/test/force_ready_test.html
+++ b/pkg/polymer/test/force_ready_test.html
@@ -3,8 +3,6 @@
   <!--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>
diff --git a/pkg/polymer/test/import_test.dart b/pkg/polymer/test/import_test.dart
new file mode 100644
index 0000000..7156ca5
--- /dev/null
+++ b/pkg/polymer/test/import_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+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(() => Polymer.onReady);
+
+  // **NOTE**: This test is currently being skipped everywhere until deferred
+  // imports have actual support.
+  test('Polymer.import', () {
+    return Polymer.import(['element_import/import_a.html']).then((_) {
+      expect((querySelector('x-foo') as dynamic).isCustom, true);
+      var dom = document.importNode(
+          (querySelector('#myTemplate') as TemplateElement).content, true);
+      return Polymer.importElements(dom).then((_) {
+        expect((querySelector('x-bar') as dynamic).isCustom, true);
+      });
+    });
+  });
+});
+
diff --git a/pkg/polymer/test/import_test.html b/pkg/polymer/test/import_test.html
new file mode 100644
index 0000000..2cb1af4
--- /dev/null
+++ b/pkg/polymer/test/import_test.html
@@ -0,0 +1,26 @@
+<!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>Polymer.import test</title>
+    <link rel="import" href="packages/polymer/polymer.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+  <body>
+    <x-foo></x-foo>
+    <hr>
+
+    <x-bar></x-bar>
+
+    <template id="myTemplate">
+      <link rel="import" href="element_import/import_b.html">
+    </template>
+
+    <script type="application/dart" src="import_test.dart"></script>
+  </body>
+</html>
diff --git a/pkg/polymer/test/inject_bound_html_test.html b/pkg/polymer/test/inject_bound_html_test.html
index 450bc41..c61d255 100644
--- a/pkg/polymer/test/inject_bound_html_test.html
+++ b/pkg/polymer/test/inject_bound_html_test.html
@@ -3,8 +3,6 @@
   <!--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>
diff --git a/pkg/polymer/test/instance_attrs_test.html b/pkg/polymer/test/instance_attrs_test.html
index cfa838d..11832de 100644
--- a/pkg/polymer/test/instance_attrs_test.html
+++ b/pkg/polymer/test/instance_attrs_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>Polymer.dart attribute deserialization test</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>
diff --git a/pkg/polymer/test/js_custom_event_test.html b/pkg/polymer/test/js_custom_event_test.html
index 4c4c679..ceadf1d 100644
--- a/pkg/polymer/test/js_custom_event_test.html
+++ b/pkg/polymer/test/js_custom_event_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>event path</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>
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
index b8cdd5a..fe0d234 100644
--- a/pkg/polymer/test/js_interop_test.dart
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -137,13 +137,13 @@
   });
 }
 
-/// Calls Platform.flush() to flush Polymer.js pending operations, e.g.
+/// Calls Polymer.flush() to flush Polymer.js pending operations, e.g.
 /// dirty checking for data-bindings.
 Future flush() {
-  var Platform = context['Platform'];
-  Platform.callMethod('flush');
+  var Polymer = context['Polymer'];
+  Polymer.callMethod('flush');
 
   var completer = new Completer();
-  Platform.callMethod('endOfMicrotask', [() => completer.complete()]);
+  Polymer.callMethod('endOfMicrotask', [() => completer.complete()]);
   return completer.future;
 }
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index cb0b79c..b0f277f 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>polymer.js interop test</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>
diff --git a/pkg/polymer/test/layout_test.html b/pkg/polymer/test/layout_test.html
index 4bf9ef4..a0d33b1 100644
--- a/pkg/polymer/test/layout_test.html
+++ b/pkg/polymer/test/layout_test.html
@@ -7,8 +7,6 @@
 <html>
 <!--polymer-test: this comment is needed for test_suite.dart-->
 <head>
-  <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>
 
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
index 4124bd5..ffafdf1 100644
--- a/pkg/polymer/test/nested_binding_test.html
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>nesting binding test</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>
diff --git a/pkg/polymer/test/noscript_test.html b/pkg/polymer/test/noscript_test.html
index 11b6819..652cc7f 100644
--- a/pkg/polymer/test/noscript_test.html
+++ b/pkg/polymer/test/noscript_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>register test</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>
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.html b/pkg/polymer/test/prop_attr_bind_reflection_test.html
index cd0f674..f1b19a5 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.html
@@ -3,8 +3,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property to attribute reflection with bind</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>
diff --git a/pkg/polymer/test/prop_attr_reflection_test.dart b/pkg/polymer/test/prop_attr_reflection_test.dart
index cf260f5..7e0ab6d 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_reflection_test.dart
@@ -176,7 +176,7 @@
     }).then((_) => onAttributeChange(xzot)).then((_) {
       expect(xzot.attributes['str'], xzot.str);
       // TODO(jmesserly): the JS test seems backwards of the description text.
-      // Is it because it doesn't do "Platform.flush()"?
+      // Is it because it doesn't do "WebComponents.flush()"?
       expect(xzot.attributes['zot'], '5',
           reason: 'extendee reflect false not honored');
     });
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index fac55ef..4d8c375 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>property to attribute reflection</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>
diff --git a/pkg/polymer/test/property_change_test.html b/pkg/polymer/test/property_change_test.html
index 06d7611..25251d3 100644
--- a/pkg/polymer/test/property_change_test.html
+++ b/pkg/polymer/test/property_change_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property changes</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>
diff --git a/pkg/polymer/test/property_observe_test.html b/pkg/polymer/test/property_observe_test.html
index 35ba7ff..0c6bbc8 100644
--- a/pkg/polymer/test/property_observe_test.html
+++ b/pkg/polymer/test/property_observe_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>property.observe changes</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>
diff --git a/pkg/polymer/test/publish_attributes_test.html b/pkg/polymer/test/publish_attributes_test.html
index c38582a..ca91807 100644
--- a/pkg/polymer/test/publish_attributes_test.html
+++ b/pkg/polymer/test/publish_attributes_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>publish attributes</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>
diff --git a/pkg/polymer/test/publish_inherited_properties_test.html b/pkg/polymer/test/publish_inherited_properties_test.html
index 1c02020..024c11e 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.html
+++ b/pkg/polymer/test/publish_inherited_properties_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>publish inherited properties</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>
diff --git a/pkg/polymer/test/register_test.html b/pkg/polymer/test/register_test.html
index 7ba890e..555b1e2 100644
--- a/pkg/polymer/test/register_test.html
+++ b/pkg/polymer/test/register_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>register test</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>
diff --git a/pkg/polymer/test/take_attributes_test.html b/pkg/polymer/test/take_attributes_test.html
index 75ad563..a7fa8e7 100644
--- a/pkg/polymer/test/take_attributes_test.html
+++ b/pkg/polymer/test/take_attributes_test.html
@@ -8,8 +8,6 @@
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
     <title>take attributes</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>
diff --git a/pkg/polymer/test/template_attr_template_test.dart b/pkg/polymer/test/template_attr_template_test.dart
index a4e0b71..bd129d4 100644
--- a/pkg/polymer/test/template_attr_template_test.dart
+++ b/pkg/polymer/test/template_attr_template_test.dart
@@ -47,7 +47,6 @@
   setUp(() => Polymer.onReady);
 
   test('declaration-tests-ran', () {
-    // TODO(jakemac): Change this to '2' once http://dartbug.com/20197 is fixed.
-    expect(testsRun, 3, reason: 'decoration-tests-ran');
+    expect(testsRun, 2, reason: 'decoration-tests-ran');
   });
 });
diff --git a/pkg/polymer/test/template_attr_template_test.html b/pkg/polymer/test/template_attr_template_test.html
index 94689a1..457be47 100644
--- a/pkg/polymer/test/template_attr_template_test.html
+++ b/pkg/polymer/test/template_attr_template_test.html
@@ -8,8 +8,6 @@
 <!--polymer-test: this comment is needed for test_suite.dart-->
 <head>
   <title>template attribute test</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>
   <link rel="import" href="template_attr_template_test_import.html">
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.html b/pkg/polymer/test/template_distribute_dynamic_test.html
index 47307d5..e42b464 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.html
+++ b/pkg/polymer/test/template_distribute_dynamic_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>template distribute</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>
diff --git a/pkg/polymer/test/two_way_bind_test.html b/pkg/polymer/test/two_way_bind_test.html
index 94b4b21..2b68884 100644
--- a/pkg/polymer/test/two_way_bind_test.html
+++ b/pkg/polymer/test/two_way_bind_test.html
@@ -3,8 +3,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>two way bindings</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>
diff --git a/pkg/polymer/test/unbind_test.html b/pkg/polymer/test/unbind_test.html
index 9d96a70a..8b8cfbb 100644
--- a/pkg/polymer/test/unbind_test.html
+++ b/pkg/polymer/test/unbind_test.html
@@ -8,8 +8,6 @@
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
     <title>unbind</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>
diff --git a/pkg/polymer/test/platform_less_test.dart b/pkg/polymer/test/web_components_less_test.dart
similarity index 91%
rename from pkg/polymer/test/platform_less_test.dart
rename to pkg/polymer/test/web_components_less_test.dart
index 28a5c0d..70cc7d6 100644
--- a/pkg/polymer/test/platform_less_test.dart
+++ b/pkg/polymer/test/web_components_less_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 polymer.test.web.layout_test;
+library polymer.test.web.web_components_less_test;
 
 import 'dart:async';
 import 'dart:html';
@@ -36,7 +36,7 @@
 
   setUp(() => Polymer.onReady);
 
-  test('platform-less configuration', () {
+  test('web-components-less configuration', () {
     var jsDoc = new JsObject.fromBrowserObject(document);
     var htmlImports = context['HTMLImports'];
 
diff --git a/pkg/polymer/test/platform_less_test.html b/pkg/polymer/test/web_components_less_test.html
similarity index 74%
rename from pkg/polymer/test/platform_less_test.html
rename to pkg/polymer/test/web_components_less_test.html
index 5f90305..7ce8cd7 100644
--- a/pkg/polymer/test/platform_less_test.html
+++ b/pkg/polymer/test/web_components_less_test.html
@@ -7,11 +7,10 @@
 <html>
 <!--polymer-test: this comment is needed for test_suite.dart-->
 <head>
-  <title>platform-less test</title>
-  <script src="packages/web_components/dart_support.js"></script>
+  <title>web_compnents-less test</title>
   <link rel="import" href="packages/polymer/polymer.html">
   <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  <link rel="import" href="platform_less_test_import.html">
+  <link rel="import" href="web_components_less_test_import.html">
 </head>
 <body unresolved>
 
@@ -21,7 +20,7 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="platform_less_test.dart">
+<script type="application/dart" src="web_components_less_test.dart">
 </script>
 
 <x-main></x-main>
diff --git a/pkg/polymer/test/platform_less_test_import.html b/pkg/polymer/test/web_components_less_test_import.html
similarity index 100%
rename from pkg/polymer/test/platform_less_test_import.html
rename to pkg/polymer/test/web_components_less_test_import.html
diff --git a/pkg/polymer/tool/create_message_details_page.dart b/pkg/polymer/tool/create_message_details_page.dart
index 0e178cd..c1e2566 100644
--- a/pkg/polymer/tool/create_message_details_page.dart
+++ b/pkg/polymer/tool/create_message_details_page.dart
@@ -81,10 +81,11 @@
 _generateMessage(MessageTemplate template, bool forSite, StringBuffer sb) {
   var details = template.details == null
       ? 'No details available' : template.details;
+  if (forSite) details = '{% raw %}$details{% endraw %}';
   var id = template.id;
   var hashTag = '${id.package}_${id.id}';
   var title = '### ${template.description} [#${id.id}](#$hashTag)';
-  var body = '\n{% raw %}$details{% endraw %}\n\n----\n\n';
+  var body = '\n$details\n\n----\n\n';
   // We add the anchor inside the <h3> title, otherwise the link doesn't work.
   if (forSite) {
     sb..write(title)
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 17e8901..fcdc128 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,12 +1,12 @@
 name: polymer_expressions
-version: 0.13.0
+version: 0.13.0+1
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
   observe: ">=0.11.0 <0.13.0"
-  template_binding: ">=0.13.0 <0.14.0"
+  template_binding: ">=0.13.0 <0.15.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   benchmark_harness: ">=1.0.0 <2.0.0"
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index cd251ee..937c030 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.11.4
+
+* Bump the version constraint for `unittest`.
+
+## 0.11.3
+
+* Narrow the constraint on unittest to ensure that new features are reflected in
+  scheduled_test's version.
+
+## 0.11.2+3
+
+* Ignore hidden files in `DirectoryDescriptor.fromFilesystem`.
+
 ## 0.11.2+2
 
 * Moved shared test utilities to `metatest` package.
diff --git a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
index 93f68a6..9d7a299 100644
--- a/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart
@@ -31,6 +31,9 @@
   /// as this descriptor is constructed.
   DirectoryDescriptor.fromFilesystem(String name, String path)
       : this(name, new Directory(path).listSync().map((entity) {
+          // Ignore hidden files.
+          if (p.basename(entity.path).startsWith(".")) return null;
+
           if (entity is Directory) {
             return new DirectoryDescriptor.fromFilesystem(
                 p.basename(entity.path), entity.path);
@@ -39,7 +42,7 @@
                 p.basename(entity.path), entity.readAsBytesSync());
           }
           // Ignore broken symlinks.
-        }));
+        }).where((path) => path != null));
 
   Future create([String parent]) => schedule(() {
     if (parent == null) parent = defaultRoot;
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 91ec1e4..db280ea 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.2+2
+version: 0.11.4
 author: Dart Team <misc@dartlang.org>
 description: >
   A package for writing readable tests of asynchronous behavior.
@@ -17,6 +17,10 @@
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
   stack_trace: '>=0.9.1 <2.0.0'
-  unittest: '>=0.9.0 <0.12.0'
+
+  # Because scheduled_test exports unittest, it needs to keep its version
+  # constraint tight to ensure that a constraint on scheduled_test properly
+  # constraints all features it provides.
+  unittest: '>=0.11.3 <0.11.4'
 dev_dependencies:
   metatest: '>=0.1.0 <0.2.0'
diff --git a/pkg/scheduled_test/test/descriptor/directory_test.dart b/pkg/scheduled_test/test/descriptor/directory_test.dart
index d6e029b..4768e06 100644
--- a/pkg/scheduled_test/test/descriptor/directory_test.dart
+++ b/pkg/scheduled_test/test/descriptor/directory_test.dart
@@ -439,4 +439,29 @@
       ]));
     });
   });
+
+  expectTestPasses("new DirectoryDescriptor().fromFilesystem ignores hidden "
+      "files", () {
+    scheduleSandbox();
+
+    d.dir('dir', [
+      d.dir('subdir', [
+        d.file('subfile1.txt', 'subcontents1'),
+        d.file('.hidden', 'subcontents2')
+      ]),
+      d.file('file1.txt', 'contents1'),
+      d.file('.DS_Store', 'contents2')
+    ]).create();
+
+    schedule(() {
+      var descriptor = new d.DirectoryDescriptor.fromFilesystem(
+          "descriptor", path.join(sandbox, 'dir'));
+      expect(descriptor, isDirectoryDescriptor('descriptor', [
+        isDirectoryDescriptor('subdir', [
+          isFileDescriptor('subfile1.txt', 'subcontents1')
+        ]),
+        isFileDescriptor('file1.txt', 'contents1')
+      ]));
+    });
+  });
 }
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
index a70bc44..531a6d0 100644
--- a/pkg/source_maps/CHANGELOG.md
+++ b/pkg/source_maps/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.10.0+1
+
+* Remove an unnecessary warning printed when the "file" field is missing from a
+  Json formatted source map. This field is optional and its absence is not
+  unusual.
+
 ## 0.10.0
 
 * Remove the `Span`, `Location` and `SourceFile` classes. Use the
diff --git a/pkg/source_maps/lib/parser.dart b/pkg/source_maps/lib/parser.dart
index d67a65e..369c27d 100644
--- a/pkg/source_maps/lib/parser.dart
+++ b/pkg/source_maps/lib/parser.dart
@@ -31,10 +31,6 @@
         'Only version 3 is supported.');
   }
 
-  if (!map.containsKey('file')) {
-    print('warning: missing "file" entry in source map');
-  }
-
   if (map.containsKey('sections')) {
     if (map.containsKey('mappings') || map.containsKey('sources') ||
         map.containsKey('names')) {
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 4af996e..2751034 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,5 +1,5 @@
 name: source_maps
-version: 0.10.0
+version: 0.10.0+1
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 960805b..0b04e5c5 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -1,3 +1,7 @@
+#### Pub version 0.14.0
+  * Up to date with release 0.5.1 ([TemplateBinding#d2bddc4][d2bddc4]).
+  * The `js/patches_mdv.js` file is now named `js/flush.js`.
+
 #### Pub version 0.13.1
   * Up to date with release 0.4.2 ([TemplateBinding#35b7880][35b7880]).
   * Widen web_components version constraint to include 0.9.0.
diff --git a/pkg/template_binding/lib/js/flush.js b/pkg/template_binding/lib/js/flush.js
new file mode 100644
index 0000000..61da3a8
--- /dev/null
+++ b/pkg/template_binding/lib/js/flush.js
@@ -0,0 +1,97 @@
+/*
+ * 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) {
+
+/**
+ * @class Polymer
+ */
+
+// imports
+var endOfMicrotask = scope.endOfMicrotask;
+
+// logging
+var log = window.WebComponents ? WebComponents.flags.log : {};
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+
+/**
+ * Force any pending data changes to be observed before 
+ * the next task. Data changes are processed asynchronously but are guaranteed
+ * to be processed, for example, before paintin. This method should rarely be 
+ * needed. It does nothing when Object.observe is available; 
+ * when Object.observe is not available, Polymer automatically flushes data 
+ * changes approximately every 1/10 second. 
+ * Therefore, `flush` should only be used when a data mutation should be 
+ * observed sooner than this.
+ * 
+ * @method flush
+ */
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    endOfMicrotask(function() {
+      flushing = false;
+      log.data && console.group('flush');
+      Platform.performMicrotaskCheckpoint();
+      log.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    // watch document visiblity to toggle dirty-checking
+    var visibilityHandler = function() {
+      // only flush if the page is visibile
+      if (document.visibilityState === 'hidden') {
+        if (scope.flushPoll) {
+          clearInterval(scope.flushPoll);
+        }
+      } else {
+        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+      }
+    };
+    if (typeof document.visibilityState === 'string') {
+      document.addEventListener('visibilitychange', visibilityHandler);
+    }
+    visibilityHandler();
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  };
+}
+
+// exports
+scope.flush = flush;
+// bc
+Platform.flush = flush;
+
+})(window.Polymer);
+
diff --git a/pkg/template_binding/lib/js/microtask.js b/pkg/template_binding/lib/js/microtask.js
index 827f2fe..ad954e3 100644
--- a/pkg/template_binding/lib/js/microtask.js
+++ b/pkg/template_binding/lib/js/microtask.js
@@ -29,8 +29,9 @@
   ;
 
 // exports
-
 scope.endOfMicrotask = endOfMicrotask;
+// bc 
+Platform.endOfMicrotask = endOfMicrotask;
 
-})(Platform);
+})(Polymer);
 
diff --git a/pkg/template_binding/lib/js/observe.js b/pkg/template_binding/lib/js/observe.js
index 147f68a..6cd2ccb 100644
--- a/pkg/template_binding/lib/js/observe.js
+++ b/pkg/template_binding/lib/js/observe.js
@@ -390,7 +390,7 @@
           obj = obj[this[i - 1]];
         if (!isObject(obj))
           return;
-        observe(obj, this[0]);
+        observe(obj, this[i]);
       }
     },
 
@@ -511,21 +511,9 @@
   }
 
   var runEOM = hasObserve ? (function(){
-    var eomObj = { pingPong: true };
-    var eomRunScheduled = false;
-
-    Object.observe(eomObj, function() {
-      runEOMTasks();
-      eomRunScheduled = false;
-    });
-
     return function(fn) {
-      eomTasks.push(fn);
-      if (!eomRunScheduled) {
-        eomRunScheduled = true;
-        eomObj.pingPong = !eomObj.pingPong;
-      }
-    };
+      return Promise.resolve().then(fn);
+    }
   })() :
   (function() {
     return function(fn) {
@@ -663,14 +651,13 @@
     }
 
     var record = {
-      object: undefined,
       objects: objects,
+      get rootObject() { return rootObj; },
+      set rootObject(value) {
+        rootObj = value;
+        rootObjProps = {};
+      },
       open: function(obs, object) {
-        if (!rootObj) {
-          rootObj = object;
-          rootObjProps = {};
-        }
-
         observers.push(obs);
         observerCount++;
         obs.iterateObjects_(observe);
@@ -691,7 +678,9 @@
         rootObj = undefined;
         rootObjProps = undefined;
         observedSetCache.push(this);
-      }
+        if (lastObservedSet === this)
+          lastObservedSet = null;
+      },
     };
 
     return record;
@@ -700,9 +689,9 @@
   var lastObservedSet;
 
   function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
+    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {
       lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
+      lastObservedSet.rootObject = obj;
     }
     lastObservedSet.open(observer, obj);
     return lastObservedSet;
@@ -1690,19 +1679,33 @@
     return splices;
   }
 
-  global.Observer = Observer;
-  global.Observer.runEOM_ = runEOM;
-  global.Observer.observerSentinel_ = observerSentinel; // for testing.
-  global.Observer.hasObjectObserve = hasObserve;
-  global.ArrayObserver = ArrayObserver;
-  global.ArrayObserver.calculateSplices = function(current, previous) {
+  // Export the observe-js object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, export as a global object.
+
+  var expose = global;
+
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      expose = exports = module.exports;
+    }
+    expose = exports;
+  } 
+
+  expose.Observer = Observer;
+  expose.Observer.runEOM_ = runEOM;
+  expose.Observer.observerSentinel_ = observerSentinel; // for testing.
+  expose.Observer.hasObjectObserve = hasObserve;
+  expose.ArrayObserver = ArrayObserver;
+  expose.ArrayObserver.calculateSplices = function(current, previous) {
     return arraySplice.calculateSplices(current, previous);
   };
 
-  global.ArraySplice = ArraySplice;
-  global.ObjectObserver = ObjectObserver;
-  global.PathObserver = PathObserver;
-  global.CompoundObserver = CompoundObserver;
-  global.Path = Path;
-  global.ObserverTransform = ObserverTransform;
+  expose.ArraySplice = ArraySplice;
+  expose.ObjectObserver = ObjectObserver;
+  expose.PathObserver = PathObserver;
+  expose.CompoundObserver = CompoundObserver;
+  expose.Path = Path;
+  expose.ObserverTransform = ObserverTransform;
+  
 })(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
diff --git a/pkg/template_binding/lib/js/patches_mdv.js b/pkg/template_binding/lib/js/patches_mdv.js
deleted file mode 100644
index 0c49bfb..0000000
--- a/pkg/template_binding/lib/js/patches_mdv.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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) {
-
-// inject style sheet
-var style = document.createElement('style');
-style.textContent = 'template {display: none !important;} /* injected by platform.js */';
-var head = document.querySelector('head');
-head.insertBefore(style, head.firstChild);
-
-// flush (with logging)
-var flushing;
-function flush() {
-  if (!flushing) {
-    flushing = true;
-    scope.endOfMicrotask(function() {
-      flushing = false;
-      logFlags.data && console.group('Platform.flush()');
-      scope.performMicrotaskCheckpoint();
-      logFlags.data && console.groupEnd();
-    });
-  }
-};
-
-// polling dirty checker
-// flush periodically if platform does not have object observe.
-if (!Observer.hasObjectObserve) {
-  var FLUSH_POLL_INTERVAL = 125;
-  window.addEventListener('WebComponentsReady', function() {
-    flush();
-    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
-  });
-} else {
-  // make flush a no-op when we have Object.observe
-  flush = function() {};
-}
-
-if (window.CustomElements && !CustomElements.useNative) {
-  var originalImportNode = Document.prototype.importNode;
-  Document.prototype.importNode = function(node, deep) {
-    var imported = originalImportNode.call(this, node, deep);
-    CustomElements.upgradeAll(imported);
-    return imported;
-  }
-}
-
-// exports
-scope.flush = flush;
-
-})(window.Platform);
-
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index 4692743..baa4f90 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.13.1
+version: 0.14.0
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
@@ -7,7 +7,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   observe: ">=0.11.0 <0.13.0"
-  web_components: ">=0.7.0 <0.10.0"
+  web_components: ">=0.7.0 <0.11.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
 environment:
diff --git a/pkg/template_binding/test/custom_element_bindings_test.html b/pkg/template_binding/test/custom_element_bindings_test.html
index 6ba536a..35e73fe 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.html
+++ b/pkg/template_binding/test/custom_element_bindings_test.html
@@ -10,12 +10,11 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/template_binding/js/observe.js"></script>
   <script src="/packages/template_binding/js/node_bind.js"></script>
   <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/patches_mdv.js"></script>
-
+  <script src="/packages/template_binding/js/flush.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/template_binding/test/node_bind_test.html b/pkg/template_binding/test/node_bind_test.html
index 2123ee7..655323a 100644
--- a/pkg/template_binding/test/node_bind_test.html
+++ b/pkg/template_binding/test/node_bind_test.html
@@ -10,11 +10,11 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/template_binding/js/observe.js"></script>
   <script src="/packages/template_binding/js/node_bind.js"></script>
   <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/patches_mdv.js"></script>
+  <script src="/packages/template_binding/js/flush.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/template_binding/test/template_binding_test.html b/pkg/template_binding/test/template_binding_test.html
index 3aa899c..b4a3577 100644
--- a/pkg/template_binding/test/template_binding_test.html
+++ b/pkg/template_binding/test/template_binding_test.html
@@ -10,11 +10,11 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/template_binding/js/observe.js"></script>
   <script src="/packages/template_binding/js/node_bind.js"></script>
   <script src="/packages/template_binding/js/microtask.js"></script>
-  <script src="/packages/template_binding/js/patches_mdv.js"></script>
+  <script src="/packages/template_binding/js/flush.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index d564ff3..7dfada9 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,3 +1,14 @@
+##0.11.3
+
+* Narrow the constraint on matcher to ensure that new features are reflected in
+  unittest's version.
+
+##0.11.2
+
+* Prints a warning instead of throwing an error when setting the test
+  configuration after it has already been set. The first configuration is always
+  used.
+
 ##0.11.1+1
 
 * Fix bug in withTestEnvironment where test cases were not reinitialized if
diff --git a/pkg/unittest/lib/unittest.dart b/pkg/unittest/lib/unittest.dart
index 3661f99..14b3af6 100644
--- a/pkg/unittest/lib/unittest.dart
+++ b/pkg/unittest/lib/unittest.dart
@@ -194,9 +194,11 @@
 void set unittestConfiguration(Configuration value) {
   if (!identical(_config, value)) {
     if (_config != null) {
-      throw new StateError('unittestConfiguration has already been set');
+      logMessage('Warning: The unittestConfiguration has already been set. New '
+          'unittestConfiguration ignored.');
+    } else {
+      _config = value;
     }
-    _config = value;
   }
 }
 
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index 170cf35..0db9cbd 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,12 +1,16 @@
 name: unittest
-version: 0.11.1+1
+version: 0.11.3
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://pub.dartlang.org/packages/unittest
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  matcher: '>=0.10.0 <0.12.0'
   stack_trace: '>=0.9.0 <2.0.0'
+
+  # Because unittest exports matcher, it needs to keep its version constraint
+  # tight to ensure that a constraint on unittest properly constraints all
+  # features it provides.
+  matcher: '>=0.11.2 <0.11.3'
 dev_dependencies:
   metatest: '>=0.1.0 <0.2.0'
diff --git a/pkg/unittest/test/with_test_environment_test.dart b/pkg/unittest/test/with_test_environment_test.dart
index ae35c20..8d28993 100644
--- a/pkg/unittest/test/with_test_environment_test.dart
+++ b/pkg/unittest/test/with_test_environment_test.dart
@@ -33,8 +33,7 @@
 }
 
 Future runUnittests(Function callback) {
-  var config = new TestConfiguration();
-  unittestConfiguration = config;
+  TestConfiguration config = unittestConfiguration = new TestConfiguration();
   callback();
 
   return config.done;
@@ -51,16 +50,11 @@
 // Test that we can run two different sets of tests in the same run using the
 // withTestEnvironment method.
 void main() {
-  // First check that we cannot call runUnittests twice in a row without it
-  // throwing a StateError due to the unittestConfiguration being set globally
-  // in the first call.
-  try {
-    runUnittests(runTests);
-    runUnittests(runTests1);
-    throw 'Expected this to be unreachable since 2nd run above should throw';
-  } on StateError catch (error) {
-    // expected, silently ignore.
-  }
+  // Check that setting config a second time does not change the configuration
+  runUnittests(runTests);
+  var config = unittestConfiguration;
+  runUnittests(runTests1);
+  expect(config, unittestConfiguration);
 
   // Test that we can run both when encapsulating in their own private test
   // environment. Also test that the tests actually running are the ones
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
index dcd317f..9ce9c28 100644
--- a/pkg/web_components/CHANGELOG.md
+++ b/pkg/web_components/CHANGELOG.md
@@ -1,7 +1,14 @@
-#### Pub version 0.9.0+1
+#### 0.10.0
+  * Updated to the `0.5.1` js version.
+  * **Breaking Change** To remain consistent with the js repository all the
+    `platform.js` has been replaced with `webcomponents.js`. Also, the default
+    file is now unminified, and the minified version is called
+    `webcomponents.min.js`.
+
+#### 0.9.0+1
   * Remove all `.map` and `.concat.js` files during release mode.
 
-#### Pub version 0.9.0
+#### 0.9.0
   * Updated to platform version 0.4.2, internally a deprecated API was removed,
     hence the bump in the version number.
 
@@ -10,7 +17,7 @@
     interop_support.js/interop_support.html can be imported separately when
     providing Dart APIs for js custom elements.
 
-#### Pub version 0.8.0
+#### 0.8.0
   * Re-apply changes from 0.7.1+1 and also cherry pick 
     [efdbbc](https://github.com/polymer/CustomElements/commit/efdbbc) to fix
     the customElementsTakeRecords function.
@@ -21,21 +28,21 @@
     then it will walk up the document tree and use the first observer that it
     finds.
 
-#### Pub version 0.7.1+2
+#### 0.7.1+2
   * Revert the change from 0.7.1+1 due to redness in FF/Safari/IE.
 
-#### Pub version 0.7.1+1
+#### 0.7.1+1
   * Cherry pick [f280d](https://github.com/Polymer/ShadowDOM/commit/f280d) and
     [165c3](https://github.com/Polymer/CustomElements/commit/165c3) to fix
     memory leaks.
 
-#### Pub version 0.7.1
+#### 0.7.1
   * Update to platform version 0.4.1-d214582.
 
-#### Pub version 0.7.0+1
+#### 0.7.0+1
   * Cherry pick https://github.com/Polymer/ShadowDOM/pull/506 to fix IOS 8.
 
-#### Pub version 0.7.0
+#### 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
     purely focused on polyfills.
@@ -43,11 +50,11 @@
     Platform.consumeDeclarations(callback).
   * Cherry pick https://github.com/Polymer/ShadowDOM/pull/505 to fix mem leak.
 
-#### Pub version 0.6.0+1
+#### 0.6.0+1
   * Cherry pick https://github.com/Polymer/ShadowDOM/pull/500 to fix
     http://dartbug.com/20141. Fixes getDefaultComputedStyle in firefox.
 
-#### Pub version 0.6.0
+#### 0.6.0
   * Upgrades to platform master as of 8/25/2014 (see lib/build.log for details).
     This is more recent than the 0.3.5 release as there were multiple breakages
     that required updating past that.
@@ -55,25 +62,25 @@
     work, but it shouldn't affect most people. See 
     https://github.com/Polymer/ShadowDOM/issues/495.
 
-#### Pub version 0.5.0+1
+#### 0.5.0+1
   * Backward compatible change to prepare for upcoming change of the user agent
     in Dartium.
 
-#### Pub version 0.5.0
+#### 0.5.0
   * Upgrades to platform version 0.3.4-02a0f66 (see lib/build.log for details).
 
-#### Pub version 0.4.0
+#### 0.4.0
   * Adds `registerDartType` and updates to platform 0.3.3-29065bc
     (re-applies the changes in 0.3.5).
 
-#### Pub version 0.3.5+1
+#### 0.3.5+1
   * Reverts back to what we had in 0.3.4. (The platform.js updates in 0.3.5 had
     breaking changes so we are republishing it in 0.4.0)
 
-#### Pub version 0.3.5
+#### 0.3.5
   * Added `registerDartType` to register a Dart API for a custom-element written
     in Javascript.
   * Updated to platform 0.3.3-29065bc
 
-#### Pub version 0.3.4
+#### 0.3.4
   * Updated to platform 0.2.4 (see lib/build.log for details)
diff --git a/pkg/web_components/README.md b/pkg/web_components/README.md
index d343f86..a1ef1b7 100644
--- a/pkg/web_components/README.md
+++ b/pkg/web_components/README.md
@@ -16,20 +16,20 @@
 Include the polyfills in your HTML `<head>` to enable Shadow DOM:
 
 ```html
-<script src="packages/web_components/platform.js"></script>
+<script src="packages/web_components/webcomponents.min.js"></script>
 <script src="packages/web_components/dart_support.js"></script>
 ```
 
 You can also use an unminified version for development:
 
 ```html
-<script src="packages/web_components/platform.concat.js"></script>
+<script src="packages/web_components/webcomponents.js"></script>
 <script src="packages/web_components/dart_support.js"></script>
 ```
 
-Because the Shadow DOM polyfill does extensive DOM patching, platform.js should
-be included **before** other script tags. Be sure to include dart_support.js
-too, it is required for the Shadow DOM polyfill to work with
+Because the Shadow DOM polyfill does extensive DOM patching, webcomponents.js
+should be included **before** other script tags. Be sure to include
+dart_support.js too, it is required for the Shadow DOM polyfill to work with
 [dart2js](https://www.dartlang.org/docs/dart-up-and-running/contents/ch04-tools-dart2js.html).
 
 ## Custom Elements
@@ -64,23 +64,6 @@
 
 ## Hacking on this package
 
-To rebuild platform.js:
-
-```bash
-# Make a directory like ~/src/polymer
-mkdir ~/src/polymer
-cd ~/src/polymer
-git clone https://github.com/polymer/tools
-
-# Sync polymer repositories
-./tools/bin/pull-all-polymer.sh
-
-# If you don't have "npm", get it here: http://nodejs.org
-cd platform-dev
-npm install
-grunt minify audit
-cd build
-
-# Copy the build output to your Dart source tree
-cp build.log platform* ~/dart/dart/pkg/web_components/lib
-```
+The `webcomponents.*` files in this package are developed 
+[here](https://github.com/Polymer/webcomponentsjs). Follow the instructions
+there for how to build a new release and then copy the files into this package.
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
deleted file mode 100644
index f6ebf15..0000000
--- a/pkg/web_components/lib/platform.concat.js
+++ /dev/null
@@ -1,12449 +0,0 @@
-/**
- * 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
- */
-
-window.Platform = window.Platform || {};
-// prepopulate window.logFlags if necessary
-window.logFlags = window.logFlags || {};
-// process flags
-(function(scope){
-  // import
-  var flags = scope.flags || {};
-  // populate flags from location
-  location.search.slice(1).split('&').forEach(function(o) {
-    o = o.split('=');
-    o[0] && (flags[o[0]] = o[1] || true);
-  });
-  var entryPoint = document.currentScript ||
-      document.querySelector('script[src*="platform.js"]');
-  if (entryPoint) {
-    var a = entryPoint.attributes;
-    for (var i = 0, n; i < a.length; i++) {
-      n = a[i];
-      if (n.name !== 'src') {
-        flags[n.name] = n.value || true;
-      }
-    }
-  }
-  if (flags.log) {
-    flags.log.split(',').forEach(function(f) {
-      window.logFlags[f] = true;
-    });
-  }
-  // If any of these flags match 'native', then force native ShadowDOM; any
-  // other truthy value, or failure to detect native
-  // ShadowDOM, results in polyfill
-  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
-  if (flags.shadow === 'native') {
-    flags.shadow = false;
-  } else {
-    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
-  }
-
-  if (flags.shadow && document.querySelectorAll('script').length > 1) {
-    console.log('Warning: platform.js is not the first script on the page. ' +
-        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +
-        'for details.');
-  }
-
-  // CustomElements polyfill flag
-  if (flags.register) {
-    window.CustomElements = window.CustomElements || {flags: {}};
-    window.CustomElements.flags.register = flags.register;
-  }
-
-  if (flags.imports) {
-    window.HTMLImports = window.HTMLImports || {flags: {}};
-    window.HTMLImports.flags.imports = flags.imports;
-  }
-
-  // export
-  scope.flags = flags;
-})(Platform);
-
-/*
- * Copyright 2012 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-if (typeof WeakMap === 'undefined') {
-  (function() {
-    var defineProperty = Object.defineProperty;
-    var counter = Date.now() % 1e9;
-
-    var WeakMap = function() {
-      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
-    };
-
-    WeakMap.prototype = {
-      set: function(key, value) {
-        var entry = key[this.name];
-        if (entry && entry[0] === key)
-          entry[1] = value;
-        else
-          defineProperty(key, this.name, {value: [key, value], writable: true});
-        return this;
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ?
-            entry[1] : undefined;
-      },
-      delete: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        var hasValue = entry[0] === key;
-        entry[0] = entry[1] = undefined;
-        return hasValue;
-      },
-      has: function(key) {
-        var entry = key[this.name];
-        if (!entry) return false;
-        return entry[0] === key;
-      }
-    };
-
-    window.WeakMap = WeakMap;
-  })();
-}
-
-// select ShadowDOM impl

-if (Platform.flags.shadow) {

-
-/*
- * 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';
-
-  var testingExposeCycleCount = global.testingExposeCycleCount;
-
-  // Detect and do basic sanity checking on Object/Array.observe.
-  function detectObjectObserve() {
-    if (typeof Object.observe !== 'function' ||
-        typeof Array.observe !== 'function') {
-      return false;
-    }
-
-    var records = [];
-
-    function callback(recs) {
-      records = recs;
-    }
-
-    var test = {};
-    var arr = [];
-    Object.observe(test, callback);
-    Array.observe(arr, callback);
-    test.id = 1;
-    test.id = 2;
-    delete test.id;
-    arr.push(1, 2);
-    arr.length = 0;
-
-    Object.deliverChangeRecords(callback);
-    if (records.length !== 5)
-      return false;
-
-    if (records[0].type != 'add' ||
-        records[1].type != 'update' ||
-        records[2].type != 'delete' ||
-        records[3].type != 'splice' ||
-        records[4].type != 'splice') {
-      return false;
-    }
-
-    Object.unobserve(test, callback);
-    Array.unobserve(arr, callback);
-
-    return true;
-  }
-
-  var hasObserve = detectObjectObserve();
-
-  function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-
-    // 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 (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
-      return false;
-    }
-
-    try {
-      var f = new Function('', 'return true;');
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-
-  var hasEval = detectEval();
-
-  function isIndex(s) {
-    return +s === s >>> 0 && s !== '';
-  }
-
-  function toNumber(s) {
-    return +s;
-  }
-
-  function isObject(obj) {
-    return obj === Object(obj);
-  }
-
-  var numberIsNaN = global.Number.isNaN || function(value) {
-    return typeof value === 'number' && global.isNaN(value);
-  }
-
-  function areSameValue(left, right) {
-    if (left === right)
-      return left !== 0 || 1 / left === 1 / right;
-    if (numberIsNaN(left) && numberIsNaN(right))
-      return true;
-
-    return left !== left && right !== right;
-  }
-
-  var createObject = ('__proto__' in {}) ?
-    function(obj) { return obj; } :
-    function(obj) {
-      var proto = obj.__proto__;
-      if (!proto)
-        return obj;
-      var newObject = Object.create(proto);
-      Object.getOwnPropertyNames(obj).forEach(function(name) {
-        Object.defineProperty(newObject, name,
-                             Object.getOwnPropertyDescriptor(obj, name));
-      });
-      return newObject;
-    };
-
-  var identStart = '[\$_a-zA-Z]';
-  var identPart = '[\$_a-zA-Z0-9]';
-  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
-
-  function getPathCharType(char) {
-    if (char === undefined)
-      return 'eof';
-
-    var code = char.charCodeAt(0);
-
-    switch(code) {
-      case 0x5B: // [
-      case 0x5D: // ]
-      case 0x2E: // .
-      case 0x22: // "
-      case 0x27: // '
-      case 0x30: // 0
-        return char;
-
-      case 0x5F: // _
-      case 0x24: // $
-        return 'ident';
-
-      case 0x20: // Space
-      case 0x09: // Tab
-      case 0x0A: // Newline
-      case 0x0D: // Return
-      case 0xA0:  // No-break space
-      case 0xFEFF:  // Byte Order Mark
-      case 0x2028:  // Line Separator
-      case 0x2029:  // Paragraph Separator
-        return 'ws';
-    }
-
-    // a-z, A-Z
-    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
-      return 'ident';
-
-    // 1-9
-    if (0x31 <= code && code <= 0x39)
-      return 'number';
-
-    return 'else';
-  }
-
-  var 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']
-    }
-  }
-
-  function noop() {}
-
-  function parsePath(path) {
-    var keys = [];
-    var index = -1;
-    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
-
-    var actions = {
-      push: function() {
-        if (key === undefined)
-          return;
-
-        keys.push(key);
-        key = undefined;
-      },
-
-      append: function() {
-        if (key === undefined)
-          key = newChar
-        else
-          key += newChar;
-      }
-    };
-
-    function maybeUnescapeQuote() {
-      if (index >= path.length)
-        return;
-
-      var nextChar = path[index + 1];
-      if ((mode == 'inSingleQuote' && nextChar == "'") ||
-          (mode == 'inDoubleQuote' && nextChar == '"')) {
-        index++;
-        newChar = nextChar;
-        actions.append();
-        return true;
-      }
-    }
-
-    while (mode) {
-      index++;
-      c = path[index];
-
-      if (c == '\\' && maybeUnescapeQuote(mode))
-        continue;
-
-      type = getPathCharType(c);
-      typeMap = pathStateMachine[mode];
-      transition = typeMap[type] || typeMap['else'] || 'error';
-
-      if (transition == 'error')
-        return; // parse error;
-
-      mode = transition[0];
-      action = actions[transition[1]] || noop;
-      newChar = transition[2] === undefined ? c : transition[2];
-      action();
-
-      if (mode === 'afterPath') {
-        return keys;
-      }
-    }
-
-    return; // parse error
-  }
-
-  function isIdent(s) {
-    return identRegExp.test(s);
-  }
-
-  var constructorIsPrivate = {};
-
-  function Path(parts, privateToken) {
-    if (privateToken !== constructorIsPrivate)
-      throw Error('Use Path.get to retrieve path objects');
-
-    for (var i = 0; i < parts.length; i++) {
-      this.push(String(parts[i]));
-    }
-
-    if (hasEval && this.length) {
-      this.getValueFrom = this.compiledGetValueFromFn();
-    }
-  }
-
-  // TODO(rafaelw): Make simple LRU cache
-  var pathCache = {};
-
-  function getPath(pathString) {
-    if (pathString instanceof Path)
-      return pathString;
-
-    if (pathString == null || pathString.length == 0)
-      pathString = '';
-
-    if (typeof pathString != 'string') {
-      if (isIndex(pathString.length)) {
-        // Constructed with array-like (pre-parsed) keys
-        return new Path(pathString, constructorIsPrivate);
-      }
-
-      pathString = String(pathString);
-    }
-
-    var path = pathCache[pathString];
-    if (path)
-      return path;
-
-    var parts = parsePath(pathString);
-    if (!parts)
-      return invalidPath;
-
-    var path = new Path(parts, constructorIsPrivate);
-    pathCache[pathString] = path;
-    return path;
-  }
-
-  Path.get = getPath;
-
-  function formatAccessor(key) {
-    if (isIndex(key)) {
-      return '[' + key + ']';
-    } else {
-      return '["' + key.replace(/"/g, '\\"') + '"]';
-    }
-  }
-
-  Path.prototype = createObject({
-    __proto__: [],
-    valid: true,
-
-    toString: function() {
-      var pathString = '';
-      for (var i = 0; i < this.length; i++) {
-        var key = this[i];
-        if (isIdent(key)) {
-          pathString += i ? '.' + key : key;
-        } else {
-          pathString += formatAccessor(key);
-        }
-      }
-
-      return pathString;
-    },
-
-    getValueFrom: function(obj, directObserver) {
-      for (var i = 0; i < this.length; i++) {
-        if (obj == null)
-          return;
-        obj = obj[this[i]];
-      }
-      return obj;
-    },
-
-    iterateObjects: function(obj, observe) {
-      for (var i = 0; i < this.length; i++) {
-        if (i)
-          obj = obj[this[i - 1]];
-        if (!isObject(obj))
-          return;
-        observe(obj, this[0]);
-      }
-    },
-
-    compiledGetValueFromFn: function() {
-      var str = '';
-      var pathString = 'obj';
-      str += 'if (obj != null';
-      var i = 0;
-      var key;
-      for (; i < (this.length - 1); i++) {
-        key = this[i];
-        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-        str += ' &&\n     ' + pathString + ' != null';
-      }
-      str += ')\n';
-
-      var key = this[i];
-      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
-
-      str += '  return ' + pathString + ';\nelse\n  return undefined;';
-      return new Function('obj', str);
-    },
-
-    setValueFrom: function(obj, value) {
-      if (!this.length)
-        return false;
-
-      for (var i = 0; i < this.length - 1; i++) {
-        if (!isObject(obj))
-          return false;
-        obj = obj[this[i]];
-      }
-
-      if (!isObject(obj))
-        return false;
-
-      obj[this[i]] = value;
-      return true;
-    }
-  });
-
-  var invalidPath = new Path('', constructorIsPrivate);
-  invalidPath.valid = false;
-  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
-
-  var MAX_DIRTY_CHECK_CYCLES = 1000;
-
-  function dirtyCheck(observer) {
-    var cycles = 0;
-    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
-      cycles++;
-    }
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    return cycles > 0;
-  }
-
-  function objectIsEmpty(object) {
-    for (var prop in object)
-      return false;
-    return true;
-  }
-
-  function diffIsEmpty(diff) {
-    return objectIsEmpty(diff.added) &&
-           objectIsEmpty(diff.removed) &&
-           objectIsEmpty(diff.changed);
-  }
-
-  function diffObjectFromOldObject(object, oldObject) {
-    var added = {};
-    var removed = {};
-    var changed = {};
-
-    for (var prop in oldObject) {
-      var newValue = object[prop];
-
-      if (newValue !== undefined && newValue === oldObject[prop])
-        continue;
-
-      if (!(prop in object)) {
-        removed[prop] = undefined;
-        continue;
-      }
-
-      if (newValue !== oldObject[prop])
-        changed[prop] = newValue;
-    }
-
-    for (var prop in object) {
-      if (prop in oldObject)
-        continue;
-
-      added[prop] = object[prop];
-    }
-
-    if (Array.isArray(object) && object.length !== oldObject.length)
-      changed.length = object.length;
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  var eomTasks = [];
-  function runEOMTasks() {
-    if (!eomTasks.length)
-      return false;
-
-    for (var i = 0; i < eomTasks.length; i++) {
-      eomTasks[i]();
-    }
-    eomTasks.length = 0;
-    return true;
-  }
-
-  var runEOM = hasObserve ? (function(){
-    var eomObj = { pingPong: true };
-    var eomRunScheduled = false;
-
-    Object.observe(eomObj, function() {
-      runEOMTasks();
-      eomRunScheduled = false;
-    });
-
-    return function(fn) {
-      eomTasks.push(fn);
-      if (!eomRunScheduled) {
-        eomRunScheduled = true;
-        eomObj.pingPong = !eomObj.pingPong;
-      }
-    };
-  })() :
-  (function() {
-    return function(fn) {
-      eomTasks.push(fn);
-    };
-  })();
-
-  var observedObjectCache = [];
-
-  function newObservedObject() {
-    var observer;
-    var object;
-    var discardRecords = false;
-    var first = true;
-
-    function callback(records) {
-      if (observer && observer.state_ === OPENED && !discardRecords)
-        observer.check_(records);
-    }
-
-    return {
-      open: function(obs) {
-        if (observer)
-          throw Error('ObservedObject in use');
-
-        if (!first)
-          Object.deliverChangeRecords(callback);
-
-        observer = obs;
-        first = false;
-      },
-      observe: function(obj, arrayObserve) {
-        object = obj;
-        if (arrayObserve)
-          Array.observe(object, callback);
-        else
-          Object.observe(object, callback);
-      },
-      deliver: function(discard) {
-        discardRecords = discard;
-        Object.deliverChangeRecords(callback);
-        discardRecords = false;
-      },
-      close: function() {
-        observer = undefined;
-        Object.unobserve(object, callback);
-        observedObjectCache.push(this);
-      }
-    };
-  }
-
-  /*
-   * The observedSet abstraction is a perf optimization which reduces the total
-   * number of Object.observe observations of a set of objects. The idea is that
-   * groups of Observers will have some object dependencies in common and this
-   * observed set ensures that each object in the transitive closure of
-   * dependencies is only observed once. The observedSet acts as a write barrier
-   * such that whenever any change comes through, all Observers are checked for
-   * changed values.
-   *
-   * Note that this optimization is explicitly moving work from setup-time to
-   * change-time.
-   *
-   * TODO(rafaelw): Implement "garbage collection". In order to move work off
-   * the critical path, when Observers are closed, their observed objects are
-   * not Object.unobserve(d). As a result, it's possible that if the observedSet
-   * is kept open, but some Observers have been closed, it could cause "leaks"
-   * (prevent otherwise collectable objects from being collected). At some
-   * point, we should implement incremental "gc" which keeps a list of
-   * observedSets which may need clean-up and does small amounts of cleanup on a
-   * timeout until all is clean.
-   */
-
-  function getObservedObject(observer, object, arrayObserve) {
-    var dir = observedObjectCache.pop() || newObservedObject();
-    dir.open(observer);
-    dir.observe(object, arrayObserve);
-    return dir;
-  }
-
-  var observedSetCache = [];
-
-  function newObservedSet() {
-    var observerCount = 0;
-    var observers = [];
-    var objects = [];
-    var rootObj;
-    var rootObjProps;
-
-    function observe(obj, prop) {
-      if (!obj)
-        return;
-
-      if (obj === rootObj)
-        rootObjProps[prop] = true;
-
-      if (objects.indexOf(obj) < 0) {
-        objects.push(obj);
-        Object.observe(obj, callback);
-      }
-
-      observe(Object.getPrototypeOf(obj), prop);
-    }
-
-    function allRootObjNonObservedProps(recs) {
-      for (var i = 0; i < recs.length; i++) {
-        var rec = recs[i];
-        if (rec.object !== rootObj ||
-            rootObjProps[rec.name] ||
-            rec.type === 'setPrototype') {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    function callback(recs) {
-      if (allRootObjNonObservedProps(recs))
-        return;
-
-      var observer;
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.iterateObjects_(observe);
-        }
-      }
-
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.check_();
-        }
-      }
-    }
-
-    var record = {
-      object: undefined,
-      objects: objects,
-      open: function(obs, object) {
-        if (!rootObj) {
-          rootObj = object;
-          rootObjProps = {};
-        }
-
-        observers.push(obs);
-        observerCount++;
-        obs.iterateObjects_(observe);
-      },
-      close: function(obs) {
-        observerCount--;
-        if (observerCount > 0) {
-          return;
-        }
-
-        for (var i = 0; i < objects.length; i++) {
-          Object.unobserve(objects[i], callback);
-          Observer.unobservedCount++;
-        }
-
-        observers.length = 0;
-        objects.length = 0;
-        rootObj = undefined;
-        rootObjProps = undefined;
-        observedSetCache.push(this);
-      }
-    };
-
-    return record;
-  }
-
-  var lastObservedSet;
-
-  function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
-      lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
-    }
-    lastObservedSet.open(observer, obj);
-    return lastObservedSet;
-  }
-
-  var UNOPENED = 0;
-  var OPENED = 1;
-  var CLOSED = 2;
-  var RESETTING = 3;
-
-  var nextObserverId = 1;
-
-  function Observer() {
-    this.state_ = UNOPENED;
-    this.callback_ = undefined;
-    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
-    this.directObserver_ = undefined;
-    this.value_ = undefined;
-    this.id_ = nextObserverId++;
-  }
-
-  Observer.prototype = {
-    open: function(callback, target) {
-      if (this.state_ != UNOPENED)
-        throw Error('Observer has already been opened.');
-
-      addToAll(this);
-      this.callback_ = callback;
-      this.target_ = target;
-      this.connect_();
-      this.state_ = OPENED;
-      return this.value_;
-    },
-
-    close: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      removeFromAll(this);
-      this.disconnect_();
-      this.value_ = undefined;
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.state_ = CLOSED;
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      dirtyCheck(this);
-    },
-
-    report_: function(changes) {
-      try {
-        this.callback_.apply(this.target_, changes);
-      } catch (ex) {
-        Observer._errorThrownDuringCallback = true;
-        console.error('Exception caught during observer callback: ' +
-                       (ex.stack || ex));
-      }
-    },
-
-    discardChanges: function() {
-      this.check_(undefined, true);
-      return this.value_;
-    }
-  }
-
-  var collectObservers = !hasObserve;
-  var allObservers;
-  Observer._allObserversCount = 0;
-
-  if (collectObservers) {
-    allObservers = [];
-  }
-
-  function addToAll(observer) {
-    Observer._allObserversCount++;
-    if (!collectObservers)
-      return;
-
-    allObservers.push(observer);
-  }
-
-  function removeFromAll(observer) {
-    Observer._allObserversCount--;
-  }
-
-  var runningMicrotaskCheckpoint = false;
-
-  global.Platform = global.Platform || {};
-
-  global.Platform.performMicrotaskCheckpoint = function() {
-    if (runningMicrotaskCheckpoint)
-      return;
-
-    if (!collectObservers)
-      return;
-
-    runningMicrotaskCheckpoint = true;
-
-    var cycles = 0;
-    var anyChanged, toCheck;
-
-    do {
-      cycles++;
-      toCheck = allObservers;
-      allObservers = [];
-      anyChanged = false;
-
-      for (var i = 0; i < toCheck.length; i++) {
-        var observer = toCheck[i];
-        if (observer.state_ != OPENED)
-          continue;
-
-        if (observer.check_())
-          anyChanged = true;
-
-        allObservers.push(observer);
-      }
-      if (runEOMTasks())
-        anyChanged = true;
-    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
-
-    if (testingExposeCycleCount)
-      global.dirtyCheckCycleCount = cycles;
-
-    runningMicrotaskCheckpoint = false;
-  };
-
-  if (collectObservers) {
-    global.Platform.clearObservers = function() {
-      allObservers = [];
-    };
-  }
-
-  function ObjectObserver(object) {
-    Observer.call(this);
-    this.value_ = object;
-    this.oldObject_ = undefined;
-  }
-
-  ObjectObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    arrayObserve: false,
-
-    connect_: function(callback, target) {
-      if (hasObserve) {
-        this.directObserver_ = getObservedObject(this, this.value_,
-                                                 this.arrayObserve);
-      } else {
-        this.oldObject_ = this.copyObject(this.value_);
-      }
-
-    },
-
-    copyObject: function(object) {
-      var copy = Array.isArray(object) ? [] : {};
-      for (var prop in object) {
-        copy[prop] = object[prop];
-      };
-      if (Array.isArray(object))
-        copy.length = object.length;
-      return copy;
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var diff;
-      var oldValues;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-
-        oldValues = {};
-        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
-                                           oldValues);
-      } else {
-        oldValues = this.oldObject_;
-        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
-      }
-
-      if (diffIsEmpty(diff))
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([
-        diff.added || {},
-        diff.removed || {},
-        diff.changed || {},
-        function(property) {
-          return oldValues[property];
-        }
-      ]);
-
-      return true;
-    },
-
-    disconnect_: function() {
-      if (hasObserve) {
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-      } else {
-        this.oldObject_ = undefined;
-      }
-    },
-
-    deliver: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      if (hasObserve)
-        this.directObserver_.deliver(false);
-      else
-        dirtyCheck(this);
-    },
-
-    discardChanges: function() {
-      if (this.directObserver_)
-        this.directObserver_.deliver(true);
-      else
-        this.oldObject_ = this.copyObject(this.value_);
-
-      return this.value_;
-    }
-  });
-
-  function ArrayObserver(array) {
-    if (!Array.isArray(array))
-      throw Error('Provided object is not an Array');
-    ObjectObserver.call(this, array);
-  }
-
-  ArrayObserver.prototype = createObject({
-
-    __proto__: ObjectObserver.prototype,
-
-    arrayObserve: true,
-
-    copyObject: function(arr) {
-      return arr.slice();
-    },
-
-    check_: function(changeRecords) {
-      var splices;
-      if (hasObserve) {
-        if (!changeRecords)
-          return false;
-        splices = projectArraySplices(this.value_, changeRecords);
-      } else {
-        splices = calcSplices(this.value_, 0, this.value_.length,
-                              this.oldObject_, 0, this.oldObject_.length);
-      }
-
-      if (!splices || !splices.length)
-        return false;
-
-      if (!hasObserve)
-        this.oldObject_ = this.copyObject(this.value_);
-
-      this.report_([splices]);
-      return true;
-    }
-  });
-
-  ArrayObserver.applySplices = function(previous, current, splices) {
-    splices.forEach(function(splice) {
-      var spliceArgs = [splice.index, splice.removed.length];
-      var addIndex = splice.index;
-      while (addIndex < splice.index + splice.addedCount) {
-        spliceArgs.push(current[addIndex]);
-        addIndex++;
-      }
-
-      Array.prototype.splice.apply(previous, spliceArgs);
-    });
-  };
-
-  function PathObserver(object, path) {
-    Observer.call(this);
-
-    this.object_ = object;
-    this.path_ = getPath(path);
-    this.directObserver_ = undefined;
-  }
-
-  PathObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    get path() {
-      return this.path_;
-    },
-
-    connect_: function() {
-      if (hasObserve)
-        this.directObserver_ = getObservedSet(this, this.object_);
-
-      this.check_(undefined, true);
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    iterateObjects_: function(observe) {
-      this.path_.iterateObjects(this.object_, observe);
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValue = this.value_;
-      this.value_ = this.path_.getValueFrom(this.object_);
-      if (skipChanges || areSameValue(this.value_, oldValue))
-        return false;
-
-      this.report_([this.value_, oldValue, this]);
-      return true;
-    },
-
-    setValue: function(newValue) {
-      if (this.path_)
-        this.path_.setValueFrom(this.object_, newValue);
-    }
-  });
-
-  function CompoundObserver(reportChangesOnOpen) {
-    Observer.call(this);
-
-    this.reportChangesOnOpen_ = reportChangesOnOpen;
-    this.value_ = [];
-    this.directObserver_ = undefined;
-    this.observed_ = [];
-  }
-
-  var observerSentinel = {};
-
-  CompoundObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      if (hasObserve) {
-        var object;
-        var needsDirectObserver = false;
-        for (var i = 0; i < this.observed_.length; i += 2) {
-          object = this.observed_[i]
-          if (object !== observerSentinel) {
-            needsDirectObserver = true;
-            break;
-          }
-        }
-
-        if (needsDirectObserver)
-          this.directObserver_ = getObservedSet(this, object);
-      }
-
-      this.check_(undefined, !this.reportChangesOnOpen_);
-    },
-
-    disconnect_: function() {
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        if (this.observed_[i] === observerSentinel)
-          this.observed_[i + 1].close();
-      }
-      this.observed_.length = 0;
-      this.value_.length = 0;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-    },
-
-    addPath: function(object, path) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add paths once started.');
-
-      var path = getPath(path);
-      this.observed_.push(object, path);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = path.getValueFrom(object);
-    },
-
-    addObserver: function(observer) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add observers once started.');
-
-      this.observed_.push(observerSentinel, observer);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = observer.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');
-      this.state_ = OPENED;
-      this.connect_();
-
-      return this.value_;
-    },
-
-    iterateObjects_: function(observe) {
-      var object;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        object = this.observed_[i]
-        if (object !== observerSentinel)
-          this.observed_[i + 1].iterateObjects(object, observe)
-      }
-    },
-
-    check_: function(changeRecords, skipChanges) {
-      var oldValues;
-      for (var i = 0; i < this.observed_.length; i += 2) {
-        var object = this.observed_[i];
-        var path = this.observed_[i+1];
-        var value;
-        if (object === observerSentinel) {
-          var observable = path;
-          value = this.state_ === UNOPENED ?
-              observable.open(this.deliver, this) :
-              observable.discardChanges();
-        } else {
-          value = path.getValueFrom(object);
-        }
-
-        if (skipChanges) {
-          this.value_[i / 2] = value;
-          continue;
-        }
-
-        if (areSameValue(value, this.value_[i / 2]))
-          continue;
-
-        oldValues = oldValues || [];
-        oldValues[i / 2] = this.value_[i / 2];
-        this.value_[i / 2] = value;
-      }
-
-      if (!oldValues)
-        return false;
-
-      // TODO(rafaelw): Having observed_ as the third callback arg here is
-      // pretty lame API. Fix.
-      this.report_([this.value_, oldValues, this.observed_]);
-      return true;
-    }
-  });
-
-  function identFn(value) { return value; }
-
-  function ObserverTransform(observable, getValueFn, setValueFn,
-                             dontPassThroughSet) {
-    this.callback_ = undefined;
-    this.target_ = undefined;
-    this.value_ = undefined;
-    this.observable_ = observable;
-    this.getValueFn_ = getValueFn || identFn;
-    this.setValueFn_ = setValueFn || identFn;
-    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
-    // at the moment because of a bug in it's dependency tracking.
-    this.dontPassThroughSet_ = dontPassThroughSet;
-  }
-
-  ObserverTransform.prototype = {
-    open: function(callback, target) {
-      this.callback_ = callback;
-      this.target_ = target;
-      this.value_ =
-          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
-      return this.value_;
-    },
-
-    observedCallback_: function(value) {
-      value = this.getValueFn_(value);
-      if (areSameValue(value, this.value_))
-        return;
-      var oldValue = this.value_;
-      this.value_ = value;
-      this.callback_.call(this.target_, this.value_, oldValue);
-    },
-
-    discardChanges: function() {
-      this.value_ = this.getValueFn_(this.observable_.discardChanges());
-      return this.value_;
-    },
-
-    deliver: function() {
-      return this.observable_.deliver();
-    },
-
-    setValue: function(value) {
-      value = this.setValueFn_(value);
-      if (!this.dontPassThroughSet_ && this.observable_.setValue)
-        return this.observable_.setValue(value);
-    },
-
-    close: function() {
-      if (this.observable_)
-        this.observable_.close();
-      this.callback_ = undefined;
-      this.target_ = undefined;
-      this.observable_ = undefined;
-      this.value_ = undefined;
-      this.getValueFn_ = undefined;
-      this.setValueFn_ = undefined;
-    }
-  }
-
-  var expectedRecordTypes = {
-    add: true,
-    update: true,
-    delete: true
-  };
-
-  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
-    var added = {};
-    var removed = {};
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      if (!expectedRecordTypes[record.type]) {
-        console.error('Unknown changeRecord type: ' + record.type);
-        console.error(record);
-        continue;
-      }
-
-      if (!(record.name in oldValues))
-        oldValues[record.name] = record.oldValue;
-
-      if (record.type == 'update')
-        continue;
-
-      if (record.type == 'add') {
-        if (record.name in removed)
-          delete removed[record.name];
-        else
-          added[record.name] = true;
-
-        continue;
-      }
-
-      // type = 'delete'
-      if (record.name in added) {
-        delete added[record.name];
-        delete oldValues[record.name];
-      } else {
-        removed[record.name] = true;
-      }
-    }
-
-    for (var prop in added)
-      added[prop] = object[prop];
-
-    for (var prop in removed)
-      removed[prop] = undefined;
-
-    var changed = {};
-    for (var prop in oldValues) {
-      if (prop in added || prop in removed)
-        continue;
-
-      var newValue = object[prop];
-      if (oldValues[prop] !== newValue)
-        changed[prop] = newValue;
-    }
-
-    return {
-      added: added,
-      removed: removed,
-      changed: changed
-    };
-  }
-
-  function newSplice(index, removed, addedCount) {
-    return {
-      index: index,
-      removed: removed,
-      addedCount: addedCount
-    };
-  }
-
-  var EDIT_LEAVE = 0;
-  var EDIT_UPDATE = 1;
-  var EDIT_ADD = 2;
-  var EDIT_DELETE = 3;
-
-  function ArraySplice() {}
-
-  ArraySplice.prototype = {
-
-    // Note: This function is *based* on the computation of the Levenshtein
-    // "edit" distance. The one change is that "updates" are treated as two
-    // edits - not one. With Array splices, an update is really a delete
-    // followed by an add. By retaining this, we optimize for "keeping" the
-    // maximum array items in the original array. For example:
-    //
-    //   'xxxx123' -> '123yyyy'
-    //
-    // With 1-edit updates, the shortest path would be just to update all seven
-    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
-    // leaves the substring '123' intact.
-    calcEditDistances: function(current, currentStart, currentEnd,
-                                old, oldStart, oldEnd) {
-      // "Deletion" columns
-      var rowCount = oldEnd - oldStart + 1;
-      var columnCount = currentEnd - currentStart + 1;
-      var distances = new Array(rowCount);
-
-      // "Addition" rows. Initialize null column.
-      for (var i = 0; i < rowCount; i++) {
-        distances[i] = new Array(columnCount);
-        distances[i][0] = i;
-      }
-
-      // Initialize null row
-      for (var j = 0; j < columnCount; j++)
-        distances[0][j] = j;
-
-      for (var i = 1; i < rowCount; i++) {
-        for (var j = 1; j < columnCount; j++) {
-          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
-            distances[i][j] = distances[i - 1][j - 1];
-          else {
-            var north = distances[i - 1][j] + 1;
-            var west = distances[i][j - 1] + 1;
-            distances[i][j] = north < west ? north : west;
-          }
-        }
-      }
-
-      return distances;
-    },
-
-    // This starts at the final weight, and walks "backward" by finding
-    // the minimum previous weight recursively until the origin of the weight
-    // matrix.
-    spliceOperationsFromEditDistances: function(distances) {
-      var i = distances.length - 1;
-      var j = distances[0].length - 1;
-      var current = distances[i][j];
-      var edits = [];
-      while (i > 0 || j > 0) {
-        if (i == 0) {
-          edits.push(EDIT_ADD);
-          j--;
-          continue;
-        }
-        if (j == 0) {
-          edits.push(EDIT_DELETE);
-          i--;
-          continue;
-        }
-        var northWest = distances[i - 1][j - 1];
-        var west = distances[i - 1][j];
-        var north = distances[i][j - 1];
-
-        var min;
-        if (west < north)
-          min = west < northWest ? west : northWest;
-        else
-          min = north < northWest ? north : northWest;
-
-        if (min == northWest) {
-          if (northWest == current) {
-            edits.push(EDIT_LEAVE);
-          } else {
-            edits.push(EDIT_UPDATE);
-            current = northWest;
-          }
-          i--;
-          j--;
-        } else if (min == west) {
-          edits.push(EDIT_DELETE);
-          i--;
-          current = west;
-        } else {
-          edits.push(EDIT_ADD);
-          j--;
-          current = north;
-        }
-      }
-
-      edits.reverse();
-      return edits;
-    },
-
-    /**
-     * Splice Projection functions:
-     *
-     * A splice map is a representation of how a previous array of items
-     * was transformed into a new array of items. Conceptually it is a list of
-     * tuples of
-     *
-     *   <index, removed, addedCount>
-     *
-     * which are kept in ascending index order of. The tuple represents that at
-     * the |index|, |removed| sequence of items were removed, and counting forward
-     * from |index|, |addedCount| items were added.
-     */
-
-    /**
-     * Lacking individual splice mutation information, the minimal set of
-     * splices can be synthesized given the previous state and final state of an
-     * array. The basic approach is to calculate the edit distance matrix and
-     * choose the shortest path through it.
-     *
-     * Complexity: O(l * p)
-     *   l: The length of the current array
-     *   p: The length of the old array
-     */
-    calcSplices: function(current, currentStart, currentEnd,
-                          old, oldStart, oldEnd) {
-      var prefixCount = 0;
-      var suffixCount = 0;
-
-      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
-      if (currentStart == 0 && oldStart == 0)
-        prefixCount = this.sharedPrefix(current, old, minLength);
-
-      if (currentEnd == current.length && oldEnd == old.length)
-        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
-
-      currentStart += prefixCount;
-      oldStart += prefixCount;
-      currentEnd -= suffixCount;
-      oldEnd -= suffixCount;
-
-      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
-        return [];
-
-      if (currentStart == currentEnd) {
-        var splice = newSplice(currentStart, [], 0);
-        while (oldStart < oldEnd)
-          splice.removed.push(old[oldStart++]);
-
-        return [ splice ];
-      } else if (oldStart == oldEnd)
-        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
-
-      var ops = this.spliceOperationsFromEditDistances(
-          this.calcEditDistances(current, currentStart, currentEnd,
-                                 old, oldStart, oldEnd));
-
-      var splice = undefined;
-      var splices = [];
-      var index = currentStart;
-      var oldIndex = oldStart;
-      for (var i = 0; i < ops.length; i++) {
-        switch(ops[i]) {
-          case EDIT_LEAVE:
-            if (splice) {
-              splices.push(splice);
-              splice = undefined;
-            }
-
-            index++;
-            oldIndex++;
-            break;
-          case EDIT_UPDATE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-          case EDIT_ADD:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.addedCount++;
-            index++;
-            break;
-          case EDIT_DELETE:
-            if (!splice)
-              splice = newSplice(index, [], 0);
-
-            splice.removed.push(old[oldIndex]);
-            oldIndex++;
-            break;
-        }
-      }
-
-      if (splice) {
-        splices.push(splice);
-      }
-      return splices;
-    },
-
-    sharedPrefix: function(current, old, searchLength) {
-      for (var i = 0; i < searchLength; i++)
-        if (!this.equals(current[i], old[i]))
-          return i;
-      return searchLength;
-    },
-
-    sharedSuffix: function(current, old, searchLength) {
-      var index1 = current.length;
-      var index2 = old.length;
-      var count = 0;
-      while (count < searchLength && this.equals(current[--index1], old[--index2]))
-        count++;
-
-      return count;
-    },
-
-    calculateSplices: function(current, previous) {
-      return this.calcSplices(current, 0, current.length, previous, 0,
-                              previous.length);
-    },
-
-    equals: function(currentValue, previousValue) {
-      return currentValue === previousValue;
-    }
-  };
-
-  var arraySplice = new ArraySplice();
-
-  function calcSplices(current, currentStart, currentEnd,
-                       old, oldStart, oldEnd) {
-    return arraySplice.calcSplices(current, currentStart, currentEnd,
-                                   old, oldStart, oldEnd);
-  }
-
-  function intersect(start1, end1, start2, end2) {
-    // Disjoint
-    if (end1 < start2 || end2 < start1)
-      return -1;
-
-    // Adjacent
-    if (end1 == start2 || end2 == start1)
-      return 0;
-
-    // Non-zero intersect, span1 first
-    if (start1 < start2) {
-      if (end1 < end2)
-        return end1 - start2; // Overlap
-      else
-        return end2 - start2; // Contained
-    } else {
-      // Non-zero intersect, span2 first
-      if (end2 < end1)
-        return end2 - start1; // Overlap
-      else
-        return end1 - start1; // Contained
-    }
-  }
-
-  function mergeSplice(splices, index, removed, addedCount) {
-
-    var splice = newSplice(index, removed, addedCount);
-
-    var inserted = false;
-    var insertionOffset = 0;
-
-    for (var i = 0; i < splices.length; i++) {
-      var current = splices[i];
-      current.index += insertionOffset;
-
-      if (inserted)
-        continue;
-
-      var intersectCount = intersect(splice.index,
-                                     splice.index + splice.removed.length,
-                                     current.index,
-                                     current.index + current.addedCount);
-
-      if (intersectCount >= 0) {
-        // Merge the two splices
-
-        splices.splice(i, 1);
-        i--;
-
-        insertionOffset -= current.addedCount - current.removed.length;
-
-        splice.addedCount += current.addedCount - intersectCount;
-        var deleteCount = splice.removed.length +
-                          current.removed.length - intersectCount;
-
-        if (!splice.addedCount && !deleteCount) {
-          // merged splice is a noop. discard.
-          inserted = true;
-        } else {
-          var removed = current.removed;
-
-          if (splice.index < current.index) {
-            // some prefix of splice.removed is prepended to current.removed.
-            var prepend = splice.removed.slice(0, current.index - splice.index);
-            Array.prototype.push.apply(prepend, removed);
-            removed = prepend;
-          }
-
-          if (splice.index + splice.removed.length > current.index + current.addedCount) {
-            // some suffix of splice.removed is appended to current.removed.
-            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
-            Array.prototype.push.apply(removed, append);
-          }
-
-          splice.removed = removed;
-          if (current.index < splice.index) {
-            splice.index = current.index;
-          }
-        }
-      } else if (splice.index < current.index) {
-        // Insert splice here.
-
-        inserted = true;
-
-        splices.splice(i, 0, splice);
-        i++;
-
-        var offset = splice.addedCount - splice.removed.length
-        current.index += offset;
-        insertionOffset += offset;
-      }
-    }
-
-    if (!inserted)
-      splices.push(splice);
-  }
-
-  function createInitialSplices(array, changeRecords) {
-    var splices = [];
-
-    for (var i = 0; i < changeRecords.length; i++) {
-      var record = changeRecords[i];
-      switch(record.type) {
-        case 'splice':
-          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
-          break;
-        case 'add':
-        case 'update':
-        case 'delete':
-          if (!isIndex(record.name))
-            continue;
-          var index = toNumber(record.name);
-          if (index < 0)
-            continue;
-          mergeSplice(splices, index, [record.oldValue], 1);
-          break;
-        default:
-          console.error('Unexpected record type: ' + JSON.stringify(record));
-          break;
-      }
-    }
-
-    return splices;
-  }
-
-  function projectArraySplices(array, changeRecords) {
-    var splices = [];
-
-    createInitialSplices(array, changeRecords).forEach(function(splice) {
-      if (splice.addedCount == 1 && splice.removed.length == 1) {
-        if (splice.removed[0] !== array[splice.index])
-          splices.push(splice);
-
-        return
-      };
-
-      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
-                                           splice.removed, 0, splice.removed.length));
-    });
-
-    return splices;
-  }
-
-  global.Observer = Observer;
-  global.Observer.runEOM_ = runEOM;
-  global.Observer.observerSentinel_ = observerSentinel; // for testing.
-  global.Observer.hasObjectObserve = hasObserve;
-  global.ArrayObserver = ArrayObserver;
-  global.ArrayObserver.calculateSplices = function(current, previous) {
-    return arraySplice.calculateSplices(current, previous);
-  };
-
-  global.ArraySplice = ArraySplice;
-  global.ObjectObserver = ObjectObserver;
-  global.PathObserver = PathObserver;
-  global.CompoundObserver = CompoundObserver;
-  global.Path = Path;
-  global.ObserverTransform = ObserverTransform;
-})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
-
-// 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.
-
-window.ShadowDOMPolyfill = {};
-
-(function(scope) {
-  'use strict';
-
-  var constructorTable = new WeakMap();
-  var nativePrototypeTable = new WeakMap();
-  var wrappers = Object.create(null);
-
-  function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-
-    // 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) {
-      return false;
-    }
-
-    try {
-      var f = new Function('return true;');
-      return f();
-    } catch (ex) {
-      return false;
-    }
-  }
-
-  var hasEval = detectEval();
-
-  function assert(b) {
-    if (!b)
-      throw new Error('Assertion failed');
-  };
-
-  var defineProperty = Object.defineProperty;
-  var getOwnPropertyNames = Object.getOwnPropertyNames;
-  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-  function mixin(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
-    return to;
-  };
-
-  function mixinStatics(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
-      switch (name) {
-        case 'arguments':
-        case 'caller':
-        case 'length':
-        case 'name':
-        case 'prototype':
-        case 'toString':
-          continue;
-      }
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
-    return to;
-  };
-
-  function oneOf(object, propertyNames) {
-    for (var i = 0; i < propertyNames.length; i++) {
-      if (propertyNames[i] in object)
-        return propertyNames[i];
-    }
-  }
-
-  var nonEnumerableDataDescriptor = {
-    value: undefined,
-    configurable: true,
-    enumerable: false,
-    writable: true
-  };
-
-  function defineNonEnumerableDataProperty(object, name, value) {
-    nonEnumerableDataDescriptor.value = value;
-    defineProperty(object, name, nonEnumerableDataDescriptor);
-  }
-
-  // Mozilla's old DOM bindings are bretty busted:
-  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844
-  // Make sure they are create before we start modifying things.
-  getOwnPropertyNames(window);
-
-  function getWrapperConstructor(node) {
-    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
-    var wrapperConstructor = constructorTable.get(nativePrototype);
-    if (wrapperConstructor)
-      return wrapperConstructor;
-
-    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
-
-    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, node);
-
-    return GeneratedWrapper;
-  }
-
-  function addForwardingProperties(nativePrototype, wrapperPrototype) {
-    installProperty(nativePrototype, wrapperPrototype, true);
-  }
-
-  function registerInstanceProperties(wrapperPrototype, instanceObject) {
-    installProperty(instanceObject, wrapperPrototype, false);
-  }
-
-  var isFirefox = /Firefox/.test(navigator.userAgent);
-
-  // This is used as a fallback when getting the descriptor fails in
-  // installProperty.
-  var dummyDescriptor = {
-    get: function() {},
-    set: function(v) {},
-    configurable: true,
-    enumerable: true
-  };
-
-  function isEventHandlerName(name) {
-    return /^on[a-z]+$/.test(name);
-  }
-
-  function isIdentifierName(name) {
-    return /^\w[a-zA-Z_0-9]*$/.test(name);
-  }
-
-  // The name of the implementation property is intentionally hard to
-  // remember. Unfortunately, browsers are slower doing obj[expr] than
-  // obj.foo so we resort to repeat this ugly name. This ugly name is never
-  // used outside of this file though.
-
-  function getGetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.__impl4cf1e782hg__.' + name) :
-        function() { return this.__impl4cf1e782hg__[name]; };
-  }
-
-  function getSetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('v', 'this.__impl4cf1e782hg__.' + name + ' = v') :
-        function(v) { this.__impl4cf1e782hg__[name] = v; };
-  }
-
-  function getMethod(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.__impl4cf1e782hg__.' + name +
-                     '.apply(this.__impl4cf1e782hg__, arguments)') :
-        function() {
-          return this.__impl4cf1e782hg__[name].apply(
-              this.__impl4cf1e782hg__, arguments);
-        };
-  }
-
-  function getDescriptor(source, name) {
-    try {
-      return Object.getOwnPropertyDescriptor(source, name);
-    } catch (ex) {
-      // JSC and V8 both use data properties instead of accessors which can
-      // cause getting the property desciptor to throw an exception.
-      // https://bugs.webkit.org/show_bug.cgi?id=49739
-      return dummyDescriptor;
-    }
-  }
-
-  // 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++) {
-      var name = names[i];
-      if (name === 'polymerBlackList_')
-        continue;
-
-      if (name in target)
-        continue;
-
-      if (source.polymerBlackList_ && source.polymerBlackList_[name])
-        continue;
-
-      if (isFirefox) {
-        // Tickle Firefox's old bindings.
-        source.__lookupGetter__(name);
-      }
-      var descriptor = getDescriptor(source, name);
-      var getter, setter;
-      if (allowMethod && typeof descriptor.value === 'function') {
-        target[name] = getMethod(name);
-        continue;
-      }
-
-      var isEvent = isEventHandlerName(name);
-      if (isEvent)
-        getter = scope.getEventHandlerGetter(name);
-      else
-        getter = getGetter(name);
-
-      if (descriptor.writable || descriptor.set || isBrokenSafari) {
-        if (isEvent)
-          setter = scope.getEventHandlerSetter(name);
-        else
-          setter = getSetter(name);
-      }
-
-      defineProperty(target, name, {
-        get: getter,
-        set: setter,
-        configurable: descriptor.configurable,
-        enumerable: descriptor.enumerable
-      });
-    }
-  }
-
-  /**
-   * @param {Function} nativeConstructor
-   * @param {Function} wrapperConstructor
-   * @param {Object=} opt_instance If present, this is used to extract
-   *     properties from an instance object.
-   */
-  function register(nativeConstructor, wrapperConstructor, opt_instance) {
-    var nativePrototype = nativeConstructor.prototype;
-    registerInternal(nativePrototype, wrapperConstructor, opt_instance);
-    mixinStatics(wrapperConstructor, nativeConstructor);
-  }
-
-  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
-    var wrapperPrototype = wrapperConstructor.prototype;
-    assert(constructorTable.get(nativePrototype) === undefined);
-
-    constructorTable.set(nativePrototype, wrapperConstructor);
-    nativePrototypeTable.set(wrapperPrototype, nativePrototype);
-
-    addForwardingProperties(nativePrototype, wrapperPrototype);
-    if (opt_instance)
-      registerInstanceProperties(wrapperPrototype, opt_instance);
-
-    defineNonEnumerableDataProperty(
-        wrapperPrototype, 'constructor', wrapperConstructor);
-    // Set it again. Some VMs optimizes objects that are used as prototypes.
-    wrapperConstructor.prototype = wrapperPrototype;
-  }
-
-  function isWrapperFor(wrapperConstructor, nativeConstructor) {
-    return constructorTable.get(nativeConstructor.prototype) ===
-        wrapperConstructor;
-  }
-
-  /**
-   * Creates a generic wrapper constructor based on |object| and its
-   * constructor.
-   * @param {Node} object
-   * @return {Function} The generated constructor.
-   */
-  function registerObject(object) {
-    var nativePrototype = Object.getPrototypeOf(object);
-
-    var superWrapperConstructor = getWrapperConstructor(nativePrototype);
-    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
-    registerInternal(nativePrototype, GeneratedWrapper, object);
-
-    return GeneratedWrapper;
-  }
-
-  function createWrapperConstructor(superWrapperConstructor) {
-    function GeneratedWrapper(node) {
-      superWrapperConstructor.call(this, node);
-    }
-    var p = Object.create(superWrapperConstructor.prototype);
-    p.constructor = GeneratedWrapper;
-    GeneratedWrapper.prototype = p;
-
-    return GeneratedWrapper;
-  }
-
-  function isWrapper(object) {
-    return object && object.__impl4cf1e782hg__;
-  }
-
-  function isNative(object) {
-    return !isWrapper(object);
-  }
-
-  /**
-   * Wraps a node in a WrapperNode. If there already exists a wrapper for the
-   * |node| that wrapper is returned instead.
-   * @param {Node} node
-   * @return {WrapperNode}
-   */
-  function wrap(impl) {
-    if (impl === null)
-      return null;
-
-    assert(isNative(impl));
-    return impl.__wrapper8e3dd93a60__ ||
-        (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));
-  }
-
-  /**
-   * Unwraps a wrapper and returns the node it is wrapping.
-   * @param {WrapperNode} wrapper
-   * @return {Node}
-   */
-  function unwrap(wrapper) {
-    if (wrapper === null)
-      return null;
-    assert(isWrapper(wrapper));
-    return wrapper.__impl4cf1e782hg__;
-  }
-
-  function unsafeUnwrap(wrapper) {
-    return wrapper.__impl4cf1e782hg__;
-  }
-
-  function setWrapper(impl, wrapper) {
-    wrapper.__impl4cf1e782hg__ = impl;
-    impl.__wrapper8e3dd93a60__ = wrapper;
-  }
-
-  /**
-   * Unwraps object if it is a wrapper.
-   * @param {Object} object
-   * @return {Object} The native implementation object.
-   */
-  function unwrapIfNeeded(object) {
-    return object && isWrapper(object) ? unwrap(object) : object;
-  }
-
-  /**
-   * Wraps object if it is not a wrapper.
-   * @param {Object} object
-   * @return {Object} The wrapper for object.
-   */
-  function wrapIfNeeded(object) {
-    return object && !isWrapper(object) ? wrap(object) : object;
-  }
-
-  /**
-   * Overrides the current wrapper (if any) for node.
-   * @param {Node} node
-   * @param {WrapperNode=} wrapper If left out the wrapper will be created as
-   *     needed next time someone wraps the node.
-   */
-  function rewrap(node, wrapper) {
-    if (wrapper === null)
-      return;
-    assert(isNative(node));
-    assert(wrapper === undefined || isWrapper(wrapper));
-    node.__wrapper8e3dd93a60__ = wrapper;
-  }
-
-  var getterDescriptor = {
-    get: undefined,
-    configurable: true,
-    enumerable: true
-  };
-
-  function defineGetter(constructor, name, getter) {
-    getterDescriptor.get = getter;
-    defineProperty(constructor.prototype, name, getterDescriptor);
-  }
-
-  function defineWrapGetter(constructor, name) {
-    defineGetter(constructor, name, function() {
-      return wrap(this.__impl4cf1e782hg__[name]);
-    });
-  }
-
-  /**
-   * Forwards existing methods on the native object to the wrapper methods.
-   * This does not wrap any of the arguments or the return value since the
-   * wrapper implementation already takes care of that.
-   * @param {Array.<Function>} constructors
-   * @parem {Array.<string>} names
-   */
-  function forwardMethodsToWrapper(constructors, names) {
-    constructors.forEach(function(constructor) {
-      names.forEach(function(name) {
-        constructor.prototype[name] = function() {
-          var w = wrapIfNeeded(this);
-          return w[name].apply(w, arguments);
-        };
-      });
-    });
-  }
-
-  scope.assert = assert;
-  scope.constructorTable = constructorTable;
-  scope.defineGetter = defineGetter;
-  scope.defineWrapGetter = defineWrapGetter;
-  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
-  scope.isWrapper = isWrapper;
-  scope.isWrapperFor = isWrapperFor;
-  scope.mixin = mixin;
-  scope.nativePrototypeTable = nativePrototypeTable;
-  scope.oneOf = oneOf;
-  scope.registerObject = registerObject;
-  scope.registerWrapper = register;
-  scope.rewrap = rewrap;
-  scope.setWrapper = setWrapper;
-  scope.unsafeUnwrap = unsafeUnwrap;
-  scope.unwrap = unwrap;
-  scope.unwrapIfNeeded = unwrapIfNeeded;
-  scope.wrap = wrap;
-  scope.wrapIfNeeded = wrapIfNeeded;
-  scope.wrappers = wrappers;
-
-})(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.
- */
-
-(function(context) {
-  'use strict';
-
-  var OriginalMutationObserver = window.MutationObserver;
-  var callbacks = [];
-  var pending = false;
-  var timerFunc;
-
-  function handle() {
-    pending = false;
-    var copies = callbacks.slice(0);
-    callbacks = [];
-    for (var i = 0; i < copies.length; i++) {
-      (0, copies[i])();
-    }
-  }
-
-  if (OriginalMutationObserver) {
-    var counter = 1;
-    var observer = new OriginalMutationObserver(handle);
-    var textNode = document.createTextNode(counter);
-    observer.observe(textNode, {characterData: true});
-
-    timerFunc = function() {
-      counter = (counter + 1) % 2;
-      textNode.data = counter;
-    };
-
-  } else {
-    timerFunc = window.setImmediate || window.setTimeout;
-  }
-
-  function setEndOfMicrotask(func) {
-    callbacks.push(func);
-    if (pending)
-      return;
-    pending = true;
-    timerFunc(handle, 0);
-  }
-
-  context.setEndOfMicrotask = setEndOfMicrotask;
-
-})(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.
- */
-
-(function(scope) {
-  'use strict';
-
-  var setEndOfMicrotask = scope.setEndOfMicrotask
-  var wrapIfNeeded = scope.wrapIfNeeded
-  var wrappers = scope.wrappers;
-
-  var registrationsTable = new WeakMap();
-  var globalMutationObservers = [];
-  var isScheduled = false;
-
-  function scheduleCallback(observer) {
-    if (observer.scheduled_)
-      return;
-
-    observer.scheduled_ = true;
-    globalMutationObservers.push(observer);
-
-    if (isScheduled)
-      return;
-    setEndOfMicrotask(notifyObservers);
-    isScheduled = true;
-  }
-
-  // http://dom.spec.whatwg.org/#mutation-observers
-  function notifyObservers() {
-    isScheduled = false;
-
-    while (globalMutationObservers.length) {
-      var notifyList = globalMutationObservers;
-      globalMutationObservers = [];
-
-      // Deliver changes in birth order of the MutationObservers.
-      notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });
-
-      for (var i = 0; i < notifyList.length; i++) {
-        var mo = notifyList[i];
-        mo.scheduled_ = false;
-        var queue = mo.takeRecords();
-        removeTransientObserversFor(mo);
-        if (queue.length) {
-          mo.callback_(queue, mo);
-        }
-      }
-    }
-  }
-
-
-  /**
-   * @param {string} type
-   * @param {Node} target
-   * @constructor
-   */
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = new wrappers.NodeList();
-    this.removedNodes = new wrappers.NodeList();
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-
-  /**
-   * Registers transient observers to ancestor and its ancesors for the node
-   * which was removed.
-   * @param {!Node} ancestor
-   * @param {!Node} node
-   */
-  function registerTransientObservers(ancestor, node) {
-    for (; ancestor; ancestor = ancestor.parentNode) {
-      var registrations = registrationsTable.get(ancestor);
-      if (!registrations)
-        continue;
-      for (var i = 0; i < registrations.length; i++) {
-        var registration = registrations[i];
-        if (registration.options.subtree)
-          registration.addTransientObserver(node);
-      }
-    }
-  }
-
-  function removeTransientObserversFor(observer) {
-    for (var i = 0; i < observer.nodes_.length; i++) {
-      var node = observer.nodes_[i];
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        return;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        if (registration.observer === observer)
-          registration.removeTransientObservers();
-      }
-    }
-  }
-
-  // http://dom.spec.whatwg.org/#queue-a-mutation-record
-  function enqueueMutation(target, type, data) {
-    // 1.
-    var interestedObservers = Object.create(null);
-    var associatedStrings = Object.create(null);
-
-    // 2.
-    for (var node = target; node; node = node.parentNode) {
-      // 3.
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        continue;
-      for (var j = 0; j < registrations.length; j++) {
-        var registration = registrations[j];
-        var options = registration.options;
-        // 1.
-        if (node !== target && !options.subtree)
-          continue;
-
-        // 2.
-        if (type === 'attributes' && !options.attributes)
-          continue;
-
-        // 3. If type is "attributes", options's attributeFilter is present, and
-        // either options's attributeFilter does not contain name or namespace
-        // is non-null, continue.
-        if (type === 'attributes' && options.attributeFilter &&
-            (data.namespace !== null ||
-             options.attributeFilter.indexOf(data.name) === -1)) {
-          continue;
-        }
-
-        // 4.
-        if (type === 'characterData' && !options.characterData)
-          continue;
-
-        // 5.
-        if (type === 'childList' && !options.childList)
-          continue;
-
-        // 6.
-        var observer = registration.observer;
-        interestedObservers[observer.uid_] = observer;
-
-        // 7. If either type is "attributes" and options's attributeOldValue is
-        // true, or type is "characterData" and options's characterDataOldValue
-        // is true, set the paired string of registered observer's observer in
-        // interested observers to oldValue.
-        if (type === 'attributes' && options.attributeOldValue ||
-            type === 'characterData' && options.characterDataOldValue) {
-          associatedStrings[observer.uid_] = data.oldValue;
-        }
-      }
-    }
-
-    // 4.
-    for (var uid in interestedObservers) {
-      var observer = interestedObservers[uid];
-      var record = new MutationRecord(type, target);
-
-      // 2.
-      if ('name' in data && 'namespace' in data) {
-        record.attributeName = data.name;
-        record.attributeNamespace = data.namespace;
-      }
-
-      // 3.
-      if (data.addedNodes)
-        record.addedNodes = data.addedNodes;
-
-      // 4.
-      if (data.removedNodes)
-        record.removedNodes = data.removedNodes;
-
-      // 5.
-      if (data.previousSibling)
-        record.previousSibling = data.previousSibling;
-
-      // 6.
-      if (data.nextSibling)
-        record.nextSibling = data.nextSibling;
-
-      // 7.
-      if (associatedStrings[uid] !== undefined)
-        record.oldValue = associatedStrings[uid];
-
-      // 8.
-      scheduleCallback(observer);
-      observer.records_.push(record);
-    }
-  }
-
-  var slice = Array.prototype.slice;
-
-  /**
-   * @param {!Object} options
-   * @constructor
-   */
-  function MutationObserverOptions(options) {
-    this.childList = !!options.childList;
-    this.subtree = !!options.subtree;
-
-    // 1. If either options' attributeOldValue or attributeFilter is present
-    // and options' attributes is omitted, set options' attributes to true.
-    if (!('attributes' in options) &&
-        ('attributeOldValue' in options || 'attributeFilter' in options)) {
-      this.attributes = true;
-    } else {
-      this.attributes = !!options.attributes;
-    }
-
-    // 2. If options' characterDataOldValue is present and options'
-    // characterData is omitted, set options' characterData to true.
-    if ('characterDataOldValue' in options && !('characterData' in options))
-      this.characterData = true;
-    else
-      this.characterData = !!options.characterData;
-
-    // 3. & 4.
-    if (!this.attributes &&
-        (options.attributeOldValue || 'attributeFilter' in options) ||
-        // 5.
-        !this.characterData && options.characterDataOldValue) {
-      throw new TypeError();
-    }
-
-    this.characterData = !!options.characterData;
-    this.attributeOldValue = !!options.attributeOldValue;
-    this.characterDataOldValue = !!options.characterDataOldValue;
-    if ('attributeFilter' in options) {
-      if (options.attributeFilter == null ||
-          typeof options.attributeFilter !== 'object') {
-        throw new TypeError();
-      }
-      this.attributeFilter = slice.call(options.attributeFilter);
-    } else {
-      this.attributeFilter = null;
-    }
-  }
-
-  var uidCounter = 0;
-
-  /**
-   * The class that maps to the DOM MutationObserver interface.
-   * @param {Function} callback.
-   * @constructor
-   */
-  function MutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-    this.scheduled_ = false;
-  }
-
-  MutationObserver.prototype = {
-    constructor: MutationObserver,
-
-    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-
-      var newOptions = new MutationObserverOptions(options);
-
-      // 6.
-      var registration;
-      var registrations = registrationsTable.get(target);
-      if (!registrations)
-        registrationsTable.set(target, registrations = []);
-
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          // 6.1.
-          registration.removeTransientObservers();
-          // 6.2.
-          registration.options = newOptions;
-        }
-      }
-
-      // 7.
-      if (!registration) {
-        registration = new Registration(this, target, newOptions);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-    },
-
-    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-
-  /**
-   * Class used to represent a registered observer.
-   * @param {MutationObserver} observer
-   * @param {Node} target
-   * @param {MutationObserverOptions} options
-   * @constructor
-   */
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-
-  Registration.prototype = {
-    /**
-     * Adds a transient observer on node. The transient observer gets removed
-     * next time we deliver the change records.
-     * @param {Node} node
-     */
-    addTransientObserver: function(node) {
-      // Don't add transient observers on the target itself. We already have all
-      // the required listeners set up on the target.
-      if (node === this.target)
-        return;
-
-      // Make sure we remove transient observers at the end of microtask, even
-      // if we didn't get any change records.
-      scheduleCallback(this.observer);
-
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        registrationsTable.set(node, registrations = []);
-
-      // We know that registrations does not contain this because we already
-      // checked if node === this.target.
-      registrations.push(this);
-    },
-
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-
-      for (var i = 0; i < transientObservedNodes.length; i++) {
-        var node = transientObservedNodes[i];
-        var registrations = registrationsTable.get(node);
-        for (var j = 0; j < registrations.length; j++) {
-          if (registrations[j] === this) {
-            registrations.splice(j, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }
-    }
-  };
-
-  scope.enqueueMutation = enqueueMutation;
-  scope.registerTransientObservers = registerTransientObservers;
-  scope.wrappers.MutationObserver = MutationObserver;
-  scope.wrappers.MutationRecord = MutationRecord;
-
-})(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';
-
-  /**
-   * A tree scope represents the root of a tree. All nodes in a tree point to
-   * the same TreeScope object. The tree scope of a node get set the first time
-   * it is accessed or when a node is added or remove to a tree.
-   *
-   * The root is a Node that has no parent.
-   *
-   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of
-   * the host of the ShadowRoot.
-   *
-   * @param {!Node} root
-   * @param {TreeScope} parent
-   * @constructor
-   */
-  function TreeScope(root, parent) {
-    /** @type {!Node} */
-    this.root = root;
-
-    /** @type {TreeScope} */
-    this.parent = parent;
-  }
-
-  TreeScope.prototype = {
-    get renderer() {
-      if (this.root instanceof scope.wrappers.ShadowRoot) {
-        return scope.getRendererForHost(this.root.host);
-      }
-      return null;
-    },
-
-    contains: function(treeScope) {
-      for (; treeScope; treeScope = treeScope.parent) {
-        if (treeScope === this)
-          return true;
-      }
-      return false;
-    }
-  };
-
-  function setTreeScope(node, treeScope) {
-    if (node.treeScope_ !== treeScope) {
-      node.treeScope_ = treeScope;
-      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
-        sr.treeScope_.parent = treeScope;
-      }
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        setTreeScope(child, treeScope);
-      }
-    }
-  }
-
-  function getTreeScope(node) {
-    if (node instanceof scope.wrappers.Window) {
-      debugger;
-    }
-
-    if (node.treeScope_)
-      return node.treeScope_;
-    var parent = node.parentNode;
-    var treeScope;
-    if (parent)
-      treeScope = getTreeScope(parent);
-    else
-      treeScope = new TreeScope(node, null);
-    return node.treeScope_ = treeScope;
-  }
-
-  scope.TreeScope = TreeScope;
-  scope.getTreeScope = getTreeScope;
-  scope.setTreeScope = setTreeScope;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-
-  var wrappedFuns = new WeakMap();
-  var listenersTable = new WeakMap();
-  var handledEventsTable = new WeakMap();
-  var currentlyDispatchingEvents = new WeakMap();
-  var targetTable = new WeakMap();
-  var currentTargetTable = new WeakMap();
-  var relatedTargetTable = new WeakMap();
-  var eventPhaseTable = new WeakMap();
-  var stopPropagationTable = new WeakMap();
-  var stopImmediatePropagationTable = new WeakMap();
-  var eventHandlersTable = new WeakMap();
-  var eventPathTable = new WeakMap();
-
-  function isShadowRoot(node) {
-    return node instanceof wrappers.ShadowRoot;
-  }
-
-  function rootOfNode(node) {
-    return getTreeScope(node).root;
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths
-  function getEventPath(node, event) {
-    var path = [];
-    var current = node;
-    path.push(current);
-    while (current) {
-      // 4.1.
-      var destinationInsertionPoints = getDestinationInsertionPoints(current);
-      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
-        // 4.1.1
-        for (var i = 0; i < destinationInsertionPoints.length; i++) {
-          var insertionPoint = destinationInsertionPoints[i];
-          // 4.1.1.1
-          if (isShadowInsertionPoint(insertionPoint)) {
-            var shadowRoot = rootOfNode(insertionPoint);
-            // 4.1.1.1.2
-            var olderShadowRoot = shadowRoot.olderShadowRoot;
-            if (olderShadowRoot)
-              path.push(olderShadowRoot);
-          }
-
-          // 4.1.1.2
-          path.push(insertionPoint);
-        }
-
-        // 4.1.2
-        current = destinationInsertionPoints[
-            destinationInsertionPoints.length - 1];
-
-      // 4.2
-      } else {
-        if (isShadowRoot(current)) {
-          if (inSameTree(node, current) && eventMustBeStopped(event)) {
-            // Stop this algorithm
-            break;
-          }
-          current = current.host;
-          path.push(current);
-
-        // 4.2.2
-        } else {
-          current = current.parentNode;
-          if (current)
-            path.push(current);
-        }
-      }
-    }
-
-    return path;
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped
-  function eventMustBeStopped(event) {
-    if (!event)
-      return false;
-
-    switch (event.type) {
-      case 'abort':
-      case 'error':
-      case 'select':
-      case 'change':
-      case 'load':
-      case 'reset':
-      case 'resize':
-      case 'scroll':
-      case 'selectstart':
-        return true;
-    }
-    return false;
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point
-  function isShadowInsertionPoint(node) {
-    return node instanceof HTMLShadowElement;
-    // and make sure that there are no shadow precing this?
-    // and that there is no content ancestor?
-  }
-
-  function getDestinationInsertionPoints(node) {
-    return scope.getDestinationInsertionPoints(node);
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting
-  function eventRetargetting(path, currentTarget) {
-    if (path.length === 0)
-      return currentTarget;
-
-    // The currentTarget might be the window object. Use its document for the
-    // purpose of finding the retargetted node.
-    if (currentTarget instanceof wrappers.Window)
-      currentTarget = currentTarget.document;
-
-    var currentTargetTree = getTreeScope(currentTarget);
-    var originalTarget = path[0];
-    var originalTargetTree = getTreeScope(originalTarget);
-    var relativeTargetTree =
-        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
-
-    for (var i = 0; i < path.length; i++) {
-      var node = path[i];
-      if (getTreeScope(node) === relativeTargetTree)
-        return node;
-    }
-
-    return path[path.length - 1];
-  }
-
-  function getTreeScopeAncestors(treeScope) {
-    var ancestors = [];
-    for (;treeScope; treeScope = treeScope.parent) {
-      ancestors.push(treeScope);
-    }
-    return ancestors;
-  }
-
-  function lowestCommonInclusiveAncestor(tsA, tsB) {
-    var ancestorsA = getTreeScopeAncestors(tsA);
-    var ancestorsB = getTreeScopeAncestors(tsB);
-
-    var result = null;
-    while (ancestorsA.length > 0 && ancestorsB.length > 0) {
-      var a = ancestorsA.pop();
-      var b = ancestorsB.pop();
-      if (a === b)
-        result = a;
-      else
-        break;
-    }
-    return result;
-  }
-
-  function getTreeScopeRoot(ts) {
-    if (!ts.parent)
-      return ts;
-    return getTreeScopeRoot(ts.parent);
-  }
-
-  function relatedTargetResolution(event, currentTarget, relatedTarget) {
-    // In case the current target is a window use its document for the purpose
-    // of retargetting the related target.
-    if (currentTarget instanceof wrappers.Window)
-      currentTarget = currentTarget.document;
-
-    var currentTargetTree = getTreeScope(currentTarget);
-    var relatedTargetTree = getTreeScope(relatedTarget);
-
-    var relatedTargetEventPath = getEventPath(relatedTarget, event);
-
-    var lowestCommonAncestorTree;
-
-    // 4
-    var lowestCommonAncestorTree =
-        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
-
-    // 5
-    if (!lowestCommonAncestorTree)
-      lowestCommonAncestorTree = relatedTargetTree.root;
-
-    // 6
-    for (var commonAncestorTree = lowestCommonAncestorTree;
-         commonAncestorTree;
-         commonAncestorTree = commonAncestorTree.parent) {
-      // 6.1
-      var adjustedRelatedTarget;
-      for (var i = 0; i < relatedTargetEventPath.length; i++) {
-        var node = relatedTargetEventPath[i];
-        if (getTreeScope(node) === commonAncestorTree)
-          return node;
-      }
-    }
-
-    return null;
-  }
-
-  function inSameTree(a, b) {
-    return getTreeScope(a) === getTreeScope(b);
-  }
-
-  var NONE = 0;
-  var CAPTURING_PHASE = 1;
-  var AT_TARGET = 2;
-  var BUBBLING_PHASE = 3;
-
-  // pendingError is used to rethrow the first error we got during an event
-  // dispatch. The browser actually reports all errors but to do that we would
-  // need to rethrow the error asynchronously.
-  var pendingError;
-
-  function dispatchOriginalEvent(originalEvent) {
-    // Make sure this event is only dispatched once.
-    if (handledEventsTable.get(originalEvent))
-      return;
-    handledEventsTable.set(originalEvent, true);
-    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
-    if (pendingError) {
-      var err = pendingError;
-      pendingError = null;
-      throw err;
-    }
-  }
-
-
-  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');
-
-    currentlyDispatchingEvents.set(event, true);
-
-    // Render to ensure that the event path is correct.
-    scope.renderAllPending();
-    var eventPath;
-
-    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object
-    // All events dispatched on Nodes with a default view, except load events,
-    // should propagate to the Window.
-
-    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
-    var overrideTarget;
-    var win;
-
-    // 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 (isLoadLikeEvent(event) && !event.bubbles) {
-      var doc = originalWrapperTarget;
-      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
-        overrideTarget = doc;
-        eventPath = [];
-      }
-    }
-
-    if (!eventPath) {
-      if (originalWrapperTarget instanceof wrappers.Window) {
-        win = originalWrapperTarget;
-        eventPath = [];
-      } else {
-        eventPath = getEventPath(originalWrapperTarget, event);
-
-        if (!isLoadLikeEvent(event)) {
-          var doc = eventPath[eventPath.length - 1];
-          if (doc instanceof wrappers.Document)
-            win = doc.defaultView;
-        }
-      }
-    }
-
-    eventPathTable.set(event, eventPath);
-
-    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {
-      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
-        dispatchBubbling(event, eventPath, win, overrideTarget);
-      }
-    }
-
-    eventPhaseTable.set(event, NONE);
-    currentTargetTable.delete(event, null);
-    currentlyDispatchingEvents.delete(event);
-
-    return event.defaultPrevented;
-  }
-
-  function dispatchCapturing(event, eventPath, win, overrideTarget) {
-    var phase = CAPTURING_PHASE;
-
-    if (win) {
-      if (!invoke(win, event, phase, eventPath, overrideTarget))
-        return false;
-    }
-
-    for (var i = eventPath.length - 1; i > 0; i--) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))
-        return false;
-    }
-
-    return true;
-  }
-
-  function dispatchAtTarget(event, eventPath, win, overrideTarget) {
-    var phase = AT_TARGET;
-    var currentTarget = eventPath[0] || win;
-    return invoke(currentTarget, event, phase, eventPath, overrideTarget);
-  }
-
-  function dispatchBubbling(event, eventPath, win, overrideTarget) {
-    var phase = BUBBLING_PHASE;
-    for (var i = 1; i < eventPath.length; i++) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))
-        return;
-    }
-
-    if (win && eventPath.length > 0) {
-      invoke(win, event, phase, eventPath, overrideTarget);
-    }
-  }
-
-  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
-    var listeners = listenersTable.get(currentTarget);
-    if (!listeners)
-      return true;
-
-    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
-
-    if (target === currentTarget) {
-      if (phase === CAPTURING_PHASE)
-        return true;
-
-      if (phase === BUBBLING_PHASE)
-         phase = AT_TARGET;
-
-    } else if (phase === BUBBLING_PHASE && !event.bubbles) {
-      return true;
-    }
-
-    if ('relatedTarget' in event) {
-      var originalEvent = unwrap(event);
-      var unwrappedRelatedTarget = originalEvent.relatedTarget;
-
-      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no
-      // way to have relatedTarget return the adjusted target but worse is that
-      // the originalEvent might not have a relatedTarget so we hit an assert
-      // when we try to wrap it.
-      if (unwrappedRelatedTarget) {
-        // In IE we can get objects that are not EventTargets at this point.
-        // Safari does not have an EventTarget interface so revert to checking
-        // for addEventListener as an approximation.
-        if (unwrappedRelatedTarget instanceof Object &&
-            unwrappedRelatedTarget.addEventListener) {
-          var relatedTarget = wrap(unwrappedRelatedTarget);
-
-          var adjusted =
-              relatedTargetResolution(event, currentTarget, relatedTarget);
-          if (adjusted === target)
-            return true;
-        } else {
-          adjusted = null;
-        }
-        relatedTargetTable.set(event, adjusted);
-      }
-    }
-
-    eventPhaseTable.set(event, phase);
-    var type = event.type;
-
-    var anyRemoved = false;
-    targetTable.set(event, target);
-    currentTargetTable.set(event, currentTarget);
-
-    // Keep track of the invoke depth so that we only clean up the removed
-    // listeners if we are in the outermost invoke.
-    listeners.depth++;
-
-    for (var i = 0, len = listeners.length; i < len; i++) {
-      var listener = listeners[i];
-      if (listener.removed) {
-        anyRemoved = true;
-        continue;
-      }
-
-      if (listener.type !== type ||
-          !listener.capture && phase === CAPTURING_PHASE ||
-          listener.capture && phase === BUBBLING_PHASE) {
-        continue;
-      }
-
-      try {
-        if (typeof listener.handler === 'function')
-          listener.handler.call(currentTarget, event);
-        else
-          listener.handler.handleEvent(event);
-
-        if (stopImmediatePropagationTable.get(event))
-          return false;
-
-      } catch (ex) {
-        if (!pendingError)
-          pendingError = ex;
-      }
-    }
-
-    listeners.depth--;
-
-    if (anyRemoved && listeners.depth === 0) {
-      var copy = listeners.slice();
-      listeners.length = 0;
-      for (var i = 0; i < copy.length; i++) {
-        if (!copy[i].removed)
-          listeners.push(copy[i]);
-      }
-    }
-
-    return !stopPropagationTable.get(event);
-  }
-
-  function Listener(type, handler, capture) {
-    this.type = type;
-    this.handler = handler;
-    this.capture = Boolean(capture);
-  }
-  Listener.prototype = {
-    equals: function(that) {
-      return this.handler === that.handler && this.type === that.type &&
-          this.capture === that.capture;
-    },
-    get removed() {
-      return this.handler === null;
-    },
-    remove: function() {
-      this.handler = null;
-    }
-  };
-
-  var OriginalEvent = window.Event;
-  OriginalEvent.prototype.polymerBlackList_ = {
-    returnValue: true,
-    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not
-    // support constructable KeyboardEvent so we keep it here for now.
-    keyLocation: true
-  };
-
-  /**
-   * Creates a new Event wrapper or wraps an existin native Event object.
-   * @param {string|Event} type
-   * @param {Object=} options
-   * @constructor
-   */
-  function Event(type, options) {
-    if (type instanceof OriginalEvent) {
-      var impl = type;
-      // 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);
-    } else {
-      return wrap(constructEvent(OriginalEvent, 'Event', type, options));
-    }
-  }
-  Event.prototype = {
-    get target() {
-      return targetTable.get(this);
-    },
-    get currentTarget() {
-      return currentTargetTable.get(this);
-    },
-    get eventPhase() {
-      return eventPhaseTable.get(this);
-    },
-    get path() {
-      var eventPath = eventPathTable.get(this);
-      if (!eventPath)
-        return [];
-      // TODO(arv): Event path should contain window.
-      return eventPath.slice();
-    },
-    stopPropagation: function() {
-      stopPropagationTable.set(this, true);
-    },
-    stopImmediatePropagation: function() {
-      stopPropagationTable.set(this, true);
-      stopImmediatePropagationTable.set(this, true);
-    }
-  };
-  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));
-
-  function unwrapOptions(options) {
-    if (!options || !options.relatedTarget)
-      return options;
-    return Object.create(options, {
-      relatedTarget: {value: unwrap(options.relatedTarget)}
-    });
-  }
-
-  function registerGenericEvent(name, SuperEvent, prototype) {
-    var OriginalEvent = window[name];
-    var GenericEvent = function(type, options) {
-      if (type instanceof OriginalEvent)
-        setWrapper(type, this);
-      else
-        return wrap(constructEvent(OriginalEvent, name, type, options));
-    };
-    GenericEvent.prototype = Object.create(SuperEvent.prototype);
-    if (prototype)
-      mixin(GenericEvent.prototype, prototype);
-    if (OriginalEvent) {
-      // - Old versions of Safari fails on new FocusEvent (and others?).
-      // - IE does not support event constructors.
-      // - createEvent('FocusEvent') throws in Firefox.
-      // => Try the best practice solution first and fallback to the old way
-      // if needed.
-      try {
-        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));
-      } catch (ex) {
-        registerWrapper(OriginalEvent, GenericEvent,
-                        document.createEvent(name));
-      }
-    }
-    return GenericEvent;
-  }
-
-  var UIEvent = registerGenericEvent('UIEvent', Event);
-  var CustomEvent = registerGenericEvent('CustomEvent', Event);
-
-  var relatedTargetProto = {
-    get relatedTarget() {
-      var relatedTarget = relatedTargetTable.get(this);
-      // relatedTarget can be null.
-      if (relatedTarget !== undefined)
-        return relatedTarget;
-      return wrap(unwrap(this).relatedTarget);
-    }
-  };
-
-  function getInitFunction(name, relatedTargetIndex) {
-    return function() {
-      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
-      var impl = unwrap(this);
-      impl[name].apply(impl, arguments);
-    };
-  }
-
-  var mouseEventProto = mixin({
-    initMouseEvent: getInitFunction('initMouseEvent', 14)
-  }, relatedTargetProto);
-
-  var focusEventProto = mixin({
-    initFocusEvent: getInitFunction('initFocusEvent', 5)
-  }, relatedTargetProto);
-
-  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);
-  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);
-
-  // In case the browser does not support event constructors we polyfill that
-  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to
-  // `initFooEvent` are derived from the registered default event init dict.
-  var defaultInitDicts = Object.create(null);
-
-  var supportsEventConstructors = (function() {
-    try {
-      new window.FocusEvent('focus');
-    } catch (ex) {
-      return false;
-    }
-    return true;
-  })();
-
-  /**
-   * Constructs a new native event.
-   */
-  function constructEvent(OriginalEvent, name, type, options) {
-    if (supportsEventConstructors)
-      return new OriginalEvent(type, unwrapOptions(options));
-
-    // Create the arguments from the default dictionary.
-    var event = unwrap(document.createEvent(name));
-    var defaultDict = defaultInitDicts[name];
-    var args = [type];
-    Object.keys(defaultDict).forEach(function(key) {
-      var v = options != null && key in options ?
-          options[key] : defaultDict[key];
-      if (key === 'relatedTarget')
-        v = unwrap(v);
-      args.push(v);
-    });
-    event['init' + name].apply(event, args);
-    return event;
-  }
-
-  if (!supportsEventConstructors) {
-    var configureEventConstructor = function(name, initDict, superName) {
-      if (superName) {
-        var superDict = defaultInitDicts[superName];
-        initDict = mixin(mixin({}, superDict), initDict);
-      }
-
-      defaultInitDicts[name] = initDict;
-    };
-
-    // The order of the default event init dictionary keys is important, the
-    // arguments to initFooEvent is derived from that.
-    configureEventConstructor('Event', {bubbles: false, cancelable: false});
-    configureEventConstructor('CustomEvent', {detail: null}, 'Event');
-    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');
-    configureEventConstructor('MouseEvent', {
-      screenX: 0,
-      screenY: 0,
-      clientX: 0,
-      clientY: 0,
-      ctrlKey: false,
-      altKey: false,
-      shiftKey: false,
-      metaKey: false,
-      button: 0,
-      relatedTarget: null
-    }, 'UIEvent');
-    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');
-  }
-
-  // Safari 7 does not yet have BeforeUnloadEvent.
-  // https://bugs.webkit.org/show_bug.cgi?id=120849
-  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
-
-  function BeforeUnloadEvent(impl) {
-    Event.call(this, impl);
-  }
-  BeforeUnloadEvent.prototype = Object.create(Event.prototype);
-  mixin(BeforeUnloadEvent.prototype, {
-    get returnValue() {
-      return unsafeUnwrap(this).returnValue;
-    },
-    set returnValue(v) {
-      unsafeUnwrap(this).returnValue = v;
-    }
-  });
-
-  if (OriginalBeforeUnloadEvent)
-    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
-
-  function isValidListener(fun) {
-    if (typeof fun === 'function')
-      return true;
-    return fun && fun.handleEvent;
-  }
-
-  function isMutationEvent(type) {
-    switch (type) {
-      case 'DOMAttrModified':
-      case 'DOMAttributeNameChanged':
-      case 'DOMCharacterDataModified':
-      case 'DOMElementNameChanged':
-      case 'DOMNodeInserted':
-      case 'DOMNodeInsertedIntoDocument':
-      case 'DOMNodeRemoved':
-      case 'DOMNodeRemovedFromDocument':
-      case 'DOMSubtreeModified':
-        return true;
-    }
-    return false;
-  }
-
-  var OriginalEventTarget = window.EventTarget;
-
-  /**
-   * This represents a wrapper for an EventTarget.
-   * @param {!EventTarget} impl The original event target.
-   * @constructor
-   */
-  function EventTarget(impl) {
-    setWrapper(impl, this);
-  }
-
-  // Node and Window have different internal type checks in WebKit so we cannot
-  // use the same method as the original function.
-  var methodNames = [
-    'addEventListener',
-    'removeEventListener',
-    'dispatchEvent'
-  ];
-
-  [Node, Window].forEach(function(constructor) {
-    var p = constructor.prototype;
-    methodNames.forEach(function(name) {
-      Object.defineProperty(p, name + '_', {value: p[name]});
-    });
-  });
-
-  function getTargetToListenAt(wrapper) {
-    if (wrapper instanceof wrappers.ShadowRoot)
-      wrapper = wrapper.host;
-    return unwrap(wrapper);
-  }
-
-  EventTarget.prototype = {
-    addEventListener: function(type, fun, capture) {
-      if (!isValidListener(fun) || isMutationEvent(type))
-        return;
-
-      var listener = new Listener(type, fun, capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners) {
-        listeners = [];
-        listeners.depth = 0;
-        listenersTable.set(this, listeners);
-      } else {
-        // Might have a duplicate.
-        for (var i = 0; i < listeners.length; i++) {
-          if (listener.equals(listeners[i]))
-            return;
-        }
-      }
-
-      listeners.push(listener);
-
-      var target = getTargetToListenAt(this);
-      target.addEventListener_(type, dispatchOriginalEvent, true);
-    },
-    removeEventListener: function(type, fun, capture) {
-      capture = Boolean(capture);
-      var listeners = listenersTable.get(this);
-      if (!listeners)
-        return;
-      var count = 0, found = false;
-      for (var i = 0; i < listeners.length; i++) {
-        if (listeners[i].type === type && listeners[i].capture === capture) {
-          count++;
-          if (listeners[i].handler === fun) {
-            found = true;
-            listeners[i].remove();
-          }
-        }
-      }
-
-      if (found && count === 1) {
-        var target = getTargetToListenAt(this);
-        target.removeEventListener_(type, dispatchOriginalEvent, true);
-      }
-    },
-    dispatchEvent: function(event) {
-      // We want to use the native dispatchEvent because it triggers the default
-      // actions (like checking a checkbox). However, if there are no listeners
-      // in the composed tree then there are no events that will trigger and
-      // listeners in the non composed tree that are part of the event path are
-      // not notified.
-      //
-      // If we find out that there are no listeners in the composed tree we add
-      // a temporary listener to the target which makes us get called back even
-      // in that case.
-
-      var nativeEvent = unwrap(event);
-      var eventType = nativeEvent.type;
-
-      // Allow dispatching the same event again. This is safe because if user
-      // code calls this during an existing dispatch of the same event the
-      // native dispatchEvent throws (that is required by the spec).
-      handledEventsTable.set(nativeEvent, false);
-
-      // Force rendering since we prefer native dispatch and that works on the
-      // composed tree.
-      scope.renderAllPending();
-
-      var tempListener;
-      if (!hasListenerInAncestors(this, eventType)) {
-        tempListener = function() {};
-        this.addEventListener(eventType, tempListener, true);
-      }
-
-      try {
-        return unwrap(this).dispatchEvent_(nativeEvent);
-      } finally {
-        if (tempListener)
-          this.removeEventListener(eventType, tempListener, true);
-      }
-    }
-  };
-
-  function hasListener(node, type) {
-    var listeners = listenersTable.get(node);
-    if (listeners) {
-      for (var i = 0; i < listeners.length; i++) {
-        if (!listeners[i].removed && listeners[i].type === type)
-          return true;
-      }
-    }
-    return false;
-  }
-
-  function hasListenerInAncestors(target, type) {
-    for (var node = unwrap(target); node; node = node.parentNode) {
-      if (hasListener(wrap(node), type))
-        return true;
-    }
-    return false;
-  }
-
-  if (OriginalEventTarget)
-    registerWrapper(OriginalEventTarget, EventTarget);
-
-  function wrapEventTargetMethods(constructors) {
-    forwardMethodsToWrapper(constructors, methodNames);
-  }
-
-  var originalElementFromPoint = document.elementFromPoint;
-
-  function elementFromPoint(self, document, x, y) {
-    scope.renderAllPending();
-
-    var element =
-        wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
-    if (!element)
-      return null;
-    var path = getEventPath(element, null);
-
-    // scope the path to this TreeScope
-    var idx = path.lastIndexOf(self);
-    if (idx == -1)
-      return null;
-    else
-      path = path.slice(0, idx);
-
-    // TODO(dfreedm): pass idx to eventRetargetting to avoid array copy
-    return eventRetargetting(path, self);
-  }
-
-  /**
-   * Returns a function that is to be used as a getter for `onfoo` properties.
-   * @param {string} name
-   * @return {Function}
-   */
-  function getEventHandlerGetter(name) {
-    return function() {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      return inlineEventHandlers && inlineEventHandlers[name] &&
-          inlineEventHandlers[name].value || null;
-     };
-  }
-
-  /**
-   * Returns a function that is to be used as a setter for `onfoo` properties.
-   * @param {string} name
-   * @return {Function}
-   */
-  function getEventHandlerSetter(name) {
-    var eventType = name.slice(2);
-    return function(value) {
-      var inlineEventHandlers = eventHandlersTable.get(this);
-      if (!inlineEventHandlers) {
-        inlineEventHandlers = Object.create(null);
-        eventHandlersTable.set(this, inlineEventHandlers);
-      }
-
-      var old = inlineEventHandlers[name];
-      if (old)
-        this.removeEventListener(eventType, old.wrapped, false);
-
-      if (typeof value === 'function') {
-        var wrapped = function(e) {
-          var rv = value.call(this, e);
-          if (rv === false)
-            e.preventDefault();
-          else if (name === 'onbeforeunload' && typeof rv === 'string')
-            e.returnValue = rv;
-          // mouseover uses true for preventDefault but preventDefault for
-          // mouseover is ignored by browsers these day.
-        };
-
-        this.addEventListener(eventType, wrapped, false);
-        inlineEventHandlers[name] = {
-          value: value,
-          wrapped: wrapped
-        };
-      }
-    };
-  }
-
-  scope.elementFromPoint = elementFromPoint;
-  scope.getEventHandlerGetter = getEventHandlerGetter;
-  scope.getEventHandlerSetter = getEventHandlerSetter;
-  scope.wrapEventTargetMethods = wrapEventTargetMethods;
-  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
-  scope.wrappers.CustomEvent = CustomEvent;
-  scope.wrappers.Event = Event;
-  scope.wrappers.EventTarget = EventTarget;
-  scope.wrappers.FocusEvent = FocusEvent;
-  scope.wrappers.MouseEvent = MouseEvent;
-  scope.wrappers.UIEvent = UIEvent;
-
-})(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 UIEvent = scope.wrappers.UIEvent;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-
-  // TouchEvent is WebKit/Blink only.
-  var OriginalTouchEvent = window.TouchEvent;
-  if (!OriginalTouchEvent)
-    return;
-
-  var nativeEvent;
-  try {
-    nativeEvent = document.createEvent('TouchEvent');
-  } catch (ex) {
-    // In Chrome creating a TouchEvent fails if the feature is not turned on
-    // which it isn't on desktop Chrome.
-    return;
-  }
-
-  var nonEnumDescriptor = {enumerable: false};
-
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
-  }
-
-  function Touch(impl) {
-    setWrapper(impl, this);
-  }
-
-  Touch.prototype = {
-    get target() {
-      return wrap(unsafeUnwrap(this).target);
-    }
-  };
-
-  var descr = {
-    configurable: true,
-    enumerable: true,
-    get: null
-  };
-
-  [
-    'clientX',
-    'clientY',
-    'screenX',
-    'screenY',
-    'pageX',
-    'pageY',
-    'identifier',
-    'webkitRadiusX',
-    'webkitRadiusY',
-    'webkitRotationAngle',
-    'webkitForce'
-  ].forEach(function(name) {
-    descr.get = function() {
-      return unsafeUnwrap(this)[name];
-    };
-    Object.defineProperty(Touch.prototype, name, descr);
-  });
-
-  function TouchList() {
-    this.length = 0;
-    nonEnum(this, 'length');
-  }
-
-  TouchList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-
-  function wrapTouchList(nativeTouchList) {
-    var list = new TouchList();
-    for (var i = 0; i < nativeTouchList.length; i++) {
-      list[i] = new Touch(nativeTouchList[i]);
-    }
-    list.length = i;
-    return list;
-  }
-
-  function TouchEvent(impl) {
-    UIEvent.call(this, impl);
-  }
-
-  TouchEvent.prototype = Object.create(UIEvent.prototype);
-
-  mixin(TouchEvent.prototype, {
-    get touches() {
-      return wrapTouchList(unsafeUnwrap(this).touches);
-    },
-
-    get targetTouches() {
-      return wrapTouchList(unsafeUnwrap(this).targetTouches);
-    },
-
-    get changedTouches() {
-      return wrapTouchList(unsafeUnwrap(this).changedTouches);
-    },
-
-    initTouchEvent: function() {
-      // The only way to use this is to reuse the TouchList from an existing
-      // TouchEvent. Since this is WebKit/Blink proprietary API we will not
-      // implement this until someone screams.
-      throw new Error('Not implemented');
-    }
-  });
-
-  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
-
-  scope.wrappers.Touch = Touch;
-  scope.wrappers.TouchEvent = TouchEvent;
-  scope.wrappers.TouchList = TouchList;
-
-})(window.ShadowDOMPolyfill);
-
-
-// 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.
-
-(function(scope) {
-  'use strict';
-
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-
-  var nonEnumDescriptor = {enumerable: false};
-
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
-  }
-
-  function NodeList() {
-    this.length = 0;
-    nonEnum(this, 'length');
-  }
-  NodeList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-  nonEnum(NodeList.prototype, 'item');
-
-  function wrapNodeList(list) {
-    if (list == null)
-      return list;
-    var wrapperList = new NodeList();
-    for (var i = 0, length = list.length; i < length; i++) {
-      wrapperList[i] = wrap(list[i]);
-    }
-    wrapperList.length = length;
-    return wrapperList;
-  }
-
-  function addWrapNodeListMethod(wrapperConstructor, name) {
-    wrapperConstructor.prototype[name] = function() {
-      return wrapNodeList(
-          unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
-    };
-  }
-
-  scope.wrappers.NodeList = NodeList;
-  scope.addWrapNodeListMethod = addWrapNodeListMethod;
-  scope.wrapNodeList = wrapNodeList;
-
-})(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';
-
-  // TODO(arv): Implement.
-
-  scope.wrapHTMLCollection = scope.wrapNodeList;
-  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
-
-})(window.ShadowDOMPolyfill);
-
-/**
- * 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.
- */
-
-(function(scope) {
-  'use strict';
-
-  var EventTarget = scope.wrappers.EventTarget;
-  var NodeList = scope.wrappers.NodeList;
-  var TreeScope = scope.TreeScope;
-  var assert = scope.assert;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var getTreeScope = scope.getTreeScope;
-  var isWrapper = scope.isWrapper;
-  var mixin = scope.mixin;
-  var registerTransientObservers = scope.registerTransientObservers;
-  var registerWrapper = scope.registerWrapper;
-  var setTreeScope = scope.setTreeScope;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-  var wrapIfNeeded = scope.wrapIfNeeded;
-  var wrappers = scope.wrappers;
-
-  function assertIsNodeWrapper(node) {
-    assert(node instanceof Node);
-  }
-
-  function createOneElementNodeList(node) {
-    var nodes = new NodeList();
-    nodes[0] = node;
-    nodes.length = 1;
-    return nodes;
-  }
-
-  var surpressMutations = false;
-
-  /**
-   * Called before node is inserted into a node to enqueue its removal from its
-   * old parent.
-   * @param {!Node} node The node that is about to be removed.
-   * @param {!Node} parent The parent node that the node is being removed from.
-   * @param {!NodeList} nodes The collected nodes.
-   */
-  function enqueueRemovalForInsertedNodes(node, parent, nodes) {
-    enqueueMutation(parent, 'childList', {
-      removedNodes: nodes,
-      previousSibling: node.previousSibling,
-      nextSibling: node.nextSibling
-    });
-  }
-
-  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
-    enqueueMutation(df, 'childList', {
-      removedNodes: nodes
-    });
-  }
-
-  /**
-   * Collects nodes from a DocumentFragment or a Node for removal followed
-   * by an insertion.
-   *
-   * This updates the internal pointers for node, previousNode and nextNode.
-   */
-  function collectNodes(node, parentNode, previousNode, nextNode) {
-    if (node instanceof DocumentFragment) {
-      var nodes = collectNodesForDocumentFragment(node);
-
-      // The extra loop is to work around bugs with DocumentFragments in IE.
-      surpressMutations = true;
-      for (var i = nodes.length - 1; i >= 0; i--) {
-        node.removeChild(nodes[i]);
-        nodes[i].parentNode_ = parentNode;
-      }
-      surpressMutations = false;
-
-      for (var i = 0; i < nodes.length; i++) {
-        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
-        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
-      }
-
-      if (previousNode)
-        previousNode.nextSibling_ = nodes[0];
-      if (nextNode)
-        nextNode.previousSibling_ = nodes[nodes.length - 1];
-
-      return nodes;
-    }
-
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent) {
-      // This will enqueue the mutation record for the removal as needed.
-      oldParent.removeChild(node);
-    }
-
-    node.parentNode_ = parentNode;
-    node.previousSibling_ = previousNode;
-    node.nextSibling_ = nextNode;
-    if (previousNode)
-      previousNode.nextSibling_ = node;
-    if (nextNode)
-      nextNode.previousSibling_ = node;
-
-    return nodes;
-  }
-
-  function collectNodesNative(node) {
-    if (node instanceof DocumentFragment)
-      return collectNodesForDocumentFragment(node);
-
-    var nodes = createOneElementNodeList(node);
-    var oldParent = node.parentNode;
-    if (oldParent)
-      enqueueRemovalForInsertedNodes(node, oldParent, nodes);
-    return nodes;
-  }
-
-  function collectNodesForDocumentFragment(node) {
-    var nodes = new NodeList();
-    var i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      nodes[i++] = child;
-    }
-    nodes.length = i;
-    enqueueRemovalForInsertedDocumentFragment(node, nodes);
-    return nodes;
-  }
-
-  function snapshotNodeList(nodeList) {
-    // NodeLists are not live at the moment so just return the same object.
-    return nodeList;
-  }
-
-  // http://dom.spec.whatwg.org/#node-is-inserted
-  function nodeWasAdded(node, treeScope) {
-    setTreeScope(node, treeScope);
-    node.nodeIsInserted_();
-  }
-
-  function nodesWereAdded(nodes, parent) {
-    var treeScope = getTreeScope(parent);
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasAdded(nodes[i], treeScope);
-    }
-  }
-
-  // http://dom.spec.whatwg.org/#node-is-removed
-  function nodeWasRemoved(node) {
-    setTreeScope(node, new TreeScope(node, null));
-  }
-
-  function nodesWereRemoved(nodes) {
-    for (var i = 0; i < nodes.length; i++) {
-      nodeWasRemoved(nodes[i]);
-    }
-  }
-
-  function ensureSameOwnerDocument(parent, child) {
-    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?
-        parent : parent.ownerDocument;
-    if (ownerDoc !== child.ownerDocument)
-      ownerDoc.adoptNode(child);
-  }
-
-  function adoptNodesIfNeeded(owner, nodes) {
-    if (!nodes.length)
-      return;
-
-    var ownerDoc = owner.ownerDocument;
-
-    // All nodes have the same ownerDocument when we get here.
-    if (ownerDoc === nodes[0].ownerDocument)
-      return;
-
-    for (var i = 0; i < nodes.length; i++) {
-      scope.adoptNodeNoRemove(nodes[i], ownerDoc);
-    }
-  }
-
-  function unwrapNodesForInsertion(owner, nodes) {
-    adoptNodesIfNeeded(owner, nodes);
-    var length = nodes.length;
-
-    if (length === 1)
-      return unwrap(nodes[0]);
-
-    var df = unwrap(owner.ownerDocument.createDocumentFragment());
-    for (var i = 0; i < length; i++) {
-      df.appendChild(unwrap(nodes[i]));
-    }
-    return df;
-  }
-
-  function clearChildNodes(wrapper) {
-    if (wrapper.firstChild_ !== undefined) {
-      var child = wrapper.firstChild_;
-      while (child) {
-        var tmp = child;
-        child = child.nextSibling_;
-        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
-      }
-    }
-    wrapper.firstChild_ = wrapper.lastChild_ = undefined;
-  }
-
-  function removeAllChildNodes(wrapper) {
-    if (wrapper.invalidateShadowRenderer()) {
-      var childWrapper = wrapper.firstChild;
-      while (childWrapper) {
-        assert(childWrapper.parentNode === wrapper);
-        var nextSibling = childWrapper.nextSibling;
-        var childNode = unwrap(childWrapper);
-        var parentNode = childNode.parentNode;
-        if (parentNode)
-          originalRemoveChild.call(parentNode, childNode);
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
-            childWrapper.parentNode_ = null;
-        childWrapper = nextSibling;
-      }
-      wrapper.firstChild_ = wrapper.lastChild_ = null;
-    } else {
-      var node = unwrap(wrapper);
-      var child = node.firstChild;
-      var nextSibling;
-      while (child) {
-        nextSibling = child.nextSibling;
-        originalRemoveChild.call(node, child);
-        child = nextSibling;
-      }
-    }
-  }
-
-  function invalidateParent(node) {
-    var p = node.parentNode;
-    return p && p.invalidateShadowRenderer();
-  }
-
-  function cleanupNodes(nodes) {
-    for (var i = 0, n; i < nodes.length; i++) {
-      n = nodes[i];
-      n.parentNode.removeChild(n);
-    }
-  }
-
-  var originalImportNode = document.importNode;
-  var originalCloneNode = window.Node.prototype.cloneNode;
-
-  function cloneNode(node, deep, opt_doc) {
-    var clone;
-    if (opt_doc)
-      clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false));
-    else
-      clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
-
-    if (deep) {
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        clone.appendChild(cloneNode(child, true, opt_doc));
-      }
-
-      if (node instanceof wrappers.HTMLTemplateElement) {
-        var cloneContent = clone.content;
-        for (var child = node.content.firstChild;
-             child;
-             child = child.nextSibling) {
-         cloneContent.appendChild(cloneNode(child, true, opt_doc));
-        }
-      }
-    }
-    // TODO(arv): Some HTML elements also clone other data like value.
-    return clone;
-  }
-
-  function contains(self, child) {
-    if (!child || getTreeScope(self) !== getTreeScope(child))
-      return false;
-
-    for (var node = child; node; node = node.parentNode) {
-      if (node === self)
-        return true;
-    }
-    return false;
-  }
-
-  var OriginalNode = window.Node;
-
-  /**
-   * This represents a wrapper of a native DOM node.
-   * @param {!Node} original The original DOM node, aka, the visual DOM node.
-   * @constructor
-   * @extends {EventTarget}
-   */
-  function Node(original) {
-    assert(original instanceof OriginalNode);
-
-    EventTarget.call(this, original);
-
-    // These properties are used to override the visual references with the
-    // logical ones. If the value is undefined it means that the logical is the
-    // same as the visual.
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.parentNode_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.firstChild_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.lastChild_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.nextSibling_ = undefined;
-
-    /**
-     * @type {Node|undefined}
-     * @private
-     */
-    this.previousSibling_ = undefined;
-
-    this.treeScope_ = undefined;
-  }
-
-  var OriginalDocumentFragment = window.DocumentFragment;
-  var originalAppendChild = OriginalNode.prototype.appendChild;
-  var originalCompareDocumentPosition =
-      OriginalNode.prototype.compareDocumentPosition;
-  var originalInsertBefore = OriginalNode.prototype.insertBefore;
-  var originalRemoveChild = OriginalNode.prototype.removeChild;
-  var originalReplaceChild = OriginalNode.prototype.replaceChild;
-
-  var isIe = /Trident/.test(navigator.userAgent);
-
-  var removeChildOriginalHelper = isIe ?
-      function(parent, child) {
-        try {
-          originalRemoveChild.call(parent, child);
-        } catch (ex) {
-          if (!(parent instanceof OriginalDocumentFragment))
-            throw ex;
-        }
-      } :
-      function(parent, child) {
-        originalRemoveChild.call(parent, child);
-      };
-
-  Node.prototype = Object.create(EventTarget.prototype);
-  mixin(Node.prototype, {
-    appendChild: function(childWrapper) {
-      return this.insertBefore(childWrapper, null);
-    },
-
-    insertBefore: function(childWrapper, refWrapper) {
-      assertIsNodeWrapper(childWrapper);
-
-      var refNode;
-      if (refWrapper) {
-        if (isWrapper(refWrapper)) {
-          refNode = unwrap(refWrapper);
-        } else {
-          refNode = refWrapper;
-          refWrapper = wrap(refNode);
-        }
-      } else {
-        refWrapper = null;
-        refNode = null;
-      }
-
-      refWrapper && assert(refWrapper.parentNode === this);
-
-      var nodes;
-      var previousNode =
-          refWrapper ? refWrapper.previousSibling : this.lastChild;
-
-      var useNative = !this.invalidateShadowRenderer() &&
-                      !invalidateParent(childWrapper);
-
-      if (useNative)
-        nodes = collectNodesNative(childWrapper);
-      else
-        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
-
-      if (useNative) {
-        ensureSameOwnerDocument(this, childWrapper);
-        clearChildNodes(this);
-        originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
-      } else {
-        if (!previousNode)
-          this.firstChild_ = nodes[0];
-        if (!refWrapper) {
-          this.lastChild_ = nodes[nodes.length - 1];
-          if (this.firstChild_ === undefined)
-            this.firstChild_ = this.firstChild;
-        }
-
-        var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
-
-        // insertBefore refWrapper no matter what the parent is?
-        if (parentNode) {
-          originalInsertBefore.call(parentNode,
-              unwrapNodesForInsertion(this, nodes), refNode);
-        } else {
-          adoptNodesIfNeeded(this, nodes);
-        }
-      }
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: nodes,
-        nextSibling: refWrapper,
-        previousSibling: previousNode
-      });
-
-      nodesWereAdded(nodes, this);
-
-      return childWrapper;
-    },
-
-    removeChild: function(childWrapper) {
-      assertIsNodeWrapper(childWrapper);
-      if (childWrapper.parentNode !== this) {
-        // IE has invalid DOM trees at times.
-        var found = false;
-        var childNodes = this.childNodes;
-        for (var ieChild = this.firstChild; ieChild;
-             ieChild = ieChild.nextSibling) {
-          if (ieChild === childWrapper) {
-            found = true;
-            break;
-          }
-        }
-        if (!found) {
-          // TODO(arv): DOMException
-          throw new Error('NotFoundError');
-        }
-      }
-
-      var childNode = unwrap(childWrapper);
-      var childWrapperNextSibling = childWrapper.nextSibling;
-      var childWrapperPreviousSibling = childWrapper.previousSibling;
-
-      if (this.invalidateShadowRenderer()) {
-        // We need to remove the real node from the DOM before updating the
-        // pointers. This is so that that mutation event is dispatched before
-        // the pointers have changed.
-        var thisFirstChild = this.firstChild;
-        var thisLastChild = this.lastChild;
-
-        var parentNode = childNode.parentNode;
-        if (parentNode)
-          removeChildOriginalHelper(parentNode, childNode);
-
-        if (thisFirstChild === childWrapper)
-          this.firstChild_ = childWrapperNextSibling;
-        if (thisLastChild === childWrapper)
-          this.lastChild_ = childWrapperPreviousSibling;
-        if (childWrapperPreviousSibling)
-          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
-        if (childWrapperNextSibling) {
-          childWrapperNextSibling.previousSibling_ =
-              childWrapperPreviousSibling;
-        }
-
-        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
-            childWrapper.parentNode_ = undefined;
-      } else {
-        clearChildNodes(this);
-        removeChildOriginalHelper(unsafeUnwrap(this), childNode);
-      }
-
-      if (!surpressMutations) {
-        enqueueMutation(this, 'childList', {
-          removedNodes: createOneElementNodeList(childWrapper),
-          nextSibling: childWrapperNextSibling,
-          previousSibling: childWrapperPreviousSibling
-        });
-      }
-
-      registerTransientObservers(this, childWrapper);
-
-      return childWrapper;
-    },
-
-    replaceChild: function(newChildWrapper, oldChildWrapper) {
-      assertIsNodeWrapper(newChildWrapper);
-
-      var oldChildNode;
-      if (isWrapper(oldChildWrapper)) {
-        oldChildNode = unwrap(oldChildWrapper);
-      } else {
-        oldChildNode = oldChildWrapper;
-        oldChildWrapper = wrap(oldChildNode);
-      }
-
-      if (oldChildWrapper.parentNode !== this) {
-        // TODO(arv): DOMException
-        throw new Error('NotFoundError');
-      }
-
-      var nextNode = oldChildWrapper.nextSibling;
-      var previousNode = oldChildWrapper.previousSibling;
-      var nodes;
-
-      var useNative = !this.invalidateShadowRenderer() &&
-                      !invalidateParent(newChildWrapper);
-
-      if (useNative) {
-        nodes = collectNodesNative(newChildWrapper);
-      } else {
-        if (nextNode === newChildWrapper)
-          nextNode = newChildWrapper.nextSibling;
-        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
-      }
-
-      if (!useNative) {
-        if (this.firstChild === oldChildWrapper)
-          this.firstChild_ = nodes[0];
-        if (this.lastChild === oldChildWrapper)
-          this.lastChild_ = nodes[nodes.length - 1];
-
-        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =
-            oldChildWrapper.parentNode_ = undefined;
-
-        // replaceChild no matter what the parent is?
-        if (oldChildNode.parentNode) {
-          originalReplaceChild.call(
-              oldChildNode.parentNode,
-              unwrapNodesForInsertion(this, nodes),
-              oldChildNode);
-        }
-      } else {
-        ensureSameOwnerDocument(this, newChildWrapper);
-        clearChildNodes(this);
-        originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper),
-                                  oldChildNode);
-      }
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: nodes,
-        removedNodes: createOneElementNodeList(oldChildWrapper),
-        nextSibling: nextNode,
-        previousSibling: previousNode
-      });
-
-      nodeWasRemoved(oldChildWrapper);
-      nodesWereAdded(nodes, this);
-
-      return oldChildWrapper;
-    },
-
-    /**
-     * Called after a node was inserted. Subclasses override this to invalidate
-     * the renderer as needed.
-     * @private
-     */
-    nodeIsInserted_: function() {
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        child.nodeIsInserted_();
-      }
-    },
-
-    hasChildNodes: function() {
-      return this.firstChild !== null;
-    },
-
-    /** @type {Node} */
-    get parentNode() {
-      // If the parentNode has not been overridden, use the original parentNode.
-      return this.parentNode_ !== undefined ?
-          this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
-    },
-
-    /** @type {Node} */
-    get firstChild() {
-      return this.firstChild_ !== undefined ?
-          this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
-    },
-
-    /** @type {Node} */
-    get lastChild() {
-      return this.lastChild_ !== undefined ?
-          this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
-    },
-
-    /** @type {Node} */
-    get nextSibling() {
-      return this.nextSibling_ !== undefined ?
-          this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
-    },
-
-    /** @type {Node} */
-    get previousSibling() {
-      return this.previousSibling_ !== undefined ?
-          this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
-    },
-
-    get parentElement() {
-      var p = this.parentNode;
-      while (p && p.nodeType !== Node.ELEMENT_NODE) {
-        p = p.parentNode;
-      }
-      return p;
-    },
-
-    get textContent() {
-      // TODO(arv): This should fallback to unsafeUnwrap(this).textContent if there
-      // are no shadow trees below or above the context node.
-      var s = '';
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        if (child.nodeType != Node.COMMENT_NODE) {
-          s += child.textContent;
-        }
-      }
-      return s;
-    },
-    set textContent(textContent) {
-      if (textContent == null) textContent = '';
-      var removedNodes = snapshotNodeList(this.childNodes);
-
-      if (this.invalidateShadowRenderer()) {
-        removeAllChildNodes(this);
-        if (textContent !== '') {
-          var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
-          this.appendChild(textNode);
-        }
-      } else {
-        clearChildNodes(this);
-        unsafeUnwrap(this).textContent = textContent;
-      }
-
-      var addedNodes = snapshotNodeList(this.childNodes);
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-
-    get childNodes() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstChild; child; child = child.nextSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-
-    cloneNode: function(deep) {
-      return cloneNode(this, deep);
-    },
-
-    contains: function(child) {
-      return contains(this, wrapIfNeeded(child));
-    },
-
-    compareDocumentPosition: function(otherNode) {
-      // This only wraps, it therefore only operates on the composed DOM and not
-      // the logical DOM.
-      return originalCompareDocumentPosition.call(unsafeUnwrap(this),
-                                                  unwrapIfNeeded(otherNode));
-    },
-
-    normalize: function() {
-      var nodes = snapshotNodeList(this.childNodes);
-      var remNodes = [];
-      var s = '';
-      var modNode;
-
-      for (var i = 0, n; i < nodes.length; i++) {
-        n = nodes[i];
-        if (n.nodeType === Node.TEXT_NODE) {
-          if (!modNode && !n.data.length)
-            this.removeNode(n);
-          else if (!modNode)
-            modNode = n;
-          else {
-            s += n.data;
-            remNodes.push(n);
-          }
-        } else {
-          if (modNode && remNodes.length) {
-            modNode.data += s;
-            cleanupNodes(remNodes);
-          }
-          remNodes = [];
-          s = '';
-          modNode = null;
-          if (n.childNodes.length)
-            n.normalize();
-        }
-      }
-
-      // handle case where >1 text nodes are the last children
-      if (modNode && remNodes.length) {
-        modNode.data += s;
-        cleanupNodes(remNodes);
-      }
-    }
-  });
-
-  defineWrapGetter(Node, 'ownerDocument');
-
-  // We use a DocumentFragment as a base and then delete the properties of
-  // DocumentFragment.prototype from the wrapper Node. Since delete makes
-  // objects slow in some JS engines we recreate the prototype object.
-  registerWrapper(OriginalNode, Node, document.createDocumentFragment());
-  delete Node.prototype.querySelector;
-  delete Node.prototype.querySelectorAll;
-  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
-
-  scope.cloneNode = cloneNode;
-  scope.nodeWasAdded = nodeWasAdded;
-  scope.nodeWasRemoved = nodeWasRemoved;
-  scope.nodesWereAdded = nodesWereAdded;
-  scope.nodesWereRemoved = nodesWereRemoved;
-  scope.originalInsertBefore = originalInsertBefore;
-  scope.originalRemoveChild = originalRemoveChild;
-  scope.snapshotNodeList = snapshotNodeList;
-  scope.wrappers.Node = Node;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLCollection = scope.wrappers.HTMLCollection;
-  var NodeList = scope.wrappers.NodeList;
-  var getTreeScope = scope.getTreeScope;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-
-  var originalDocumentQuerySelector = document.querySelector;
-  var originalElementQuerySelector = document.documentElement.querySelector;
-
-  var originalDocumentQuerySelectorAll = document.querySelectorAll;
-  var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
-
-  var originalDocumentGetElementsByTagName = document.getElementsByTagName;
-  var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
-
-  var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
-  var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
-
-  var OriginalElement = window.Element;
-  var OriginalDocument = window.HTMLDocument || window.Document;
-
-  function filterNodeList(list, index, result, deep) {
-    var wrappedItem = null;
-    var root = null;
-    for (var i = 0, length = list.length; i < length; i++) {
-      wrappedItem = wrap(list[i]);
-      if (!deep && (root = getTreeScope(wrappedItem).root)) {
-        if (root instanceof scope.wrappers.ShadowRoot) {
-          continue;
-        }
-      }
-      result[index++] = wrappedItem;
-    }
-
-    return index;
-  }
-
-  function shimSelector(selector) {
-    return String(selector).replace(/\/deep\//g, ' ');
-  }
-
-  function findOne(node, selector) {
-    var m, el = node.firstElementChild;
-    while (el) {
-      if (el.matches(selector))
-        return el;
-      m = findOne(el, selector);
-      if (m)
-        return m;
-      el = el.nextElementSibling;
-    }
-    return null;
-  }
-
-  function matchesSelector(el, selector) {
-    return el.matches(selector);
-  }
-
-  var XHTML_NS = 'http://www.w3.org/1999/xhtml';
-
-  function matchesTagName(el, localName, localNameLowerCase) {
-    var ln = el.localName;
-    return ln === localName ||
-        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
-  }
-
-  function matchesEveryThing() {
-    return true;
-  }
-
-  function matchesLocalNameOnly(el, ns, localName) {
-    return el.localName === localName;
-  }
-
-  function matchesNameSpace(el, ns) {
-    return el.namespaceURI === ns;
-  }
-
-  function matchesLocalNameNS(el, ns, localName) {
-    return el.namespaceURI === ns && el.localName === localName;
-  }
-
-  function findElements(node, index, result, p, arg0, arg1) {
-    var el = node.firstElementChild;
-    while (el) {
-      if (p(el, arg0, arg1))
-        result[index++] = el;
-      index = findElements(el, index, result, p, arg0, arg1);
-      el = el.nextElementSibling;
-    }
-    return index;
-  }
-
-  // find and findAll will only match Simple Selectors,
-  // Structural Pseudo Classes are not guarenteed to be correct
-  // http://www.w3.org/TR/css3-selectors/#simple-selectors
-
-  function querySelectorAllFiltered(p, index, result, selector, deep) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      // We are in the shadow tree and the logical tree is
-      // going to be disconnected so we do a manual tree traversal
-      return findElements(this, index, result, p, selector, null);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementQuerySelectorAll.call(target, selector);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentQuerySelectorAll.call(target, selector);
-    } else {
-      // When we get a ShadowRoot the logical tree is going to be disconnected
-      // so we do a manual tree traversal
-      return findElements(this, index, result, p, selector, null);
-    }
-
-    return filterNodeList(list, index, result, deep);
-  }
-
-  var SelectorsInterface = {
-    querySelector: function(selector) {
-      var shimmed = shimSelector(selector);
-      var deep = shimmed !== selector;
-      selector = shimmed;
-
-      var target = unsafeUnwrap(this);
-      var wrappedItem;
-      var root = getTreeScope(this).root;
-      if (root instanceof scope.wrappers.ShadowRoot) {
-        // We are in the shadow tree and the logical tree is
-        // going to be disconnected so we do a manual tree traversal
-        return findOne(this, selector);
-      } else if (target instanceof OriginalElement) {
-        wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
-      } else if (target instanceof OriginalDocument) {
-        wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
-      } else {
-        // When we get a ShadowRoot the logical tree is going to be disconnected
-        // so we do a manual tree traversal
-        return findOne(this, selector);
-      }
-
-      if (!wrappedItem) {
-        // When the original query returns nothing
-        // we return nothing (to be consistent with the other wrapped calls)
-        return wrappedItem;
-      } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
-        if (root instanceof scope.wrappers.ShadowRoot) {
-          // When the original query returns an element in the ShadowDOM
-          // we must do a manual tree traversal
-          return findOne(this, selector);
-        }
-      }
-
-      return wrappedItem;
-    },
-    querySelectorAll: function(selector) {
-      var shimmed = shimSelector(selector);
-      var deep = shimmed !== selector;
-      selector = shimmed;
-
-      var result = new NodeList();
-
-      result.length = querySelectorAllFiltered.call(this,
-          matchesSelector,
-          0,
-          result,
-          selector,
-          deep);
-
-      return result;
-    }
-  };
-
-  function getElementsByTagNameFiltered(p, index, result, localName,
-                                        lowercase) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      // We are in the shadow tree and the logical tree is
-      // going to be disconnected so we do a manual tree traversal
-      return findElements(this, index, result, p, localName, lowercase);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementGetElementsByTagName.call(target, localName,
-                                                      lowercase);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentGetElementsByTagName.call(target, localName,
-                                                       lowercase);
-    } else {
-      // When we get a ShadowRoot the logical tree is going to be disconnected
-      // so we do a manual tree traversal
-      return findElements(this, index, result, p, localName, lowercase);
-    }
-
-    return filterNodeList(list, index, result, false);
-  }
-
-  function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
-    var target = unsafeUnwrap(this);
-    var list;
-    var root = getTreeScope(this).root;
-    if (root instanceof scope.wrappers.ShadowRoot) {
-      // We are in the shadow tree and the logical tree is
-      // going to be disconnected so we do a manual tree traversal
-      return findElements(this, index, result, p, ns, localName);
-    } else if (target instanceof OriginalElement) {
-      list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
-    } else if (target instanceof OriginalDocument) {
-      list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
-    } else {
-      // When we get a ShadowRoot the logical tree is going to be disconnected
-      // so we do a manual tree traversal
-      return findElements(this, index, result, p, ns, localName);
-    }
-
-    return filterNodeList(list, index, result, false);
-  }
-
-  var GetElementsByInterface = {
-    getElementsByTagName: function(localName) {
-      var result = new HTMLCollection();
-      var match = localName === '*' ? matchesEveryThing : matchesTagName;
-
-      result.length = getElementsByTagNameFiltered.call(this,
-          match,
-          0,
-          result,
-          localName,
-          localName.toLowerCase());
-
-      return result;
-    },
-
-    getElementsByClassName: function(className) {
-      // TODO(arv): Check className?
-      return this.querySelectorAll('.' + className);
-    },
-
-    getElementsByTagNameNS: function(ns, localName) {
-      var result = new HTMLCollection();
-      var match = null;
-
-      if (ns === '*') {
-        match = localName === '*' ? matchesEveryThing : matchesLocalNameOnly;
-      } else {
-        match = localName === '*' ? matchesNameSpace : matchesLocalNameNS;
-      }
-
-      result.length = getElementsByTagNameNSFiltered.call(this,
-          match,
-          0,
-          result,
-          ns || null,
-          localName);
-
-      return result;
-    }
-  };
-
-  scope.GetElementsByInterface = GetElementsByInterface;
-  scope.SelectorsInterface = SelectorsInterface;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var NodeList = scope.wrappers.NodeList;
-
-  function forwardElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.nextSibling;
-    }
-    return node;
-  }
-
-  function backwardsElement(node) {
-    while (node && node.nodeType !== Node.ELEMENT_NODE) {
-      node = node.previousSibling;
-    }
-    return node;
-  }
-
-  var ParentNodeInterface = {
-    get firstElementChild() {
-      return forwardElement(this.firstChild);
-    },
-
-    get lastElementChild() {
-      return backwardsElement(this.lastChild);
-    },
-
-    get childElementCount() {
-      var count = 0;
-      for (var child = this.firstElementChild;
-           child;
-           child = child.nextElementSibling) {
-        count++;
-      }
-      return count;
-    },
-
-    get children() {
-      var wrapperList = new NodeList();
-      var i = 0;
-      for (var child = this.firstElementChild;
-           child;
-           child = child.nextElementSibling) {
-        wrapperList[i++] = child;
-      }
-      wrapperList.length = i;
-      return wrapperList;
-    },
-
-    remove: function() {
-      var p = this.parentNode;
-      if (p)
-        p.removeChild(this);
-    }
-  };
-
-  var ChildNodeInterface = {
-    get nextElementSibling() {
-      return forwardElement(this.nextSibling);
-    },
-
-    get previousElementSibling() {
-      return backwardsElement(this.previousSibling);
-    }
-  };
-
-  scope.ChildNodeInterface = ChildNodeInterface;
-  scope.ParentNodeInterface = ParentNodeInterface;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var Node = scope.wrappers.Node;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-
-  var OriginalCharacterData = window.CharacterData;
-
-  function CharacterData(node) {
-    Node.call(this, node);
-  }
-  CharacterData.prototype = Object.create(Node.prototype);
-  mixin(CharacterData.prototype, {
-    get textContent() {
-      return this.data;
-    },
-    set textContent(value) {
-      this.data = value;
-    },
-    get data() {
-      return unsafeUnwrap(this).data;
-    },
-    set data(value) {
-      var oldValue = unsafeUnwrap(this).data;
-      enqueueMutation(this, 'characterData', {
-        oldValue: oldValue
-      });
-      unsafeUnwrap(this).data = value;
-    }
-  });
-
-  mixin(CharacterData.prototype, ChildNodeInterface);
-
-  registerWrapper(OriginalCharacterData, CharacterData,
-                  document.createTextNode(''));
-
-  scope.wrappers.CharacterData = CharacterData;
-})(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 CharacterData = scope.wrappers.CharacterData;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  function toUInt32(x) {
-    return x >>> 0;
-  }
-
-  var OriginalText = window.Text;
-
-  function Text(node) {
-    CharacterData.call(this, node);
-  }
-  Text.prototype = Object.create(CharacterData.prototype);
-  mixin(Text.prototype, {
-    splitText: function(offset) {
-      offset = toUInt32(offset);
-      var s = this.data;
-      if (offset > s.length)
-        throw new Error('IndexSizeError');
-      var head = s.slice(0, offset);
-      var tail = s.slice(offset);
-      this.data = head;
-      var newTextNode = this.ownerDocument.createTextNode(tail);
-      if (this.parentNode)
-        this.parentNode.insertBefore(newTextNode, this.nextSibling);
-      return newTextNode;
-    }
-  });
-
-  registerWrapper(OriginalText, Text, document.createTextNode(''));
-
-  scope.wrappers.Text = Text;
-})(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 setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-
-  function invalidateClass(el) {
-    scope.invalidateRendererBasedOnAttribute(el, 'class');
-  }
-
-  function DOMTokenList(impl, ownerElement) {
-    setWrapper(impl, this);
-    this.ownerElement_ = ownerElement;
-  }
-
-  DOMTokenList.prototype = {
-    constructor: DOMTokenList,
-    get length() {
-      return unsafeUnwrap(this).length;
-    },
-    item: function(index) {
-      return unsafeUnwrap(this).item(index);
-    },
-    contains: function(token) {
-      return unsafeUnwrap(this).contains(token);
-    },
-    add: function() {
-      unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);
-      invalidateClass(this.ownerElement_);
-    },
-    remove: function() {
-      unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);
-      invalidateClass(this.ownerElement_);
-    },
-    toggle: function(token) {
-      var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);
-      invalidateClass(this.ownerElement_);
-      return rv;
-    },
-    toString: function() {
-      return unsafeUnwrap(this).toString();
-    }
-  };
-
-  scope.wrappers.DOMTokenList = DOMTokenList;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var ChildNodeInterface = scope.ChildNodeInterface;
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var DOMTokenList = scope.wrappers.DOMTokenList;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var addWrapNodeListMethod = scope.addWrapNodeListMethod;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrappers = scope.wrappers;
-
-  var OriginalElement = window.Element;
-
-  var matchesNames = [
-    'matches',  // needs to come first.
-    'mozMatchesSelector',
-    'msMatchesSelector',
-    'webkitMatchesSelector',
-  ].filter(function(name) {
-    return OriginalElement.prototype[name];
-  });
-
-  var matchesName = matchesNames[0];
-
-  var originalMatches = OriginalElement.prototype[matchesName];
-
-  function invalidateRendererBasedOnAttribute(element, name) {
-    // Only invalidate if parent node is a shadow host.
-    var p = element.parentNode;
-    if (!p || !p.shadowRoot)
-      return;
-
-    var renderer = scope.getRendererForHost(p);
-    if (renderer.dependsOnAttribute(name))
-      renderer.invalidate();
-  }
-
-  function enqueAttributeChange(element, name, oldValue) {
-    // This is not fully spec compliant. We should use localName (which might
-    // have a different case than name) and the namespace (which requires us
-    // to get the Attr object).
-    enqueueMutation(element, 'attributes', {
-      name: name,
-      namespace: null,
-      oldValue: oldValue
-    });
-  }
-
-  var classListTable = new WeakMap();
-
-  function Element(node) {
-    Node.call(this, node);
-  }
-  Element.prototype = Object.create(Node.prototype);
-  mixin(Element.prototype, {
-    createShadowRoot: function() {
-      var newShadowRoot = new wrappers.ShadowRoot(this);
-      unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
-
-      var renderer = scope.getRendererForHost(this);
-      renderer.invalidate();
-
-      return newShadowRoot;
-    },
-
-    get shadowRoot() {
-      return unsafeUnwrap(this).polymerShadowRoot_ || null;
-    },
-
-    // getDestinationInsertionPoints added in ShadowRenderer.js
-
-    setAttribute: function(name, value) {
-      var oldValue = unsafeUnwrap(this).getAttribute(name);
-      unsafeUnwrap(this).setAttribute(name, value);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    removeAttribute: function(name) {
-      var oldValue = unsafeUnwrap(this).getAttribute(name);
-      unsafeUnwrap(this).removeAttribute(name);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    matches: function(selector) {
-      return originalMatches.call(unsafeUnwrap(this), selector);
-    },
-
-    get classList() {
-      var list = classListTable.get(this);
-      if (!list) {
-        classListTable.set(this,
-            list = new DOMTokenList(unsafeUnwrap(this).classList, this));
-      }
-      return list;
-    },
-
-    get className() {
-      return unsafeUnwrap(this).className;
-    },
-
-    set className(v) {
-      this.setAttribute('class', v);
-    },
-
-    get id() {
-      return unsafeUnwrap(this).id;
-    },
-
-    set id(v) {
-      this.setAttribute('id', v);
-    }
-  });
-
-  matchesNames.forEach(function(name) {
-    if (name !== 'matches') {
-      Element.prototype[name] = function(selector) {
-        return this.matches(selector);
-      };
-    }
-  });
-
-  if (OriginalElement.prototype.webkitCreateShadowRoot) {
-    Element.prototype.webkitCreateShadowRoot =
-        Element.prototype.createShadowRoot;
-  }
-
-  mixin(Element.prototype, ChildNodeInterface);
-  mixin(Element.prototype, GetElementsByInterface);
-  mixin(Element.prototype, ParentNodeInterface);
-  mixin(Element.prototype, SelectorsInterface);
-
-  registerWrapper(OriginalElement, Element,
-                  document.createElementNS(null, 'x'));
-
-  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
-  scope.matchesNames = matchesNames;
-  scope.wrappers.Element = Element;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var Element = scope.wrappers.Element;
-  var defineGetter = scope.defineGetter;
-  var enqueueMutation = scope.enqueueMutation;
-  var mixin = scope.mixin;
-  var nodesWereAdded = scope.nodesWereAdded;
-  var nodesWereRemoved = scope.nodesWereRemoved;
-  var registerWrapper = scope.registerWrapper;
-  var snapshotNodeList = scope.snapshotNodeList;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrappers = scope.wrappers;
-
-  /////////////////////////////////////////////////////////////////////////////
-  // innerHTML and outerHTML
-
-  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
-  var escapeAttrRegExp = /[&\u00A0"]/g;
-  var escapeDataRegExp = /[&\u00A0<>]/g;
-
-  function escapeReplace(c) {
-    switch (c) {
-      case '&':
-        return '&amp;';
-      case '<':
-        return '&lt;';
-      case '>':
-        return '&gt;';
-      case '"':
-        return '&quot;'
-      case '\u00A0':
-        return '&nbsp;';
-    }
-  }
-
-  function escapeAttr(s) {
-    return s.replace(escapeAttrRegExp, escapeReplace);
-  }
-
-  function escapeData(s) {
-    return s.replace(escapeDataRegExp, escapeReplace);
-  }
-
-  function makeSet(arr) {
-    var set = {};
-    for (var i = 0; i < arr.length; i++) {
-      set[arr[i]] = true;
-    }
-    return set;
-  }
-
-  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements
-  var voidElements = makeSet([
-    'area',
-    'base',
-    'br',
-    'col',
-    'command',
-    'embed',
-    'hr',
-    'img',
-    'input',
-    'keygen',
-    'link',
-    'meta',
-    'param',
-    'source',
-    'track',
-    'wbr'
-  ]);
-
-  var plaintextParents = makeSet([
-    'style',
-    'script',
-    'xmp',
-    'iframe',
-    'noembed',
-    'noframes',
-    'plaintext',
-    'noscript'
-  ]);
-
-  function getOuterHTML(node, parentNode) {
-    switch (node.nodeType) {
-      case Node.ELEMENT_NODE:
-        var tagName = node.tagName.toLowerCase();
-        var s = '<' + tagName;
-        var attrs = node.attributes;
-        for (var i = 0, attr; attr = attrs[i]; i++) {
-          s += ' ' + attr.name + '="' + escapeAttr(attr.value) + '"';
-        }
-        s += '>';
-        if (voidElements[tagName])
-          return s;
-
-        return s + getInnerHTML(node) + '</' + tagName + '>';
-
-      case Node.TEXT_NODE:
-        var data = node.data;
-        if (parentNode && plaintextParents[parentNode.localName])
-          return data;
-        return escapeData(data);
-
-      case Node.COMMENT_NODE:
-        return '<!--' + node.data + '-->';
-
-      default:
-        console.error(node);
-        throw new Error('not implemented');
-    }
-  }
-
-  function getInnerHTML(node) {
-    if (node instanceof wrappers.HTMLTemplateElement)
-      node = node.content;
-
-    var s = '';
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      s += getOuterHTML(child, node);
-    }
-    return s;
-  }
-
-  function setInnerHTML(node, value, opt_tagName) {
-    var tagName = opt_tagName || 'div';
-    node.textContent = '';
-    var tempElement = unwrap(node.ownerDocument.createElement(tagName));
-    tempElement.innerHTML = value;
-    var firstChild;
-    while (firstChild = tempElement.firstChild) {
-      node.appendChild(wrap(firstChild));
-    }
-  }
-
-  // IE11 does not have MSIE in the user agent string.
-  var oldIe = /MSIE/.test(navigator.userAgent);
-
-  var OriginalHTMLElement = window.HTMLElement;
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-
-  function HTMLElement(node) {
-    Element.call(this, node);
-  }
-  HTMLElement.prototype = Object.create(Element.prototype);
-  mixin(HTMLElement.prototype, {
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      // IE9 does not handle set innerHTML correctly on plaintextParents. It
-      // creates element children. For example
-      //
-      //   scriptElement.innerHTML = '<a>test</a>'
-      //
-      // Creates a single HTMLAnchorElement child.
-      if (oldIe && plaintextParents[this.localName]) {
-        this.textContent = value;
-        return;
-      }
-
-      var removedNodes = snapshotNodeList(this.childNodes);
-
-      if (this.invalidateShadowRenderer()) {
-        if (this instanceof wrappers.HTMLTemplateElement)
-          setInnerHTML(this.content, value);
-        else
-          setInnerHTML(this, value, this.tagName);
-
-      // If we have a non native template element we need to handle this
-      // manually since setting impl.innerHTML would add the html as direct
-      // children and not be moved over to the content fragment.
-      } else if (!OriginalHTMLTemplateElement &&
-                 this instanceof wrappers.HTMLTemplateElement) {
-        setInnerHTML(this.content, value);
-      } else {
-        unsafeUnwrap(this).innerHTML = value;
-      }
-
-      var addedNodes = snapshotNodeList(this.childNodes);
-
-      enqueueMutation(this, 'childList', {
-        addedNodes: addedNodes,
-        removedNodes: removedNodes
-      });
-
-      nodesWereRemoved(removedNodes);
-      nodesWereAdded(addedNodes, this);
-    },
-
-    get outerHTML() {
-      return getOuterHTML(this, this.parentNode);
-    },
-    set outerHTML(value) {
-      var p = this.parentNode;
-      if (p) {
-        p.invalidateShadowRenderer();
-        var df = frag(p, value);
-        p.replaceChild(df, this);
-      }
-    },
-
-    insertAdjacentHTML: function(position, text) {
-      var contextElement, refNode;
-      switch (String(position).toLowerCase()) {
-        case 'beforebegin':
-          contextElement = this.parentNode;
-          refNode = this;
-          break;
-        case 'afterend':
-          contextElement = this.parentNode;
-          refNode = this.nextSibling;
-          break;
-        case 'afterbegin':
-          contextElement = this;
-          refNode = this.firstChild;
-          break;
-        case 'beforeend':
-          contextElement = this;
-          refNode = null;
-          break;
-        default:
-          return;
-      }
-
-      var df = frag(contextElement, text);
-      contextElement.insertBefore(df, refNode);
-    },
-
-    get hidden() {
-      return this.hasAttribute('hidden');
-    },
-    set hidden(v) {
-      if (v) {
-        this.setAttribute('hidden', '');
-      } else {
-        this.removeAttribute('hidden');
-      }
-    }
-  });
-
-  function frag(contextElement, html) {
-    // TODO(arv): This does not work with SVG and other non HTML elements.
-    var p = unwrap(contextElement.cloneNode(false));
-    p.innerHTML = html;
-    var df = unwrap(document.createDocumentFragment());
-    var c;
-    while (c = p.firstChild) {
-      df.appendChild(c);
-    }
-    return wrap(df);
-  }
-
-  function getter(name) {
-    return function() {
-      scope.renderAllPending();
-      return unsafeUnwrap(this)[name];
-    };
-  }
-
-  function getterRequiresRendering(name) {
-    defineGetter(HTMLElement, name, getter(name));
-  }
-
-  [
-    'clientHeight',
-    'clientLeft',
-    'clientTop',
-    'clientWidth',
-    'offsetHeight',
-    'offsetLeft',
-    'offsetTop',
-    'offsetWidth',
-    'scrollHeight',
-    'scrollWidth',
-  ].forEach(getterRequiresRendering);
-
-  function getterAndSetterRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      get: getter(name),
-      set: function(v) {
-        scope.renderAllPending();
-        unsafeUnwrap(this)[name] = v;
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  [
-    'scrollLeft',
-    'scrollTop',
-  ].forEach(getterAndSetterRequiresRendering);
-
-  function methodRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      value: function() {
-        scope.renderAllPending();
-        return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  [
-    'getBoundingClientRect',
-    'getClientRects',
-    'scrollIntoView'
-  ].forEach(methodRequiresRendering);
-
-  // HTMLElement is abstract so we use a subclass that has no members.
-  registerWrapper(OriginalHTMLElement, HTMLElement,
-                  document.createElement('b'));
-
-  scope.wrappers.HTMLElement = HTMLElement;
-
-  // TODO: Find a better way to share these two with WrapperShadowRoot.
-  scope.getInnerHTML = getInnerHTML;
-  scope.setInnerHTML = setInnerHTML
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
-
-  function HTMLCanvasElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
-
-  mixin(HTMLCanvasElement.prototype, {
-    getContext: function() {
-      var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
-      return context && wrap(context);
-    }
-  });
-
-  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,
-                  document.createElement('canvas'));
-
-  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLContentElement = window.HTMLContentElement;
-
-  function HTMLContentElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLContentElement.prototype, {
-    constructor: HTMLContentElement,
-
-    get select() {
-      return this.getAttribute('select');
-    },
-    set select(value) {
-      this.setAttribute('select', value);
-    },
-
-    setAttribute: function(n, v) {
-      HTMLElement.prototype.setAttribute.call(this, n, v);
-      if (String(n).toLowerCase() === 'select')
-        this.invalidateShadowRenderer(true);
-    }
-
-    // getDistributedNodes is added in ShadowRenderer
-  });
-
-  if (OriginalHTMLContentElement)
-    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
-
-  scope.wrappers.HTMLContentElement = HTMLContentElement;
-})(window.ShadowDOMPolyfill);
-
-/*
- * Copyright 2014 The Polymer Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style
- * license that can be found in the LICENSE file.
- */
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-
-  var OriginalHTMLFormElement = window.HTMLFormElement;
-
-  function HTMLFormElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLFormElement.prototype, {
-    get elements() {
-      // Note: technically this should be an HTMLFormControlsCollection, but
-      // that inherits from HTMLCollection, so should be good enough. Spec:
-      // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlformcontrolscollection
-      return wrapHTMLCollection(unwrap(this).elements);
-    }
-  });
-
-  registerWrapper(OriginalHTMLFormElement, HTMLFormElement,
-                  document.createElement('form'));
-
-  scope.wrappers.HTMLFormElement = HTMLFormElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-
-  var OriginalHTMLImageElement = window.HTMLImageElement;
-
-  function HTMLImageElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
-
-  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,
-                  document.createElement('img'));
-
-  function Image(width, height) {
-    if (!(this instanceof Image)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('img'));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-
-    if (width !== undefined)
-      node.width = width;
-    if (height !== undefined)
-      node.height = height;
-  }
-
-  Image.prototype = HTMLImageElement.prototype;
-
-  scope.wrappers.HTMLImageElement = HTMLImageElement;
-  scope.wrappers.Image = Image;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var NodeList = scope.wrappers.NodeList;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLShadowElement = window.HTMLShadowElement;
-
-  function HTMLShadowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-  HTMLShadowElement.prototype.constructor = HTMLShadowElement;
-
-  // getDistributedNodes is added in ShadowRenderer
-
-  if (OriginalHTMLShadowElement)
-    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
-
-  scope.wrappers.HTMLShadowElement = HTMLShadowElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var contentTable = new WeakMap();
-  var templateContentsOwnerTable = new WeakMap();
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
-  function getTemplateContentsOwner(doc) {
-    if (!doc.defaultView)
-      return doc;
-    var d = templateContentsOwnerTable.get(doc);
-    if (!d) {
-      // TODO(arv): This should either be a Document or HTMLDocument depending
-      // on doc.
-      d = doc.implementation.createHTMLDocument('');
-      while (d.lastChild) {
-        d.removeChild(d.lastChild);
-      }
-      templateContentsOwnerTable.set(doc, d);
-    }
-    return d;
-  }
-
-  function extractContent(templateElement) {
-    // templateElement is not a wrapper here.
-    var doc = getTemplateContentsOwner(templateElement.ownerDocument);
-    var df = unwrap(doc.createDocumentFragment());
-    var child;
-    while (child = templateElement.firstChild) {
-      df.appendChild(child);
-    }
-    return df;
-  }
-
-  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
-
-  function HTMLTemplateElement(node) {
-    HTMLElement.call(this, node);
-    if (!OriginalHTMLTemplateElement) {
-      var content = extractContent(node);
-      contentTable.set(this, wrap(content));
-    }
-  }
-  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
-
-  mixin(HTMLTemplateElement.prototype, {
-    constructor: HTMLTemplateElement,
-    get content() {
-      if (OriginalHTMLTemplateElement)
-        return wrap(unsafeUnwrap(this).content);
-      return contentTable.get(this);
-    },
-
-    // TODO(arv): cloneNode needs to clone content.
-
-  });
-
-  if (OriginalHTMLTemplateElement)
-    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
-
-  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLMediaElement = window.HTMLMediaElement;
-
-  if (!OriginalHTMLMediaElement) return;
-
-  function HTMLMediaElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
-
-  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
-                  document.createElement('audio'));
-
-  scope.wrappers.HTMLMediaElement = HTMLMediaElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var rewrap = scope.rewrap;
-
-  var OriginalHTMLAudioElement = window.HTMLAudioElement;
-
-  if (!OriginalHTMLAudioElement) return;
-
-  function HTMLAudioElement(node) {
-    HTMLMediaElement.call(this, node);
-  }
-  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
-
-  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
-                  document.createElement('audio'));
-
-  function Audio(src) {
-    if (!(this instanceof Audio)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('audio'));
-    HTMLMediaElement.call(this, node);
-    rewrap(node, this);
-
-    node.setAttribute('preload', 'auto');
-    if (src !== undefined)
-      node.setAttribute('src', src);
-  }
-
-  Audio.prototype = HTMLAudioElement.prototype;
-
-  scope.wrappers.HTMLAudioElement = HTMLAudioElement;
-  scope.wrappers.Audio = Audio;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var rewrap = scope.rewrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLOptionElement = window.HTMLOptionElement;
-
-  function trimText(s) {
-    return s.replace(/\s+/g, ' ').trim();
-  }
-
-  function HTMLOptionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLOptionElement.prototype, {
-    get text() {
-      return trimText(this.textContent);
-    },
-    set text(value) {
-      this.textContent = trimText(String(value));
-    },
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-
-  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,
-                  document.createElement('option'));
-
-  function Option(text, value, defaultSelected, selected) {
-    if (!(this instanceof Option)) {
-      throw new TypeError(
-          'DOM object constructor cannot be called as a function.');
-    }
-
-    var node = unwrap(document.createElement('option'));
-    HTMLElement.call(this, node);
-    rewrap(node, this);
-
-    if (text !== undefined)
-      node.text = text;
-    if (value !== undefined)
-      node.setAttribute('value', value);
-    if (defaultSelected === true)
-      node.setAttribute('selected', '');
-    node.selected = selected === true;
-  }
-
-  Option.prototype = HTMLOptionElement.prototype;
-
-  scope.wrappers.HTMLOptionElement = HTMLOptionElement;
-  scope.wrappers.Option = Option;
-})(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 HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLSelectElement = window.HTMLSelectElement;
-
-  function HTMLSelectElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLSelectElement.prototype, {
-    add: function(element, before) {
-      if (typeof before === 'object')  // also includes null
-        before = unwrap(before);
-      unwrap(this).add(unwrap(element), before);
-    },
-
-    remove: function(indexOrNode) {
-      // Spec only allows index but implementations allow index or node.
-      // remove() is also allowed which is same as remove(undefined)
-      if (indexOrNode === undefined) {
-        HTMLElement.prototype.remove.call(this);
-        return;
-      }
-
-      if (typeof indexOrNode === 'object')
-        indexOrNode = unwrap(indexOrNode);
-
-      unwrap(this).remove(indexOrNode);
-    },
-
-    get form() {
-      return wrap(unwrap(this).form);
-    }
-  });
-
-  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,
-                  document.createElement('select'));
-
-  scope.wrappers.HTMLSelectElement = HTMLSelectElement;
-})(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 HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-
-  var OriginalHTMLTableElement = window.HTMLTableElement;
-
-  function HTMLTableElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableElement.prototype, {
-    get caption() {
-      return wrap(unwrap(this).caption);
-    },
-    createCaption: function() {
-      return wrap(unwrap(this).createCaption());
-    },
-
-    get tHead() {
-      return wrap(unwrap(this).tHead);
-    },
-    createTHead: function() {
-      return wrap(unwrap(this).createTHead());
-    },
-
-    createTFoot: function() {
-      return wrap(unwrap(this).createTFoot());
-    },
-    get tFoot() {
-      return wrap(unwrap(this).tFoot);
-    },
-
-    get tBodies() {
-      return wrapHTMLCollection(unwrap(this).tBodies);
-    },
-    createTBody: function() {
-      return wrap(unwrap(this).createTBody());
-    },
-
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,
-                  document.createElement('table'));
-
-  scope.wrappers.HTMLTableElement = HTMLTableElement;
-})(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 HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
-
-  function HTMLTableSectionElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableSectionElement.prototype, {
-    constructor: HTMLTableSectionElement,
-    get rows() {
-      return wrapHTMLCollection(unwrap(this).rows);
-    },
-    insertRow: function(index) {
-      return wrap(unwrap(this).insertRow(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,
-                  document.createElement('thead'));
-
-  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
-})(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 HTMLElement = scope.wrappers.HTMLElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var wrapHTMLCollection = scope.wrapHTMLCollection;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
-
-  function HTMLTableRowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLTableRowElement.prototype, {
-    get cells() {
-      return wrapHTMLCollection(unwrap(this).cells);
-    },
-
-    insertCell: function(index) {
-      return wrap(unwrap(this).insertCell(index));
-    }
-  });
-
-  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,
-                  document.createElement('tr'));
-
-  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
-
-  function HTMLUnknownElement(node) {
-    switch (node.localName) {
-      case 'content':
-        return new HTMLContentElement(node);
-      case 'shadow':
-        return new HTMLShadowElement(node);
-      case 'template':
-        return new HTMLTemplateElement(node);
-    }
-    HTMLElement.call(this, node);
-  }
-  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
-  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
-  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
-})(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 Element = scope.wrappers.Element;
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var registerObject = scope.registerObject;
-
-  var SVG_NS = 'http://www.w3.org/2000/svg';
-  var svgTitleElement = document.createElementNS(SVG_NS, 'title');
-  var SVGTitleElement = registerObject(svgTitleElement);
-  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
-
-  // IE11 does not have classList for SVG elements. The spec says that classList
-  // is an accessor on Element, but IE11 puts classList on HTMLElement, leaving
-  // SVGElement without a classList property. We therefore move the accessor for
-  // IE11.
-  if (!('classList' in svgTitleElement)) {
-    var descr = Object.getOwnPropertyDescriptor(Element.prototype, 'classList');
-    Object.defineProperty(HTMLElement.prototype, 'classList', descr);
-    delete Element.prototype.classList;
-  }
-
-  scope.wrappers.SVGElement = SVGElement;
-})(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 mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var OriginalSVGUseElement = window.SVGUseElement;
-
-  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses
-  // SVGGraphicsElement. Use the <g> element to get the right prototype.
-
-  var SVG_NS = 'http://www.w3.org/2000/svg';
-  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));
-  var useElement = document.createElementNS(SVG_NS, 'use');
-  var SVGGElement = gWrapper.constructor;
-  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
-  var parentInterface = parentInterfacePrototype.constructor;
-
-  function SVGUseElement(impl) {
-    parentInterface.call(this, impl);
-  }
-
-  SVGUseElement.prototype = Object.create(parentInterfacePrototype);
-
-  // Firefox does not expose instanceRoot.
-  if ('instanceRoot' in useElement) {
-    mixin(SVGUseElement.prototype, {
-      get instanceRoot() {
-        return wrap(unwrap(this).instanceRoot);
-      },
-      get animatedInstanceRoot() {
-        return wrap(unwrap(this).animatedInstanceRoot);
-      },
-    });
-  }
-
-  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
-
-  scope.wrappers.SVGUseElement = SVGUseElement;
-})(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 EventTarget = scope.wrappers.EventTarget;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var wrap = scope.wrap;
-
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-  if (!OriginalSVGElementInstance)
-    return;
-
-  function SVGElementInstance(impl) {
-    EventTarget.call(this, impl);
-  }
-
-  SVGElementInstance.prototype = Object.create(EventTarget.prototype);
-  mixin(SVGElementInstance.prototype, {
-    /** @type {SVGElement} */
-    get correspondingElement() {
-      return wrap(unsafeUnwrap(this).correspondingElement);
-    },
-
-    /** @type {SVGUseElement} */
-    get correspondingUseElement() {
-      return wrap(unsafeUnwrap(this).correspondingUseElement);
-    },
-
-    /** @type {SVGElementInstance} */
-    get parentNode() {
-      return wrap(unsafeUnwrap(this).parentNode);
-    },
-
-    /** @type {SVGElementInstanceList} */
-    get childNodes() {
-      throw new Error('Not implemented');
-    },
-
-    /** @type {SVGElementInstance} */
-    get firstChild() {
-      return wrap(unsafeUnwrap(this).firstChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get lastChild() {
-      return wrap(unsafeUnwrap(this).lastChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get previousSibling() {
-      return wrap(unsafeUnwrap(this).previousSibling);
-    },
-
-    /** @type {SVGElementInstance} */
-    get nextSibling() {
-      return wrap(unsafeUnwrap(this).nextSibling);
-    }
-  });
-
-  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
-
-  scope.wrappers.SVGElementInstance = SVGElementInstance;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-
-  function CanvasRenderingContext2D(impl) {
-    setWrapper(impl, this);
-  }
-
-  mixin(CanvasRenderingContext2D.prototype, {
-    get canvas() {
-      return wrap(unsafeUnwrap(this).canvas);
-    },
-
-    drawImage: function() {
-      arguments[0] = unwrapIfNeeded(arguments[0]);
-      unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
-    },
-
-    createPattern: function() {
-      arguments[0] = unwrap(arguments[0]);
-      return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
-    }
-  });
-
-  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,
-                  document.createElement('canvas').getContext('2d'));
-
-  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-
-  // IE10 does not have WebGL.
-  if (!OriginalWebGLRenderingContext)
-    return;
-
-  function WebGLRenderingContext(impl) {
-    setWrapper(impl, this);
-  }
-
-  mixin(WebGLRenderingContext.prototype, {
-    get canvas() {
-      return wrap(unsafeUnwrap(this).canvas);
-    },
-
-    texImage2D: function() {
-      arguments[5] = unwrapIfNeeded(arguments[5]);
-      unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
-    },
-
-    texSubImage2D: function() {
-      arguments[6] = unwrapIfNeeded(arguments[6]);
-      unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
-    }
-  });
-
-  // Blink/WebKit has broken DOM bindings. Usually we would create an instance
-  // of the object and pass it into registerWrapper as a "blueprint" but
-  // creating WebGL contexts is expensive and might fail so we use a dummy
-  // object with dummy instance properties for these broken browsers.
-  var instanceProperties = /WebKit/.test(navigator.userAgent) ?
-      {drawingBufferHeight: null, drawingBufferWidth: null} : {};
-
-  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,
-      instanceProperties);
-
-  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalRange = window.Range;
-
-  function Range(impl) {
-    setWrapper(impl, this);
-  }
-  Range.prototype = {
-    get startContainer() {
-      return wrap(unsafeUnwrap(this).startContainer);
-    },
-    get endContainer() {
-      return wrap(unsafeUnwrap(this).endContainer);
-    },
-    get commonAncestorContainer() {
-      return wrap(unsafeUnwrap(this).commonAncestorContainer);
-    },
-    setStart: function(refNode,offset) {
-      unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
-    },
-    setEnd: function(refNode,offset) {
-      unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
-    },
-    setStartBefore: function(refNode) {
-      unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
-    },
-    setStartAfter: function(refNode) {
-      unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
-    },
-    setEndBefore: function(refNode) {
-      unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
-    },
-    setEndAfter: function(refNode) {
-      unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
-    },
-    selectNode: function(refNode) {
-      unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
-    },
-    selectNodeContents: function(refNode) {
-      unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
-    },
-    compareBoundaryPoints: function(how, sourceRange) {
-      return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
-    },
-    extractContents: function() {
-      return wrap(unsafeUnwrap(this).extractContents());
-    },
-    cloneContents: function() {
-      return wrap(unsafeUnwrap(this).cloneContents());
-    },
-    insertNode: function(node) {
-      unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
-    },
-    surroundContents: function(newParent) {
-      unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
-    },
-    cloneRange: function() {
-      return wrap(unsafeUnwrap(this).cloneRange());
-    },
-    isPointInRange: function(node, offset) {
-      return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
-    },
-    comparePoint: function(node, offset) {
-      return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
-    },
-    intersectsNode: function(node) {
-      return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return unsafeUnwrap(this).toString();
-    }
-  };
-
-  // IE9 does not have createContextualFragment.
-  if (OriginalRange.prototype.createContextualFragment) {
-    Range.prototype.createContextualFragment = function(html) {
-      return wrap(unsafeUnwrap(this).createContextualFragment(html));
-    };
-  }
-
-  registerWrapper(window.Range, Range, document.createRange());
-
-  scope.wrappers.Range = Range;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var mixin = scope.mixin;
-  var registerObject = scope.registerObject;
-
-  var DocumentFragment = registerObject(document.createDocumentFragment());
-  mixin(DocumentFragment.prototype, ParentNodeInterface);
-  mixin(DocumentFragment.prototype, SelectorsInterface);
-  mixin(DocumentFragment.prototype, GetElementsByInterface);
-
-  var Comment = registerObject(document.createComment(''));
-
-  scope.wrappers.Comment = Comment;
-  scope.wrappers.DocumentFragment = DocumentFragment;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var DocumentFragment = scope.wrappers.DocumentFragment;
-  var TreeScope = scope.TreeScope;
-  var elementFromPoint = scope.elementFromPoint;
-  var getInnerHTML = scope.getInnerHTML;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var rewrap = scope.rewrap;
-  var setInnerHTML = scope.setInnerHTML;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-
-  var shadowHostTable = new WeakMap();
-  var nextOlderShadowTreeTable = new WeakMap();
-
-  var spaceCharRe = /[ \t\n\r\f]/;
-
-  function ShadowRoot(hostWrapper) {
-    var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
-    DocumentFragment.call(this, node);
-
-    // createDocumentFragment associates the node with a wrapper
-    // DocumentFragment instance. Override that.
-    rewrap(node, this);
-
-    var oldShadowRoot = hostWrapper.shadowRoot;
-    nextOlderShadowTreeTable.set(this, oldShadowRoot);
-
-    this.treeScope_ =
-        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
-
-    shadowHostTable.set(this, hostWrapper);
-  }
-  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
-  mixin(ShadowRoot.prototype, {
-    constructor: ShadowRoot,
-
-    get innerHTML() {
-      return getInnerHTML(this);
-    },
-    set innerHTML(value) {
-      setInnerHTML(this, value);
-      this.invalidateShadowRenderer();
-    },
-
-    get olderShadowRoot() {
-      return nextOlderShadowTreeTable.get(this) || null;
-    },
-
-    get host() {
-      return shadowHostTable.get(this) || null;
-    },
-
-    invalidateShadowRenderer: function() {
-      return shadowHostTable.get(this).invalidateShadowRenderer();
-    },
-
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this.ownerDocument, x, y);
-    },
-
-    getElementById: function(id) {
-      if (spaceCharRe.test(id))
-        return null;
-      return this.querySelector('[id="' + id + '"]');
-    }
-  });
-
-  scope.wrappers.ShadowRoot = ShadowRoot;
-
-})(window.ShadowDOMPolyfill);
-
-// Copyright 2013 The Polymer Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-(function(scope) {
-  'use strict';
-
-  var Element = scope.wrappers.Element;
-  var HTMLContentElement = scope.wrappers.HTMLContentElement;
-  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
-  var Node = scope.wrappers.Node;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var assert = scope.assert;
-  var getTreeScope = scope.getTreeScope;
-  var mixin = scope.mixin;
-  var oneOf = scope.oneOf;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  /**
-   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
-   * Up means parentNode
-   * Sideways means previous and next sibling.
-   * @param {!Node} wrapper
-   */
-  function updateWrapperUpAndSideways(wrapper) {
-    wrapper.previousSibling_ = wrapper.previousSibling;
-    wrapper.nextSibling_ = wrapper.nextSibling;
-    wrapper.parentNode_ = wrapper.parentNode;
-  }
-
-  /**
-   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
-   * Down means first and last child
-   * @param {!Node} wrapper
-   */
-  function updateWrapperDown(wrapper) {
-    wrapper.firstChild_ = wrapper.firstChild;
-    wrapper.lastChild_ = wrapper.lastChild;
-  }
-
-  function updateAllChildNodes(parentNodeWrapper) {
-    assert(parentNodeWrapper instanceof Node);
-    for (var childWrapper = parentNodeWrapper.firstChild;
-         childWrapper;
-         childWrapper = childWrapper.nextSibling) {
-      updateWrapperUpAndSideways(childWrapper);
-    }
-    updateWrapperDown(parentNodeWrapper);
-  }
-
-  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
-    var parentNode = unwrap(parentNodeWrapper);
-    var newChild = unwrap(newChildWrapper);
-    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
-
-    remove(newChildWrapper);
-    updateWrapperUpAndSideways(newChildWrapper);
-
-    if (!refChildWrapper) {
-      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
-      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)
-        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
-
-      var lastChildWrapper = wrap(parentNode.lastChild);
-      if (lastChildWrapper)
-        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
-    } else {
-      if (parentNodeWrapper.firstChild === refChildWrapper)
-        parentNodeWrapper.firstChild_ = refChildWrapper;
-
-      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
-    }
-
-    scope.originalInsertBefore.call(parentNode, newChild, refChild);
-  }
-
-  function remove(nodeWrapper) {
-    var node = unwrap(nodeWrapper)
-    var parentNode = node.parentNode;
-    if (!parentNode)
-      return;
-
-    var parentNodeWrapper = wrap(parentNode);
-    updateWrapperUpAndSideways(nodeWrapper);
-
-    if (nodeWrapper.previousSibling)
-      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
-    if (nodeWrapper.nextSibling)
-      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
-
-    if (parentNodeWrapper.lastChild === nodeWrapper)
-      parentNodeWrapper.lastChild_ = nodeWrapper;
-    if (parentNodeWrapper.firstChild === nodeWrapper)
-      parentNodeWrapper.firstChild_ = nodeWrapper;
-
-    scope.originalRemoveChild.call(parentNode, node);
-  }
-
-  var distributedNodesTable = new WeakMap();
-  var destinationInsertionPointsTable = new WeakMap();
-  var rendererForHostTable = new WeakMap();
-
-  function resetDistributedNodes(insertionPoint) {
-    distributedNodesTable.set(insertionPoint, []);
-  }
-
-  function getDistributedNodes(insertionPoint) {
-    var rv = distributedNodesTable.get(insertionPoint);
-    if (!rv)
-      distributedNodesTable.set(insertionPoint, rv = []);
-    return rv;
-  }
-
-  function getChildNodesSnapshot(node) {
-    var result = [], i = 0;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      result[i++] = child;
-    }
-    return result;
-  }
-
-  var request = oneOf(window, [
-    'requestAnimationFrame',
-    'mozRequestAnimationFrame',
-    'webkitRequestAnimationFrame',
-    'setTimeout'
-  ]);
-
-  var pendingDirtyRenderers = [];
-  var renderTimer;
-
-  function renderAllPending() {
-    // TODO(arv): Order these in document order. That way we do not have to
-    // render something twice.
-    for (var i = 0; i < pendingDirtyRenderers.length; i++) {
-      var renderer = pendingDirtyRenderers[i];
-      var parentRenderer = renderer.parentRenderer;
-      if (parentRenderer && parentRenderer.dirty)
-        continue;
-      renderer.render();
-    }
-
-    pendingDirtyRenderers = [];
-  }
-
-  function handleRequestAnimationFrame() {
-    renderTimer = null;
-    renderAllPending();
-  }
-
-  /**
-   * Returns existing shadow renderer for a host or creates it if it is needed.
-   * @params {!Element} host
-   * @return {!ShadowRenderer}
-   */
-  function getRendererForHost(host) {
-    var renderer = rendererForHostTable.get(host);
-    if (!renderer) {
-      renderer = new ShadowRenderer(host);
-      rendererForHostTable.set(host, renderer);
-    }
-    return renderer;
-  }
-
-  function getShadowRootAncestor(node) {
-    var root = getTreeScope(node).root;
-    if (root instanceof ShadowRoot)
-      return root;
-    return null;
-  }
-
-  function getRendererForShadowRoot(shadowRoot) {
-    return getRendererForHost(shadowRoot.host);
-  }
-
-  var spliceDiff = new ArraySplice();
-  spliceDiff.equals = function(renderNode, rawNode) {
-    return unwrap(renderNode.node) === rawNode;
-  };
-
-  /**
-   * RenderNode is used as an in memory "render tree". When we render the
-   * composed tree we create a tree of RenderNodes, then we diff this against
-   * the real DOM tree and make minimal changes as needed.
-   */
-  function RenderNode(node) {
-    this.skip = false;
-    this.node = node;
-    this.childNodes = [];
-  }
-
-  RenderNode.prototype = {
-    append: function(node) {
-      var rv = new RenderNode(node);
-      this.childNodes.push(rv);
-      return rv;
-    },
-
-    sync: function(opt_added) {
-      if (this.skip)
-        return;
-
-      var nodeWrapper = this.node;
-      // plain array of RenderNodes
-      var newChildren = this.childNodes;
-      // plain array of real nodes.
-      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
-      var added = opt_added || new WeakMap();
-
-      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
-
-      var newIndex = 0, oldIndex = 0;
-      var lastIndex = 0;
-      for (var i = 0; i < splices.length; i++) {
-        var splice = splices[i];
-        for (; lastIndex < splice.index; lastIndex++) {
-          oldIndex++;
-          newChildren[newIndex++].sync(added);
-        }
-
-        var removedCount = splice.removed.length;
-        for (var j = 0; j < removedCount; j++) {
-          var wrapper = wrap(oldChildren[oldIndex++]);
-          if (!added.get(wrapper))
-            remove(wrapper);
-        }
-
-        var addedCount = splice.addedCount;
-        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
-        for (var j = 0; j < addedCount; j++) {
-          var newChildRenderNode = newChildren[newIndex++];
-          var newChildWrapper = newChildRenderNode.node;
-          insertBefore(nodeWrapper, newChildWrapper, refNode);
-
-          // Keep track of added so that we do not remove the node after it
-          // has been added.
-          added.set(newChildWrapper, true);
-
-          newChildRenderNode.sync(added);
-        }
-
-        lastIndex += addedCount;
-      }
-
-      for (var i = lastIndex; i < newChildren.length; i++) {
-        newChildren[i].sync(added);
-      }
-    }
-  };
-
-  function ShadowRenderer(host) {
-    this.host = host;
-    this.dirty = false;
-    this.invalidateAttributes();
-    this.associateNode(host);
-  }
-
-  ShadowRenderer.prototype = {
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees
-    render: function(opt_renderNode) {
-      if (!this.dirty)
-        return;
-
-      this.invalidateAttributes();
-
-      var host = this.host;
-
-      this.distribution(host);
-      var renderNode = opt_renderNode || new RenderNode(host);
-      this.buildRenderTree(renderNode, host);
-
-      var topMostRenderer = !opt_renderNode;
-      if (topMostRenderer)
-        renderNode.sync();
-
-      this.dirty = false;
-    },
-
-    get parentRenderer() {
-      return getTreeScope(this.host).renderer;
-    },
-
-    invalidate: function() {
-      if (!this.dirty) {
-        this.dirty = true;
-        var parentRenderer = this.parentRenderer;
-        if (parentRenderer)
-          parentRenderer.invalidate();
-        pendingDirtyRenderers.push(this);
-        if (renderTimer)
-          return;
-        renderTimer = window[request](handleRequestAnimationFrame, 0);
-      }
-    },
-
-    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms
-    distribution: function(root) {
-      this.resetAllSubtrees(root);
-      this.distributionResolution(root);
-    },
-
-    resetAll: function(node) {
-      if (isInsertionPoint(node))
-        resetDistributedNodes(node);
-      else
-        resetDestinationInsertionPoints(node);
-
-      this.resetAllSubtrees(node);
-    },
-
-    resetAllSubtrees: function(node) {
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.resetAll(child);
-      }
-
-      if (node.shadowRoot)
-        this.resetAll(node.shadowRoot);
-
-      if (node.olderShadowRoot)
-        this.resetAll(node.olderShadowRoot);
-    },
-
-    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results
-    distributionResolution: function(node) {
-      if (isShadowHost(node)) {
-        var shadowHost = node;
-        // 1.1
-        var pool = poolPopulation(shadowHost);
-
-        var shadowTrees = getShadowTrees(shadowHost);
-
-        // 1.2
-        for (var i = 0; i < shadowTrees.length; i++) {
-          // 1.2.1
-          this.poolDistribution(shadowTrees[i], pool);
-        }
-
-        // 1.3
-        for (var i = shadowTrees.length - 1; i >= 0; i--) {
-          var shadowTree = shadowTrees[i];
-
-          // 1.3.1
-          // TODO(arv): We should keep the shadow insertion points on the
-          // shadow root (or renderer) so we don't have to search the tree
-          // every time.
-          var shadow = getShadowInsertionPoint(shadowTree);
-
-          // 1.3.2
-          if (shadow) {
-
-            // 1.3.2.1
-            var olderShadowRoot = shadowTree.olderShadowRoot;
-            if (olderShadowRoot) {
-              // 1.3.2.1.1
-              pool = poolPopulation(olderShadowRoot);
-            }
-
-            // 1.3.2.2
-            for (var j = 0; j < pool.length; j++) {
-              // 1.3.2.2.1
-              destributeNodeInto(pool[j], shadow);
-            }
-          }
-
-          // 1.3.3
-          this.distributionResolution(shadowTree);
-        }
-      }
-
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.distributionResolution(child);
-      }
-    },
-
-    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm
-    poolDistribution: function (node, pool) {
-      if (node instanceof HTMLShadowElement)
-        return;
-
-      if (node instanceof HTMLContentElement) {
-        var content = node;
-        this.updateDependentAttributes(content.getAttribute('select'));
-
-        var anyDistributed = false;
-
-        // 1.1
-        for (var i = 0; i < pool.length; i++) {
-          var node = pool[i];
-          if (!node)
-            continue;
-          if (matches(node, content)) {
-            destributeNodeInto(node, content);
-            pool[i] = undefined;
-            anyDistributed = true;
-          }
-        }
-
-        // 1.2
-        // Fallback content
-        if (!anyDistributed) {
-          for (var child = content.firstChild;
-               child;
-               child = child.nextSibling) {
-            destributeNodeInto(child, content);
-          }
-        }
-
-        return;
-      }
-
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.poolDistribution(child, pool);
-      }
-    },
-
-    buildRenderTree: function(renderNode, node) {
-      var children = this.compose(node);
-      for (var i = 0; i < children.length; i++) {
-        var child = children[i];
-        var childRenderNode = renderNode.append(child);
-        this.buildRenderTree(childRenderNode, child);
-      }
-
-      if (isShadowHost(node)) {
-        var renderer = getRendererForHost(node);
-        renderer.dirty = false;
-      }
-
-    },
-
-    compose: function(node) {
-      var children = [];
-      var p = node.shadowRoot || node;
-      for (var child = p.firstChild; child; child = child.nextSibling) {
-        if (isInsertionPoint(child)) {
-          this.associateNode(p);
-          var distributedNodes = getDistributedNodes(child);
-          for (var j = 0; j < distributedNodes.length; j++) {
-            var distributedNode = distributedNodes[j];
-            if (isFinalDestination(child, distributedNode))
-              children.push(distributedNode);
-          }
-        } else {
-          children.push(child);
-        }
-      }
-      return children;
-    },
-
-    /**
-     * Invalidates the attributes used to keep track of which attributes may
-     * cause the renderer to be invalidated.
-     */
-    invalidateAttributes: function() {
-      this.attributes = Object.create(null);
-    },
-
-    /**
-     * Parses the selector and makes this renderer dependent on the attribute
-     * being used in the selector.
-     * @param {string} selector
-     */
-    updateDependentAttributes: function(selector) {
-      if (!selector)
-        return;
-
-      var attributes = this.attributes;
-
-      // .class
-      if (/\.\w+/.test(selector))
-        attributes['class'] = true;
-
-      // #id
-      if (/#\w+/.test(selector))
-        attributes['id'] = true;
-
-      selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
-        attributes[name] = true;
-      });
-
-      // Pseudo selectors have been removed from the spec.
-    },
-
-    dependsOnAttribute: function(name) {
-      return this.attributes[name];
-    },
-
-    associateNode: function(node) {
-      unsafeUnwrap(node).polymerShadowRenderer_ = this;
-    }
-  };
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm
-  function poolPopulation(node) {
-    var pool = [];
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      if (isInsertionPoint(child)) {
-        pool.push.apply(pool, getDistributedNodes(child));
-      } else {
-        pool.push(child);
-      }
-    }
-    return pool;
-  }
-
-  function getShadowInsertionPoint(node) {
-    if (node instanceof HTMLShadowElement)
-      return node;
-    if (node instanceof HTMLContentElement)
-      return null;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      var res = getShadowInsertionPoint(child);
-      if (res)
-        return res;
-    }
-    return null;
-  }
-
-  function destributeNodeInto(child, insertionPoint) {
-    getDistributedNodes(insertionPoint).push(child);
-    var points = destinationInsertionPointsTable.get(child);
-    if (!points)
-      destinationInsertionPointsTable.set(child, [insertionPoint]);
-    else
-      points.push(insertionPoint);
-  }
-
-  function getDestinationInsertionPoints(node) {
-    return destinationInsertionPointsTable.get(node);
-  }
-
-  function resetDestinationInsertionPoints(node) {
-    // IE11 crashes when delete is used.
-    destinationInsertionPointsTable.set(node, undefined);
-  }
-
-  // AllowedSelectors :
-  //   TypeSelector
-  //   *
-  //   ClassSelector
-  //   IDSelector
-  //   AttributeSelector
-  //   negation
-  var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
-
-  function matches(node, contentElement) {
-    var select = contentElement.getAttribute('select');
-    if (!select)
-      return true;
-
-    // Here we know the select attribute is a non empty string.
-    select = select.trim();
-    if (!select)
-      return true;
-
-    if (!(node instanceof Element))
-      return false;
-
-    if (!selectorStartCharRe.test(select))
-      return false;
-
-    try {
-      return node.matches(select);
-    } catch (ex) {
-      // Invalid selector.
-      return false;
-    }
-  }
-
-  function isFinalDestination(insertionPoint, node) {
-    var points = getDestinationInsertionPoints(node);
-    return points && points[points.length - 1] === insertionPoint;
-  }
-
-  function isInsertionPoint(node) {
-    return node instanceof HTMLContentElement ||
-           node instanceof HTMLShadowElement;
-  }
-
-  function isShadowHost(shadowHost) {
-    return shadowHost.shadowRoot;
-  }
-
-  // Returns the shadow trees as an array, with the youngest tree at the
-  // beginning of the array.
-  function getShadowTrees(host) {
-    var trees = [];
-
-    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
-      trees.push(tree);
-    }
-    return trees;
-  }
-
-  function render(host) {
-    new ShadowRenderer(host).render();
-  };
-
-  // Need to rerender shadow host when:
-  //
-  // - a direct child to the ShadowRoot is added or removed
-  // - a direct child to the host is added or removed
-  // - a new shadow root is created
-  // - a direct child to a content/shadow element is added or removed
-  // - a sibling to a content/shadow element is added or removed
-  // - content[select] is changed
-  // - an attribute in a direct child to a host is modified
-
-  /**
-   * This gets called when a node was added or removed to it.
-   */
-  Node.prototype.invalidateShadowRenderer = function(force) {
-    var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
-    if (renderer) {
-      renderer.invalidate();
-      return true;
-    }
-
-    return false;
-  };
-
-  HTMLContentElement.prototype.getDistributedNodes =
-  HTMLShadowElement.prototype.getDistributedNodes = function() {
-    // TODO(arv): We should only rerender the dirty ancestor renderers (from
-    // the root and down).
-    renderAllPending();
-    return getDistributedNodes(this);
-  };
-
-  Element.prototype.getDestinationInsertionPoints = function() {
-    renderAllPending();
-    return getDestinationInsertionPoints(this) || [];
-  };
-
-  HTMLContentElement.prototype.nodeIsInserted_ =
-  HTMLShadowElement.prototype.nodeIsInserted_ = function() {
-    // Invalidate old renderer if any.
-    this.invalidateShadowRenderer();
-
-    var shadowRoot = getShadowRootAncestor(this);
-    var renderer;
-    if (shadowRoot)
-      renderer = getRendererForShadowRoot(shadowRoot);
-    unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
-    if (renderer)
-      renderer.invalidate();
-  };
-
-  scope.getRendererForHost = getRendererForHost;
-  scope.getShadowTrees = getShadowTrees;
-  scope.renderAllPending = renderAllPending;
-
-  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
-
-  // Exposed for testing
-  scope.visual = {
-    insertBefore: insertBefore,
-    remove: remove,
-  };
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var HTMLElement = scope.wrappers.HTMLElement;
-  var assert = scope.assert;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  var elementsWithFormProperty = [
-    'HTMLButtonElement',
-    'HTMLFieldSetElement',
-    'HTMLInputElement',
-    'HTMLKeygenElement',
-    'HTMLLabelElement',
-    'HTMLLegendElement',
-    'HTMLObjectElement',
-    // HTMLOptionElement is handled in HTMLOptionElement.js
-    'HTMLOutputElement',
-    // HTMLSelectElement is handled in HTMLSelectElement.js
-    'HTMLTextAreaElement',
-  ];
-
-  function createWrapperConstructor(name) {
-    if (!window[name])
-      return;
-
-    // Ensure we are not overriding an already existing constructor.
-    assert(!scope.wrappers[name]);
-
-    var GeneratedWrapper = function(node) {
-      // At this point all of them extend HTMLElement.
-      HTMLElement.call(this, node);
-    }
-    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
-    mixin(GeneratedWrapper.prototype, {
-      get form() {
-        return wrap(unwrap(this).form);
-      },
-    });
-
-    registerWrapper(window[name], GeneratedWrapper,
-        document.createElement(name.slice(4, -7)));
-    scope.wrappers[name] = GeneratedWrapper;
-  }
-
-  elementsWithFormProperty.forEach(createWrapperConstructor);
-
-})(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 registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalSelection = window.Selection;
-
-  function Selection(impl) {
-    setWrapper(impl, this);
-  }
-  Selection.prototype = {
-    get anchorNode() {
-      return wrap(unsafeUnwrap(this).anchorNode);
-    },
-    get focusNode() {
-      return wrap(unsafeUnwrap(this).focusNode);
-    },
-    addRange: function(range) {
-      unsafeUnwrap(this).addRange(unwrap(range));
-    },
-    collapse: function(node, index) {
-      unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
-    },
-    containsNode: function(node, allowPartial) {
-      return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
-    },
-    extend: function(node, offset) {
-      unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
-    },
-    getRangeAt: function(index) {
-      return wrap(unsafeUnwrap(this).getRangeAt(index));
-    },
-    removeRange: function(range) {
-      unsafeUnwrap(this).removeRange(unwrap(range));
-    },
-    selectAllChildren: function(node) {
-      unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return unsafeUnwrap(this).toString();
-    }
-  };
-
-  // WebKit extensions. Not implemented.
-  // readonly attribute Node baseNode;
-  // readonly attribute long baseOffset;
-  // readonly attribute Node extentNode;
-  // readonly attribute long extentOffset;
-  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,
-  //                       [Default=Undefined] optional long baseOffset,
-  //                       [Default=Undefined] optional Node extentNode,
-  //                       [Default=Undefined] optional long extentOffset);
-  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,
-  //                  [Default=Undefined] optional long offset);
-
-  registerWrapper(window.Selection, Selection, window.getSelection());
-
-  scope.wrappers.Selection = Selection;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var GetElementsByInterface = scope.GetElementsByInterface;
-  var Node = scope.wrappers.Node;
-  var ParentNodeInterface = scope.ParentNodeInterface;
-  var Selection = scope.wrappers.Selection;
-  var SelectorsInterface = scope.SelectorsInterface;
-  var ShadowRoot = scope.wrappers.ShadowRoot;
-  var TreeScope = scope.TreeScope;
-  var cloneNode = scope.cloneNode;
-  var defineWrapGetter = scope.defineWrapGetter;
-  var elementFromPoint = scope.elementFromPoint;
-  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
-  var matchesNames = scope.matchesNames;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var rewrap = scope.rewrap;
-  var setWrapper = scope.setWrapper;
-  var unsafeUnwrap = scope.unsafeUnwrap;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-  var wrapEventTargetMethods = scope.wrapEventTargetMethods;
-  var wrapNodeList = scope.wrapNodeList;
-
-  var implementationTable = new WeakMap();
-
-  function Document(node) {
-    Node.call(this, node);
-    this.treeScope_ = new TreeScope(this, null);
-  }
-  Document.prototype = Object.create(Node.prototype);
-
-  defineWrapGetter(Document, 'documentElement');
-
-  // Conceptually both body and head can be in a shadow but suporting that seems
-  // overkill at this point.
-  defineWrapGetter(Document, 'body');
-  defineWrapGetter(Document, 'head');
-
-  // document cannot be overridden so we override a bunch of its methods
-  // directly on the instance.
-
-  function wrapMethod(name) {
-    var original = document[name];
-    Document.prototype[name] = function() {
-      return wrap(original.apply(unsafeUnwrap(this), arguments));
-    };
-  }
-
-  [
-    'createComment',
-    'createDocumentFragment',
-    'createElement',
-    'createElementNS',
-    'createEvent',
-    'createEventNS',
-    'createRange',
-    'createTextNode',
-    'getElementById'
-  ].forEach(wrapMethod);
-
-  var originalAdoptNode = document.adoptNode;
-
-  function adoptNodeNoRemove(node, doc) {
-    originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
-    adoptSubtree(node, doc);
-  }
-
-  function adoptSubtree(node, doc) {
-    if (node.shadowRoot)
-      doc.adoptNode(node.shadowRoot);
-    if (node instanceof ShadowRoot)
-      adoptOlderShadowRoots(node, doc);
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      adoptSubtree(child, doc);
-    }
-  }
-
-  function adoptOlderShadowRoots(shadowRoot, doc) {
-    var oldShadowRoot = shadowRoot.olderShadowRoot;
-    if (oldShadowRoot)
-      doc.adoptNode(oldShadowRoot);
-  }
-
-  var originalGetSelection = document.getSelection;
-
-  mixin(Document.prototype, {
-    adoptNode: function(node) {
-      if (node.parentNode)
-        node.parentNode.removeChild(node);
-      adoptNodeNoRemove(node, this);
-      return node;
-    },
-    elementFromPoint: function(x, y) {
-      return elementFromPoint(this, this, x, y);
-    },
-    importNode: function(node, deep) {
-      return cloneNode(node, deep, unsafeUnwrap(this));
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    },
-    getElementsByName: function(name) {
-      return SelectorsInterface.querySelectorAll.call(this,
-          '[name=' + JSON.stringify(String(name)) + ']');
-    }
-  });
-
-  if (document.registerElement) {
-    var originalRegisterElement = document.registerElement;
-    Document.prototype.registerElement = function(tagName, object) {
-      var prototype, extendsOption;
-      if (object !== undefined) {
-        prototype = object.prototype;
-        extendsOption = object.extends;
-      }
-
-      if (!prototype)
-        prototype = Object.create(HTMLElement.prototype);
-
-
-      // If we already used the object as a prototype for another custom
-      // element.
-      if (scope.nativePrototypeTable.get(prototype)) {
-        // TODO(arv): DOMException
-        throw new Error('NotSupportedError');
-      }
-
-      // Find first object on the prototype chain that already have a native
-      // prototype. Keep track of all the objects before that so we can create
-      // a similar structure for the native case.
-      var proto = Object.getPrototypeOf(prototype);
-      var nativePrototype;
-      var prototypes = [];
-      while (proto) {
-        nativePrototype = scope.nativePrototypeTable.get(proto);
-        if (nativePrototype)
-          break;
-        prototypes.push(proto);
-        proto = Object.getPrototypeOf(proto);
-      }
-
-      if (!nativePrototype) {
-        // TODO(arv): DOMException
-        throw new Error('NotSupportedError');
-      }
-
-      // This works by creating a new prototype object that is empty, but has
-      // the native prototype as its proto. The original prototype object
-      // passed into register is used as the wrapper prototype.
-
-      var newPrototype = Object.create(nativePrototype);
-      for (var i = prototypes.length - 1; i >= 0; i--) {
-        newPrototype = Object.create(newPrototype);
-      }
-
-      // Add callbacks if present.
-      // Names are taken from:
-      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156
-      // and not from the spec since the spec is out of date.
-      [
-        'createdCallback',
-        'attachedCallback',
-        'detachedCallback',
-        'attributeChangedCallback',
-      ].forEach(function(name) {
-        var f = prototype[name];
-        if (!f)
-          return;
-        newPrototype[name] = function() {
-          // if this element has been wrapped prior to registration,
-          // the wrapper is stale; in this case rewrap
-          if (!(wrap(this) instanceof CustomElementConstructor)) {
-            rewrap(this);
-          }
-          f.apply(wrap(this), arguments);
-        };
-      });
-
-      var p = {prototype: newPrototype};
-      if (extendsOption)
-        p.extends = extendsOption;
-
-      function CustomElementConstructor(node) {
-        if (!node) {
-          if (extendsOption) {
-            return document.createElement(extendsOption, tagName);
-          } else {
-            return document.createElement(tagName);
-          }
-        }
-        setWrapper(node, this);
-      }
-      CustomElementConstructor.prototype = prototype;
-      CustomElementConstructor.prototype.constructor = CustomElementConstructor;
-
-      scope.constructorTable.set(newPrototype, CustomElementConstructor);
-      scope.nativePrototypeTable.set(prototype, newPrototype);
-
-      // registration is synchronous so do it last
-      var nativeConstructor = originalRegisterElement.call(unwrap(this),
-          tagName, p);
-      return CustomElementConstructor;
-    };
-
-    forwardMethodsToWrapper([
-      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    ], [
-      'registerElement',
-    ]);
-  }
-
-  // We also override some of the methods on document.body and document.head
-  // for convenience.
-  forwardMethodsToWrapper([
-    window.HTMLBodyElement,
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    window.HTMLHeadElement,
-    window.HTMLHtmlElement,
-  ], [
-    'appendChild',
-    'compareDocumentPosition',
-    'contains',
-    'getElementsByClassName',
-    'getElementsByTagName',
-    'getElementsByTagNameNS',
-    'insertBefore',
-    'querySelector',
-    'querySelectorAll',
-    'removeChild',
-    'replaceChild',
-  ].concat(matchesNames));
-
-  forwardMethodsToWrapper([
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-  ], [
-    'adoptNode',
-    'importNode',
-    'contains',
-    'createComment',
-    'createDocumentFragment',
-    'createElement',
-    'createElementNS',
-    'createEvent',
-    'createEventNS',
-    'createRange',
-    'createTextNode',
-    'elementFromPoint',
-    'getElementById',
-    'getElementsByName',
-    'getSelection',
-  ]);
-
-  mixin(Document.prototype, GetElementsByInterface);
-  mixin(Document.prototype, ParentNodeInterface);
-  mixin(Document.prototype, SelectorsInterface);
-
-  mixin(Document.prototype, {
-    get implementation() {
-      var implementation = implementationTable.get(this);
-      if (implementation)
-        return implementation;
-      implementation =
-          new DOMImplementation(unwrap(this).implementation);
-      implementationTable.set(this, implementation);
-      return implementation;
-    },
-
-    get defaultView() {
-      return wrap(unwrap(this).defaultView);
-    }
-  });
-
-  registerWrapper(window.Document, Document,
-      document.implementation.createHTMLDocument(''));
-
-  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has
-  // one Document interface and IE implements the standard correctly.
-  if (window.HTMLDocument)
-    registerWrapper(window.HTMLDocument, Document);
-
-  wrapEventTargetMethods([
-    window.HTMLBodyElement,
-    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
-    window.HTMLHeadElement,
-  ]);
-
-  function DOMImplementation(impl) {
-    setWrapper(impl, this);
-  }
-
-  function wrapImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return wrap(original.apply(unsafeUnwrap(this), arguments));
-    };
-  }
-
-  function forwardImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return original.apply(unsafeUnwrap(this), arguments);
-    };
-  }
-
-  wrapImplMethod(DOMImplementation, 'createDocumentType');
-  wrapImplMethod(DOMImplementation, 'createDocument');
-  wrapImplMethod(DOMImplementation, 'createHTMLDocument');
-  forwardImplMethod(DOMImplementation, 'hasFeature');
-
-  registerWrapper(window.DOMImplementation, DOMImplementation);
-
-  forwardMethodsToWrapper([
-    window.DOMImplementation,
-  ], [
-    'createDocumentType',
-    'createDocument',
-    'createHTMLDocument',
-    'hasFeature',
-  ]);
-
-  scope.adoptNodeNoRemove = adoptNodeNoRemove;
-  scope.wrappers.DOMImplementation = DOMImplementation;
-  scope.wrappers.Document = Document;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var EventTarget = scope.wrappers.EventTarget;
-  var Selection = scope.wrappers.Selection;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var renderAllPending = scope.renderAllPending;
-  var unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalWindow = window.Window;
-  var originalGetComputedStyle = window.getComputedStyle;
-  var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
-  var originalGetSelection = window.getSelection;
-
-  function Window(impl) {
-    EventTarget.call(this, impl);
-  }
-  Window.prototype = Object.create(EventTarget.prototype);
-
-  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
-    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
-  };
-
-  // Mozilla proprietary extension.
-  if (originalGetDefaultComputedStyle) {
-    OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
-      return wrap(this || window).getDefaultComputedStyle(
-          unwrapIfNeeded(el), pseudo);
-    };
-  }
-
-  OriginalWindow.prototype.getSelection = function() {
-    return wrap(this || window).getSelection();
-  };
-
-  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
-  delete window.getComputedStyle;
-  delete window.getDefaultComputedStyle;
-  delete window.getSelection;
-
-  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(
-      function(name) {
-        OriginalWindow.prototype[name] = function() {
-          var w = wrap(this || window);
-          return w[name].apply(w, arguments);
-        };
-
-        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
-        delete window[name];
-      });
-
-  mixin(Window.prototype, {
-    getComputedStyle: function(el, pseudo) {
-      renderAllPending();
-      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),
-                                           pseudo);
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    },
-
-    get document() {
-      return wrap(unwrap(this).document);
-    }
-  });
-
-  // Mozilla proprietary extension.
-  if (originalGetDefaultComputedStyle) {
-    Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
-      renderAllPending();
-      return originalGetDefaultComputedStyle.call(unwrap(this),
-          unwrapIfNeeded(el),pseudo);
-    };
-  }
-
-  registerWrapper(OriginalWindow, Window, window);
-
-  scope.wrappers.Window = Window;
-
-})(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 unwrap = scope.unwrap;
-
-  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that
-  // requires wrapping. Since it is only a method we do not need a real wrapper,
-  // we can just override the method.
-
-  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
-  var OriginalDataTransferSetDragImage =
-      OriginalDataTransfer.prototype.setDragImage;
-
-  if (OriginalDataTransferSetDragImage) {
-    OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-      OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-    };
-  }
-
-})(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 registerWrapper = scope.registerWrapper;
-  var setWrapper = scope.setWrapper;
-  var unwrap = scope.unwrap;
-
-  var OriginalFormData = window.FormData;
-  if (!OriginalFormData) return;
-
-  function FormData(formElement) {
-    var impl;
-    if (formElement instanceof OriginalFormData) {
-      impl = formElement;
-    } else {
-      impl = new OriginalFormData(formElement && unwrap(formElement));
-    }
-    setWrapper(impl, this);
-  }
-
-  registerWrapper(OriginalFormData, FormData, new OriginalFormData());
-
-  scope.wrappers.FormData = FormData;
-
-})(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.
-
-(function(scope) {
-  'use strict';
-
-  var isWrapperFor = scope.isWrapperFor;
-
-  // This is a list of the elements we currently override the global constructor
-  // for.
-  var elements = {
-    'a': 'HTMLAnchorElement',
-    // Do not create an applet element by default since it shows a warning in
-    // IE.
-    // https://github.com/Polymer/polymer/issues/217
-    // 'applet': 'HTMLAppletElement',
-    'area': 'HTMLAreaElement',
-    'audio': 'HTMLAudioElement',
-    'base': 'HTMLBaseElement',
-    'body': 'HTMLBodyElement',
-    'br': 'HTMLBRElement',
-    'button': 'HTMLButtonElement',
-    'canvas': 'HTMLCanvasElement',
-    'caption': 'HTMLTableCaptionElement',
-    'col': 'HTMLTableColElement',
-    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.
-    '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',
-    // WebKit and Moz are wrong:
-    // https://bugs.webkit.org/show_bug.cgi?id=111469
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096
-    // 'td': 'HTMLTableCellElement',
-    'template': 'HTMLTemplateElement',
-    'textarea': 'HTMLTextAreaElement',
-    'thead': 'HTMLTableSectionElement',
-    'time': 'HTMLTimeElement',
-    'title': 'HTMLTitleElement',
-    'tr': 'HTMLTableRowElement',
-    'track': 'HTMLTrackElement',
-    'ul': 'HTMLUListElement',
-    'video': 'HTMLVideoElement',
-  };
-
-  function overrideConstructor(tagName) {
-    var nativeConstructorName = elements[tagName];
-    var nativeConstructor = window[nativeConstructorName];
-    if (!nativeConstructor)
-      return;
-    var element = document.createElement(tagName);
-    var wrapperConstructor = element.constructor;
-    window[nativeConstructorName] = wrapperConstructor;
-  }
-
-  Object.keys(elements).forEach(overrideConstructor);
-
-  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
-    window[name] = scope.wrappers[name]
-  });
-
-})(window.ShadowDOMPolyfill);
-
-/*
- * 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) {
-
-  // convenient global
-  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
-  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
-
-  // users may want to customize other types
-  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but
-  // I've left this code here in case we need to temporarily patch another
-  // type
-  /*
-  (function() {
-    var elts = {HTMLButtonElement: 'button'};
-    for (var c in elts) {
-      window[c] = function() { throw 'Patched Constructor'; };
-      window[c].prototype = Object.getPrototypeOf(
-          document.createElement(elts[c]));
-    }
-  })();
-  */
-
-  // patch in prefixed name
-  Object.defineProperty(Element.prototype, 'webkitShadowRoot',
-      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));
-
-  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-  Element.prototype.createShadowRoot = function() {
-    var root = originalCreateShadowRoot.call(this);
-    CustomElements.watchShadow(this);
-    return root;
-  };
-
-  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
-
-  function queryShadow(node, selector) {
-    var m, el = node.firstElementChild;
-    var shadows, sr, i;
-    shadows = [];
-    sr = node.shadowRoot;
-    while(sr) {
-      shadows.push(sr);
-      sr = sr.olderShadowRoot;
-    }
-    for(i = shadows.length - 1; i >= 0; i--) {
-      m = shadows[i].querySelector(selector);
-      if (m) {
-        return m;
-      }
-    }
-    while(el) {
-      m = queryShadow(el, selector);
-      if (m) {
-        return m;
-      }
-      el = el.nextElementSibling;
-    }
-    return null;
-  }
-
-  function queryAllShadows(node, selector, results) {
-    var el = node.firstElementChild;
-    var temp, sr, shadows, i, j;
-    shadows = [];
-    sr = node.shadowRoot;
-    while(sr) {
-      shadows.push(sr);
-      sr = sr.olderShadowRoot;
-    }
-    for (i = shadows.length - 1; i >= 0; i--) {
-      temp = shadows[i].querySelectorAll(selector);
-      for(j = 0; j < temp.length; j++) {
-        results.push(temp[j]);
-      }
-    }
-    while (el) {
-      queryAllShadows(el, selector, results);
-      el = el.nextElementSibling;
-    }
-    return results;
-  }
-
-  scope.queryAllShadows = function(node, selector, all) {
-    if (all) {
-      return queryAllShadows(node, selector, []);
-    } else {
-      return queryShadow(node, selector);
-    }
-  };
-})(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
- */
-
-/*
-  This is a limited shim for ShadowDOM css styling.
-  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
-  
-  The intention here is to support only the styling features which can be 
-  relatively simply implemented. The goal is to allow users to avoid the 
-  most obvious pitfalls and do so without compromising performance significantly. 
-  For ShadowDOM styling that's not covered here, a set of best practices
-  can be provided that should allow users to accomplish more complex styling.
-
-  The following is a list of specific ShadowDOM styling features and a brief
-  discussion of the approach used to shim.
-
-  Shimmed features:
-
-  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
-  element using the :host rule. To shim this feature, the :host styles are 
-  reformatted and prefixed with a given scope name and promoted to a 
-  document level stylesheet.
-  For example, given a scope name of .foo, a rule like this:
-  
-    :host {
-        background: red;
-      }
-    }
-  
-  becomes:
-  
-    .foo {
-      background: red;
-    }
-  
-  * encapsultion: Styles defined within ShadowDOM, apply only to 
-  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
-  this feature.
-  
-  By default, rules are prefixed with the host element tag name 
-  as a descendant selector. This ensures styling does not leak out of the 'top'
-  of the element's ShadowDOM. For example,
-
-  div {
-      font-weight: bold;
-    }
-  
-  becomes:
-
-  x-foo div {
-      font-weight: bold;
-    }
-  
-  becomes:
-
-
-  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then 
-  selectors are scoped by adding an attribute selector suffix to each
-  simple selector that contains the host element tag name. Each element 
-  in the element's ShadowDOM template is also given the scope attribute. 
-  Thus, these rules match only elements that have the scope attribute.
-  For example, given a scope name of x-foo, a rule like this:
-  
-    div {
-      font-weight: bold;
-    }
-  
-  becomes:
-  
-    div[x-foo] {
-      font-weight: bold;
-    }
-
-  Note that elements that are dynamically added to a scope must have the scope
-  selector added to them manually.
-
-  * upper/lower bound encapsulation: Styles which are defined outside a
-  shadowRoot should not cross the ShadowDOM boundary and should not apply
-  inside a shadowRoot.
-
-  This styling behavior is not emulated. Some possible ways to do this that 
-  were rejected due to complexity and/or performance concerns include: (1) reset
-  every possible property for every possible selector for a given scope name;
-  (2) re-implement css in javascript.
-  
-  As an alternative, users should make sure to use selectors
-  specific to the scope in which they are working.
-  
-  * ::distributed: This behavior is not emulated. It's often not necessary
-  to style the contents of a specific insertion point and instead, descendants
-  of the host element can be styled selectively. Users can also create an 
-  extra node around an insertion point and style that node's contents
-  via descendent selectors. For example, with a shadowRoot like this:
-  
-    <style>
-      ::content(div) {
-        background: red;
-      }
-    </style>
-    <content></content>
-  
-  could become:
-  
-    <style>
-      / *@polyfill .content-container div * / 
-      ::content(div) {
-        background: red;
-      }
-    </style>
-    <div class="content-container">
-      <content></content>
-    </div>
-  
-  Note the use of @polyfill in the comment above a ShadowDOM specific style
-  declaration. This is a directive to the styling shim to use the selector 
-  in comments in lieu of the next selector when running under polyfill.
-*/
-(function(scope) {
-
-var ShadowCSS = {
-  strictStyling: false,
-  registry: {},
-  // Shim styles for a given root associated with a name and extendsName
-  // 1. cache root styles by name
-  // 2. optionally tag root nodes with scope name
-  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */
-  // 4. shim :host and scoping
-  shimStyling: function(root, name, extendsName) {
-    var scopeStyles = this.prepareRoot(root, name, extendsName);
-    var typeExtension = this.isTypeExtension(extendsName);
-    var scopeSelector = this.makeScopeSelector(name, typeExtension);
-    // use caching to make working with styles nodes easier and to facilitate
-    // lookup of extendee
-    var cssText = stylesToCssText(scopeStyles, true);
-    cssText = this.scopeCssText(cssText, scopeSelector);
-    // cache shimmed css on root for user extensibility
-    if (root) {
-      root.shimmedStyle = cssText;
-    }
-    // add style to document
-    this.addCssToDocument(cssText, name);
-  },
-  /*
-  * Shim a style element with the given selector. Returns cssText that can
-  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
-  */
-  shimStyle: function(style, selector) {
-    return this.shimCssText(style.textContent, selector);
-  },
-  /*
-  * Shim some cssText with the given selector. Returns cssText that can
-  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
-  */
-  shimCssText: function(cssText, selector) {
-    cssText = this.insertDirectives(cssText);
-    return this.scopeCssText(cssText, selector);
-  },
-  makeScopeSelector: function(name, typeExtension) {
-    if (name) {
-      return typeExtension ? '[is=' + name + ']' : name;
-    }
-    return '';
-  },
-  isTypeExtension: function(extendsName) {
-    return extendsName && extendsName.indexOf('-') < 0;
-  },
-  prepareRoot: function(root, name, extendsName) {
-    var def = this.registerRoot(root, name, extendsName);
-    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
-    // remove existing style elements
-    this.removeStyles(root, def.rootStyles);
-    // apply strict attr
-    if (this.strictStyling) {
-      this.applyScopeToContent(root, name);
-    }
-    return def.scopeStyles;
-  },
-  removeStyles: function(root, styles) {
-    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {
-      s.parentNode.removeChild(s);
-    }
-  },
-  registerRoot: function(root, name, extendsName) {
-    var def = this.registry[name] = {
-      root: root,
-      name: name,
-      extendsName: extendsName
-    }
-    var styles = this.findStyles(root);
-    def.rootStyles = styles;
-    def.scopeStyles = def.rootStyles;
-    var extendee = this.registry[def.extendsName];
-    if (extendee) {
-      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
-    }
-    return def;
-  },
-  findStyles: function(root) {
-    if (!root) {
-      return [];
-    }
-    var styles = root.querySelectorAll('style');
-    return Array.prototype.filter.call(styles, function(s) {
-      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
-    });
-  },
-  applyScopeToContent: function(root, name) {
-    if (root) {
-      // add the name attribute to each node in root.
-      Array.prototype.forEach.call(root.querySelectorAll('*'),
-          function(node) {
-            node.setAttribute(name, '');
-          });
-      // and template contents too
-      Array.prototype.forEach.call(root.querySelectorAll('template'),
-          function(template) {
-            this.applyScopeToContent(template.content, name);
-          },
-          this);
-    }
-  },
-  insertDirectives: function(cssText) {
-    cssText = this.insertPolyfillDirectivesInCssText(cssText);
-    return this.insertPolyfillRulesInCssText(cssText);
-  },
-  /*
-   * Process styles to convert native ShadowDOM rules that will trip
-   * up the css parser; we rely on decorating the stylesheet with inert rules.
-   * 
-   * For example, we convert this rule:
-   * 
-   * polyfill-next-selector { content: ':host menu-item'; }
-   * ::content menu-item {
-   * 
-   * to this:
-   * 
-   * scopeName menu-item {
-   *
-  **/
-  insertPolyfillDirectivesInCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
-      // remove end comment delimiter and add block start
-      return p1.slice(0, -2) + '{';
-    });
-    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
-      return p1 + ' {';
-    });
-  },
-  /*
-   * Process styles to add rules which will only apply under the polyfill
-   * 
-   * For example, we convert this rule:
-   * 
-   * polyfill-rule {
-   *   content: ':host menu-item';
-   * ...
-   * }
-   * 
-   * to this:
-   * 
-   * scopeName menu-item {...}
-   *
-  **/
-  insertPolyfillRulesInCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
-      // remove end comment delimiter
-      return p1.slice(0, -1);
-    });
-    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
-      var rule = match.replace(p1, '').replace(p2, '');
-      return p3 + rule;
-    });
-  },
-  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
-   * 
-   *  .foo {... } 
-   *  
-   *  and converts this to
-   *  
-   *  scopeName .foo { ... }
-  */
-  scopeCssText: function(cssText, scopeSelector) {
-    var unscoped = this.extractUnscopedRulesFromCssText(cssText);
-    cssText = this.insertPolyfillHostInCssText(cssText);
-    cssText = this.convertColonHost(cssText);
-    cssText = this.convertColonHostContext(cssText);
-    cssText = this.convertShadowDOMSelectors(cssText);
-    if (scopeSelector) {
-      var self = this, cssText;
-      withCssRules(cssText, function(rules) {
-        cssText = self.scopeRules(rules, scopeSelector);
-      });
-
-    }
-    cssText = cssText + '\n' + unscoped;
-    return cssText.trim();
-  },
-  /*
-   * Process styles to add rules which will only apply under the polyfill
-   * and do not process via CSSOM. (CSSOM is destructive to rules on rare 
-   * occasions, e.g. -webkit-calc on Safari.)
-   * For example, we convert this rule:
-   * 
-   * (comment start) @polyfill-unscoped-rule menu-item { 
-   * ... } (comment end)
-   * 
-   * to this:
-   * 
-   * menu-item {...}
-   *
-  **/
-  extractUnscopedRulesFromCssText: function(cssText) {
-    // TODO(sorvell): remove either content or comment
-    var r = '', m;
-    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
-      r += m[1].slice(0, -1) + '\n\n';
-    }
-    while (m = cssContentUnscopedRuleRe.exec(cssText)) {
-      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\n\n';
-    }
-    return r;
-  },
-  /*
-   * convert a rule like :host(.foo) > .bar { }
-   *
-   * to
-   *
-   * scopeName.foo > .bar
-  */
-  convertColonHost: function(cssText) {
-    return this.convertColonRule(cssText, cssColonHostRe,
-        this.colonHostPartReplacer);
-  },
-  /*
-   * convert a rule like :host-context(.foo) > .bar { }
-   *
-   * to
-   *
-   * scopeName.foo > .bar, .foo scopeName > .bar { }
-   * 
-   * and
-   *
-   * :host-context(.foo:host) .bar { ... }
-   * 
-   * to
-   * 
-   * scopeName.foo .bar { ... }
-  */
-  convertColonHostContext: function(cssText) {
-    return this.convertColonRule(cssText, cssColonHostContextRe,
-        this.colonHostContextPartReplacer);
-  },
-  convertColonRule: function(cssText, regExp, partReplacer) {
-    // p1 = :host, p2 = contents of (), p3 rest of rule
-    return cssText.replace(regExp, function(m, p1, p2, p3) {
-      p1 = polyfillHostNoCombinator;
-      if (p2) {
-        var parts = p2.split(','), r = [];
-        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {
-          p = p.trim();
-          r.push(partReplacer(p1, p, p3));
-        }
-        return r.join(',');
-      } else {
-        return p1 + p3;
-      }
-    });
-  },
-  colonHostContextPartReplacer: function(host, part, suffix) {
-    if (part.match(polyfillHost)) {
-      return this.colonHostPartReplacer(host, part, suffix);
-    } else {
-      return host + part + suffix + ', ' + part + ' ' + host + suffix;
-    }
-  },
-  colonHostPartReplacer: function(host, part, suffix) {
-    return host + part.replace(polyfillHost, '') + suffix;
-  },
-  /*
-   * Convert combinators like ::shadow and pseudo-elements like ::content
-   * by replacing with space.
-  */
-  convertShadowDOMSelectors: function(cssText) {
-    for (var i=0; i < shadowDOMSelectorsRe.length; i++) {
-      cssText = cssText.replace(shadowDOMSelectorsRe[i], ' ');
-    }
-    return cssText;
-  },
-  // change a selector like 'div' to 'name div'
-  scopeRules: function(cssRules, scopeSelector) {
-    var cssText = '';
-    if (cssRules) {
-      Array.prototype.forEach.call(cssRules, function(rule) {
-        if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
-          cssText += this.scopeSelector(rule.selectorText, scopeSelector, 
-            this.strictStyling) + ' {\n\t';
-          cssText += this.propertiesFromRule(rule) + '\n}\n\n';
-        } else if (rule.type === CSSRule.MEDIA_RULE) {
-          cssText += '@media ' + rule.media.mediaText + ' {\n';
-          cssText += this.scopeRules(rule.cssRules, scopeSelector);
-          cssText += '\n}\n\n';
-        } else {
-          // KEYFRAMES_RULE in IE throws when we query cssText
-          // when it contains a -webkit- property.
-          // if this happens, we fallback to constructing the rule
-          // from the CSSRuleSet
-          // https://connect.microsoft.com/IE/feedbackdetail/view/955703/accessing-csstext-of-a-keyframe-rule-that-contains-a-webkit-property-via-cssom-generates-exception
-          try {
-            if (rule.cssText) {
-              cssText += rule.cssText + '\n\n';
-            }
-          } catch(x) {
-            if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {
-              cssText += this.ieSafeCssTextFromKeyFrameRule(rule);
-            }
-          }
-        }
-      }, this);
-    }
-    return cssText;
-  },
-  ieSafeCssTextFromKeyFrameRule: function(rule) {
-    var cssText = '@keyframes ' + rule.name + ' {';
-    Array.prototype.forEach.call(rule.cssRules, function(rule) {
-      cssText += ' ' + rule.keyText + ' {' + rule.style.cssText + '}';
-    });
-    cssText += ' }';
-    return cssText;
-  },
-  scopeSelector: function(selector, scopeSelector, strict) {
-    var r = [], parts = selector.split(',');
-    parts.forEach(function(p) {
-      p = p.trim();
-      if (this.selectorNeedsScoping(p, scopeSelector)) {
-        p = (strict && !p.match(polyfillHostNoCombinator)) ? 
-            this.applyStrictSelectorScope(p, scopeSelector) :
-            this.applySelectorScope(p, scopeSelector);
-      }
-      r.push(p);
-    }, this);
-    return r.join(', ');
-  },
-  selectorNeedsScoping: function(selector, scopeSelector) {
-    if (Array.isArray(scopeSelector)) {
-      return true;
-    }
-    var re = this.makeScopeMatcher(scopeSelector);
-    return !selector.match(re);
-  },
-  makeScopeMatcher: function(scopeSelector) {
-    scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
-    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
-  },
-  applySelectorScope: function(selector, selectorScope) {
-    return Array.isArray(selectorScope) ?
-        this.applySelectorScopeList(selector, selectorScope) :
-        this.applySimpleSelectorScope(selector, selectorScope);
-  },
-  // apply an array of selectors
-  applySelectorScopeList: function(selector, scopeSelectorList) {
-    var r = [];
-    for (var i=0, s; (s=scopeSelectorList[i]); i++) {
-      r.push(this.applySimpleSelectorScope(selector, s));
-    }
-    return r.join(', ');
-  },
-  // scope via name and [is=name]
-  applySimpleSelectorScope: function(selector, scopeSelector) {
-    if (selector.match(polyfillHostRe)) {
-      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
-      return selector.replace(polyfillHostRe, scopeSelector + ' ');
-    } else {
-      return scopeSelector + ' ' + selector;
-    }
-  },
-  // return a selector with [name] suffix on each simple selector
-  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
-  applyStrictSelectorScope: function(selector, scopeSelector) {
-    scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, '$1');
-    var splits = [' ', '>', '+', '~'],
-      scoped = selector,
-      attrName = '[' + scopeSelector + ']';
-    splits.forEach(function(sep) {
-      var parts = scoped.split(sep);
-      scoped = parts.map(function(p) {
-        // remove :host since it should be unnecessary
-        var t = p.trim().replace(polyfillHostRe, '');
-        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
-          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
-        }
-        return p;
-      }).join(sep);
-    });
-    return scoped;
-  },
-  insertPolyfillHostInCssText: function(selector) {
-    return selector.replace(colonHostContextRe, polyfillHostContext).replace(
-        colonHostRe, polyfillHost);
-  },
-  propertiesFromRule: function(rule) {
-    var cssText = rule.style.cssText;
-    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content
-    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)
-    // don't replace attr rules
-    if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
-      cssText = cssText.replace(/content:[^;]*;/g, 'content: \'' + 
-          rule.style.content + '\';');
-    }
-    // TODO(sorvell): we can workaround this issue here, but we need a list
-    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53
-    //
-    // inherit rules can be omitted from cssText
-    // TODO(sorvell): remove when Blink bug is fixed:
-    // https://code.google.com/p/chromium/issues/detail?id=358273
-    var style = rule.style;
-    for (var i in style) {
-      if (style[i] === 'initial') {
-        cssText += i + ': initial; ';
-      }
-    }
-    return cssText;
-  },
-  replaceTextInStyles: function(styles, action) {
-    if (styles && action) {
-      if (!(styles instanceof Array)) {
-        styles = [styles];
-      }
-      Array.prototype.forEach.call(styles, function(s) {
-        s.textContent = action.call(this, s.textContent);
-      }, this);
-    }
-  },
-  addCssToDocument: function(cssText, name) {
-    if (cssText.match('@import')) {
-      addOwnSheet(cssText, name);
-    } else {
-      addCssToDocument(cssText);
-    }
-  }
-};
-
-var selectorRe = /([^{]*)({[\s\S]*?})/gim,
-    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
-    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,  
-    // TODO(sorvell): remove either content or comment
-    cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,
-    cssPseudoRe = /::(x-[^\s{,(]*)/gim,
-    cssPartRe = /::part\(([^)]*)\)/gim,
-    // note: :host pre-processed to -shadowcsshost.
-    polyfillHost = '-shadowcsshost',
-    // note: :host-context pre-processed to -shadowcsshostcontext.
-    polyfillHostContext = '-shadowcsscontext',
-    parenSuffix = ')(?:\\((' +
-        '(?:\\([^)(]*\\)|[^)(]*)+?' +
-        ')\\))?([^,{]*)';
-    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),
-    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),
-    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
-    colonHostRe = /\:host/gim,
-    colonHostContextRe = /\:host-context/gim,
-    /* host name without combinator */
-    polyfillHostNoCombinator = polyfillHost + '-no-combinator',
-    polyfillHostRe = new RegExp(polyfillHost, 'gim'),
-    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),
-    shadowDOMSelectorsRe = [
-      /\^\^/g,
-      /\^/g,
-      /\/shadow\//g,
-      /\/shadow-deep\//g,
-      /::shadow/g,
-      /\/deep\//g,
-      /::content/g
-    ];
-
-function stylesToCssText(styles, preserveComments) {
-  var cssText = '';
-  Array.prototype.forEach.call(styles, function(s) {
-    cssText += s.textContent + '\n\n';
-  });
-  // strip comments for easier processing
-  if (!preserveComments) {
-    cssText = cssText.replace(cssCommentRe, '');
-  }
-  return cssText;
-}
-
-function cssTextToStyle(cssText) {
-  var style = document.createElement('style');
-  style.textContent = cssText;
-  return style;
-}
-
-function cssToRules(cssText) {
-  var style = cssTextToStyle(cssText);
-  document.head.appendChild(style);
-  var rules = [];
-  if (style.sheet) {
-    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet
-    // with an @import
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013
-    try {
-      rules = style.sheet.cssRules;
-    } catch(e) {
-      //
-    }
-  } else {
-    console.warn('sheet not found', style);
-  }
-  style.parentNode.removeChild(style);
-  return rules;
-}
-
-var frame = document.createElement('iframe');
-frame.style.display = 'none';
-
-function initFrame() {
-  frame.initialized = true;
-  document.body.appendChild(frame);
-  var doc = frame.contentDocument;
-  var base = doc.createElement('base');
-  base.href = document.baseURI;
-  doc.head.appendChild(base);
-}
-
-function inFrame(fn) {
-  if (!frame.initialized) {
-    initFrame();
-  }
-  document.body.appendChild(frame);
-  fn(frame.contentDocument);
-  document.body.removeChild(frame);
-}
-
-// TODO(sorvell): use an iframe if the cssText contains an @import to workaround
-// https://code.google.com/p/chromium/issues/detail?id=345114
-var isChrome = navigator.userAgent.match('Chrome');
-function withCssRules(cssText, callback) {
-  if (!callback) {
-    return;
-  }
-  var rules;
-  if (cssText.match('@import') && isChrome) {
-    var style = cssTextToStyle(cssText);
-    inFrame(function(doc) {
-      doc.head.appendChild(style.impl);
-      rules = Array.prototype.slice.call(style.sheet.cssRules, 0);
-      callback(rules);
-    });
-  } else {
-    rules = cssToRules(cssText);
-    callback(rules);
-  }
-}
-
-function rulesToCss(cssRules) {
-  for (var i=0, css=[]; i < cssRules.length; i++) {
-    css.push(cssRules[i].cssText);
-  }
-  return css.join('\n\n');
-}
-
-function addCssToDocument(cssText) {
-  if (cssText) {
-    getSheet().appendChild(document.createTextNode(cssText));
-  }
-}
-
-function addOwnSheet(cssText, name) {
-  var style = cssTextToStyle(cssText);
-  style.setAttribute(name, '');
-  style.setAttribute(SHIMMED_ATTRIBUTE, '');
-  document.head.appendChild(style);
-}
-
-var SHIM_ATTRIBUTE = 'shim-shadowdom';
-var SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';
-var NO_SHIM_ATTRIBUTE = 'no-shim';
-
-var sheet;
-function getSheet() {
-  if (!sheet) {
-    sheet = document.createElement("style");
-    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');
-    sheet[SHIMMED_ATTRIBUTE] = true;
-  }
-  return sheet;
-}
-
-// add polyfill stylesheet to document
-if (window.ShadowDOMPolyfill) {
-  addCssToDocument('style { display: none !important; }\n');
-  var doc = wrap(document);
-  var head = doc.querySelector('head');
-  head.insertBefore(getSheet(), head.childNodes[0]);
-
-  // TODO(sorvell): monkey-patching HTMLImports is abusive;
-  // consider a better solution.
-  document.addEventListener('DOMContentLoaded', function() {
-    var urlResolver = scope.urlResolver;
-    
-    if (window.HTMLImports && !HTMLImports.useNative) {
-      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +
-          '[' + SHIM_ATTRIBUTE + ']';
-      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';
-      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
-      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
-
-      HTMLImports.parser.documentSelectors = [
-        HTMLImports.parser.documentSelectors,
-        SHIM_SHEET_SELECTOR,
-        SHIM_STYLE_SELECTOR
-      ].join(',');
-  
-      var originalParseGeneric = HTMLImports.parser.parseGeneric;
-
-      HTMLImports.parser.parseGeneric = function(elt) {
-        if (elt[SHIMMED_ATTRIBUTE]) {
-          return;
-        }
-        var style = elt.__importElement || elt;
-        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
-          originalParseGeneric.call(this, elt);
-          return;
-        }
-        if (elt.__resource) {
-          style = elt.ownerDocument.createElement('style');
-          style.textContent = elt.__resource;
-        }
-        // relay on HTMLImports for path fixup
-        HTMLImports.path.resolveUrlsInStyle(style);
-        style.textContent = ShadowCSS.shimStyle(style);
-        style.removeAttribute(SHIM_ATTRIBUTE, '');
-        style.setAttribute(SHIMMED_ATTRIBUTE, '');
-        style[SHIMMED_ATTRIBUTE] = true;
-        // place in document
-        if (style.parentNode !== head) {
-          // replace links in head
-          if (elt.parentNode === head) {
-            head.replaceChild(style, elt);
-          } else {
-            this.addElementToDocument(style);
-          }
-        }
-        style.__importParsed = true;
-        this.markParsingComplete(elt);
-        this.parseNext();
-      }
-
-      var hasResource = HTMLImports.parser.hasResource;
-      HTMLImports.parser.hasResource = function(node) {
-        if (node.localName === 'link' && node.rel === 'stylesheet' &&
-            node.hasAttribute(SHIM_ATTRIBUTE)) {
-          return (node.__resource);
-        } else {
-          return hasResource.call(this, node);
-        }
-      }
-
-    }
-  });
-}
-
-// exports
-scope.ShadowCSS = ShadowCSS;
-
-})(window.Platform);
-
-} else {
-/*
- * 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) {
-
-  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill
-  window.wrap = window.unwrap = function(n){
-    return n;
-  }
-
-  addEventListener('DOMContentLoaded', function() {
-    if (CustomElements.useNative === false) {
-      var originalCreateShadowRoot = Element.prototype.createShadowRoot;
-      Element.prototype.createShadowRoot = function() {
-        var root = originalCreateShadowRoot.call(this);
-        CustomElements.watchShadow(this);
-        return root;
-      };
-    }
-  });
-
-})(window.Platform);
-
-}
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-(function(scope) {
-  'use strict';
-
-  // feature detect for URL constructor
-  var hasWorkingUrl = false;
-  if (!scope.forceJURL) {
-    try {
-      var u = new URL('b', 'http://a');
-      hasWorkingUrl = u.href === 'http://a/b';
-    } catch(e) {}
-  }
-
-  if (hasWorkingUrl)
-    return;
-
-  var relative = Object.create(null);
-  relative['ftp'] = 21;
-  relative['file'] = 0;
-  relative['gopher'] = 70;
-  relative['http'] = 80;
-  relative['https'] = 443;
-  relative['ws'] = 80;
-  relative['wss'] = 443;
-
-  var relativePathDotMapping = Object.create(null);
-  relativePathDotMapping['%2e'] = '.';
-  relativePathDotMapping['.%2e'] = '..';
-  relativePathDotMapping['%2e.'] = '..';
-  relativePathDotMapping['%2e%2e'] = '..';
-
-  function isRelativeScheme(scheme) {
-    return relative[scheme] !== undefined;
-  }
-
-  function invalid() {
-    clear.call(this);
-    this._isInvalid = true;
-  }
-
-  function IDNAToASCII(h) {
-    if ('' == h) {
-      invalid.call(this)
-    }
-    // XXX
-    return h.toLowerCase()
-  }
-
-  function percentEscape(c) {
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ? `
-       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  function percentEscapeQuery(c) {
-    // XXX This actually needs to encode c using encoding and then
-    // convert the bytes one-by-one.
-
-    var unicode = c.charCodeAt(0);
-    if (unicode > 0x20 &&
-       unicode < 0x7F &&
-       // " # < > ` (do not escape '?')
-       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1
-      ) {
-      return c;
-    }
-    return encodeURIComponent(c);
-  }
-
-  var EOF = undefined,
-      ALPHA = /[a-zA-Z]/,
-      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
-
-  function parse(input, stateOverride, base) {
-    function err(message) {
-      errors.push(message)
-    }
-
-    var state = stateOverride || 'scheme start',
-        cursor = 0,
-        buffer = '',
-        seenAt = false,
-        seenBracket = false,
-        errors = [];
-
-    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
-      var c = input[cursor];
-      switch (state) {
-        case 'scheme start':
-          if (c && ALPHA.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-            state = 'scheme';
-          } else if (!stateOverride) {
-            buffer = '';
-            state = 'no scheme';
-            continue;
-          } else {
-            err('Invalid scheme.');
-            break loop;
-          }
-          break;
-
-        case 'scheme':
-          if (c && ALPHANUMERIC.test(c)) {
-            buffer += c.toLowerCase(); // ASCII-safe
-          } else if (':' == c) {
-            this._scheme = buffer;
-            buffer = '';
-            if (stateOverride) {
-              break loop;
-            }
-            if (isRelativeScheme(this._scheme)) {
-              this._isRelative = true;
-            }
-            if ('file' == this._scheme) {
-              state = 'relative';
-            } else if (this._isRelative && base && base._scheme == this._scheme) {
-              state = 'relative or authority';
-            } else if (this._isRelative) {
-              state = 'authority first slash';
-            } else {
-              state = 'scheme data';
-            }
-          } else if (!stateOverride) {
-            buffer = '';
-            cursor = 0;
-            state = 'no scheme';
-            continue;
-          } else if (EOF == c) {
-            break loop;
-          } else {
-            err('Code point not allowed in scheme: ' + c)
-            break loop;
-          }
-          break;
-
-        case 'scheme data':
-          if ('?' == c) {
-            query = '?';
-            state = 'query';
-          } else if ('#' == c) {
-            this._fragment = '#';
-            state = 'fragment';
-          } else {
-            // XXX error handling
-            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-              this._schemeData += percentEscape(c);
-            }
-          }
-          break;
-
-        case 'no scheme':
-          if (!base || !(isRelativeScheme(base._scheme))) {
-            err('Missing scheme.');
-            invalid.call(this);
-          } else {
-            state = 'relative';
-            continue;
-          }
-          break;
-
-        case 'relative or authority':
-          if ('/' == c && '/' == input[cursor+1]) {
-            state = 'authority ignore slashes';
-          } else {
-            err('Expected /, got: ' + c);
-            state = 'relative';
-            continue
-          }
-          break;
-
-        case 'relative':
-          this._isRelative = true;
-          if ('file' != this._scheme)
-            this._scheme = base._scheme;
-          if (EOF == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            break loop;
-          } else if ('/' == c || '\\' == c) {
-            if ('\\' == c)
-              err('\\ is an invalid code point.');
-            state = 'relative slash';
-          } else if ('?' == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = '?';
-            state = 'query';
-          } else if ('#' == c) {
-            this._host = base._host;
-            this._port = base._port;
-            this._path = base._path.slice();
-            this._query = base._query;
-            this._fragment = '#';
-            state = 'fragment';
-          } else {
-            var nextC = input[cursor+1]
-            var nextNextC = input[cursor+2]
-            if (
-              'file' != this._scheme || !ALPHA.test(c) ||
-              (nextC != ':' && nextC != '|') ||
-              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {
-              this._host = base._host;
-              this._port = base._port;
-              this._path = base._path.slice();
-              this._path.pop();
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'relative slash':
-          if ('/' == c || '\\' == c) {
-            if ('\\' == c) {
-              err('\\ is an invalid code point.');
-            }
-            if ('file' == this._scheme) {
-              state = 'file host';
-            } else {
-              state = 'authority ignore slashes';
-            }
-          } else {
-            if ('file' != this._scheme) {
-              this._host = base._host;
-              this._port = base._port;
-            }
-            state = 'relative path';
-            continue;
-          }
-          break;
-
-        case 'authority first slash':
-          if ('/' == c) {
-            state = 'authority second slash';
-          } else {
-            err("Expected '/', got: " + c);
-            state = 'authority ignore slashes';
-            continue;
-          }
-          break;
-
-        case 'authority second slash':
-          state = 'authority ignore slashes';
-          if ('/' != c) {
-            err("Expected '/', got: " + c);
-            continue;
-          }
-          break;
-
-        case 'authority ignore slashes':
-          if ('/' != c && '\\' != c) {
-            state = 'authority';
-            continue;
-          } else {
-            err('Expected authority, got: ' + c);
-          }
-          break;
-
-        case 'authority':
-          if ('@' == c) {
-            if (seenAt) {
-              err('@ already seen.');
-              buffer += '%40';
-            }
-            seenAt = true;
-            for (var i = 0; i < buffer.length; i++) {
-              var cp = buffer[i];
-              if ('\t' == cp || '\n' == cp || '\r' == cp) {
-                err('Invalid whitespace in authority.');
-                continue;
-              }
-              // XXX check URL code points
-              if (':' == cp && null === this._password) {
-                this._password = '';
-                continue;
-              }
-              var tempC = percentEscape(cp);
-              (null !== this._password) ? this._password += tempC : this._username += tempC;
-            }
-            buffer = '';
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            cursor -= buffer.length;
-            buffer = '';
-            state = 'host';
-            continue;
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'file host':
-          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
-              state = 'relative path';
-            } else if (buffer.length == 0) {
-              state = 'relative path start';
-            } else {
-              this._host = IDNAToASCII.call(this, buffer);
-              buffer = '';
-              state = 'relative path start';
-            }
-            continue;
-          } else if ('\t' == c || '\n' == c || '\r' == c) {
-            err('Invalid whitespace in file host.');
-          } else {
-            buffer += c;
-          }
-          break;
-
-        case 'host':
-        case 'hostname':
-          if (':' == c && !seenBracket) {
-            // XXX host parsing
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'port';
-            if ('hostname' == stateOverride) {
-              break loop;
-            }
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
-            this._host = IDNAToASCII.call(this, buffer);
-            buffer = '';
-            state = 'relative path start';
-            if (stateOverride) {
-              break loop;
-            }
-            continue;
-          } else if ('\t' != c && '\n' != c && '\r' != c) {
-            if ('[' == c) {
-              seenBracket = true;
-            } else if (']' == c) {
-              seenBracket = false;
-            }
-            buffer += c;
-          } else {
-            err('Invalid code point in host/hostname: ' + c);
-          }
-          break;
-
-        case 'port':
-          if (/[0-9]/.test(c)) {
-            buffer += c;
-          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
-            if ('' != buffer) {
-              var temp = parseInt(buffer, 10);
-              if (temp != relative[this._scheme]) {
-                this._port = temp + '';
-              }
-              buffer = '';
-            }
-            if (stateOverride) {
-              break loop;
-            }
-            state = 'relative path start';
-            continue;
-          } else if ('\t' == c || '\n' == c || '\r' == c) {
-            err('Invalid code point in port: ' + c);
-          } else {
-            invalid.call(this);
-          }
-          break;
-
-        case 'relative path start':
-          if ('\\' == c)
-            err("'\\' not allowed in path.");
-          state = 'relative path';
-          if ('/' != c && '\\' != c) {
-            continue;
-          }
-          break;
-
-        case 'relative path':
-          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {
-            if ('\\' == c) {
-              err('\\ not allowed in relative path.');
-            }
-            var tmp;
-            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
-              buffer = tmp;
-            }
-            if ('..' == buffer) {
-              this._path.pop();
-              if ('/' != c && '\\' != c) {
-                this._path.push('');
-              }
-            } else if ('.' == buffer && '/' != c && '\\' != c) {
-              this._path.push('');
-            } else if ('.' != buffer) {
-              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
-                buffer = buffer[0] + ':';
-              }
-              this._path.push(buffer);
-            }
-            buffer = '';
-            if ('?' == c) {
-              this._query = '?';
-              state = 'query';
-            } else if ('#' == c) {
-              this._fragment = '#';
-              state = 'fragment';
-            }
-          } else if ('\t' != c && '\n' != c && '\r' != c) {
-            buffer += percentEscape(c);
-          }
-          break;
-
-        case 'query':
-          if (!stateOverride && '#' == c) {
-            this._fragment = '#';
-            state = 'fragment';
-          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-            this._query += percentEscapeQuery(c);
-          }
-          break;
-
-        case 'fragment':
-          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
-            this._fragment += c;
-          }
-          break;
-      }
-
-      cursor++;
-    }
-  }
-
-  function clear() {
-    this._scheme = '';
-    this._schemeData = '';
-    this._username = '';
-    this._password = null;
-    this._host = '';
-    this._port = '';
-    this._path = [];
-    this._query = '';
-    this._fragment = '';
-    this._isInvalid = false;
-    this._isRelative = false;
-  }
-
-  // Does not process domain names or IP addresses.
-  // Does not handle encoding for the query parameter.
-  function jURL(url, base /* , encoding */) {
-    if (base !== undefined && !(base instanceof jURL))
-      base = new jURL(String(base));
-
-    this._url = url;
-    clear.call(this);
-
-    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
-    // encoding = encoding || 'utf-8'
-
-    parse.call(this, input, null, base);
-  }
-
-  jURL.prototype = {
-    get href() {
-      if (this._isInvalid)
-        return this._url;
-
-      var authority = '';
-      if ('' != this._username || null != this._password) {
-        authority = this._username +
-            (null != this._password ? ':' + this._password : '') + '@';
-      }
-
-      return this.protocol +
-          (this._isRelative ? '//' + authority + this.host : '') +
-          this.pathname + this._query + this._fragment;
-    },
-    set href(href) {
-      clear.call(this);
-      parse.call(this, href);
-    },
-
-    get protocol() {
-      return this._scheme + ':';
-    },
-    set protocol(protocol) {
-      if (this._isInvalid)
-        return;
-      parse.call(this, protocol + ':', 'scheme start');
-    },
-
-    get host() {
-      return this._isInvalid ? '' : this._port ?
-          this._host + ':' + this._port : this._host;
-    },
-    set host(host) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, host, 'host');
-    },
-
-    get hostname() {
-      return this._host;
-    },
-    set hostname(hostname) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, hostname, 'hostname');
-    },
-
-    get port() {
-      return this._port;
-    },
-    set port(port) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      parse.call(this, port, 'port');
-    },
-
-    get pathname() {
-      return this._isInvalid ? '' : this._isRelative ?
-          '/' + this._path.join('/') : this._schemeData;
-    },
-    set pathname(pathname) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      this._path = [];
-      parse.call(this, pathname, 'relative path start');
-    },
-
-    get search() {
-      return this._isInvalid || !this._query || '?' == this._query ?
-          '' : this._query;
-    },
-    set search(search) {
-      if (this._isInvalid || !this._isRelative)
-        return;
-      this._query = '?';
-      if ('?' == search[0])
-        search = search.slice(1);
-      parse.call(this, search, 'query');
-    },
-
-    get hash() {
-      return this._isInvalid || !this._fragment || '#' == this._fragment ?
-          '' : this._fragment;
-    },
-    set hash(hash) {
-      if (this._isInvalid)
-        return;
-      this._fragment = '#';
-      if ('#' == hash[0])
-        hash = hash.slice(1);
-      parse.call(this, hash, 'fragment');
-    },
-
-    get origin() {
-      var host;
-      if (this._isInvalid || !this._scheme) {
-        return '';
-      }
-      // javascript: Gecko returns String(""), WebKit/Blink String("null")
-      // Gecko throws error for "data://"
-      // data: Gecko returns "", Blink returns "data://", WebKit returns "null"
-      // Gecko returns String("") for file: mailto:
-      // WebKit/Blink returns String("SCHEME://") for file: mailto:
-      switch (this._scheme) {
-        case 'data':
-        case 'file':
-        case 'javascript':
-        case 'mailto':
-          return 'null';
-      }
-      host = this.host;
-      if (!host) {
-        return '';
-      }
-      return this._scheme + '://' + host;
-    }
-  };
-
-  // Copy over the static methods
-  var OriginalURL = scope.URL;
-  if (OriginalURL) {
-    jURL.createObjectURL = function(blob) {
-      // IE extension allows a second optional options argument.
-      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx
-      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
-    };
-    jURL.revokeObjectURL = function(url) {
-      OriginalURL.revokeObjectURL(url);
-    };
-  }
-
-  scope.URL = jURL;
-
-})(this);
-
-/*
- * 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) {
-
-// Old versions of iOS do not have bind.
-
-if (!Function.prototype.bind) {
-  Function.prototype.bind = function(scope) {
-    var self = this;
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function() {
-      var args2 = args.slice();
-      args2.push.apply(args2, arguments);
-      return self.apply(scope, args2);
-    };
-  };
-}
-
-})(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.
- */
-
-(function(global) {
-
-  var registrationsTable = new WeakMap();
-
-  // We use setImmediate or postMessage for our future callback.
-  var setImmediate = window.msSetImmediate;
-
-  // Use post message to emulate setImmediate.
-  if (!setImmediate) {
-    var setImmediateQueue = [];
-    var sentinel = String(Math.random());
-    window.addEventListener('message', function(e) {
-      if (e.data === sentinel) {
-        var queue = setImmediateQueue;
-        setImmediateQueue = [];
-        queue.forEach(function(func) {
-          func();
-        });
-      }
-    });
-    setImmediate = function(func) {
-      setImmediateQueue.push(func);
-      window.postMessage(sentinel, '*');
-    };
-  }
-
-  // This is used to ensure that we never schedule 2 callas to setImmediate
-  var isScheduled = false;
-
-  // Keep track of observers that needs to be notified next time.
-  var scheduledObservers = [];
-
-  /**
-   * Schedules |dispatchCallback| to be called in the future.
-   * @param {MutationObserver} observer
-   */
-  function scheduleCallback(observer) {
-    scheduledObservers.push(observer);
-    if (!isScheduled) {
-      isScheduled = true;
-      setImmediate(dispatchCallbacks);
-    }
-  }
-
-  function wrapIfNeeded(node) {
-    return window.ShadowDOMPolyfill &&
-        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||
-        node;
-  }
-
-  function dispatchCallbacks() {
-    // http://dom.spec.whatwg.org/#mutation-observers
-
-    isScheduled = false; // Used to allow a new setImmediate call above.
-
-    var observers = scheduledObservers;
-    scheduledObservers = [];
-    // Sort observers based on their creation UID (incremental).
-    observers.sort(function(o1, o2) {
-      return o1.uid_ - o2.uid_;
-    });
-
-    var anyNonEmpty = false;
-    observers.forEach(function(observer) {
-
-      // 2.1, 2.2
-      var queue = observer.takeRecords();
-      // 2.3. Remove all transient registered observers whose observer is mo.
-      removeTransientObserversFor(observer);
-
-      // 2.4
-      if (queue.length) {
-        observer.callback_(queue, observer);
-        anyNonEmpty = true;
-      }
-    });
-
-    // 3.
-    if (anyNonEmpty)
-      dispatchCallbacks();
-  }
-
-  function removeTransientObserversFor(observer) {
-    observer.nodes_.forEach(function(node) {
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        return;
-      registrations.forEach(function(registration) {
-        if (registration.observer === observer)
-          registration.removeTransientObservers();
-      });
-    });
-  }
-
-  /**
-   * This function is used for the "For each registered observer observer (with
-   * observer's options as options) in target's list of registered observers,
-   * run these substeps:" and the "For each ancestor ancestor of target, and for
-   * each registered observer observer (with options options) in ancestor's list
-   * of registered observers, run these substeps:" part of the algorithms. The
-   * |options.subtree| is checked to ensure that the callback is called
-   * correctly.
-   *
-   * @param {Node} target
-   * @param {function(MutationObserverInit):MutationRecord} callback
-   */
-  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
-    for (var node = target; node; node = node.parentNode) {
-      var registrations = registrationsTable.get(node);
-
-      if (registrations) {
-        for (var j = 0; j < registrations.length; j++) {
-          var registration = registrations[j];
-          var options = registration.options;
-
-          // Only target ignores subtree.
-          if (node !== target && !options.subtree)
-            continue;
-
-          var record = callback(options);
-          if (record)
-            registration.enqueue(record);
-        }
-      }
-    }
-  }
-
-  var uidCounter = 0;
-
-  /**
-   * The class that maps to the DOM MutationObserver interface.
-   * @param {Function} callback.
-   * @constructor
-   */
-  function JsMutationObserver(callback) {
-    this.callback_ = callback;
-    this.nodes_ = [];
-    this.records_ = [];
-    this.uid_ = ++uidCounter;
-  }
-
-  JsMutationObserver.prototype = {
-    observe: function(target, options) {
-      target = wrapIfNeeded(target);
-
-      // 1.1
-      if (!options.childList && !options.attributes && !options.characterData ||
-
-          // 1.2
-          options.attributeOldValue && !options.attributes ||
-
-          // 1.3
-          options.attributeFilter && options.attributeFilter.length &&
-              !options.attributes ||
-
-          // 1.4
-          options.characterDataOldValue && !options.characterData) {
-
-        throw new SyntaxError();
-      }
-
-      var registrations = registrationsTable.get(target);
-      if (!registrations)
-        registrationsTable.set(target, registrations = []);
-
-      // 2
-      // If target's list of registered observers already includes a registered
-      // observer associated with the context object, replace that registered
-      // observer's options with options.
-      var registration;
-      for (var i = 0; i < registrations.length; i++) {
-        if (registrations[i].observer === this) {
-          registration = registrations[i];
-          registration.removeListeners();
-          registration.options = options;
-          break;
-        }
-      }
-
-      // 3.
-      // Otherwise, add a new registered observer to target's list of registered
-      // observers with the context object as the observer and options as the
-      // options, and add target to context object's list of nodes on which it
-      // is registered.
-      if (!registration) {
-        registration = new Registration(this, target, options);
-        registrations.push(registration);
-        this.nodes_.push(target);
-      }
-
-      registration.addListeners();
-    },
-
-    disconnect: function() {
-      this.nodes_.forEach(function(node) {
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          var registration = registrations[i];
-          if (registration.observer === this) {
-            registration.removeListeners();
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-      this.records_ = [];
-    },
-
-    takeRecords: function() {
-      var copyOfRecords = this.records_;
-      this.records_ = [];
-      return copyOfRecords;
-    }
-  };
-
-  /**
-   * @param {string} type
-   * @param {Node} target
-   * @constructor
-   */
-  function MutationRecord(type, target) {
-    this.type = type;
-    this.target = target;
-    this.addedNodes = [];
-    this.removedNodes = [];
-    this.previousSibling = null;
-    this.nextSibling = null;
-    this.attributeName = null;
-    this.attributeNamespace = null;
-    this.oldValue = null;
-  }
-
-  function copyMutationRecord(original) {
-    var record = new MutationRecord(original.type, original.target);
-    record.addedNodes = original.addedNodes.slice();
-    record.removedNodes = original.removedNodes.slice();
-    record.previousSibling = original.previousSibling;
-    record.nextSibling = original.nextSibling;
-    record.attributeName = original.attributeName;
-    record.attributeNamespace = original.attributeNamespace;
-    record.oldValue = original.oldValue;
-    return record;
-  };
-
-  // We keep track of the two (possibly one) records used in a single mutation.
-  var currentRecord, recordWithOldValue;
-
-  /**
-   * Creates a record without |oldValue| and caches it as |currentRecord| for
-   * later use.
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecord(type, target) {
-    return currentRecord = new MutationRecord(type, target);
-  }
-
-  /**
-   * Gets or creates a record with |oldValue| based in the |currentRecord|
-   * @param {string} oldValue
-   * @return {MutationRecord}
-   */
-  function getRecordWithOldValue(oldValue) {
-    if (recordWithOldValue)
-      return recordWithOldValue;
-    recordWithOldValue = copyMutationRecord(currentRecord);
-    recordWithOldValue.oldValue = oldValue;
-    return recordWithOldValue;
-  }
-
-  function clearRecords() {
-    currentRecord = recordWithOldValue = undefined;
-  }
-
-  /**
-   * @param {MutationRecord} record
-   * @return {boolean} Whether the record represents a record from the current
-   * mutation event.
-   */
-  function recordRepresentsCurrentMutation(record) {
-    return record === recordWithOldValue || record === currentRecord;
-  }
-
-  /**
-   * Selects which record, if any, to replace the last record in the queue.
-   * This returns |null| if no record should be replaced.
-   *
-   * @param {MutationRecord} lastRecord
-   * @param {MutationRecord} newRecord
-   * @param {MutationRecord}
-   */
-  function selectRecord(lastRecord, newRecord) {
-    if (lastRecord === newRecord)
-      return lastRecord;
-
-    // Check if the the record we are adding represents the same record. If
-    // so, we keep the one with the oldValue in it.
-    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))
-      return recordWithOldValue;
-
-    return null;
-  }
-
-  /**
-   * Class used to represent a registered observer.
-   * @param {MutationObserver} observer
-   * @param {Node} target
-   * @param {MutationObserverInit} options
-   * @constructor
-   */
-  function Registration(observer, target, options) {
-    this.observer = observer;
-    this.target = target;
-    this.options = options;
-    this.transientObservedNodes = [];
-  }
-
-  Registration.prototype = {
-    enqueue: function(record) {
-      var records = this.observer.records_;
-      var length = records.length;
-
-      // There are cases where we replace the last record with the new record.
-      // For example if the record represents the same mutation we need to use
-      // the one with the oldValue. If we get same record (this can happen as we
-      // walk up the tree) we ignore the new record.
-      if (records.length > 0) {
-        var lastRecord = records[length - 1];
-        var recordToReplaceLast = selectRecord(lastRecord, record);
-        if (recordToReplaceLast) {
-          records[length - 1] = recordToReplaceLast;
-          return;
-        }
-      } else {
-        scheduleCallback(this.observer);
-      }
-
-      records[length] = record;
-    },
-
-    addListeners: function() {
-      this.addListeners_(this.target);
-    },
-
-    addListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.addEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.addEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.addEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.addEventListener('DOMNodeRemoved', this, true);
-    },
-
-    removeListeners: function() {
-      this.removeListeners_(this.target);
-    },
-
-    removeListeners_: function(node) {
-      var options = this.options;
-      if (options.attributes)
-        node.removeEventListener('DOMAttrModified', this, true);
-
-      if (options.characterData)
-        node.removeEventListener('DOMCharacterDataModified', this, true);
-
-      if (options.childList)
-        node.removeEventListener('DOMNodeInserted', this, true);
-
-      if (options.childList || options.subtree)
-        node.removeEventListener('DOMNodeRemoved', this, true);
-    },
-
-    /**
-     * Adds a transient observer on node. The transient observer gets removed
-     * next time we deliver the change records.
-     * @param {Node} node
-     */
-    addTransientObserver: function(node) {
-      // Don't add transient observers on the target itself. We already have all
-      // the required listeners set up on the target.
-      if (node === this.target)
-        return;
-
-      this.addListeners_(node);
-      this.transientObservedNodes.push(node);
-      var registrations = registrationsTable.get(node);
-      if (!registrations)
-        registrationsTable.set(node, registrations = []);
-
-      // We know that registrations does not contain this because we already
-      // checked if node === this.target.
-      registrations.push(this);
-    },
-
-    removeTransientObservers: function() {
-      var transientObservedNodes = this.transientObservedNodes;
-      this.transientObservedNodes = [];
-
-      transientObservedNodes.forEach(function(node) {
-        // Transient observers are never added to the target.
-        this.removeListeners_(node);
-
-        var registrations = registrationsTable.get(node);
-        for (var i = 0; i < registrations.length; i++) {
-          if (registrations[i] === this) {
-            registrations.splice(i, 1);
-            // Each node can only have one registered observer associated with
-            // this observer.
-            break;
-          }
-        }
-      }, this);
-    },
-
-    handleEvent: function(e) {
-      // Stop propagation since we are managing the propagation manually.
-      // This means that other mutation events on the page will not work
-      // correctly but that is by design.
-      e.stopImmediatePropagation();
-
-      switch (e.type) {
-        case 'DOMAttrModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes
-
-          var name = e.attrName;
-          var namespace = e.relatedNode.namespaceURI;
-          var target = e.target;
-
-          // 1.
-          var record = new getRecord('attributes', target);
-          record.attributeName = name;
-          record.attributeNamespace = namespace;
-
-          // 2.
-          var oldValue =
-              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.attributes)
-              return;
-
-            // 3.2, 4.3
-            if (options.attributeFilter && options.attributeFilter.length &&
-                options.attributeFilter.indexOf(name) === -1 &&
-                options.attributeFilter.indexOf(namespace) === -1) {
-              return;
-            }
-            // 3.3, 4.4
-            if (options.attributeOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.4, 4.5
-            return record;
-          });
-
-          break;
-
-        case 'DOMCharacterDataModified':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata
-          var target = e.target;
-
-          // 1.
-          var record = getRecord('characterData', target);
-
-          // 2.
-          var oldValue = e.prevValue;
-
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 3.1, 4.2
-            if (!options.characterData)
-              return;
-
-            // 3.2, 4.3
-            if (options.characterDataOldValue)
-              return getRecordWithOldValue(oldValue);
-
-            // 3.3, 4.4
-            return record;
-          });
-
-          break;
-
-        case 'DOMNodeRemoved':
-          this.addTransientObserver(e.target);
-          // Fall through.
-        case 'DOMNodeInserted':
-          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist
-          var target = e.relatedNode;
-          var changedNode = e.target;
-          var addedNodes, removedNodes;
-          if (e.type === 'DOMNodeInserted') {
-            addedNodes = [changedNode];
-            removedNodes = [];
-          } else {
-
-            addedNodes = [];
-            removedNodes = [changedNode];
-          }
-          var previousSibling = changedNode.previousSibling;
-          var nextSibling = changedNode.nextSibling;
-
-          // 1.
-          var record = getRecord('childList', target);
-          record.addedNodes = addedNodes;
-          record.removedNodes = removedNodes;
-          record.previousSibling = previousSibling;
-          record.nextSibling = nextSibling;
-
-          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
-            // 2.1, 3.2
-            if (!options.childList)
-              return;
-
-            // 2.2, 3.3
-            return record;
-          });
-
-      }
-
-      clearRecords();
-    }
-  };
-
-  global.JsMutationObserver = JsMutationObserver;
-
-  if (!global.MutationObserver)
-    global.MutationObserver = JsMutationObserver;
-
-
-})(this);
-
-/*
- * 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
- */
-window.HTMLImports = window.HTMLImports || {flags:{}};
-/*

- * 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) {

-

-var IMPORT_LINK_TYPE = 'import';

-var hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));

-var useNative = hasNative;

-var isIE = /Trident/.test(navigator.userAgent);

-

-// TODO(sorvell): SD polyfill intrusion

-var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);

-var wrap = function(node) {

-  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;

-};

-

-var rootDocument = wrap(document);

-    

-// NOTE: We cannot polyfill document.currentScript because it's not possible

-// both to override and maintain the ability to capture the native value;

-// therefore we choose to expose _currentScript both when native imports

-// and the polyfill are in use.

-var currentScriptDescriptor = {

-  get: function() {

-    var script = HTMLImports.currentScript || document.currentScript ||

-        // NOTE: only works when called in synchronously executing code.

-        // readyState should check if `loading` but IE10 is 

-        // interactive when scripts run so we cheat.

-        (document.readyState !== 'complete' ? 

-        document.scripts[document.scripts.length - 1] : null);

-    return wrap(script);

-  },

-  configurable: true

-};

-

-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);

-Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor);

-

-// call a callback when all HTMLImports in the document at call (or at least

-//  document ready) time have loaded.

-// 1. ensure the document is in a ready state (has dom), then 

-// 2. watch for loading of imports and call callback when done

-function whenReady(callback, doc) {

-  doc = doc || rootDocument;

-  // if document is loading, wait and try again

-  whenDocumentReady(function() {

-    watchImportsLoad(callback, doc);

-  }, doc);

-}

-

-// call the callback when the document is in a ready state (has dom)

-var requiredReadyState = isIE ? 'complete' : 'interactive';

-var READY_EVENT = 'readystatechange';

-function isDocumentReady(doc) {

-  return (doc.readyState === 'complete' ||

-      doc.readyState === requiredReadyState);

-}

-

-// call <callback> when we ensure the document is in a ready state

-function whenDocumentReady(callback, doc) {

-  if (!isDocumentReady(doc)) {

-    var checkReady = function() {

-      if (doc.readyState === 'complete' || 

-          doc.readyState === requiredReadyState) {

-        doc.removeEventListener(READY_EVENT, checkReady);

-        whenDocumentReady(callback, doc);

-      }

-    };

-    doc.addEventListener(READY_EVENT, checkReady);

-  } else if (callback) {

-    callback();

-  }

-}

-

-function markTargetLoaded(event) {

-  event.target.__loaded = true;

-}

-

-// call <callback> when we ensure all imports have loaded

-function watchImportsLoad(callback, doc) {

-  var imports = doc.querySelectorAll('link[rel=import]');

-  var loaded = 0, l = imports.length;

-  function checkDone(d) { 

-    if ((loaded == l) && callback) {

-       callback();

-    }

-  }

-  function loadedImport(e) {

-    markTargetLoaded(e);

-    loaded++;

-    checkDone();

-  }

-  if (l) {

-    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {

-      if (isImportLoaded(imp)) {

-        loadedImport.call(imp, {target: imp});

-      } else {

-        imp.addEventListener('load', loadedImport);

-        imp.addEventListener('error', loadedImport);

-      }

-    }

-  } else {

-    checkDone();

-  }

-}

-

-// 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.import && link.import.readyState !== 'loading') :

-      link.__importParsed;

-}

-

-// TODO(sorvell): Workaround for 

-// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when

-// this bug is addressed.

-// (1) Install a mutation observer to see when HTMLImports have loaded

-// (2) if this script is run during document load it will watch any existing

-// imports for loading.

-//

-// NOTE: The workaround has restricted functionality: (1) it's only compatible

-// with imports that are added to document.head since the mutation observer 

-// watches only head for perf reasons, (2) it requires this script

-// to run before any imports have completed loading.

-if (useNative) {

-  new MutationObserver(function(mxns) {

-    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {

-      if (m.addedNodes) {

-        handleImports(m.addedNodes);

-      }

-    }

-  }).observe(document.head, {childList: true});

-

-  function handleImports(nodes) {

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

-      if (isImport(n)) {

-        handleImport(n);  

-      }

-    }

-  }

-

-  function isImport(element) {

-    return element.localName === 'link' && element.rel === 'import';

-  }

-

-  function handleImport(element) {

-    var loaded = element.import;

-    if (loaded) {

-      markTargetLoaded({target: element});

-    } else {

-      element.addEventListener('load', markTargetLoaded);

-      element.addEventListener('error', markTargetLoaded);

-    }

-  }

-

-  // make sure to catch any imports that are in the process of loading

-  // when this script is run.

-  (function() {

-    if (document.readyState === 'loading') {

-      var imports = document.querySelectorAll('link[rel=import]');

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

-        handleImport(imp);

-      }

-    }

-  })();

-

-}

-

-// Fire the 'HTMLImportsLoaded' event when imports in document at load time 

-// have loaded. This event is required to simulate the script blocking 

-// behavior of native imports. A main document script that needs to be sure

-// imports have loaded should wait for this event.

-whenReady(function() {

-  HTMLImports.ready = true;

-  HTMLImports.readyTime = new Date().getTime();

-  rootDocument.dispatchEvent(

-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})

-  );

-});

-

-// exports

-scope.useNative = useNative;

-scope.isImportLoaded = isImportLoaded;

-scope.whenReady = whenReady;

-scope.rootDocument = rootDocument;

-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;

-scope.isIE = isIE;

-

-})(window.HTMLImports);
-/*
- * 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) {
-
-  // imports
-  var path = scope.path;
-  var xhr = scope.xhr;
-  var flags = scope.flags;
-
-  // TODO(sorvell): this loader supports a dynamic list of urls
-  // and an oncomplete callback that is called when the loader is done.
-  // The polyfill currently does *not* need this dynamism or the onComplete
-  // concept. Because of this, the loader could be simplified quite a bit.
-  var Loader = function(onLoad, onComplete) {
-    this.cache = {};
-    this.onload = onLoad;
-    this.oncomplete = onComplete;
-    this.inflight = 0;
-    this.pending = {};
-  };
-
-  Loader.prototype = {
-
-    addNodes: function(nodes) {
-      // number of transactions to complete
-      this.inflight += nodes.length;
-      // commence transactions
-      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-        this.require(n);
-      }
-      // anything to do?
-      this.checkDone();
-    },
-
-    addNode: function(node) {
-      // number of transactions to complete
-      this.inflight++;
-      // commence transactions
-      this.require(node);
-      // anything to do?
-      this.checkDone();
-    },
-
-    require: function(elt) {
-      var url = elt.src || elt.href;
-      // ensure we have a standard url that can be used
-      // reliably for deduping.
-      // TODO(sjmiles): ad-hoc
-      elt.__nodeUrl = url;
-      // deduplication
-      if (!this.dedupe(url, elt)) {
-        // fetch this resource
-        this.fetch(url, elt);
-      }
-    },
-
-    dedupe: function(url, elt) {
-      if (this.pending[url]) {
-        // add to list of nodes waiting for inUrl
-        this.pending[url].push(elt);
-        // don't need fetch
-        return true;
-      }
-      var resource;
-      if (this.cache[url]) {
-        this.onload(url, elt, this.cache[url]);
-        // finished this transaction
-        this.tail();
-        // don't need fetch
-        return true;
-      }
-      // first node waiting for inUrl
-      this.pending[url] = [elt];
-      // need fetch (not a dupe)
-      return false;
-    },
-
-    fetch: function(url, elt) {
-      flags.load && console.log('fetch', url, elt);
-      if (url.match(/^data:/)) {
-        // Handle Data URI Scheme
-        var pieces = url.split(',');
-        var header = pieces[0];
-        var body = pieces[1];
-        if(header.indexOf(';base64') > -1) {
-          body = atob(body);
-        } else {
-          body = decodeURIComponent(body);
-        }
-        setTimeout(function() {
-            this.receive(url, elt, null, body);
-        }.bind(this), 0);
-      } else {
-        var receiveXhr = function(err, resource, redirectedUrl) {
-          this.receive(url, elt, err, resource, redirectedUrl);
-        }.bind(this);
-        xhr.load(url, receiveXhr);
-        // TODO(sorvell): blocked on)
-        // https://code.google.com/p/chromium/issues/detail?id=257221
-        // xhr'ing for a document makes scripts in imports runnable; otherwise
-        // they are not; however, it requires that we have doctype=html in
-        // the import which is unacceptable. This is only needed on Chrome
-        // to avoid the bug above.
-        /*
-        if (isDocumentLink(elt)) {
-          xhr.loadDocument(url, receiveXhr);
-        } else {
-          xhr.load(url, receiveXhr);
-        }
-        */
-      }
-    },
-
-    receive: function(url, elt, err, resource, redirectedUrl) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
-        // If url was redirected, use the redirected location so paths are
-        // calculated relative to that.
-        this.onload(url, p, resource, err, redirectedUrl);
-        this.tail();
-      }
-      this.pending[url] = null;
-    },
-
-    tail: function() {
-      --this.inflight;
-      this.checkDone();
-    },
-
-    checkDone: function() {
-      if (!this.inflight) {
-        this.oncomplete();
-      }
-    }
-
-  };
-
-  xhr = xhr || {
-    async: true,
-
-    ok: function(request) {
-      return (request.status >= 200 && request.status < 300)
-          || (request.status === 304)
-          || (request.status === 0);
-    },
-
-    load: function(url, next, nextContext) {
-      var request = new XMLHttpRequest();
-      if (scope.flags.debug || scope.flags.bust) {
-        url += '?' + Math.random();
-      }
-      request.open('GET', url, xhr.async);
-      request.addEventListener('readystatechange', function(e) {
-        if (request.readyState === 4) {
-          // Servers redirecting an import can add a Location header to help us
-          // polyfill correctly.
-          var locationHeader = request.getResponseHeader("Location");
-          var redirectedUrl = null;
-          if (locationHeader) {
-            var redirectedUrl = (locationHeader.substr( 0, 1 ) === "/")
-              ? location.origin + locationHeader  // Location is a relative path
-              : locationHeader;                    // Full path
-          }
-          next.call(nextContext, !xhr.ok(request) && request,
-              request.response || request.responseText, redirectedUrl);
-        }
-      });
-      request.send();
-      return request;
-    },
-
-    loadDocument: function(url, next, nextContext) {
-      this.load(url, next, nextContext).responseType = 'document';
-    }
-    
-  };
-
-  // exports
-  scope.xhr = xhr;
-  scope.Loader = Loader;
-
-})(window.HTMLImports);
-
-/*
- * 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) {
-
-// imports
-var rootDocument = scope.rootDocument;
-var flags = scope.flags;
-var isIE = scope.isIE;
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-
-// importParser
-// highlander object to manage parsing of imports
-// parses import related elements
-// and ensures proper parse order
-// parse order is enforced by crawling the tree and monitoring which elements
-// have been parsed; async parsing is also supported.
-
-// highlander object for parsing a document tree
-var importParser = {
-
-  // parse selectors for main document elements
-  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
-
-  // parse selectors for import document elements
-  importsSelectors: [
-    'link[rel=' + IMPORT_LINK_TYPE + ']',
-    'link[rel=stylesheet]',
-    'style',
-    'script:not([type])',
-    'script[type="text/javascript"]'
-  ].join(','),
-
-  map: {
-    link: 'parseLink',
-    script: 'parseScript',
-    style: 'parseStyle'
-  },
-
-  dynamicElements: [],
-
-  // try to parse the next import in the tree
-  parseNext: function() {
-    var next = this.nextToParse();
-    if (next) {
-      this.parse(next);
-    }
-  },
-
-  parse: function(elt) {
-    if (this.isParsed(elt)) {
-      flags.parse && console.log('[%s] is already parsed', elt.localName);
-      return;
-    }
-    var fn = this[this.map[elt.localName]];
-    if (fn) {
-      this.markParsing(elt);
-      fn.call(this, elt);
-    }
-  },
-
-  parseDynamic: function(elt, quiet) {
-    this.dynamicElements.push(elt);
-    if (!quiet) {
-      this.parseNext();
-    }
-  },
-
-  // only 1 element may be parsed at a time; parsing is async so each
-  // parsing implementation must inform the system that parsing is complete
-  // via markParsingComplete.
-  // To prompt the system to parse the next element, parseNext should then be
-  // called.
-  // Note, parseNext used to be included at the end of markParsingComplete, but
-  // we must not do this so that, for example, we can (1) mark parsing complete 
-  // then (2) fire an import load event, and then (3) parse the next resource.
-  markParsing: function(elt) {
-    flags.parse && console.log('parsing', elt);
-    this.parsingElement = elt;
-  },
-
-  markParsingComplete: function(elt) {
-    elt.__importParsed = true;
-    this.markDynamicParsingComplete(elt);
-    if (elt.__importElement) {
-      elt.__importElement.__importParsed = true;
-      this.markDynamicParsingComplete(elt.__importElement);
-    }
-    this.parsingElement = null;
-    flags.parse && console.log('completed', elt);
-  },
-
-  markDynamicParsingComplete: function(elt) {
-    var i = this.dynamicElements.indexOf(elt);
-    if (i >= 0) {
-      this.dynamicElements.splice(i, 1);
-    }
-  },
-
-  parseImport: function(elt) {
-    // TODO(sorvell): consider if there's a better way to do this;
-    // expose an imports parsing hook; this is needed, for example, by the
-    // CustomElements polyfill.
-    if (HTMLImports.__importsParsingHook) {
-      HTMLImports.__importsParsingHook(elt);
-    }
-    if (elt.import) {
-      elt.import.__importParsed = true;
-    }
-    this.markParsingComplete(elt);
-    // fire load event
-    if (elt.__resource && !elt.__error) {
-      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
-    } else {
-      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));
-    }
-    // TODO(sorvell): workaround for Safari addEventListener not working
-    // for elements not in the main document.
-    if (elt.__pending) {
-      var fn;
-      while (elt.__pending.length) {
-        fn = elt.__pending.shift();
-        if (fn) {
-          fn({target: elt});
-        }
-      }
-    }
-    this.parseNext();
-  },
-
-  parseLink: function(linkElt) {
-    if (nodeIsImport(linkElt)) {
-      this.parseImport(linkElt);
-    } else {
-      // make href absolute
-      linkElt.href = linkElt.href;
-      this.parseGeneric(linkElt);
-    }
-  },
-
-  parseStyle: function(elt) {
-    // TODO(sorvell): style element load event can just not fire so clone styles
-    var src = elt;
-    elt = cloneStyle(elt);
-    elt.__importElement = src;
-    this.parseGeneric(elt);
-  },
-
-  parseGeneric: function(elt) {
-    this.trackElement(elt);
-    this.addElementToDocument(elt);
-  },
-
-  rootImportForElement: function(elt) {
-    var n = elt;
-    while (n.ownerDocument.__importLink) {
-      n = n.ownerDocument.__importLink;
-    }
-    return n;
-  },
-
-  addElementToDocument: function(elt) {
-    var port = this.rootImportForElement(elt.__importElement || elt);
-    var l = port.__insertedElements = port.__insertedElements || 0;
-    var refNode = port.nextElementSibling;
-    for (var i=0; i < l; i++) {
-      refNode = refNode && refNode.nextElementSibling;
-    }
-    port.parentNode.insertBefore(elt, refNode);
-  },
-
-  // tracks when a loadable element has loaded
-  trackElement: function(elt, callback) {
-    var self = this;
-    var done = function(e) {
-      if (callback) {
-        callback(e);
-      }
-      self.markParsingComplete(elt);
-      self.parseNext();
-    };
-    elt.addEventListener('load', done);
-    elt.addEventListener('error', done);
-
-    // NOTE: IE does not fire "load" event for styles that have already loaded
-    // This is in violation of the spec, so we try our hardest to work around it
-    if (isIE && elt.localName === 'style') {
-      var fakeLoad = false;
-      // If there's not @import in the textContent, assume it has loaded
-      if (elt.textContent.indexOf('@import') == -1) {
-        fakeLoad = true;
-      // if we have a sheet, we have been parsed
-      } else if (elt.sheet) {
-        fakeLoad = true;
-        var csr = elt.sheet.cssRules;
-        var len = csr ? csr.length : 0;
-        // search the rules for @import's
-        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {
-          if (r.type === CSSRule.IMPORT_RULE) {
-            // if every @import has resolved, fake the load
-            fakeLoad = fakeLoad && Boolean(r.styleSheet);
-          }
-        }
-      }
-      // dispatch a fake load event and continue parsing
-      if (fakeLoad) {
-        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));
-      }
-    }
-  },
-
-  // NOTE: execute scripts by injecting them and watching for the load/error
-  // event. Inline scripts are handled via dataURL's because browsers tend to
-  // provide correct parsing errors in this case. If this has any compatibility
-  // issues, we can switch to injecting the inline script with textContent.
-  // Scripts with dataURL's do not appear to generate load events and therefore
-  // we assume they execute synchronously.
-  parseScript: function(scriptElt) {
-    var script = document.createElement('script');
-    script.__importElement = scriptElt;
-    script.src = scriptElt.src ? scriptElt.src : 
-        generateScriptDataUrl(scriptElt);
-    scope.currentScript = scriptElt;
-    this.trackElement(script, function(e) {
-      script.parentNode.removeChild(script);
-      scope.currentScript = null;  
-    });
-    this.addElementToDocument(script);
-  },
-
-  // determine the next element in the tree which should be parsed
-  nextToParse: function() {
-    this._mayParse = [];
-    return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || 
-        this.nextToParseDynamic());
-  },
-
-  nextToParseInDoc: function(doc, link) {
-    // 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)) {
-          if (this.hasResource(n)) {
-            return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
-          } else {
-            return;
-          }
-        }
-      }
-    }
-    // all nodes have been parsed, ready to parse import, if any
-    return link;
-  },
-
-  nextToParseDynamic: function() {
-    return this.dynamicElements[0];
-  },
-
-  // return the set of parse selectors relevant for this node.
-  parseSelectorsForNode: function(node) {
-    var doc = node.ownerDocument || node;
-    return doc === rootDocument ? this.documentSelectors :
-        this.importsSelectors;
-  },
-
-  isParsed: function(node) {
-    return node.__importParsed;
-  },
-
-  needsDynamicParsing: function(elt) {
-    return (this.dynamicElements.indexOf(elt) >= 0);
-  },
-
-  hasResource: function(node) {
-    if (nodeIsImport(node) && (node.import === undefined)) {
-      return false;
-    }
-    return true;
-  }
-
-};
-
-function nodeIsImport(elt) {
-  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);
-}
-
-function generateScriptDataUrl(script) {
-  var scriptContent = generateScriptContent(script);
-  return 'data:text/javascript;charset=utf-8,' + encodeURIComponent(scriptContent);
-}
-
-function generateScriptContent(script) {
-  return script.textContent + generateSourceMapHint(script);
-}
-
-// calculate source map hint
-function generateSourceMapHint(script) {
-  var moniker = script.__nodeUrl;
-  if (!moniker) {
-    moniker = script.ownerDocument.baseURI;
-    // there could be more than one script this url
-    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';
-    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow 
-    // this sort of thing
-    var matches = script.textContent.match(/Polymer\(['"]([^'"]*)/);
-    tag = matches && matches[1] || tag;
-    // tag the moniker
-    moniker += '/' + tag + '.js';
-  }
-  return '\n//# sourceURL=' + moniker + '\n';
-}
-
-// style/stylesheet handling
-
-// clone style with proper path resolution for main document
-// NOTE: styles are the only elements that require direct path fixup.
-function cloneStyle(style) {
-  var clone = style.ownerDocument.createElement('style');
-  clone.textContent = style.textContent;
-  path.resolveUrlsInStyle(clone);
-  return clone;
-}
-
-// path fixup: style elements in imports must be made relative to the main 
-// document. We fixup url's in url() and @import.
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-
-var path = {
-
-  resolveUrlsInStyle: function(style) {
-    var doc = style.ownerDocument;
-    var resolver = doc.createElement('a');
-    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
-    return style;  
-  },
-
-  resolveUrlsInCssText: function(cssText, urlObj) {
-    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
-    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
-    return r;
-  },
-
-  replaceUrls: function(text, urlObj, regexp) {
-    return text.replace(regexp, function(m, pre, url, post) {
-      var urlPath = url.replace(/["']/g, '');
-      urlObj.href = urlPath;
-      urlPath = urlObj.href;
-      return pre + '\'' + urlPath + '\'' + post;
-    });    
-  }
-
-};
-
-// exports
-scope.parser = importParser;
-scope.path = path;
-
-})(HTMLImports);
-
-/*
- * 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) {
-
-// imports
-var useNative = scope.useNative;
-var flags = scope.flags;
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-
-if (!useNative) {
-
-  // imports
-  var rootDocument = scope.rootDocument;
-  var xhr = scope.xhr;
-  var Loader = scope.Loader;
-  var parser = scope.parser;
-
-  // importer
-  // highlander object to manage loading of imports
-
-  // for any document, importer:
-  // - loads any linked import documents (with deduping)
-
-  var importer = {
-
-    documents: {},
-    
-    // nodes to load in the mian document
-    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
-    
-    // nodes to load in imports
-    importsPreloadSelectors: [
-      'link[rel=' + IMPORT_LINK_TYPE + ']'
-    ].join(','),
-    
-    loadNode: function(node) {
-      importLoader.addNode(node);
-    },
-    
-    // load all loadable elements within the parent element
-    loadSubtree: function(parent) {
-      var nodes = this.marshalNodes(parent);
-      // add these nodes to loader's queue
-      importLoader.addNodes(nodes);
-    },
-    
-    marshalNodes: function(parent) {
-      // all preloadable nodes in inDocument
-      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
-    },
-    
-    // find the proper set of load selectors for a given node
-    loadSelectorsForNode: function(node) {
-      var doc = node.ownerDocument || node;
-      return doc === rootDocument ? this.documentPreloadSelectors :
-          this.importsPreloadSelectors;
-    },
-    
-    loaded: function(url, elt, resource, err, redirectedUrl) {
-      flags.load && console.log('loaded', url, elt);
-      // store generic resource
-      // TODO(sorvell): fails for nodes inside <template>.content
-      // see https://code.google.com/p/chromium/issues/detail?id=249381.
-      elt.__resource = resource;
-      elt.__error = err;
-      if (isDocumentLink(elt)) {
-        var doc = this.documents[url];
-        // if we've never seen a document at this url
-        if (doc === undefined) {
-          // generate an HTMLDocument from data
-          doc = err ? null : makeDocument(resource, redirectedUrl || url);
-          if (doc) {
-            doc.__importLink = elt;
-            // note, we cannot use MO to detect parsed nodes because
-            // SD polyfill does not report these as mutations.
-            this.bootDocument(doc);
-          }
-          // cache document
-          this.documents[url] = doc;
-        }
-        // don't store import record until we're actually loaded
-        // store document resource
-        elt.import = doc;
-      }
-      parser.parseNext();
-    },
-    
-    bootDocument: function(doc) {
-      this.loadSubtree(doc);
-      this.observe(doc);
-      parser.parseNext();
-    },
-    
-    loadedAll: function() {
-      parser.parseNext();
-    }
-
-  };
-
-  // loader singleton
-  var importLoader = new Loader(importer.loaded.bind(importer), 
-      importer.loadedAll.bind(importer));
-
-  function isDocumentLink(elt) {
-    return isLinkRel(elt, IMPORT_LINK_TYPE);
-  }
-
-  function isLinkRel(elt, rel) {
-    return elt.localName === 'link' && elt.getAttribute('rel') === rel;
-  }
-
-  function isScript(elt) {
-    return elt.localName === 'script';
-  }
-
-  function makeDocument(resource, url) {
-    // create a new HTML document
-    var doc = resource;
-    if (!(doc instanceof Document)) {
-      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
-    }
-    // cache the new document's source url
-    doc._URL = url;
-    // establish a relative path via <base>
-    var base = doc.createElement('base');
-    base.setAttribute('href', url);
-    // add baseURI support to browsers (IE) that lack it.
-    if (!doc.baseURI) {
-      doc.baseURI = url;
-    }
-    // ensure UTF-8 charset
-    var meta = doc.createElement('meta');
-    meta.setAttribute('charset', 'utf-8');
-
-    doc.head.appendChild(meta);
-    doc.head.appendChild(base);
-    // install HTML last as it may trigger CustomElement upgrades
-    // TODO(sjmiles): problem wrt to template boostrapping below,
-    // template bootstrapping must (?) come before element upgrade
-    // but we cannot bootstrap templates until they are in a document
-    // which is too late
-    if (!(resource instanceof Document)) {
-      // install html
-      doc.body.innerHTML = resource;
-    }
-    // TODO(sorvell): ideally this code is not aware of Template polyfill,
-    // but for now the polyfill needs help to bootstrap these templates
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(doc);
-    }
-    return doc;
-  }
-
-  // Polyfill document.baseURI for browsers without it.
-  if (!document.baseURI) {
-    var baseURIDescriptor = {
-      get: function() {
-        var base = document.querySelector('base');
-        return base ? base.href : window.location.href;
-      },
-      configurable: true
-    };
-
-    Object.defineProperty(document, 'baseURI', baseURIDescriptor);
-    Object.defineProperty(rootDocument, 'baseURI', baseURIDescriptor);
-  }
-
-  // IE shim for CustomEvent
-  if (typeof window.CustomEvent !== 'function') {
-    window.CustomEvent = function(inType, dictionary) {
-       var e = document.createEvent('HTMLEvents');
-       e.initEvent(inType,
-          dictionary.bubbles === false ? false : true,
-          dictionary.cancelable === false ? false : true,
-          dictionary.detail);
-       return e;
-    };
-  }
-
-} else {
-  // do nothing if using native imports
-  var importer = {};
-}
-
-// exports
-scope.importer = importer;
-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-scope.importLoader = importLoader;
-
-})(window.HTMLImports);
-
-/*
- * 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){
-
-// imports
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-var importer = scope.importer;
-var parser = scope.parser;
-
-var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
-
-
-// we track mutations for addedNodes, looking for imports
-function handler(mutations) {
-  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {
-    if (m.type === 'childList' && m.addedNodes.length) {
-      addedNodes(m.addedNodes);
-    }
-  }
-}
-
-// find loadable elements and add them to the importer
-// IFF the owning document has already parsed, then parsable elements
-// need to be marked for dynamic parsing.
-function addedNodes(nodes) {
-  var owner, parsed;
-  for (var i=0, l=nodes.length, n, loading; (i<l) && (n=nodes[i]); i++) {
-    if (!owner) {
-      owner = n.ownerDocument;
-      parsed = parser.isParsed(owner);
-    }
-    // note: the act of loading kicks the parser, so we use parseDynamic's
-    // 2nd argument to control if this added node needs to kick the parser.
-    loading = shouldLoadNode(n);
-    if (loading) {
-      importer.loadNode(n);
-    }
-    if (shouldParseNode(n) && parsed) {
-      parser.parseDynamic(n, loading);
-    }
-    if (n.children && n.children.length) {
-      addedNodes(n.children);
-    }
-  }
-}
-
-function shouldLoadNode(node) {
-  return (node.nodeType === 1) && matches.call(node,
-      importer.loadSelectorsForNode(node));
-}
-
-function shouldParseNode(node) {
-  return (node.nodeType === 1) && matches.call(node,
-      parser.parseSelectorsForNode(node));  
-}
-
-// x-plat matches
-var matches = HTMLElement.prototype.matches || 
-    HTMLElement.prototype.matchesSelector || 
-    HTMLElement.prototype.webkitMatchesSelector ||
-    HTMLElement.prototype.mozMatchesSelector ||
-    HTMLElement.prototype.msMatchesSelector;
-
-var observer = new MutationObserver(handler);
-
-// observe the given root for loadable elements
-function observe(root) {
-  observer.observe(root, {childList: true, subtree: true});
-}
-
-// exports
-// TODO(sorvell): factor so can put on scope
-scope.observe = observe;
-importer.observe = observe;
-
-})(HTMLImports);
-
-/*
- * 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(){
-
-// bootstrap
-
-// TODO(sorvell): SD polyfill intrusion
-var doc = window.ShadowDOMPolyfill ? 
-    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-// no need to bootstrap the polyfill when native imports is available.
-if (!HTMLImports.useNative) {
-  function bootstrap() {
-    HTMLImports.importer.bootDocument(doc);
-  }
-    
-  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added
-  // by the parser. For this reason, we must wait until the dom exists to 
-  // bootstrap.
-  if (document.readyState === 'complete' ||
-      (document.readyState === 'interactive' && !window.attachEvent)) {
-    bootstrap();
-  } else {
-    document.addEventListener('DOMContentLoaded', bootstrap);
-  }
-}
-
-})();
-
-/*
- * 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
- */
-window.CustomElements = window.CustomElements || {flags:{}};
-/*

- * 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){

-

-var logFlags = window.logFlags || {};

-var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';

-

-// walk the subtree rooted at node, applying 'find(element, data)' function

-// to each element

-// if 'find' returns true for 'element', do not search element's subtree

-function findAll(node, find, data) {

-  var e = node.firstElementChild;

-  if (!e) {

-    e = node.firstChild;

-    while (e && e.nodeType !== Node.ELEMENT_NODE) {

-      e = e.nextSibling;

-    }

-  }

-  while (e) {

-    if (find(e, data) !== true) {

-      findAll(e, find, data);

-    }

-    e = e.nextElementSibling;

-  }

-  return null;

-}

-

-// walk all shadowRoots on a given node.

-function forRoots(node, cb) {

-  var root = node.shadowRoot;

-  while(root) {

-    forSubtree(root, cb);

-    root = root.olderShadowRoot;

-  }

-}

-

-// walk the subtree rooted at node, including descent into shadow-roots,

-// applying 'cb' to each element

-function forSubtree(node, cb) {

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);

-  findAll(node, function(e) {

-    if (cb(e)) {

-      return true;

-    }

-    forRoots(e, cb);

-  });

-  forRoots(node, cb);

-  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();

-}

-

-// manage lifecycle on added node

-function added(node) {

-  if (upgrade(node)) {

-    insertedNode(node);

-    return true;

-  }

-  inserted(node);

-}

-

-// manage lifecycle on added node's subtree only

-function addedSubtree(node) {

-  forSubtree(node, function(e) {

-    if (added(e)) {

-      return true;

-    }

-  });

-}

-

-// manage lifecycle on added node and it's subtree

-function addedNode(node) {

-  return added(node) || addedSubtree(node);

-}

-

-// upgrade custom elements at node, if applicable

-function upgrade(node) {

-  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {

-    var type = node.getAttribute('is') || node.localName;

-    var definition = scope.registry[type];

-    if (definition) {

-      logFlags.dom && console.group('upgrade:', node.localName);

-      scope.upgrade(node);

-      logFlags.dom && console.groupEnd();

-      return true;

-    }

-  }

-}

-

-function insertedNode(node) {

-  inserted(node);

-  if (inDocument(node)) {

-    forSubtree(node, function(e) {

-      inserted(e);

-    });

-  }

-}

-

-// TODO(sorvell): on platforms without MutationObserver, mutations may not be

-// reliable and therefore attached/detached are not reliable.

-// To make these callbacks less likely to fail, we defer all inserts and removes

-// to give a chance for elements to be inserted into dom.

-// This ensures attachedCallback fires for elements that are created and

-// immediately added to dom.

-var hasPolyfillMutations = (!window.MutationObserver ||

-    (window.MutationObserver === window.JsMutationObserver));

-scope.hasPolyfillMutations = hasPolyfillMutations;

-

-var isPendingMutations = false;

-var pendingMutations = [];

-function deferMutation(fn) {

-  pendingMutations.push(fn);

-  if (!isPendingMutations) {

-    isPendingMutations = true;

-    var async = (window.Platform && window.Platform.endOfMicrotask) ||

-        setTimeout;

-    async(takeMutations);

-  }

-}

-

-function takeMutations() {

-  isPendingMutations = false;

-  var $p = pendingMutations;

-  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {

-    p();

-  }

-  pendingMutations = [];

-}

-

-function inserted(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _inserted(element);

-    });

-  } else {

-    _inserted(element);

-  }

-}

-

-// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this

-function _inserted(element) {

-  // TODO(sjmiles): it's possible we were inserted and removed in the space

-  // of one microtask, in which case we won't be 'inDocument' here

-  // But there are other cases where we are testing for inserted without

-  // specific knowledge of mutations, and must test 'inDocument' to determine

-  // whether to call inserted

-  // If we can factor these cases into separate code paths we can have

-  // better diagnostics.

-  // TODO(sjmiles): when logging, do work on all custom elements so we can

-  // track behavior even when callbacks not defined

-  //console.log('inserted: ', element.localName);

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('inserted:', element.localName);

-    if (inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) + 1;

-      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state

-      if (element.__inserted < 1) {

-        element.__inserted = 1;

-      }

-      // if we are 'over inserted', squelch the callback

-      if (element.__inserted > 1) {

-        logFlags.dom && console.warn('inserted:', element.localName,

-          'insert/remove count:', element.__inserted)

-      } else if (element.attachedCallback) {

-        logFlags.dom && console.log('inserted:', element.localName);

-        element.attachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-function removedNode(node) {

-  removed(node);

-  forSubtree(node, function(e) {

-    removed(e);

-  });

-}

-

-function removed(element) {

-  if (hasPolyfillMutations) {

-    deferMutation(function() {

-      _removed(element);

-    });

-  } else {

-    _removed(element);

-  }

-}

-

-function _removed(element) {

-  // TODO(sjmiles): temporary: do work on all custom elements so we can track

-  // behavior even when callbacks not defined

-  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {

-    logFlags.dom && console.group('removed:', element.localName);

-    if (!inDocument(element)) {

-      element.__inserted = (element.__inserted || 0) - 1;

-      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state

-      if (element.__inserted > 0) {

-        element.__inserted = 0;

-      }

-      // if we are 'over removed', squelch the callback

-      if (element.__inserted < 0) {

-        logFlags.dom && console.warn('removed:', element.localName,

-            'insert/remove count:', element.__inserted)

-      } else if (element.detachedCallback) {

-        element.detachedCallback();

-      }

-    }

-    logFlags.dom && console.groupEnd();

-  }

-}

-

-// SD polyfill intrustion due mainly to the fact that 'document'

-// is not entirely wrapped

-function wrapIfNeeded(node) {

-  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)

-      : node;

-}

-

-function inDocument(element) {

-  var p = element;

-  var doc = wrapIfNeeded(document);

-  while (p) {

-    if (p == doc) {

-      return true;

-    }

-    p = p.parentNode || p.host;

-  }

-}

-

-function watchShadow(node) {

-  if (node.shadowRoot && !node.shadowRoot.__watched) {

-    logFlags.dom && console.log('watching shadow-root for: ', node.localName);

-    // watch all unwatched roots...

-    var root = node.shadowRoot;

-    while (root) {

-      watchRoot(root);

-      root = root.olderShadowRoot;

-    }

-  }

-}

-

-function watchRoot(root) {

-  observe(root);

-}

-

-function handler(mutations) {

-  //

-  if (logFlags.dom) {

-    var mx = mutations[0];

-    if (mx && mx.type === 'childList' && mx.addedNodes) {

-        if (mx.addedNodes) {

-          var d = mx.addedNodes[0];

-          while (d && d !== document && !d.host) {

-            d = d.parentNode;

-          }

-          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';

-          u = u.split('/?').shift().split('/').pop();

-        }

-    }

-    console.group('mutations (%d) [%s]', mutations.length, u || '');

-  }

-  //

-  mutations.forEach(function(mx) {

-    //logFlags.dom && console.group('mutation');

-    if (mx.type === 'childList') {

-      forEach(mx.addedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        // nodes added may need lifecycle management

-        addedNode(n);

-      });

-      // removed nodes may need lifecycle management

-      forEach(mx.removedNodes, function(n) {

-        //logFlags.dom && console.log(n.localName);

-        if (!n.localName) {

-          return;

-        }

-        removedNode(n);

-      });

-    }

-    //logFlags.dom && console.groupEnd();

-  });

-  logFlags.dom && console.groupEnd();

-};

-

-function takeRecords(node) {

-  // If the optional node is not supplied, assume we mean the whole document.

-  if (!node) node = wrapIfNeeded(document);

-

-  // Find the root of the tree, which will be an Document or ShadowRoot.

-  while (node.parentNode) {

-    node = node.parentNode;

-  }

-

-  var observer = node.__observer;

-  if (observer) {

-    handler(observer.takeRecords());

-    takeMutations();

-  }

-}

-

-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);

-

-function observe(inRoot) {

-  if (inRoot.__observer) return;

-

-  // For each ShadowRoot, we create a new MutationObserver, so the root can be

-  // garbage collected once all references to the `inRoot` node are gone.

-  var observer = new MutationObserver(handler);

-  observer.observe(inRoot, {childList: true, subtree: true});

-  inRoot.__observer = observer;

-}

-

-function observeDocument(doc) {

-  observe(doc);

-}

-

-function upgradeDocument(doc) {

-  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());

-  addedNode(doc);

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

-    }

-  }

-  upgradeDocument(doc);

-}

-

-// exports

-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;

-scope.watchShadow = watchShadow;

-scope.upgradeDocumentTree = upgradeDocumentTree;

-scope.upgradeAll = addedNode;

-scope.upgradeSubtree = addedSubtree;

-scope.insertedNode = insertedNode;

-

-scope.observeDocument = observeDocument;

-scope.upgradeDocument = upgradeDocument;

-

-scope.takeRecords = takeRecords;

-

-})(window.CustomElements);

-
-/*
- * 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
- */
-
-/**
- * Implements `document.registerElement`
- * @module CustomElements
-*/
-
-/**
- * Polyfilled extensions to the `document` object.
- * @class Document
-*/
-
-(function(scope) {
-
-// imports
-
-if (!scope) {
-  scope = window.CustomElements = {flags:{}};
-}
-var flags = scope.flags;
-
-// native document.registerElement?
-
-var hasNative = Boolean(document.registerElement);
-// For consistent timing, use native custom elements only when not polyfilling
-// other key related web components features.
-var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
-
-if (useNative) {
-
-  // stub
-  var nop = function() {};
-
-  // exports
-  scope.registry = {};
-  scope.upgradeElement = nop;
-
-  scope.watchShadow = nop;
-  scope.upgrade = nop;
-  scope.upgradeAll = nop;
-  scope.upgradeSubtree = nop;
-  scope.observeDocument = nop;
-  scope.upgradeDocument = nop;
-  scope.upgradeDocumentTree = nop;
-  scope.takeRecords = nop;
-  scope.reservedTagList = [];
-
-} else {
-
-  /**
-   * Registers a custom tag name with the document.
-   *
-   * When a registered element is created, a `readyCallback` method is called
-   * in the scope of the element. The `readyCallback` method can be specified on
-   * either `options.prototype` or `options.lifecycle` with the latter taking
-   * precedence.
-   *
-   * @method register
-   * @param {String} name The tag name to register. Must include a dash ('-'),
-   *    for example 'x-component'.
-   * @param {Object} options
-   *    @param {String} [options.extends]
-   *      (_off spec_) Tag name of an element to extend (or blank for a new
-   *      element). This parameter is not part of the specification, but instead
-   *      is a hint for the polyfill because the extendee is difficult to infer.
-   *      Remember that the input prototype must chain to the extended element's
-   *      prototype (or HTMLElement.prototype) regardless of the value of
-   *      `extends`.
-   *    @param {Object} options.prototype The prototype to use for the new
-   *      element. The prototype must inherit from HTMLElement.
-   *    @param {Object} [options.lifecycle]
-   *      Callbacks that fire at important phases in the life of the custom
-   *      element.
-   *
-   * @example
-   *      FancyButton = document.registerElement("fancy-button", {
-   *        extends: 'button',
-   *        prototype: Object.create(HTMLButtonElement.prototype, {
-   *          readyCallback: {
-   *            value: function() {
-   *              console.log("a fancy-button was created",
-   *            }
-   *          }
-   *        })
-   *      });
-   * @return {Function} Constructor for the newly registered type.
-   */
-  function register(name, options) {
-    //console.warn('document.registerElement("' + name + '", ', options, ')');
-    // construct a defintion out of options
-    // TODO(sjmiles): probably should clone options instead of mutating it
-    var definition = options || {};
-    if (!name) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('document.registerElement: first argument `name` must not be empty');
-    }
-    if (name.indexOf('-') < 0) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('document.registerElement: first argument (\'name\') must contain a dash (\'-\'). Argument provided was \'' + String(name) + '\'.');
-    }
-    // prevent registering reserved names
-    if (isReservedTag(name)) {
-      throw new Error('Failed to execute \'registerElement\' on \'Document\': Registration failed for type \'' + String(name) + '\'. The type name is invalid.');
-    }
-    // elements may only be registered once
-    if (getRegisteredDefinition(name)) {
-      throw new Error('DuplicateDefinitionError: a type with name \'' + String(name) + '\' is already registered');
-    }
-    // must have a prototype, default to an extension of HTMLElement
-    // TODO(sjmiles): probably should throw if no prototype, check spec
-    if (!definition.prototype) {
-      // TODO(sjmiles): replace with more appropriate error (EricB can probably
-      // offer guidance)
-      throw new Error('Options missing required prototype property');
-    }
-    // record name
-    definition.__name = name.toLowerCase();
-    // ensure a lifecycle object so we don't have to null test it
-    definition.lifecycle = definition.lifecycle || {};
-    // build a list of ancestral custom elements (for native base detection)
-    // TODO(sjmiles): we used to need to store this, but current code only
-    // uses it in 'resolveTagName': it should probably be inlined
-    definition.ancestry = ancestry(definition.extends);
-    // extensions of native specializations of HTMLElement require localName
-    // to remain native, and use secondary 'is' specifier for extension type
-    resolveTagName(definition);
-    // some platforms require modifications to the user-supplied prototype
-    // chain
-    resolvePrototypeChain(definition);
-    // overrides to implement attributeChanged callback
-    overrideAttributeApi(definition.prototype);
-    // 7.1.5: Register the DEFINITION with DOCUMENT
-    registerDefinition(definition.__name, definition);
-    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE
-    // 7.1.8. Return the output of the previous step.
-    definition.ctor = generateConstructor(definition);
-    definition.ctor.prototype = definition.prototype;
-    // force our .constructor to be our actual constructor
-    definition.prototype.constructor = definition.ctor;
-    // if initial parsing is complete
-    if (scope.ready) {
-      // upgrade any pre-existing nodes of this type
-      scope.upgradeDocumentTree(document);
-    }
-    return definition.ctor;
-  }
-
-  function isReservedTag(name) {
-    for (var i = 0; i < reservedTagList.length; i++) {
-      if (name === reservedTagList[i]) {
-        return true;
-      }
-    }
-  }
-
-  var reservedTagList = [
-    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',
-    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'
-  ];
-
-  function ancestry(extnds) {
-    var extendee = getRegisteredDefinition(extnds);
-    if (extendee) {
-      return ancestry(extendee.extends).concat([extendee]);
-    }
-    return [];
-  }
-
-  function resolveTagName(definition) {
-    // if we are explicitly extending something, that thing is our
-    // baseTag, unless it represents a custom component
-    var baseTag = definition.extends;
-    // if our ancestry includes custom components, we only have a
-    // baseTag if one of them does
-    for (var i=0, a; (a=definition.ancestry[i]); i++) {
-      baseTag = a.is && a.tag;
-    }
-    // our tag is our baseTag, if it exists, and otherwise just our name
-    definition.tag = baseTag || definition.__name;
-    if (baseTag) {
-      // if there is a base tag, use secondary 'is' specifier
-      definition.is = definition.__name;
-    }
-  }
-
-  function resolvePrototypeChain(definition) {
-    // if we don't support __proto__ we need to locate the native level
-    // prototype for precise mixing in
-    if (!Object.__proto__) {
-      // default prototype
-      var nativePrototype = HTMLElement.prototype;
-      // work out prototype when using type-extension
-      if (definition.is) {
-        var inst = document.createElement(definition.tag);
-        var expectedPrototype = Object.getPrototypeOf(inst);
-        // only set nativePrototype if it will actually appear in the definition's chain
-        if (expectedPrototype === definition.prototype) {
-          nativePrototype = expectedPrototype;
-        }
-      }
-      // ensure __proto__ reference is installed at each point on the prototype
-      // chain.
-      // NOTE: On platforms without __proto__, a mixin strategy is used instead
-      // of prototype swizzling. In this case, this generated __proto__ provides
-      // limited support for prototype traversal.
-      var proto = definition.prototype, ancestor;
-      while (proto && (proto !== nativePrototype)) {
-        ancestor = Object.getPrototypeOf(proto);
-        proto.__proto__ = ancestor;
-        proto = ancestor;
-      }
-      // cache this in case of mixin
-      definition.native = nativePrototype;
-    }
-  }
-
-  // SECTION 4
-
-  function instantiate(definition) {
-    // 4.a.1. Create a new object that implements PROTOTYPE
-    // 4.a.2. Let ELEMENT by this new object
-    //
-    // the custom element instantiation algorithm must also ensure that the
-    // output is a valid DOM element with the proper wrapper in place.
-    //
-    return upgrade(domCreateElement(definition.tag), definition);
-  }
-
-  function upgrade(element, definition) {
-    // some definitions specify an 'is' attribute
-    if (definition.is) {
-      element.setAttribute('is', definition.is);
-    }
-    // make 'element' implement definition.prototype
-    implement(element, definition);
-    // flag as upgraded
-    element.__upgraded__ = true;
-    // lifecycle management
-    created(element);
-    // attachedCallback fires in tree order, call before recursing
-    scope.insertedNode(element);
-    // there should never be a shadow root on element at this point
-    scope.upgradeSubtree(element);
-    // OUTPUT
-    return element;
-  }
-
-  function implement(element, definition) {
-    // prototype swizzling is best
-    if (Object.__proto__) {
-      element.__proto__ = definition.prototype;
-    } else {
-      // where above we can re-acquire inPrototype via
-      // getPrototypeOf(Element), we cannot do so when
-      // we use mixin, so we install a magic reference
-      customMixin(element, definition.prototype, definition.native);
-      element.__proto__ = definition.prototype;
-    }
-  }
-
-  function customMixin(inTarget, inSrc, inNative) {
-    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of
-    // any property. This set should be precalculated. We also need to
-    // consider this for supporting 'super'.
-    var used = {};
-    // start with inSrc
-    var p = inSrc;
-    // The default is HTMLElement.prototype, so we add a test to avoid mixing in
-    // native prototypes
-    while (p !== inNative && p !== HTMLElement.prototype) {
-      var keys = Object.getOwnPropertyNames(p);
-      for (var i=0, k; k=keys[i]; i++) {
-        if (!used[k]) {
-          Object.defineProperty(inTarget, k,
-              Object.getOwnPropertyDescriptor(p, k));
-          used[k] = 1;
-        }
-      }
-      p = Object.getPrototypeOf(p);
-    }
-  }
-
-  function created(element) {
-    // invoke createdCallback
-    if (element.createdCallback) {
-      element.createdCallback();
-    }
-  }
-
-  // attribute watching
-
-  function overrideAttributeApi(prototype) {
-    // overrides to implement callbacks
-    // TODO(sjmiles): should support access via .attributes NamedNodeMap
-    // TODO(sjmiles): preserves user defined overrides, if any
-    if (prototype.setAttribute._polyfilled) {
-      return;
-    }
-    var setAttribute = prototype.setAttribute;
-    prototype.setAttribute = function(name, value) {
-      changeAttribute.call(this, name, value, setAttribute);
-    }
-    var removeAttribute = prototype.removeAttribute;
-    prototype.removeAttribute = function(name) {
-      changeAttribute.call(this, name, null, removeAttribute);
-    }
-    prototype.setAttribute._polyfilled = true;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/
-  // index.html#dfn-attribute-changed-callback
-  function changeAttribute(name, value, operation) {
-    name = name.toLowerCase();
-    var oldValue = this.getAttribute(name);
-    operation.apply(this, arguments);
-    var newValue = this.getAttribute(name);
-    if (this.attributeChangedCallback
-        && (newValue !== oldValue)) {
-      this.attributeChangedCallback(name, oldValue, newValue);
-    }
-  }
-
-  // element registry (maps tag names to definitions)
-
-  var registry = {};
-
-  function getRegisteredDefinition(name) {
-    if (name) {
-      return registry[name.toLowerCase()];
-    }
-  }
-
-  function registerDefinition(name, definition) {
-    registry[name] = definition;
-  }
-
-  function generateConstructor(definition) {
-    return function() {
-      return instantiate(definition);
-    };
-  }
-
-  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
-  function createElementNS(namespace, tag, typeExtension) {
-    // NOTE: we do not support non-HTML elements,
-    // just call createElementNS for non HTML Elements
-    if (namespace === HTML_NAMESPACE) {
-      return createElement(tag, typeExtension);
-    } else {
-      return domCreateElementNS(namespace, tag);
-    }
-  }
-
-  function createElement(tag, typeExtension) {
-    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could
-    // error check it, or perhaps there should only ever be one argument
-    var definition = getRegisteredDefinition(typeExtension || tag);
-    if (definition) {
-      if (tag == definition.tag && typeExtension == definition.is) {
-        return new definition.ctor();
-      }
-      // Handle empty string for type extension.
-      if (!typeExtension && !definition.is) {
-        return new definition.ctor();
-      }
-    }
-
-    if (typeExtension) {
-      var element = createElement(tag);
-      element.setAttribute('is', typeExtension);
-      return element;
-    }
-    var element = domCreateElement(tag);
-    // Custom tags should be HTMLElements even if not upgraded.
-    if (tag.indexOf('-') >= 0) {
-      implement(element, HTMLElement);
-    }
-    return element;
-  }
-
-  function upgradeElement(element) {
-    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {
-      var is = element.getAttribute('is');
-      var definition = getRegisteredDefinition(is || element.localName);
-      if (definition) {
-        if (is && definition.tag == element.localName) {
-          return upgrade(element, definition);
-        } else if (!is && !definition.extends) {
-          return upgrade(element, definition);
-        }
-      }
-    }
-  }
-
-  function cloneNode(deep) {
-    // call original clone
-    var n = domCloneNode.call(this, deep);
-    // upgrade the element and subtree
-    scope.upgradeAll(n);
-    // return the clone
-    return n;
-  }
-  // capture native createElement before we override it
-
-  var domCreateElement = document.createElement.bind(document);
-  var domCreateElementNS = document.createElementNS.bind(document);
-
-  // capture native cloneNode before we override it
-
-  var domCloneNode = Node.prototype.cloneNode;
-
-  // exports
-
-  document.registerElement = register;
-  document.createElement = createElement; // override
-  document.createElementNS = createElementNS; // override
-  Node.prototype.cloneNode = cloneNode; // override
-
-  scope.registry = registry;
-
-  /**
-   * Upgrade an element to a custom element. Upgrading an element
-   * causes the custom prototype to be applied, an `is` attribute
-   * to be attached (as needed), and invocation of the `readyCallback`.
-   * `upgrade` does nothing if the element is already upgraded, or
-   * if it matches no registered custom tag name.
-   *
-   * @method ugprade
-   * @param {Element} element The element to upgrade.
-   * @return {Element} The upgraded element.
-   */
-  scope.upgrade = upgradeElement;
-}
-
-// Create a custom 'instanceof'. This is necessary when CustomElements
-// are implemented via a mixin strategy, as for example on IE10.
-var isInstance;
-if (!Object.__proto__ && !useNative) {
-  isInstance = function(obj, ctor) {
-    var p = obj;
-    while (p) {
-      // NOTE: this is not technically correct since we're not checking if
-      // an object is an instance of a constructor; however, this should
-      // be good enough for the mixin strategy.
-      if (p === ctor.prototype) {
-        return true;
-      }
-      p = p.__proto__;
-    }
-    return false;
-  }
-} else {
-  isInstance = function(obj, base) {
-    return obj instanceof base;
-  }
-}
-
-// exports
-scope.instanceof = isInstance;
-scope.reservedTagList = reservedTagList;
-
-// bc
-document.register = document.registerElement;
-
-scope.hasNative = hasNative;
-scope.useNative = useNative;
-
-})(window.CustomElements);
-
-/*
- * 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) {
-
-// import
-
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-
-// highlander object for parsing a document tree
-
-var parser = {
-  selectors: [
-    'link[rel=' + IMPORT_LINK_TYPE + ']'
-  ],
-  map: {
-    link: 'parseLink'
-  },
-  parse: function(inDocument) {
-    if (!inDocument.__parsed) {
-      // only parse once
-      inDocument.__parsed = true;
-      // all parsable elements in inDocument (depth-first pre-order traversal)
-      var elts = inDocument.querySelectorAll(parser.selectors);
-      // for each parsable node type, call the mapped parsing method
-      forEach(elts, function(e) {
-        parser[parser.map[e.localName]](e);
-      });
-      // upgrade all upgradeable static elements, anything dynamically
-      // created should be caught by observer
-      CustomElements.upgradeDocument(inDocument);
-      // observe document for dom changes
-      CustomElements.observeDocument(inDocument);
-    }
-  },
-  parseLink: function(linkElt) {
-    // imports
-    if (isDocumentLink(linkElt)) {
-      this.parseImport(linkElt);
-    }
-  },
-  parseImport: function(linkElt) {
-    if (linkElt.import) {
-      parser.parse(linkElt.import);
-    }
-  }
-};
-
-function isDocumentLink(inElt) {
-  return (inElt.localName === 'link'
-      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);
-}
-
-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-// exports
-
-scope.parser = parser;
-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-
-})(window.CustomElements);
-/*
- * 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){
-
-// bootstrap parsing
-function bootstrap() {
-  // parse document
-  CustomElements.parser.parse(document);
-  // one more pass before register is 'live'
-  CustomElements.upgradeDocument(document);
-  // install upgrade hook if HTMLImports are available
-  if (window.HTMLImports) {
-    HTMLImports.__importsParsingHook = function(elt) {
-      CustomElements.parser.parse(elt.import);
-    }
-  }
-  // set internal 'ready' flag, now document.registerElement will trigger 
-  // synchronous upgrades
-  CustomElements.ready = true;
-  // async to ensure *native* custom elements upgrade prior to this
-  // DOMContentLoaded can fire before elements upgrade (e.g. when there's
-  // an external script)
-  setTimeout(function() {
-    // capture blunt profiling data
-    CustomElements.readyTime = Date.now();
-    if (window.HTMLImports) {
-      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
-    }
-    // notify the system that we are bootstrapped
-    document.dispatchEvent(
-      new CustomEvent('WebComponentsReady', {bubbles: true})
-    );
-  });
-}
-
-// CustomEvent shim for IE
-if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType, params) {
-    params = params || {};
-    var e = document.createEvent('CustomEvent');
-    e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
-    return e;
-  };
-  window.CustomEvent.prototype = window.Event.prototype;
-}
-
-// When loading at readyState complete time (or via flag), boot custom elements
-// immediately.
-// If relevant, HTMLImports must already be loaded.
-if (document.readyState === 'complete' || scope.flags.eager) {
-  bootstrap();
-// When loading at readyState interactive time, bootstrap only if HTMLImports
-// are not pending. Also avoid IE as the semantics of this state are unreliable.
-} else if (document.readyState === 'interactive' && !window.attachEvent &&
-    (!window.HTMLImports || window.HTMLImports.ready)) {
-  bootstrap();
-// When loading at other readyStates, wait for the appropriate DOM event to 
-// bootstrap.
-} else {
-  var loadEvent = window.HTMLImports && !HTMLImports.ready ?
-      'HTMLImportsLoaded' : 'DOMContentLoaded';
-  window.addEventListener(loadEvent, bootstrap);
-}
-
-})(window.CustomElements);
-
-/*
- * 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() {
-
-if (window.ShadowDOMPolyfill) {
-
-  // ensure wrapped inputs for these functions
-  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',
-      'upgradeDocument'];
-
-  // cache originals
-  var original = {};
-  fns.forEach(function(fn) {
-    original[fn] = CustomElements[fn];
-  });
-
-  // override
-  fns.forEach(function(fn) {
-    CustomElements[fn] = function(inNode) {
-      return original[fn](wrap(inNode));
-    };
-  });
-
-}
-
-})();
-
-/*
- * 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) {
-    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; position: relative;' 
-      + ' } \n'
-      ;
-  var head = document.querySelector('head');
-  head.insertBefore(style, head.firstChild);
-
-})(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) {
-
-  function withDependencies(task, depends) {
-    depends = depends || [];
-    if (!depends.map) {
-      depends = [depends];
-    }
-    return task.apply(this, depends.map(marshal));
-  }
-
-  function module(name, dependsOrFactory, moduleFactory) {
-    var module;
-    switch (arguments.length) {
-      case 0:
-        return;
-      case 1:
-        module = null;
-        break;
-      case 2:
-        // dependsOrFactory is `factory` in this case
-        module = dependsOrFactory.apply(this);
-        break;
-      default:
-        // dependsOrFactory is `depends` in this case
-        module = withDependencies(moduleFactory, dependsOrFactory);
-        break;
-    }
-    modules[name] = module;
-  };
-
-  function marshal(name) {
-    return modules[name];
-  }
-
-  var modules = {};
-
-  function using(depends, task) {
-    HTMLImports.whenImportsReady(function() {
-      withDependencies(task, depends);
-    });
-  };
-
-  // exports
-
-  scope.marshal = marshal;
-  // `module` confuses commonjs detectors
-  scope.modularize = module;
-  scope.using = using;
-
-})(window);
-
-//# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
deleted file mode 100644
index a35db97..0000000
--- a/pkg/web_components/lib/platform.concat.js.map
+++ /dev/null
@@ -1,160 +0,0 @@
-{
-  "version": 3,
-  "file": "platform.concat.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",
-    "build/else.js",
-    "src/patches-shadowdom-native.js",
-    "build/end-if.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": "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;AACA;A;AC7CA;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;AACA;AACA;AACA;AACA;A;AC5XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;A;ACluBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;ACzlBA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;A;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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.log('Warning: 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        return this;\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(observer) {\n    if (observer.scheduled_)\n      return;\n\n    observer.scheduled_ = true;\n    globalMutationObservers.push(observer);\n\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        mo.scheduled_ = false;\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    // 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      scheduleCallback(observer);\n      observer.records_.push(record);\n    }\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    this.scheduled_ = false;\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      // Make sure we remove transient observers at the end of microtask, even\n      // if we didn't get any change records.\n      scheduleCallback(this.observer);\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      if (textContent == null) 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",
-    "} else {",
-    "/*\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    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\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 IMPORT_LINK_TYPE = 'import';\r\nvar hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));\r\nvar useNative = hasNative;\r\nvar isIE = /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\n\r\nvar rootDocument = 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(rootDocument, '_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 whenReady(callback, doc) {\r\n  doc = doc || rootDocument;\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) && callback) {\r\n       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\nwhenReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  rootDocument.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 = whenReady;\r\nscope.rootDocument = rootDocument;\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.isIE = isIE;\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\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\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\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\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\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\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\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n\n  };\n\n  xhr = xhr || {\n    async: true,\n\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\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\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\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\n// imports\nvar rootDocument = scope.rootDocument;\nvar flags = scope.flags;\nvar isIE = scope.isIE;\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\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\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n\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\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n\n  dynamicElements: [],\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\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\n  parseDynamic: function(elt, quiet) {\n    this.dynamicElements.push(elt);\n    if (!quiet) {\n      this.parseNext();\n    }\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\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    this.markDynamicParsingComplete(elt);\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n      this.markDynamicParsingComplete(elt.__importElement);\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n\n  markDynamicParsingComplete: function(elt) {\n    var i = this.dynamicElements.indexOf(elt);\n    if (i >= 0) {\n      this.dynamicElements.splice(i, 1);\n    }\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\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\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\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\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\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\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\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\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    this._mayParse = [];\n    return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || \n        this.nextToParseDynamic());\n  },\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\n  nextToParseDynamic: function() {\n    return this.dynamicElements[0];\n  },\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 === rootDocument ? this.documentSelectors :\n        this.importsSelectors;\n  },\n\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n\n  needsDynamicParsing: function(elt) {\n    return (this.dynamicElements.indexOf(elt) >= 0);\n  },\n\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\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\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\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\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\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\n// imports\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\nif (!useNative) {\n\n  // imports\n  var rootDocument = scope.rootDocument;\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\n    documents: {},\n    \n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    \n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    \n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\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    \n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\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 === rootDocument ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\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    \n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    \n    loadedAll: function() {\n      parser.parseNext();\n    }\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(rootDocument, '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})(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\n// imports\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importer = scope.importer;\nvar parser = scope.parser;\n\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\n\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\n// IFF the owning document has already parsed, then parsable elements\n// need to be marked for dynamic parsing.\nfunction addedNodes(nodes) {\n  var owner, parsed;\n  for (var i=0, l=nodes.length, n, loading; (i<l) && (n=nodes[i]); i++) {\n    if (!owner) {\n      owner = n.ownerDocument;\n      parsed = parser.isParsed(owner);\n    }\n    // note: the act of loading kicks the parser, so we use parseDynamic's\n    // 2nd argument to control if this added node needs to kick the parser.\n    loading = shouldLoadNode(n);\n    if (loading) {\n      importer.loadNode(n);\n    }\n    if (shouldParseNode(n) && parsed) {\n      parser.parseDynamic(n, loading);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\nfunction shouldParseNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      parser.parseSelectorsForNode(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  observe(root);\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\nfunction takeRecords(node) {\r\n  // If the optional node is not supplied, assume we mean the whole document.\r\n  if (!node) node = wrapIfNeeded(document);\r\n\r\n  // Find the root of the tree, which will be an Document or ShadowRoot.\r\n  while (node.parentNode) {\r\n    node = node.parentNode;\r\n  }\r\n\r\n  var observer = node.__observer;\r\n  if (observer) {\r\n    handler(observer.takeRecords());\r\n    takeMutations();\r\n  }\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  if (inRoot.__observer) return;\r\n\r\n  // For each ShadowRoot, we create a new MutationObserver, so the root can be\r\n  // garbage collected once all references to the `inRoot` node are gone.\r\n  var observer = new MutationObserver(handler);\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n  inRoot.__observer = observer;\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/lib/platform.js b/pkg/web_components/lib/platform.js
deleted file mode 100644
index 8c8a9d2..0000000
--- a/pkg/web_components/lib/platform.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * @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
- */
-// @version: 0.4.2-f0342cf
-
-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.log("Warning: 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];return d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0}),this},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(a){a.scheduled_||(a.scheduled_=!0,o.push(a),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];c.scheduled_=!1;var 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)}}}for(var o in f){var m=f[o],p=new d(c,a);"name"in e&&"namespace"in e&&(p.attributeName=e.name,p.attributeNamespace=e.namespace),e.addedNodes&&(p.addedNodes=e.addedNodes),e.removedNodes&&(p.removedNodes=e.removedNodes),e.previousSibling&&(p.previousSibling=e.previousSibling),e.nextSibling&&(p.nextSibling=e.nextSibling),void 0!==g[o]&&(p.oldValue=g[o]),b(m),m.records_.push(p)}}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,this.scheduled_=!1}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){b(this.observer),this.transientObservedNodes.push(a);var c=n.get(a);c||n.set(a,c=[]),c.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){null==a&&(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: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"))},get origin(){var a;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return a=this.host,a?this._scheme+"://"+a:""}};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||q,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===s}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===s)&&(b.removeEventListener(t,e),d(a,b))};b.addEventListener(t,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 m?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",l=k in document.createElement("link"),m=l,n=/Trident/.test(navigator.userAgent),o=Boolean(window.ShadowDOMPolyfill),p=function(a){return o?ShadowDOMPolyfill.wrapIfNeeded(a):a},q=p(document),r={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(a)},configurable:!0};Object.defineProperty(document,"_currentScript",r),Object.defineProperty(q,"_currentScript",r);var s=n?"complete":"interactive",t="readystatechange";m&&(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(),q.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=m,a.isImportLoaded=g,a.whenReady=b,a.rootDocument=q,a.IMPORT_LINK_TYPE=k,a.isIE=n}(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===j}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=a.rootDocument,h=a.flags,i=a.isIE,j=a.IMPORT_LINK_TYPE,k={documentSelectors:"link[rel="+j+"]",importsSelectors:["link[rel="+j+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],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))},parseDynamic:function(a,b){this.dynamicElements.push(a),b||this.parseNext()},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,this.markDynamicParsingComplete(a),a.__importElement&&(a.__importElement.__importParsed=!0,this.markDynamicParsingComplete(a.__importElement)),this.parsingElement=null,h.parse&&console.log("completed",a)},markDynamicParsingComplete:function(a){var b=this.dynamicElements.indexOf(a);b>=0&&this.dynamicElements.splice(b,1)},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(g)||this.nextToParseDynamic())},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},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===g?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},needsDynamicParsing:function(a){return this.dynamicElements.indexOf(a)>=0},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=a.IMPORT_LINK_TYPE;if(e)var h={};else{var i=a.rootDocument,j=(a.xhr,a.Loader),k=a.parser,h={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===i?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(h.loaded.bind(h),h.loadedAll.bind(h));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(i,"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=h,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,f,i,j,k=0,l=a.length;l>k&&(i=a[k]);k++)b||(b=i.ownerDocument,f=h.isParsed(b)),j=d(i),j&&g.loadNode(i),e(i)&&f&&h.parseDynamic(i,j),i.children&&i.children.length&&c(i.children)}function d(a){return 1===a.nodeType&&i.call(a,g.loadSelectorsForNode(a))}function e(a){return 1===a.nodeType&&i.call(a,h.parseSelectorsForNode(a))}function f(a){j.observe(a,{childList:!0,subtree:!0})}var g=(a.IMPORT_LINK_TYPE,a.importer),h=a.parser,i=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,j=new MutationObserver(b);a.observe=f,g.observe=f}(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){w(a)}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&&(H(a.addedNodes,function(a){a.localName&&g(a)}),H(a.removedNodes,function(a){a.localName&&n(a)}))}),B.dom&&console.groupEnd()}function v(a){for(a||(a=q(document));a.parentNode;)a=a.parentNode;var b=a.__observer;b&&(u(b.takeRecords()),k())}function w(a){if(!a.__observer){var b=new MutationObserver(u);b.observe(a,{childList:!0,subtree:!0}),a.__observer=b}}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=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
deleted file mode 100644
index 4d484f5..0000000
--- a/pkg/web_components/lib/platform.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"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":";;;;;;;;;;;AASA,OAAA,SAAA,OAAA,aAEA,OAAA,SAAA,OAAA,aAEA,SAAA,GAEA,GAAA,GAAA,EAAA,SAEA,UAAA,OAAA,MAAA,GAAA,MAAA,KAAA,QAAA,SAAA,GACA,EAAA,EAAA,MAAA,KACA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,KAAA,IAEA,IAAA,GAAA,SAAA,eACA,SAAA,cAAA,6BACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,QAAA,EAAA,OACA,EAAA,EAAA,MAAA,EAAA,QAAA,EAIA,GAAA,KACA,EAAA,IAAA,MAAA,KAAA,QAAA,SAAA,GACA,OAAA,SAAA,IAAA,IAMA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAEA,EAAA,OADA,WAAA,EAAA,QACA,EAEA,EAAA,SAAA,YAAA,UAAA,iBAGA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,IAAA,4IAMA,EAAA,WACA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAGA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SAIA,EAAA,MAAA,GACA,UC5DA,mBAAA,WACA,WACA,GAAA,GAAA,OAAA,eACA,EAAA,KAAA,MAAA,IAEA,EAAA,WACA,KAAA,KAAA,QAAA,IAAA,KAAA,WAAA,IAAA,KAAA,MAGA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAKA,OAJA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,IACA,MAEA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,EACA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,KAAA,EAAA,OAAA,CACA,IAAA,GAAA,EAAA,KAAA,CAEA,OADA,GAAA,GAAA,EAAA,GAAA,OACA,GAEA,IAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,OAAA,GACA,EAAA,KAAA,GADA,IAKA,OAAA,QAAA,KC1CA,SAAA,MAAA,SCQA,SAAA,GACA,YAKA,SAAA,KAQA,QAAA,GAAA,GACA,EAAA,EARA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAGA,IAAA,MAMA,KACA,IAUA,OATA,QAAA,QAAA,EAAA,GACA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,GAAA,QACA,GAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAEA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAGA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAEA,GAKA,QAAA,KAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAMA,IAAA,mBAAA,YAAA,UAAA,iBACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,OAAA,IAAA,IAAA,GAAA,KAAA,EAGA,QAAA,GAAA,GACA,OAAA,EAGA,QAAA,GAAA,GACA,MAAA,KAAA,OAAA,GAOA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,EAAA,IAAA,EAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAqBA,QAAA,GAAA,GACA,GAAA,SAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,WAAA,EAEA,QAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,MAAA,EAEA,KAAA,IACA,IAAA,IACA,MAAA,OAEA,KAAA,IACA,IAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,OACA,IAAA,MACA,IAAA,MACA,MAAA,KAIA,MAAA,IAAA,IAAA,KAAA,GAAA,GAAA,IAAA,IAAA,EACA,QAGA,GAAA,IAAA,IAAA,EACA,SAEA,OAuEA,QAAA,MAEA,QAAA,GAAA,GAsBA,QAAA,KACA,KAAA,GAAA,EAAA,QAAA,CAGA,GAAA,GAAA,EAAA,EAAA,EACA,OAAA,iBAAA,GAAA,KAAA,GACA,iBAAA,GAAA,KAAA,GACA,IACA,EAAA,EACA,EAAA,UACA,GALA,QASA,IAnCA,GAEA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAFA,KACA,EAAA,GACA,EAAA,aAEA,GACA,KAAA,WACA,SAAA,IAGA,EAAA,KAAA,GACA,EAAA,SAGA,OAAA,WACA,SAAA,EACA,EAAA,EAEA,GAAA,IAkBA,GAIA,GAHA,IACA,EAAA,EAAA,GAEA,MAAA,IAAA,EAAA,GAAA,CAOA,GAJA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,EAAA,SAAA,QAEA,SAAA,EACA,MAOA,IALA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,EACA,EAAA,SAAA,EAAA,GAAA,EAAA,EAAA,GACA,IAEA,cAAA,EACA,MAAA,IAOA,QAAA,GAAA,GACA,MAAA,GAAA,KAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,IAAA,EACA,KAAA,OAAA,wCAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,KAAA,OAAA,EAAA,IAGA,IAAA,KAAA,SACA,KAAA,aAAA,KAAA,0BAOA,QAAA,GAAA,GACA,GAAA,YAAA,GACA,MAAA,EAKA,KAHA,MAAA,GAAA,GAAA,EAAA,UACA,EAAA,IAEA,gBAAA,GAAA,CACA,GAAA,EAAA,EAAA,QAEA,MAAA,IAAA,GAAA,EAAA,EAGA,GAAA,OAAA,GAGA,GAAA,GAAA,EAAA,EACA,IAAA,EACA,MAAA,EAEA,IAAA,GAAA,EAAA,EACA,KAAA,EACA,MAAA,EAEA,IAAA,GAAA,GAAA,GAAA,EAAA,EAEA,OADA,GAAA,GAAA,EACA,EAKA,QAAA,GAAA,GACA,MAAA,GAAA,GACA,IAAA,EAAA,IAEA,KAAA,EAAA,QAAA,KAAA,OAAA,KAqFA,QAAA,GAAA,GAEA,IADA,GAAA,GAAA,EACA,EAAA,GAAA,EAAA,UACA,GAKA,OAHA,KACA,EAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,GAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,QACA,EAAA,EAAA,UACA,EAAA,EAAA,SAGA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,KACA,IAEA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAEA,SAAA,GAAA,IAAA,EAAA,MAGA,IAAA,GAKA,IAAA,EAAA,KACA,EAAA,GAAA,GALA,EAAA,GAAA,QAQA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAMA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EACA,QAAA,EACA,QAAA,GAKA,QAAA,KACA,IAAA,GAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,GAAA,OAAA,IACA,GAAA,IAGA,OADA,IAAA,OAAA,GACA,EA4BA,QAAA,KAMA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,KAAA,GACA,EAAA,OAAA,GAPA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAOA,QACA,KAAA,SAAA,GACA,GAAA,EACA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAEA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EACA,MAAA,QAAA,EAAA,GAEA,OAAA,QAAA,EAAA,IAEA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OACA,OAAA,UAAA,EAAA,GACA,GAAA,KAAA,QA2BA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,OAAA,GAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAKA,QAAA,KAOA,QAAA,GAAA,EAAA,GACA,IAGA,IAAA,IACA,EAAA,IAAA,GAEA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GACA,OAAA,QAAA,EAAA,IAGA,EAAA,OAAA,eAAA,GAAA,IAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,SAAA,GACA,EAAA,EAAA,OACA,iBAAA,EAAA,KACA,OAAA,EAGA,OAAA,EAGA,QAAA,GAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,QAAA,IACA,EAAA,gBAAA,EAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,QAAA,IACA,EAAA,UAhDA,GAGA,GACA,EAJA,EAAA,EACA,KACA,KAmDA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,EAAA,GACA,IACA,EAAA,EACA,MAGA,EAAA,KAAA,GACA,IACA,EAAA,gBAAA,IAEA,MAAA,WAEA,GADA,MACA,EAAA,GAAA,CAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,EAAA,iBAGA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,GAAA,KAAA,QAIA,OAAA,GAKA,QAAA,GAAA,EAAA,GAMA,MALA,IAAA,EAAA,SAAA,IACA,EAAA,GAAA,OAAA,IACA,EAAA,OAAA,GAEA,EAAA,KAAA,EAAA,GACA,EAUA,QAAA,KACA,KAAA,OAAA,GACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,KA2DA,QAAA,GAAA,GACA,EAAA,qBACA,IAGA,GAAA,KAAA,GAGA,QAAA,KACA,EAAA,qBAmDA,QAAA,GAAA,GACA,EAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA0FA,QAAA,GAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,GAAA,KAAA,KAAA,GAgDA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,EAAA,GACA,KAAA,gBAAA,OA8CA,QAAA,GAAA,GACA,EAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OACA,KAAA,aAgIA,QAAA,GAAA,GAAA,MAAA,GAEA,QAAA,GAAA,EAAA,EAAA,EACA,GACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EACA,KAAA,YAAA,GAAA,EACA,KAAA,YAAA,GAAA,EAGA,KAAA,oBAAA,EAsDA,QAAA,GAAA,EAAA,EAAA,GAIA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,OAMA,EAAA,OAAA,KACA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAGA,OAAA,EAAA,KAUA,EAAA,OAAA,UACA,GAAA,EAAA,YACA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAbA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAfA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IA4BA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GACA,KAAA,IAAA,IAAA,IAAA,IAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,KAAA,IACA,EAAA,GAAA,GAGA,OACA,MAAA,EACA,QAAA,EACA,QAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,OACA,MAAA,EACA,QAAA,EACA,WAAA,GASA,QAAA,MA0OA,QAAA,GAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,IAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAGA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,EAAA,EAAA,EAAA,GAEA,GAAA,EACA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAGA,GAAA,GAAA,EAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MACA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAEA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CACA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAEA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAEA,IAAA,EAAA,MAAA,EAAA,MAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,EAAA,MAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAGA,GAAA,EAAA,MAAA,EAAA,QAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GAGA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAnBA,IAAA,MAsBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GACA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MACA,IAAA,SACA,EAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MACA,IAAA,SACA,IAAA,SACA,IAAA,EAAA,EAAA,MACA,QACA,IAAA,GAAA,EAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,GAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAKA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,KAcA,OAZA,GAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAKA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,EA7oDA,GAAA,GAAA,EAAA,wBA2CA,EAAA,IAwBA,EAAA,IAcA,EAAA,EAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,EAAA,MAAA,IAYA,EAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAKA,OAJA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAEA,GAGA,EAAA,aACA,EAAA,gBACA,EAAA,GAAA,QAAA,IAAA,EAAA,IAAA,EAAA,MA2CA,GACA,YACA,IAAA,cACA,OAAA,UAAA,UACA,KAAA,iBACA,KAAA,cAGA,QACA,IAAA,UACA,KAAA,eACA,KAAA,iBACA,KAAA,cAGA,aACA,IAAA,eACA,OAAA,UAAA,WAGA,SACA,OAAA,UAAA,UACA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,SAAA,QACA,KAAA,cAAA,QACA,KAAA,gBAAA,QACA,KAAA,YAAA,SAGA,eACA,IAAA,iBACA,GAAA,YAAA,UACA,QAAA,UAAA,UACA,KAAA,gBAAA,SAAA,IACA,KAAA,gBAAA,SAAA,KAGA,WACA,IAAA,eAAA,QACA,KAAA,SAAA,SAGA,SACA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,gBACA,KAAA,SAAA,SAGA,eACA,KAAA,gBACA,KAAA,SACA,QAAA,gBAAA,WAGA,eACA,KAAA,gBACA,KAAA,SACA,QAAA,gBAAA,WAGA,cACA,IAAA,gBACA,KAAA,SAAA,UAyEA,KAgBA,IA+BA,GAAA,IAAA,EAUA,EAAA,UAAA,GACA,aACA,OAAA,EAEA,SAAA,WAEA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,EAEA,IADA,EAAA,GACA,EAAA,IAAA,EAAA,EAEA,EAAA,GAIA,MAAA,IAGA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EACA,MACA,GAAA,EAAA,KAAA,IAEA,MAAA,IAGA,eAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,EAAA,GACA,MACA,GAAA,EAAA,KAAA,MAIA,uBAAA,WACA,GAAA,GAAA,GACA,EAAA,KACA,IAAA,iBAGA,KAFA,GACA,GADA,EAAA,EAEA,EAAA,KAAA,OAAA,EAAA,IACA,EAAA,KAAA,GACA,GAAA,EAAA,GAAA,IAAA,EAAA,EAAA,GACA,GAAA,aAAA,EAAA,UAEA,IAAA,KAEA,IAAA,GAAA,KAAA,EAIA,OAHA,IAAA,EAAA,GAAA,IAAA,EAAA,EAAA,GAEA,GAAA,YAAA,EAAA,+BACA,GAAA,UAAA,MAAA,IAGA,aAAA,SAAA,EAAA,GACA,IAAA,KAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,IAAA,EAAA,GACA,OAAA,CACA,GAAA,EAAA,KAAA,IAGA,MAAA,GAAA,IAGA,EAAA,KAAA,IAAA,GACA,IAHA,IAOA,IAAA,GAAA,GAAA,GAAA,GAAA,EACA,GAAA,OAAA,EACA,EAAA,aAAA,EAAA,aAAA,YAEA,IAqQA,GArQA,EAAA,IA8DA,MAYA,GAAA,EAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CAOA,OALA,QAAA,QAAA,EAAA,WACA,IACA,GAAA,IAGA,SAAA,GACA,GAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAIA,WACA,MAAA,UAAA,GACA,GAAA,KAAA,OAIA,MAyEA,MAsGA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,GAAA,CAWA,GAAA,WACA,KAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GACA,KAAA,OAAA,oCAOA,OALA,GAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,GACA,KAAA,QAGA,MAAA,WACA,KAAA,QAAA,KAGA,EAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,KAGA,QAAA,WACA,KAAA,QAAA,IAGA,EAAA,OAGA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GACA,MAAA,GACA,EAAA,4BAAA,EACA,QAAA,MAAA,+CACA,EAAA,OAAA,MAIA,eAAA,WAEA,MADA,MAAA,OAAA,QAAA,GACA,KAAA,QAIA,IACA,IADA,IAAA,CAEA,GAAA,mBAAA,EAEA,KACA,MAeA,IAAA,KAAA,CAEA,GAAA,SAAA,EAAA,aAEA,EAAA,SAAA,2BAAA,WACA,IAAA,IAGA,GAAA,CAGA,IAAA,CAEA,IACA,GAAA,EADA,EAAA,CAGA,GAAA,CACA,IACA,EAAA,GACA,MACA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,QAAA,KAGA,EAAA,WACA,GAAA,GAEA,GAAA,KAAA,IAEA,MACA,GAAA,SACA,EAAA,GAAA,EAEA,KACA,EAAA,qBAAA,GAEA,IAAA,IAGA,KACA,EAAA,SAAA,eAAA,WACA,QAUA,EAAA,UAAA,GACA,UAAA,EAAA,UAEA,cAAA,EAEA,SAAA,WACA,EACA,KAAA,gBAAA,EAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAKA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAIA,OAFA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QACA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,EAAA,CACA,IAAA,EACA,OAAA,CAEA,MACA,EAAA,EAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,EAAA,KAAA,OAAA,KAAA,WAGA,OAAA,GAAA,IACA,GAEA,IACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YACA,EAAA,YACA,SAAA,GACA,MAAA,GAAA,OAIA,IAGA,YAAA,WACA,GACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,KAGA,EACA,KAAA,gBAAA,SAAA,GAEA,EAAA,QAGA,eAAA,WAMA,MALA,MAAA,gBACA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAEA,KAAA,UAUA,EAAA,UAAA,GAEA,UAAA,EAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GACA,GAAA,EACA,IAAA,EAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,EAAA,KAAA,OAAA,OAEA,GAAA,EAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAGA,OAAA,IAAA,EAAA,QAGA,IACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SAAA,KACA,IANA,KAUA,EAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAGA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAGA,OAAA,UAAA,OAAA,MAAA,EAAA,MAYA,EAAA,UAAA,GACA,UAAA,EAAA,UAEA,GAAA,QACA,MAAA,MAAA,OAGA,SAAA,WACA,IACA,KAAA,gBAAA,EAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAGA,YAAA,WACA,KAAA,OAAA,OAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAIA,gBAAA,SAAA,GACA,KAAA,MAAA,eAAA,KAAA,QAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,MAEA,OADA,MAAA,OAAA,KAAA,MAAA,aAAA,KAAA,SACA,GAAA,EAAA,KAAA,OAAA,IACA,GAEA,KAAA,SAAA,KAAA,OAAA,EAAA,QACA,IAGA,SAAA,SAAA,GACA,KAAA,OACA,KAAA,MAAA,aAAA,KAAA,QAAA,KAaA,IAAA,MAEA,GAAA,UAAA,GACA,UAAA,EAAA,UAEA,SAAA,WACA,GAAA,EAAA,CAGA,IAAA,GAFA,GACA,GAAA,EACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAEA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,GAAA,CACA,GAAA,CACA,OAIA,IACA,KAAA,gBAAA,EAAA,KAAA,IAGA,KAAA,OAAA,QAAA,KAAA,uBAGA,YAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,KAAA,UAAA,KAAA,IACA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,EACA,KAAA,OAAA,OAAA,EAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAIA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,IAAA,KAAA,QAAA,GACA,KAAA,OAAA,iCAEA,IAAA,GAAA,EAAA,EAEA,IADA,KAAA,UAAA,KAAA,EAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,aAAA,KAGA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,IAAA,KAAA,QAAA,GACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,GAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,GACA,KAAA,OAAA,4BAEA,MAAA,OAAA,GACA,KAAA,eAGA,YAAA,WACA,GAAA,KAAA,QAAA,GACA,KAAA,OAAA,wCAIA,OAHA,MAAA,OAAA,GACA,KAAA,WAEA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,IACA,KAAA,UAAA,EAAA,GAAA,eAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAAA,CACA,GAEA,GAFA,EAAA,KAAA,UAAA,GACA,EAAA,KAAA,UAAA,EAAA,EAEA,IAAA,IAAA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,GACA,EAAA,KAAA,KAAA,QAAA,MACA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,EAAA,EAAA,KAAA,OAAA,EAAA,MAGA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KAwBA,EAAA,WACA,KAAA,SAAA,EAAA,GAKA,MAJA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OACA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,EAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAGA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAGA,QAAA,WACA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SACA,KAAA,YAAA,SAAA,GADA,QAIA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OACA,KAAA,YAAA,QAIA,IAAA,KACA,KAAA,EACA,QAAA,EACA,UAAA,GAsEA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CAIA,GAAA,WAaA,kBAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,EAAA,EAAA,EACA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,OAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,OACA,CACA,GAAA,GAAA,EAAA,EAAA,GAAA,GAAA,EACA,EAAA,EAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,MAAA,IAMA,kCAAA,SAAA,GAKA,IAJA,GAAA,GAAA,EAAA,OAAA,EACA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GACA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAKA,GAAA,GAAA,EAAA,CAKA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,KAEA,EAAA,KAAA,IACA,EAAA,GAEA,IACA,KACA,GAAA,GACA,EAAA,KAAA,IACA,IACA,EAAA,IAEA,EAAA,KAAA,IACA,IACA,EAAA,OA9BA,GAAA,KAAA,IACA,QANA,GAAA,KAAA,IACA,GAuCA,OADA,GAAA,UACA,GA2BA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAYA,IAXA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAEA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,EAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAEA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,EAAA,KAAA,EAAA,GAUA,KAAA,GARA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAEA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,EAAA,IACA,IAAA,IACA,IACA,EAAA,KAAA,GACA,EAAA,QAGA,IACA,GACA,MACA,KAAA,IACA,IACA,EAAA,EAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MACA,KAAA,IACA,IACA,EAAA,EAAA,KAAA,IAEA,EAAA,aACA,GACA,MACA,KAAA,IACA,IACA,EAAA,EAAA,KAAA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,IAQA,MAHA,IACA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,KAAA,OAAA,EAAA,GAAA,EAAA,IACA,MAAA,EACA,OAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GAIA,IAHA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EACA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,IAAA,GAAA,EAuJA,GAAA,SAAA,EACA,EAAA,SAAA,QAAA,GACA,EAAA,SAAA,kBAAA,GACA,EAAA,SAAA,iBAAA,EACA,EAAA,cAAA,EACA,EAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,IAAA,iBAAA,EAAA,IAGA,EAAA,YAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,EACA,EAAA,iBAAA,EACA,EAAA,KAAA,EACA,EAAA,kBAAA,GACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QCvqDA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAMA,IAAA,UAAA,iBACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAOA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,EAAA,IAEA,MAAA,GAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GACA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YACA,IAAA,WACA,SAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAEA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GAWA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,MAAA,EACA,EAAA,EAAA,EAAA,GAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EACA,IAAA,EACA,MAAA,EAEA,IAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAcA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAQA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,kCAAA,GACA,WAAA,MAAA,MAAA,mBAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,2BAAA,EAAA,QACA,SAAA,GAAA,KAAA,mBAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,kCAAA,EACA,8CACA,WACA,MAAA,MAAA,mBAAA,GAAA,MACA,KAAA,mBAAA,YAIA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAIA,MAAA,IAaA,QAAA,GAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,sBAAA,KAGA,IAAA,IAGA,EAAA,mBAAA,EAAA,kBAAA,IAAA,CAGA,GAEA,EAAA,iBAAA,EAEA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAKA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAEA,EAAA,UAAA,EAAA,KAAA,KAEA,EADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAWA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAEA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAEA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GAEA,EACA,EAAA,cAAA,GAEA,EAAA,UAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,IAAA,EAAA,aACA,EASA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAIA,OAHA,GAAA,YAAA,EACA,EAAA,UAAA,EAEA,EAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,mBAGA,QAAA,GAAA,GACA,OAAA,EAAA,GASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAEA,EAAA,EAAA,IACA,EAAA,wBACA,EAAA,sBAAA,IAAA,EAAA,IAAA,KAQA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,oBAGA,QAAA,GAAA,GACA,MAAA,GAAA,mBAGA,QAAA,GAAA,EAAA,GACA,EAAA,mBAAA,EACA,EAAA,sBAAA,EAQA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EAQA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,sBAAA,GASA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,IAAA,EACA,EAAA,EAAA,UAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,mBAAA,MAWA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBApYA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAwBA,EAAA,IAOA,EAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,yBAoCA,GACA,MAAA,OACA,cAAA,EACA,YAAA,EACA,UAAA,EAWA,GAAA,OAwBA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GAqDA,EAAA,WACA,GAAA,GAAA,OAAA,yBAAA,KAAA,UAAA,WACA,SAAA,GAAA,OAAA,MA0LA,GACA,IAAA,OACA,cAAA,EACA,YAAA,EAgCA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,EAAA,iBAAA,EACA,EAAA,wBAAA,EACA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,MAAA,EACA,EAAA,qBAAA,EACA,EAAA,MAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,OAAA,EACA,EAAA,WAAA,EACA,EAAA,aAAA,EACA,EAAA,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBClaA,SAAA,GACA,YAOA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAmBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAlCA,GAGA,GAHA,EAAA,OAAA,iBACA,KACA,GAAA,CAYA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WACA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAIA,GAAA,OAAA,cAAA,OAAA,UAWA,GAAA,kBAAA,GAEA,OAAA,mBC1CA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,aAGA,EAAA,YAAA,EACA,EAAA,KAAA,GAEA,IAEA,EAAA,GACA,GAAA,IAIA,QAAA,KAGA,IAFA,GAAA,EAEA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,MAGA,EAAA,KAAA,SAAA,EAAA,GAAA,MAAA,GAAA,KAAA,EAAA,MAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,YAAA,CACA,IAAA,GAAA,EAAA,aACA,GAAA,GACA,EAAA,QACA,EAAA,UAAA,EAAA,KAYA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KASA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,QAAA,SACA,EAAA,qBAAA,KAKA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,OAAA,GACA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,MACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,WAAA,GACA,EAAA,6BAMA,QAAA,GAAA,EAAA,EAAA,GAMA,IAAA,GAJA,GAAA,OAAA,OAAA,MACA,EAAA,OAAA,OAAA,MAGA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAEA,KAAA,IAAA,GAAA,EAAA,YAIA,eAAA,IAAA,EAAA,YAMA,eAAA,GAAA,EAAA,kBACA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAIA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAMA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAMA,IAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,GAAA,GAAA,EAAA,EAGA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KACA,EAAA,mBAAA,EAAA,WAIA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAGA,EAAA,cACA,EAAA,YAAA,EAAA,aAGA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAGA,EAAA,GACA,EAAA,SAAA,KAAA,IAUA,QAAA,GAAA,GAqBA,GApBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAQA,KAAA,WAJA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAGA,EAAA,YAFA,EAQA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBACA,KAAA,IAAA,UAMA,IAHA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBACA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAEA,MAAA,gBAAA,KAWA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EACA,KAAA,YAAA,EAmEA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA9TA,GAAA,GAAA,EAAA,kBACA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAqLA,EAAA,MAAA,UAAA,MAgDA,EAAA,CAeA,GAAA,WACA,YAAA,EAGA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAGA,GAHA,EAAA,GAAA,GAAA,GAIA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAEA,EAAA,2BAEA,EAAA,QAAA,EAKA,KACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,KAKA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAkBA,EAAA,WAMA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAKA,EAAA,KAAA,UAEA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAOA,EAAA,gBAAA,EACA,EAAA,2BAAA,EACA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,eAAA,GAEA,OAAA,mBCtXA,SAAA,GACA,YAgBA,SAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EAGA,KAAA,OAAA,EAoBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,IAKA,QAAA,GAAA,GAKA,GAJA,YAAA,GAAA,SAAA,OAIA,EAAA,WACA,MAAA,GAAA,UACA,IACA,GADA,EAAA,EAAA,UAMA,OAHA,GADA,EACA,EAAA,GAEA,GAAA,GAAA,EAAA,MACA,EAAA,WAAA,EA1CA,EAAA,WACA,GAAA,YACA,MAAA,MAAA,eAAA,GAAA,SAAA,WACA,EAAA,mBAAA,KAAA,KAAA,MAEA,MAGA,SAAA,SAAA,GACA,KAAA,EAAA,EAAA,EAAA,OACA,GAAA,IAAA,KACA,OAAA,CAEA,QAAA,IAgCA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBC5EA,SAAA,GACA,YAyBA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAAA,KAIA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,EAAA,CAEA,KADA,EAAA,KAAA,GACA,GAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EAAA,OAAA,EAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,eACA,IACA,EAAA,KAAA,GAIA,EAAA,KAAA,GAIA,EAAA,EACA,EAAA,OAAA,OAIA,IAAA,EAAA,GAAA,CACA,GAAA,EAAA,EAAA,IAAA,EAAA,GAEA,KAEA,GAAA,EAAA,KACA,EAAA,KAAA,OAIA,GAAA,EAAA,WACA,GACA,EAAA,KAAA,GAKA,MAAA,GAIA,QAAA,GAAA,GACA,IAAA,EACA,OAAA,CAEA,QAAA,EAAA,MACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,QACA,IAAA,SACA,IAAA,SACA,IAAA,cACA,OAAA,EAEA,OAAA,EAIA,QAAA,GAAA,GACA,MAAA,aAAA,mBAKA,QAAA,GAAA,GACA,MAAA,GAAA,8BAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,IAAA,EAAA,OACA,MAAA,EAIA,aAAA,GAAA,SACA,EAAA,EAAA,SAQA,KAAA,GANA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAGA,MAAA,GAAA,EAAA,OAAA,GAGA,QAAA,GAAA,GAEA,IADA,GAAA,MACA,EAAA,EAAA,EAAA,OACA,EAAA,KAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,KACA,EAAA,OAAA,GAAA,EAAA,OAAA,GAAA,CACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,KACA,IAAA,IAAA,EAGA,KAFA,GAAA,EAIA,MAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAGA,YAAA,GAAA,SACA,EAAA,EAAA,SAEA,IAKA,GALA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,GAKA,EACA,EAAA,EAAA,EAGA,KACA,EAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EACA,EACA,EAAA,EAAA,OAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAIA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,GAaA,QAAA,GAAA,GAEA,IAAA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAAA,SACA,GAAA,CACA,GAAA,GAAA,CAEA,MADA,GAAA,KACA,GAKA,QAAA,GAAA,GACA,OAAA,EAAA,MAEA,IAAA,OAEA,IAAA,eACA,IAAA,SACA,OAAA,EAEA,OAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAEA,GAAA,IAAA,GAAA,GAGA,EAAA,kBACA,IAAA,GAOA,EACA,CAKA,IAAA,EAAA,KAAA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,aAAA,GAAA,WAAA,EAAA,EAAA,eACA,EAAA,EACA,MAIA,IAAA,EACA,GAAA,YAAA,GAAA,OACA,EAAA,EACA,SAIA,IAFA,EAAA,EAAA,EAAA,IAEA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAiBA,MAZA,IAAA,IAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,IACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA,iBAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAEA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,GACA,EAAA,EAAA,IAAA,CACA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAGA,IAAA,EAAA,OAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,KAAA,EACA,OAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAEA,IAAA,IAAA,EAAA,CACA,GAAA,IAAA,GACA,OAAA,CAEA,KAAA,KACA,EAAA,QAEA,IAAA,IAAA,KAAA,EAAA,QACA,OAAA,CAGA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aAMA,IAAA,EAAA,CAIA,GAAA,YAAA,SACA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,GAEA,EACA,EAAA,EAAA,EAAA,EACA,IAAA,IAAA,EACA,OAAA,MAEA,GAAA,IAEA,GAAA,IAAA,EAAA,IAIA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAEA,GAAA,CACA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAIA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QACA,GAAA,MAIA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,IACA,EAAA,SAAA,IAAA,IAIA,IAMA,GALA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAEA,EAAA,QAAA,YAAA,GAEA,GAAA,IAAA,GACA,OAAA,EAEA,MAAA,GACA,IACA,EAAA,IAMA,GAFA,EAAA,QAEA,GAAA,IAAA,EAAA,MAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SACA,EAAA,KAAA,EAAA,IAIA,OAAA,EAAA,IAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GA6BA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KAYA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GAXA,IAAA,GAAA,CAKA,OAAA,KAAA,iBAAA,EAAA,MACA,eAAA,OAGA,GAAA,EAAA,MAFA,GAAA,GAAA,GAkCA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAEA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAFA,EAMA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,OACA,GAAA,EAAA,MAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAKA,IAHA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,GACA,EAAA,EAAA,UAAA,GACA,EAMA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAGA,MAAA,GAgBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAgCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GACA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GACA,GAAA,EASA,OARA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IACA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EAqCA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAeA,QAAA,GAAA,GACA,MAAA,kBAAA,IACA,EACA,GAAA,EAAA,YAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,kBACA,IAAA,0BACA,IAAA,2BACA,IAAA,wBACA,IAAA,kBACA,IAAA,8BACA,IAAA,iBACA,IAAA,6BACA,IAAA,qBACA,OAAA,EAEA,OAAA,EAUA,QAAA,GAAA,GACA,EAAA,EAAA,MAkBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAsFA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WACA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAEA,IAAA,GACA,EAAA,GAAA,KAAA,EAAA,GAAA,EAAA,GACA,KAAA,EACA,MAAA,KACA,IAAA,GAAA,EAAA,EAAA,MAGA,EAAA,EAAA,YAAA,EACA,OAAA,IAAA,EACA,MAEA,EAAA,EAAA,MAAA,EAAA,GAGA,EAAA,EAAA,IAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,GAAA,IAAA,KACA;MAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MASA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,GAAA,IAAA,KACA,KACA,EAAA,OAAA,OAAA,MACA,GAAA,IAAA,KAAA,GAGA,IAAA,GAAA,EAAA,EAIA,IAHA,GACA,KAAA,oBAAA,EAAA,EAAA,SAAA,GAEA,kBAAA,GAAA,CACA,GAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EACA,MAAA,EACA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAKA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KA93BA,GAyNA,GAzNA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAGA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,GAAA,GAAA,SACA,GAAA,GAAA,SACA,GAAA,GAAA,SA4LA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CAqOA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MACA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAIA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAGA,aAAA,GAyBA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,IAAA,OAEA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,GAAA,IAAA,KACA,OAAA,GAGA,EAAA,YAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAEA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,GAAA,IAAA,MAAA,KAGA,EAAA,GAAA,EAAA,SAAA,YAAA,SAqCA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAEA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAEA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAYA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GACA,eAAA,EAAA,iBAAA,IACA,IAEA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAKA,GAAA,OAAA,OAAA,MAEA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IAyBA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAKA,IAAA,SAAA,SAAA,EAAA,YAAA,IACA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,EACA,SAAA,EACA,OAAA,EACA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAKA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,GAAA,MAAA,aAEA,GAAA,aAAA,GACA,EAAA,MAAA,YAAA,KAIA,IACA,EAAA,GAAA,EAwBA,IAAA,IAAA,OAAA,YAaA,IACA,mBACA,sBACA,kBAGA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAUA,EAAA,WACA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KACA,IAAA,GAMA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WAPA,MACA,EAAA,MAAA,EACA,EAAA,IAAA,KAAA,EASA,GAAA,KAAA,EAEA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAGA,IAAA,GADA,GAAA,EAAA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EACA,EAAA,GAAA,UAKA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAGA,cAAA,SAAA,GAWA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAEA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAGA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MAwBA,IACA,EAAA,GAAA,EAMA,IAAA,IAAA,SAAA,gBAyEA,GAAA,iBAAA,EACA,EAAA,sBAAA,EACA,EAAA,sBAAA,EACA,EAAA,uBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,YAAA,GACA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,YAAA,EACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBCj5BA,SAAA,GACA,YAyBA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,EAAA,EAAA,MAkCA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UASA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAnFA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,KAGA,EAAA,OAAA,UACA,IAAA,EAAA,CAGA,GAAA,EACA,KACA,EAAA,SAAA,YAAA,cACA,MAAA,GAGA,OAGA,GAAA,IAAA,YAAA,EAUA,GAAA,WACA,GAAA,UACA,MAAA,GAAA,EAAA,MAAA,SAIA,IAAA,IACA,cAAA,EACA,YAAA,EACA,IAAA,OAIA,UACA,UACA,UACA,UACA,QACA,QACA,aACA,gBACA,gBACA,sBACA,eACA,QAAA,SAAA,GACA,EAAA,IAAA,WACA,MAAA,GAAA,MAAA,IAEA,OAAA,eAAA,EAAA,UAAA,EAAA,KAQA,EAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAiBA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAGA,GAAA,iBACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAGA,eAAA,WAIA,KAAA,IAAA,OAAA,sBAIA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,WAAA,EACA,EAAA,SAAA,UAAA,IAEA,OAAA,mBCxHA,SAAA,GACA,YAOA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UASA,QAAA,GAAA,GACA,GAAA,MAAA,EACA,MAAA,EAEA,KAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,UAAA,GAAA,WACA,MAAA,GACA,EAAA,MAAA,GAAA,MAAA,EAAA,MAAA,aAlCA,GAAA,GAAA,EAAA,aACA,EAAA,EAAA,KAEA,GAAA,YAAA,EAUA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAoBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBC3CA,SAAA,GACA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAEA,OAAA,mBCRA,SAAA,GACA,YAqBA,SAAA,GAAA,GACA,EAAA,YAAA,IAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAGA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAYA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAUA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAEA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAQA,OALA,KACA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAEA,EAGA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAcA,OAbA,IAEA,EAAA,YAAA,GAGA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAGA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAEA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAGA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,GAAA,GAAA,EAAA,OAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,aACA,KAAA,EAAA,eACA,EAAA,UAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,OAAA,CAGA,GAAA,GAAA,EAAA,aAGA,IAAA,IAAA,EAAA,GAAA,cAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,kBAAA,EAAA,GAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,MAEA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GAGA,KAAA,GADA,GAAA,EAAA,EAAA,cAAA,0BACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAEA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAEA,IADA,GAAA,GAAA,EAAA,YACA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aACA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAGA,EAAA,YAAA,EAAA,WAAA,OAGA,QAAA,GAAA,GACA,GAAA,EAAA,2BAAA,CAEA,IADA,GAAA,GAAA,EAAA,WACA,GAAA,CACA,EAAA,EAAA,aAAA,EACA,IAAA,GAAA,EAAA,YACA,EAAA,EAAA,GACA,EAAA,EAAA,UACA,IACA,EAAA,KAAA,EAAA,GACA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,KACA,EAAA,EAEA,EAAA,YAAA,EAAA,WAAA,SAKA,KAHA,GAEA,GAFA,EAAA,EAAA,GACA,EAAA,EAAA,WAEA,GACA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GACA,EAAA,EAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UACA,OAAA,IAAA,EAAA,2BAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,YAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAMA,IAJA,EAAA,EADA,EACA,EAAA,KAAA,EAAA,EAAA,IAAA,GAEA,EAAA,KAAA,EAAA,IAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAEA,IAAA,GADA,GAAA,EAAA,QACA,EAAA,EAAA,QAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAKA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,EAAA,GACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,IAAA,EACA,OAAA,CAEA,QAAA,EAWA,QAAA,GAAA,GACA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAUA,KAAA,YAAA,OAMA,KAAA,YAAA,OAMA,KAAA,WAAA,OAMA,KAAA,aAAA,OAMA,KAAA,iBAAA,OAEA,KAAA,WAAA,OAtUA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,UACA,EAAA,EAAA,OACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAaA,GAAA,EAkNA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UAsCA,EAAA,OAAA,KAkDA,EAAA,OAAA,iBAEA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAEA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAGA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,KAGA,EAAA,KACA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAEA,IAAA,GACA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BACA,EAAA,EAOA,IAJA,EADA,EACA,EAAA,GAEA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,EAAA,MAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GACA,SAAA,KAAA,cACA,KAAA,YAAA,KAAA,YAGA,IAAA,GAAA,EAAA,EAAA,WAAA,EAAA,KAGA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAYA,MARA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAGA,EAAA,EAAA,MAEA,GAGA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAIA,IAAA,GAFA,IAAA,EAEA,GADA,KAAA,WACA,KAAA,YAAA,EACA,EAAA,EAAA,YACA,GAAA,IAAA,EAAA,CACA,GAAA,CACA,OAGA,IAAA,EAEA,KAAA,IAAA,OAAA,iBAIA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,YACA,EAAA,EAAA,eAEA,IAAA,KAAA,2BAAA,CAIA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IACA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAEA,GAAA,MACA,EAAA,EAAA,MAAA,EAaA,OAVA,IACA,EAAA,KAAA,aACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAIA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EAQA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAGA,IAEA,GAFA,EAAA,EAAA,YACA,EAAA,EAAA,gBAGA,GAAA,KAAA,6BACA,EAAA,EA2CA,OAzCA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAiBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,KAnBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAEA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KACA,EAAA,WACA,EAAA,KAAA,GACA,IASA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAGA,EAAA,GACA,EAAA,EAAA,MAEA,GAQA,gBAAA,WACA,IAAA,GAAA,GAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,mBAIA,cAAA,WACA,MAAA,QAAA,KAAA,YAIA,GAAA,cAEA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,EAAA,MAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,EAAA,MAAA,aAIA,GAAA,aACA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,EAAA,MAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,EAAA,MAAA,cAIA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,EAAA,MAAA,kBAGA,GAAA,iBAEA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAEA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAGA,OAAA,IAEA,GAAA,aAAA,GACA,MAAA,IAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,EAAA,MAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAGA,GAAA,MACA,EAAA,MAAA,YAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,cAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAGA,SAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAGA,MAAA,GAAA,KAAA,EAAA,MACA,EAAA,KAGA,UAAA,WAMA,IAAA,GAFA,GAEA,EALA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UACA,GAAA,EAAA,KAAA,OAEA,GAGA,GAAA,EAAA,KACA,EAAA,KAAA,IAHA,EAAA,EAFA,KAAA,WAAA,IAQA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAKA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAKA,EAAA,EAAA,iBAKA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBACA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,qBAAA,EACA,EAAA,oBAAA,EACA,EAAA,iBAAA,EACA,EAAA,SAAA,KAAA,GAEA,OAAA,mBC9tBA,SAAA,GACA,YAuBA,SAAA,GAAA,EAAA,EAAA,EAAA,GAGA,IAAA,GAFA,GAAA,KACA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,KACA,IAAA,EAAA,EAAA,GAAA,OACA,YAAA,GAAA,SAAA,aAIA,EAAA,KAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,MAAA,QAAA,GAAA,QAAA,YAAA,KAGA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,EAAA,kBACA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,EAEA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EACA,GAAA,EAAA,mBAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,QAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,OAAA,KAAA,GACA,IAAA,GAAA,EAAA,eAAA,EAGA,QAAA,KACA,OAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,YAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,eAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,eAAA,GAAA,EAAA,YAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,KAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GAOA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GACA,GADA,EAAA,EAAA,MAEA,EAAA,EAAA,MAAA,IACA,IAAA,YAAA,GAAA,SAAA,WAGA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,KACA,IAAA,YAAA,GACA,EAAA,EAAA,KAAA,EAAA,OACA,CAAA,KAAA,YAAA,IAKA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,KAJA,GAAA,EAAA,KAAA,EAAA,GAOA,MAAA,GAAA,EAAA,EAAA,EAAA,GA0DA,QAAA,GAAA,EAAA,EAAA,EAAA,EACA,GACA,GACA,GADA,EAAA,EAAA,MAEA,EAAA,EAAA,MAAA,IACA,IAAA,YAAA,GAAA,SAAA,WAGA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EACA,IAAA,YAAA,GACA,EAAA,EAAA,KAAA,EAAA,EACA,OACA,CAAA,KAAA,YAAA,IAMA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EALA,GAAA,EAAA,KAAA,EAAA,EACA,GAOA,MAAA,GAAA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,GACA,GADA,EAAA,EAAA,MAEA,EAAA,EAAA,MAAA,IACA,IAAA,YAAA,GAAA,SAAA,WAGA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EACA,IAAA,YAAA,GACA,EAAA,EAAA,KAAA,EAAA,EAAA,OACA,CAAA,KAAA,YAAA,IAKA,MAAA,GAAA,KAAA,EAAA,EAAA,EAAA,EAAA,EAJA,GAAA,EAAA,KAAA,EAAA,EAAA,GAOA,MAAA,GAAA,EAAA,EAAA,GAAA,GAvNA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,KAEA,EAAA,SAAA,cACA,EAAA,SAAA,gBAAA,cAEA,EAAA,SAAA,iBACA,EAAA,SAAA,gBAAA,iBAEA,EAAA,SAAA,qBACA,EAAA,SAAA,gBAAA,qBAEA,EAAA,SAAA,uBACA,EAAA,SAAA,gBAAA,uBAEA,EAAA,OAAA,QACA,EAAA,OAAA,cAAA,OAAA,SAuCA,EAAA,+BA4DA,GACA,cAAA,SAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,IAAA,CACA,GAAA,CAEA,IACA,GADA,EAAA,EAAA,MAEA,EAAA,EAAA,MAAA,IACA,IAAA,YAAA,GAAA,SAAA,WAGA,MAAA,GAAA,KAAA,EACA,IAAA,YAAA,GACA,EAAA,EAAA,EAAA,KAAA,EAAA,QACA,CAAA,KAAA,YAAA,IAKA,MAAA,GAAA,KAAA,EAJA,GAAA,EAAA,EAAA,KAAA,EAAA,IAOA,MAAA,IAIA,IAAA,EAAA,EAAA,GAAA,OACA,YAAA,GAAA,SAAA,WAGA,EAAA,KAAA,GAIA,EATA,GAWA,iBAAA,SAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,IAAA,CACA,GAAA,CAEA,IAAA,GAAA,GAAA,EASA,OAPA,GAAA,OAAA,EAAA,KAAA,KACA,EACA,EACA,EACA,EACA,GAEA,IAiDA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,GACA,EAAA,MAAA,EAAA,EAAA,CASA,OAPA,GAAA,OAAA,EAAA,KAAA,KACA,EACA,EACA,EACA,EACA,EAAA,eAEA,GAGA,uBAAA,SAAA,GAEA,MAAA,MAAA,iBAAA,IAAA,IAGA,uBAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,GACA,EAAA,IAeA,OAZA,GADA,MAAA,EACA,MAAA,EAAA,EAAA,EAEA,MAAA,EAAA,EAAA,EAGA,EAAA,OAAA,EAAA,KAAA,KACA,EACA,EACA,EACA,GAAA,KACA,GAEA,GAIA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAEA,OAAA,mBCzQA,SAAA,GACA,YAIA,SAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAGA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,eAEA,OAAA,GAbA,GAAA,GAAA,EAAA,SAAA,SAgBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aAGA,GAAA,oBACA,MAAA,GAAA,KAAA,YAGA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,GAEA,OAAA,IAGA,GAAA,YAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,OAAA,WACA,GAAA,GAAA,KAAA,UACA,IACA,EAAA,YAAA,QAIA,GACA,GAAA,sBACA,MAAA,GAAA,KAAA,cAGA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAEA,OAAA,mBCtEA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,aAEA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAEA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,GAAA,MAAA,MAEA,GAAA,MAAA,GACA,GAAA,GAAA,EAAA,MAAA,IACA,GAAA,KAAA,iBACA,SAAA,IAEA,EAAA,MAAA,KAAA,KAIA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,eAAA,KAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCzCA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,cAEA,GADA,EAAA,gBACA,EAAA,OACA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OACA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAGA,OAFA,MAAA,YACA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAEA,EAAA,SAAA,KAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YAKA,SAAA,GAAA,GACA,EAAA,mCAAA,EAAA,SAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,MACA,KAAA,cAAA,EATA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,YAWA,GAAA,WACA,YAAA,EACA,GAAA,UACA,MAAA,GAAA,MAAA,QAEA,KAAA,SAAA,GACA,MAAA,GAAA,MAAA,KAAA,IAEA,SAAA,SAAA,GACA,MAAA,GAAA,MAAA,SAAA,IAEA,IAAA,WACA,EAAA,MAAA,IAAA,MAAA,EAAA,MAAA,WACA,EAAA,KAAA,gBAEA,OAAA,WACA,EAAA,MAAA,OAAA,MAAA,EAAA,MAAA,WACA,EAAA,KAAA,gBAEA,OAAA,WACA,GAAA,GAAA,EAAA,MAAA,OAAA,MAAA,EAAA,MAAA,UAEA,OADA,GAAA,KAAA,eACA,GAEA,SAAA,WACA,MAAA,GAAA,MAAA,aAIA,EAAA,SAAA,aAAA,GACA,OAAA,mBC7CA,SAAA,GACA,YA+BA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cAGA,QAAA,GAAA,EAAA,EAAA,GAIA,EAAA,EAAA,cACA,KAAA,EACA,UAAA,KACA,SAAA,IAMA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAtDA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,aACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAEA,GADA,EAAA,MACA,EAAA,iBACA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,OAAA,QAEA,GACA,UACA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAGA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,GAwBA,EAAA,GAAA,QAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,GAAA,MAAA,mBAAA,CAEA,IAAA,GAAA,EAAA,mBAAA,KAGA,OAFA,GAAA,aAEA,GAGA,GAAA,cACA,MAAA,GAAA,MAAA,oBAAA,MAKA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,MAAA,aAAA,EACA,GAAA,MAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,aAAA,EACA,GAAA,MAAA,gBAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAAA,IAGA,GAAA,aACA,GAAA,GAAA,EAAA,IAAA,KAKA,OAJA,IACA,EAAA,IAAA,KACA,EAAA,GAAA,GAAA,EAAA,MAAA,UAAA,OAEA,GAGA,GAAA,aACA,MAAA,GAAA,MAAA,WAGA,GAAA,WAAA,GACA,KAAA,aAAA,QAAA,IAGA,GAAA,MACA,MAAA,GAAA,MAAA,IAGA,GAAA,IAAA,GACA,KAAA,aAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IACA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAKA,EAAA,UAAA,yBACA,EAAA,UAAA,uBACA,EAAA,UAAA,kBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAEA,EAAA,mCAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBCjJA,SAAA,GACA,YAsBA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,QACA,KAAA,OACA,MAAA,UAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,KAAA,CAEA,OAAA,GAkCA,QAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,IAAA,MAAA,aAIA,IAAA,GAAA,GAHA,EAAA,EAAA,QAAA,cACA,EAAA,IAAA,EACA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,GAAA,IAAA,EAAA,KAAA,KAAA,EAAA,EAAA,OAAA,GAGA,OADA,IAAA,IACA,EAAA,GACA,EAEA,EAAA,EAAA,GAAA,KAAA,EAAA,GAEA,KAAA,MAAA,UACA,GAAA,GAAA,EAAA,IACA,OAAA,IAAA,EAAA,EAAA,WACA,EACA,EAAA,EAEA,KAAA,MAAA,aACA,MAAA,OAAA,EAAA,KAAA,KAEA,SAEA,KADA,SAAA,MAAA,GACA,GAAA,OAAA,oBAIA,QAAA,GAAA,GACA,YAAA,GAAA,sBACA,EAAA,EAAA,QAGA,KAAA,GADA,GAAA,GACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,EAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,GAAA,YAAA,EACA,IAAA,GAAA,EAAA,EAAA,cAAA,cAAA,GACA,GAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,IAUA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAmGA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CAGA,KAFA,GACA,GADA,EAAA,EAAA,SAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,EAAA,MAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAgBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,EAAA,MAAA,GAAA,GAEA,cAAA,EACA,YAAA,IASA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,MAAA,WAEA,MADA,GAAA,mBACA,EAAA,MAAA,GAAA,MAAA,EAAA,MAAA,YAEA,cAAA,EACA,YAAA,IA5SA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,eACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAMA,EAAA,cACA,EAAA,eAkCA,EAAA,GACA,OACA,OACA,KACA,MACA,UACA,QACA,KACA,MACA,QACA,SACA,OACA,OACA,QACA,SACA,QACA,QAGA,EAAA,GACA,QACA,SACA,MACA,SACA,UACA,WACA,YACA,aAwDA,EAAA,OAAA,KAAA,UAAA,WAEA,EAAA,OAAA,YACA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GAOA,GAAA,GAAA,EAAA,KAAA,WAEA,YADA,KAAA,YAAA,EAIA,IAAA,GAAA,EAAA,KAAA,WAEA,MAAA,2BACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAKA,GACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,EAAA,MAAA,UAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,WAAA,GACA,GAAA,GAAA,KAAA,UACA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,QAIA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eACA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UACA,MACA,KAAA,YACA,EAAA,KACA,EAAA,IACA,MACA,SACA,OAGA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,IAGA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,EACA,KAAA,aAAA,SAAA,IAEA,KAAA,gBAAA,cA6BA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eACA,eACA,QAAA,IAeA,aACA,aACA,QAAA,IAcA,wBACA,iBACA,kBACA,QAAA,GAGA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAGA,EAAA,aAAA,EACA,EAAA,aAAA,GACA,OAAA,mBClUA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,EAAA,MAAA,WAAA,MAAA,EAAA,MAAA,UACA,OAAA,IAAA,EAAA,MAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC3BA,SAAA,GACA,YAQA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAPA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,EAEA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,KAAA,aAAA,SAAA,IAGA,aAAA,SAAA,EAAA,GACA,EAAA,UAAA,aAAA,KAAA,KAAA,EAAA,GACA,WAAA,OAAA,GAAA,eACA,KAAA,0BAAA,MAMA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,GACA,OAAA,mBClCA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OAEA,EAAA,OAAA,eAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,YAIA,MAAA,GAAA,EAAA,MAAA,aAIA,EAAA,EAAA,EACA,SAAA,cAAA,SAEA,EAAA,SAAA,gBAAA,GACA,OAAA,mBC9BA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GA5BA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,QAkBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCtCA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YAGA,GAFA,EAAA,MACA,EAAA,SAAA,SACA,EAAA,iBAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,UAAA,YAAA,EAIA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBCtBA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAEA,MAAA,GAGA,QAAA,GAAA,GAKA,IAHA,GAEA,GAFA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAKA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,KAAA,IACA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KA5CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,GAAA,SACA,EAAA,GAAA,SA8BA,EAAA,OAAA,mBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,YAAA,EACA,GAAA,WACA,MAAA,GACA,EAAA,EAAA,MAAA,SACA,EAAA,IAAA,SAOA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBCpEA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAEA,KAKA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,IACA,OAAA,mBCnBA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GACA,EAAA,aAAA,MAAA,GA7BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAEA,KAKA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAiBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,IACA,OAAA,mBCvCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAkBA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,UACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,KAAA,GACA,SAAA,GACA,EAAA,aAAA,QAAA,GACA,KAAA,GACA,EAAA,aAAA,WAAA,IACA,EAAA,SAAA,KAAA,EAhDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GACA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBC1DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAGA,OAAA,SAAA,GAGA,MAAA,UAAA,MACA,GAAA,UAAA,OAAA,KAAA,OAIA,gBAAA,KACA,EAAA,EAAA,QAEA,GAAA,MAAA,OAAA,KAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC3CA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCzDA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,EACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,wBAAA,GACA,OAAA,mBC9BA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,OAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBChCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EACA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAaA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1BA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAMA,MAAA,aAAA,IAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,UAAA,YACA,QAAA,eAAA,EAAA,UAAA,YAAA,SACA,GAAA,UAAA,UAGA,EAAA,SAAA,WAAA,GACA,OAAA,mBCvBA,SAAA,GACA,YAmBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,cAKA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAMA,GAAA,UAAA,OAAA,OAAA,GAGA,gBAAA,IACA,EAAA,EAAA,WACA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAKA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCzCA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA;EAIA,GAAA,2BACA,MAAA,GAAA,EAAA,MAAA,0BAIA,GAAA,cACA,MAAA,GAAA,EAAA,MAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAIA,GAAA,cACA,MAAA,GAAA,EAAA,MAAA,aAIA,GAAA,aACA,MAAA,GAAA,EAAA,MAAA,YAIA,GAAA,mBACA,MAAA,GAAA,EAAA,MAAA,kBAIA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,IACA,OAAA,mBC/DA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,EAAA,EAAA,MAXA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAMA,GAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,EAAA,MAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,EAAA,MAAA,UAAA,MAAA,EAAA,MAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,EAAA,MAAA,cAAA,MAAA,EAAA,MAAA,cAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YAeA,SAAA,GAAA,GACA,EAAA,EAAA,MAdA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,EAAA,MAAA,SAGA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,EAAA,MAAA,WAAA,MAAA,EAAA,MAAA,YAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,EAAA,MAAA,cAAA,MAAA,EAAA,MAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAEA,GAAA,EAAA,EACA,GAEA,EAAA,SAAA,sBAAA,IACA,OAAA,mBC/CA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,EAAA,MAVA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,KAKA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAEA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,2BACA,MAAA,GAAA,EAAA,MAAA,0BAEA,SAAA,SAAA,EAAA,GACA,EAAA,MAAA,SAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,EAAA,MAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,EAAA,MAAA,eAAA,EAAA,KAEA,cAAA,SAAA,GACA,EAAA,MAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GACA,EAAA,MAAA,aAAA,EAAA,KAEA,YAAA,SAAA,GACA,EAAA,MAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,EAAA,MAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GACA,EAAA,MAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,sBAAA,EAAA,EAAA,KAEA,gBAAA,WACA,MAAA,GAAA,EAAA,MAAA,oBAEA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAEA,WAAA,SAAA,GACA,EAAA,MAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,EAAA,MAAA,iBAAA,EAAA,KAEA,WAAA,WACA,MAAA,GAAA,EAAA,MAAA,eAEA,eAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,MAAA,GAAA,MAAA,eAAA,EAAA,KAEA,SAAA,WACA,MAAA,GAAA,MAAA,aAKA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,yBAAA,MAIA,EAAA,OAAA,MAAA,EAAA,SAAA,eAEA,EAAA,SAAA,MAAA,GAEA,OAAA,mBC5FA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBACA,EAAA,EAAA,MACA,EAAA,EAAA,eAEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAEA,IAAA,GAAA,EAAA,SAAA,cAAA,IAEA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBCnBA,SAAA,GACA,YAkBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,GAAA,cAAA,yBACA,GAAA,KAAA,KAAA,GAIA,EAAA,EAAA,KAEA,IAAA,GAAA,EAAA,UACA,GAAA,IAAA,KAAA,GAEA,KAAA,WACA,GAAA,GAAA,KAAA,EAAA,GAAA,IAEA,EAAA,IAAA,KAAA,GA9BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,EAEA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GACA,EAAA,KAAA,GACA,KAAA,4BAGA,GAAA,mBACA,MAAA,GAAA,IAAA,OAAA,MAGA,GAAA,QACA,MAAA,GAAA,IAAA,OAAA,MAGA,yBAAA,WACA,MAAA,GAAA,IAAA,MAAA,4BAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,cAAA,EAAA,IAGA,eAAA,SAAA,GACA,MAAA,GAAA,KAAA,GACA,KACA,KAAA,cAAA,QAAA,EAAA,SAIA,EAAA,SAAA,WAAA,GAEA,OAAA,mBCxEA,SAAA,GACA,YAqBA,SAAA,GAAA,GACA,EAAA,iBAAA,EAAA,gBACA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WAuBA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAKA,IAHA,EAAA,GACA,EAAA,GAEA,EASA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAZA,CACA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KACA,EAAA,aAAA,EAAA,aAQA,EAAA,qBAAA,KAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,GAEA,EAAA,kBACA,EAAA,gBAAA,aAAA,GACA,EAAA,cACA,EAAA,YAAA,iBAAA,GAEA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,oBAAA,KAAA,EAAA,IAOA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAGA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GAaA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,cACA,IAAA,EAAA,OAEA,EAAA,SAGA,KAGA,QAAA,KACA,EAAA,KACA,IAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAKA,OAJA,KACA,EAAA,GAAA,GAAA,GACA,EAAA,IAAA,EAAA,IAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EACA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAaA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cA8DA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GAgPA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,GACA,EAAA,KAAA,MAAA,EAAA,EAAA,IAEA,EAAA,KAAA,EAGA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,YAAA,GACA,MAAA,EACA,IAAA,YAAA,GACA,MAAA,KACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EACA,MAAA,GAEA,MAAA,MAGA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,GAGA,EAAA,KAAA,GAFA,EAAA,IAAA,GAAA,IAKA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,GAGA,QAAA,GAAA,GAEA,EAAA,IAAA,EAAA,QAYA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,SACA,KAAA,EACA,OAAA,CAIA,IADA,EAAA,EAAA,QACA,EACA,OAAA,CAEA,MAAA,YAAA,IACA,OAAA,CAEA,KAAA,EAAA,KAAA,GACA,OAAA,CAEA,KACA,MAAA,GAAA,QAAA,GACA,MAAA,GAEA,OAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,IAAA,EAAA,EAAA,OAAA,KAAA,EAGA,QAAA,GAAA,GACA,MAAA,aAAA,IACA,YAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,WAKA,QAAA,GAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,KAAA,EAEA,OAAA,GA3kBA,GA4HA,GA5HA,EAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,WAEA,GADA,EAAA,OACA,EAAA,cAEA,GADA,EAAA,MACA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,KAkFA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAqBA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAGA,KA+CA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAcA,EAAA,WACA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAEA,OADA,MAAA,WAAA,KAAA,GACA,GAGA,KAAA,SAAA,GACA,IAAA,KAAA,KAAA,CAcA,IAAA,GAXA,GAAA,KAAA,KAEA,EAAA,KAAA,WAEA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,SAEA,EAAA,EAAA,iBAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MAAA,IACA,IACA,EAAA,KAAA,KAAA,EAIA,KAAA,GADA,GAAA,EAAA,QAAA,OACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAAA,IACA,EAAA,GAKA,IAAA,GAFA,GAAA,EAAA,WACA,EAAA,EAAA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,KACA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,GAIA,EAAA,IAAA,GAAA,GAEA,EAAA,KAAA,GAGA,GAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,KAAA,MAYA,EAAA,WAGA,OAAA,SAAA,GACA,GAAA,KAAA,MAAA,CAGA,KAAA,sBAEA,IAAA,GAAA,KAAA,IAEA,MAAA,aAAA,EACA,IAAA,GAAA,GAAA,GAAA,GAAA,EACA,MAAA,gBAAA,EAAA,EAEA,IAAA,IAAA,CACA,IACA,EAAA,OAEA,KAAA,OAAA,IAGA,GAAA,kBACA,MAAA,GAAA,KAAA,MAAA,UAGA,WAAA,WACA,IAAA,KAAA,MAAA,CACA,KAAA,OAAA,CACA,IAAA,GAAA,KAAA,cAIA,IAHA,GACA,EAAA,aACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,iBAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,GAEA,KAAA,iBAAA,IAGA,iBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,SAAA,EAGA,GAAA,YACA,KAAA,SAAA,EAAA,YAEA,EAAA,iBACA,KAAA,SAAA,EAAA,kBAIA,uBAAA,SAAA,GACA,GAAA,EAAA,GAAA,CAQA,IAAA,GAPA,GAAA,EAEA,EAAA,EAAA,GAEA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,KAAA,iBAAA,EAAA,GAAA,EAIA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAMA,EAAA,EAAA,EAGA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,eACA,KAEA,EAAA,EAAA,GAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAKA,KAAA,uBAAA,IAIA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,uBAAA,IAKA,iBAAA,SAAA,EAAA,GACA,KAAA,YAAA,IAGA,GAAA,YAAA,GAAA,CACA,GAAA,GAAA,CACA,MAAA,0BAAA,EAAA,aAAA,UAKA,KAAA,GAHA,IAAA,EAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAEA,EAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,GAAA,OACA,GAAA,GAMA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,EAAA,OAOA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,iBAAA,EAAA,IAIA,gBAAA,SAAA,EAAA,GAEA,IAAA,GADA,GAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAAA,EACA,MAAA,gBAAA,EAAA,GAGA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,OAAA,IAKA,QAAA,SAAA,GAGA,IAAA,GAFA,MACA,EAAA,EAAA,YAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,GAAA,CACA,KAAA,cAAA,EAEA,KAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,IACA,EAAA,KAAA,QAGA,GAAA,KAAA,EAGA,OAAA,IAOA,qBAAA,WACA,KAAA,WAAA,OAAA,OAAA,OAQA,0BAAA,SAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,KAAA,UAGA,SAAA,KAAA,KACA,EAAA,UAAA,GAGA,OAAA,KAAA,KACA,EAAA,IAAA,GAEA,EAAA,QAAA,uBAAA,SAAA,EAAA,GACA,EAAA,IAAA,MAMA,mBAAA,SAAA,GACA,MAAA,MAAA,WAAA,IAGA,cAAA,SAAA,GACA,EAAA,GAAA,uBAAA,MAuDA,IAAA,GAAA,0BAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,EAAA,MAAA,sBACA,OAAA,IACA,EAAA,cACA,IAGA,GAGA,EAAA,UAAA,oBACA,EAAA,UAAA,oBAAA,WAIA,MADA,KACA,EAAA,OAGA,EAAA,UAAA,8BAAA,WAEA,MADA,KACA,EAAA,WAGA,EAAA,UAAA,gBACA,EAAA,UAAA,gBAAA,WAEA,KAAA,0BAEA,IACA,GADA,EAAA,EAAA,KAEA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAGA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBCnpBA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAIA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GAzCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,OACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,GACA,oBACA,sBACA,mBACA,oBACA,mBACA,oBACA,oBAEA,oBAEA,sBA0BA,GAAA,QAAA,IAEA,OAAA,mBCjDA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,EAAA,MAVA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,IAEA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,EAAA,MAAA,aAEA,GAAA,aACA,MAAA,GAAA,EAAA,MAAA,YAEA,SAAA,SAAA,GACA,EAAA,MAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GACA,EAAA,MAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,EAAA,MAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,KAEA,YAAA,SAAA,GACA,EAAA,MAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,EAAA,MAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,GAAA,MAAA,aAgBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAEA,OAAA,mBChEA,SAAA,GACA,YA2BA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAcA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,EAAA,MAAA,aAkBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YACA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GA+MA,QAAA,GAAA,GACA,EAAA,EAAA,MAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,EAAA,MAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,EAAA,MAAA,YA7SA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,iBACA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,WACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAGA,GAFA,EAAA,aAEA,GAAA,SAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,mBAIA,EAAA,EAAA,QACA,EAAA,EAAA,SAaA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,kBACA,QAAA,EAEA,IAAA,GAAA,SAAA,UAuBA,EAAA,SAAA,YAyBA,IAvBA,EAAA,EAAA,WACA,UAAA,SAAA,GAIA,MAHA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MACA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,QAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,SAEA,kBAAA,SAAA,GACA,MAAA,GAAA,iBAAA,KAAA,KACA,SAAA,KAAA,UAAA,OAAA,IAAA,QAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GAyEA,QAAA,GAAA,GACA,MAAA,OAOA,GAAA,EAAA,MANA,EACA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GA7EA,GAAA,GAAA,CAYA,IAXA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,SAGA,IACA,EAAA,OAAA,OAAA,YAAA,YAKA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBASA,KAHA,GACA,GADA,EAAA,OAAA,eAAA,GAEA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAGA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAQA,KAAA,GADA,GAAA,OAAA,OAAA,GACA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IAQA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAGA,EAAA,eAAA,IACA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAYA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAEA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAMA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,gBACA,OAAA,kBAEA,cACA,0BACA,WACA,yBACA,uBACA,yBACA,eACA,gBACA,mBACA,cACA,gBACA,OAAA,IAEA,GACA,OAAA,cAAA,OAAA,WAEA,YACA,aACA,WACA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,mBACA,iBACA,oBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,IAGA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAIA,OAAA,cACA,EAAA,OAAA,aAAA,GAEA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,kBAqBA,EAAA,EAAA,sBACA,EAAA,EAAA,kBACA,EAAA,EAAA,sBACA,EAAA,EAAA,cAEA,EAAA,OAAA,kBAAA,GAEA,GACA,OAAA,oBAEA,qBACA,iBACA,qBACA,eAGA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBCxUA,SAAA,GACA,YAgBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAfA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,wBACA,EAAA,OAAA,YAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAIA,IACA,EAAA,UAAA,wBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,wBACA,EAAA,GAAA,KAIA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,8BACA,QAAA,cAEA,mBAAA,sBAAA,iBAAA,QACA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,MAAA,OACA,OAAA,GAAA,GAAA,MAAA,EAAA,kBAIA,QAAA,KAGA,EAAA,EAAA,WACA,iBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,GAAA,EAAA,MAAA,aAKA,IACA,EAAA,UAAA,wBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MACA,EAAA,GAAA,KAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAEA,OAAA,mBCjFA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAMA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,KACA,EAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,MAIA,OAAA,mBCnBA,SAAA,GACA,YASA,SAAA,GAAA,GACA,GAAA,EAEA,GADA,YAAA,GACA,EAEA,GAAA,GAAA,GAAA,EAAA,IAEA,EAAA,EAAA,MAdA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,WACA,EAAA,EAAA,OAEA,EAAA,OAAA,QACA,KAYA,EAAA,EAAA,EAAA,GAAA,IAEA,EAAA,SAAA,SAAA,IAEA,OAAA,mBCxBA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,eACA,EAAA,eAAA,UAAA,IAIA,gBAAA,UAAA,KAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,MAGA,OAAA,mBCdA,SAAA,GACA,YAsFA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GACA,EAAA,EAAA,WACA,QAAA,GAAA,GA3FA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBACA,KAAA,kBACA,KAAA,kBACA,GAAA,gBACA,OAAA,oBACA,OAAA,oBACA,QAAA,0BACA,IAAA,sBAEA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,IAAA,iBACA,IAAA,uBACA,IAAA,iBACA,GAAA,mBACA,MAAA,mBACA,SAAA,sBACA,KAAA,kBACA,KAAA,kBACA,MAAA,mBACA,SAAA,sBACA,GAAA,qBACA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBACA,OAAA,oBACA,GAAA,gBACA,KAAA,kBACA,IAAA,iBACA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,KAAA,kBACA,MAAA,mBACA,OAAA,oBACA,GAAA,mBACA,SAAA,sBACA,OAAA,oBACA,OAAA,oBACA,EAAA,uBACA,MAAA,mBACA,IAAA,iBACA,SAAA,sBACA,EAAA,mBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,KAAA,kBACA,MAAA,mBACA,MAAA,mBACA,MAAA,0BAKA,SAAA,sBACA,SAAA,sBACA,MAAA,0BACA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAaA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBClGA,SAAA,GAkCA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GACA,EAAA,KAAA,GACA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,GADA,EAAA,EAAA,GAAA,cAAA,GAEA,MAAA,EAGA,MAAA,GAAA,CAEA,GADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAEA,MAAA,MAGA,QAAA,GAAA,EAAA,EAAA,GACA,GACA,GAAA,EAAA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GACA,EAAA,KAAA,GACA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,IADA,EAAA,EAAA,GAAA,iBAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAGA,MAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GA3EA,OAAA,KAAA,kBAAA,aACA,OAAA,OAAA,kBAAA,eAkBA,OAAA,eAAA,QAAA,UAAA,mBACA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAGA,QAAA,UAAA,uBAAA,QAAA,UAAA,iBAiDA,EAAA,gBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GACA,EAAA,EAAA,MAEA,EAAA,EAAA,KAGA,OAAA,UC0BA,SAAA,GAidA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAQA,OAPA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAGA,IACA,EAAA,EAAA,QAAA,EAAA,KAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,cAAA,QAEA,OADA,GAAA,YAAA,EACA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAIA,IACA,EAAA,EAAA,MAAA,SACA,MAAA,QAIA,SAAA,KAAA,kBAAA,EAGA,OADA,GAAA,WAAA,YAAA,GACA,EAMA,QAAA,KACA,EAAA,aAAA,EACA,SAAA,KAAA,YAAA,EACA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,KAAA,YAAA,GAGA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAMA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAGA,GAAA,EACA,IAAA,EAAA,MAAA,YAAA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,MAAA,UAAA,MAAA,KAAA,EAAA,MAAA,SAAA,GACA,EAAA,SAGA,GAAA,EAAA,GACA,EAAA,IAWA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GAQA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EA9jBA,GAAA,IACA,eAAA,EACA,YAMA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,kBAAA,EAAA,GAGA,EAAA,EAAA,GAAA,EACA,GAAA,KAAA,aAAA,EAAA,GAEA,IACA,EAAA,aAAA,GAGA,KAAA,iBAAA,EAAA,IAMA,UAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAEA,MADA,GAAA,KAAA,iBAAA,GACA,KAAA,aAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,MAAA,GACA,EAAA,OAAA,EAAA,IAAA,EAEA,IAEA,gBAAA,SAAA,GACA,MAAA,IAAA,EAAA,QAAA,KAAA,GAEA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EAQA,OAPA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBAEA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAEA,aAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,WAAA,YAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UACA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAEA,WAAA,SAAA,GACA,IAAA,EACA,QAEA,IAAA,GAAA,EAAA,iBAAA,QACA,OAAA,OAAA,UAAA,OAAA,KAAA,EAAA,SAAA,GACA,OAAA,EAAA,aAAA,MAGA,oBAAA,SAAA,EAAA,GACA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,KACA,SAAA,GACA,EAAA,aAAA,EAAA,MAGA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,YACA,SAAA,GACA,KAAA,oBAAA,EAAA,QAAA,IAEA,QAGA,iBAAA,SAAA,GAEA,MADA,GAAA,KAAA,kCAAA,GACA,KAAA,6BAAA,IAgBA,kCAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAWA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,gCAAA,EAKA,IAJA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GACA,EAAA,KAAA,0BAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,IACA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAKA,MADA,GAAA,EAAA,KAAA,EACA,EAAA,QAgBA,gCAAA,SAAA,GAGA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,MAAA,EAAA,IAAA,MAEA,MAAA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,QAAA,EAAA,GAAA,IAAA,QAAA,EAAA,GAAA,EAAA,IAAA,MAEA,OAAA,IASA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAiBA,wBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,sBACA,KAAA,+BAEA,iBAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GADA,EAAA,yBACA,EAAA,CAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,OACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,GAAA,KAAA,KAEA,MAAA,GAAA,KAIA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAGA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAMA,0BAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,qBAAA,OAAA,IACA,EAAA,EAAA,QAAA,qBAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EA6BA,OA5BA,IACA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,cAAA,EAAA,OAAA,SAAA,EAAA,MAAA,QACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,cACA,IAAA,EAAA,OAAA,QAAA,WACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,cAOA,KACA,EAAA,UACA,GAAA,EAAA,QAAA,QAEA,MAAA,GACA,EAAA,OAAA,QAAA,gBAAA,EAAA,WACA,GAAA,KAAA,8BAAA,MAIA,MAEA,GAEA,8BAAA,SAAA,GACA,GAAA,GAAA,cAAA,EAAA,KAAA,IAKA,OAJA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,SAAA,GACA,GAAA,IAAA,EAAA,QAAA,KAAA,EAAA,MAAA,QAAA,MAEA,GAAA,MAGA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAUA,OATA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,mBAAA,EAAA,IAEA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GACA,GAAA,MAAA,QAAA,GACA,OAAA,CAEA,IAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,IAEA,iBAAA,SAAA,GAEA,MADA,GAAA,EAAA,QAAA,MAAA,OAAA,QAAA,MAAA,OACA,GAAA,QAAA,KAAA,EAAA,IAAA,iBAAA,MAEA,mBAAA,SAAA,EAAA,GACA,MAAA,OAAA,QAAA,GACA,KAAA,uBAAA,EAAA,GACA,KAAA,yBAAA,EAAA,IAGA,uBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,KACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,KAAA,yBAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAGA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GACA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GAKA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAYA,OAXA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAEA,GAAA,GAAA,EAAA,OAAA,QAAA,eAAA,GAIA,OAHA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,QAAA,GAAA,IACA,EAAA,EAAA,QAAA,kBAAA,KAAA,EAAA,SAEA,IACA,KAAA,KAEA,GAEA,4BAAA,SAAA,GACA,MAAA,GAAA,QAAA,mBAAA,GAAA,QACA,YAAA,IAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,OAIA,GAAA,MAAA,UAAA,EAAA,MAAA,QAAA,MAAA,gBACA,EAAA,EAAA,QAAA,kBAAA,aACA,EAAA,MAAA,QAAA,MAQA,IAAA,GAAA,EAAA,KACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,KACA,GAAA,EAAA,cAGA,OAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,IACA,YAAA,SACA,GAAA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,YAAA,EAAA,KAAA,KAAA,EAAA,cACA,QAGA,iBAAA,SAAA,EAAA,GACA,EAAA,MAAA,WACA,EAAA,EAAA,GAEA,EAAA,KAMA,EAAA,oCAEA,EAAA,4DACA,EAAA,6EAEA,EAAA,sDACA,EAAA,mEAEA,EAAA,+DACA,EAAA,4EAIA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAGA,gBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,sBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,iBAAA,6BACA,YAAA,YACA,mBAAA,oBAEA,yBAAA,EAAA,iBACA,eAAA,GAAA,QAAA,EAAA,OACA,sBAAA,GAAA,QAAA,EAAA,OACA,sBACA,QACA,MACA,cACA,mBACA,YACA,YACA,aAyCA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MAsBA,IA2CA,GA3CA,EAAA,UAAA,UAAA,MAAA,UAuCA,EAAA,iBACA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CACA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAIA,SAAA,iBAAA,mBAAA,WACA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GACA,aAAA,SAAA,0BAAA,IAAA,EACA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GACA,IAAA,EAAA,GAAA,CAGA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAEA,WADA,GAAA,KAAA,KAAA,EAGA,GAAA,aACA,EAAA,EAAA,cAAA,cAAA,SACA,EAAA,YAAA,EAAA,YAGA,YAAA,KAAA,mBAAA,GACA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,KAAA,qBAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,GACA,KAAA,aAGA,IAAA,GAAA,YAAA,OAAA,WACA,aAAA,OAAA,YAAA,SAAA,GACA,MAAA,SAAA,EAAA,WAAA,eAAA,EAAA,KACA,EAAA,aAAA,GACA,EAAA,WAEA,EAAA,KAAA,KAAA,OASA,EAAA,UAAA,GAEA,OAAA,YClwBA,WAGA,OAAA,KAAA,OAAA,OAAA,SAAA,GACA,MAAA,IAGA,iBAAA,mBAAA,WACA,GAAA,eAAA,aAAA,EAAA,CACA,GAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,OAKA,OAAA,UCxBA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAGA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAGA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,GAGA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GACA,GAAA,EACA,GAAA,EACA,IAEA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GACA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAGA,CAAA,GAAA,EAIA,CACA,EAAA,kBACA,MAAA,GALA,EAAA,GACA,EAAA,WACA,UALA,GAAA,EAAA,cACA,EAAA,QASA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBACA,CAAA,GAAA,KAAA,EAkBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAEA,GAAA,qCAAA,EACA,MAAA,GARA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAnBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAEA,GAAA,KAAA,WACA,KAAA,aAAA,GAGA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QACA,wBACA,KAAA,YACA,wBAEA,cAaA,KAEA,KAAA,cACA,KAAA,GACA,MAAA,IACA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IACA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,aAAA,EAAA,GAGA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAGA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBACA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CACA,EAAA,oBAAA,GACA,EAAA,UACA,UAJA,EAAA,0BAMA,MAEA,KAAA,WAIA,GAHA,KAAA,aAAA,EACA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GACA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCACA,EAAA,qBACA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA;IACA,CAAA,GAAA,KAAA,EAOA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAEA,QAAA,KAAA,UAAA,EAAA,KAAA,IACA,KAAA,GAAA,KAAA,GACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,KACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,MAAA,OAEA,EAAA,eACA,UAnBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IACA,EAAA,WAgBA,KAEA,KAAA,iBACA,GAAA,KAAA,GAAA,MAAA,EASA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OAEA,EAAA,eACA,UAdA,MAAA,GACA,EAAA,gCAGA,EADA,QAAA,KAAA,QACA,YAEA,0BAUA,MAEA,KAAA,wBACA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GACA,EAAA,0BACA,UAJA,EAAA,wBAMA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAEA,KAEA,KAAA,2BACA,GAAA,KAAA,GAAA,MAAA,EAAA,CACA,EAAA,WACA,UAEA,EAAA,4BAAA,EAEA,MAEA,KAAA,YACA,GAAA,KAAA,EAAA,CACA,IACA,EAAA,mBACA,GAAA,OAEA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,KAAA,GAAA,MAAA,GAAA,MAAA,EAKA,GAAA,KAAA,GAAA,OAAA,KAAA,UAAA,CAIA,GAAA,GAAA,EAAA,EACA,QAAA,KAAA,UAAA,KAAA,WAAA,EAAA,KAAA,WAAA,MAJA,MAAA,UAAA,OALA,GAAA,oCAWA,EAAA,OACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,OACA,EAAA,GACA,EAAA,MACA,UAEA,GAAA,EAEA,KAEA,KAAA,YACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAEA,GAAA,EAAA,OACA,EAAA,uBAEA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,uBANA,EAAA,eAQA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,oCAEA,GAAA,CAEA,MAEA,KAAA,OACA,IAAA,WACA,GAAA,KAAA,GAAA,EAQA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CAIA,GAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,sBACA,EACA,KAAA,EAEA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,GACA,KAAA,EACA,GAAA,EACA,KAAA,IACA,GAAA,GAEA,GAAA,GAEA,EAAA,wCAAA,OAnBA,IAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,OACA,YAAA,EACA,KAAA,EAoBA,MAEA,KAAA,OACA,GAAA,QAAA,KAAA,GACA,GAAA,MACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,WACA,KAAA,MAAA,EAAA,IAEA,EAAA,GAEA,GAAA,EACA,KAAA,EAEA,GAAA,qBACA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,+BAAA,GAEA,EAAA,KAAA,MAEA,KAEA,KAAA,sBAIA,GAHA,MAAA,GACA,EAAA,6BACA,EAAA,gBACA,KAAA,GAAA,MAAA,EACA,QAEA,MAEA,KAAA,gBACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GA6BA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,GAAA,EAAA,QA9BA,CACA,MAAA,GACA,EAAA,mCAEA,IAAA,IACA,EAAA,EAAA,EAAA,kBACA,EAAA,GAEA,MAAA,GACA,KAAA,MAAA,MACA,KAAA,GAAA,MAAA,GACA,KAAA,MAAA,KAAA,KAEA,KAAA,GAAA,KAAA,GAAA,MAAA,EACA,KAAA,MAAA,KAAA,IACA,KAAA,IACA,QAAA,KAAA,SAAA,GAAA,KAAA,MAAA,QAAA,GAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KACA,EAAA,EAAA,GAAA,KAEA,KAAA,MAAA,KAAA,IAEA,EAAA,GACA,KAAA,GACA,KAAA,OAAA,IACA,EAAA,SACA,KAAA,IACA,KAAA,UAAA,IACA,EAAA,YAKA,KAEA,KAAA,QACA,GAAA,KAAA,EAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA,MAEA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAKA,KAIA,QAAA,KACA,KAAA,QAAA,GACA,KAAA,YAAA,GACA,KAAA,UAAA,GACA,KAAA,UAAA,KACA,KAAA,MAAA,GACA,KAAA,MAAA,GACA,KAAA,SACA,KAAA,OAAA,GACA,KAAA,UAAA,GACA,KAAA,YAAA,EACA,KAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,SAAA,GAAA,YAAA,KACA,EAAA,GAAA,GAAA,OAAA,KAEA,KAAA,KAAA,EACA,EAAA,KAAA,KAEA,IAAA,GAAA,EAAA,QAAA,+BAAA,GAGA,GAAA,KAAA,KAAA,EAAA,KAAA,GAzcA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAGA,IAAA,EAAA,CAGA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GACA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IA8CA,IAAA,GAAA,OACA,EAAA,WACA,EAAA,mBAoYA,GAAA,WACA,GAAA,QACA,GAAA,KAAA,WACA,MAAA,MAAA,IAEA,IAAA,GAAA,EAMA,QALA,IAAA,KAAA,WAAA,MAAA,KAAA,aACA,EAAA,KAAA,WACA,MAAA,KAAA,UAAA,IAAA,KAAA,UAAA,IAAA,KAGA,KAAA,UACA,KAAA,YAAA,KAAA,EAAA,KAAA,KAAA,IACA,KAAA,SAAA,KAAA,OAAA,KAAA,WAEA,GAAA,MAAA,GACA,EAAA,KAAA,MACA,EAAA,KAAA,KAAA,IAGA,GAAA,YACA,MAAA,MAAA,QAAA,KAEA,GAAA,UAAA,GACA,KAAA,YAEA,EAAA,KAAA,KAAA,EAAA,IAAA,iBAGA,GAAA,QACA,MAAA,MAAA,WAAA,GAAA,KAAA,MACA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,OAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,aAGA,GAAA,QACA,MAAA,MAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,WAAA,GAAA,KAAA,YACA,IAAA,KAAA,MAAA,KAAA,KAAA,KAAA,aAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,SACA,EAAA,KAAA,KAAA,EAAA,yBAGA,GAAA,UACA,MAAA,MAAA,aAAA,KAAA,QAAA,KAAA,KAAA,OACA,GAAA,KAAA,QAEA,GAAA,QAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,OAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,WAGA,GAAA,QACA,MAAA,MAAA,aAAA,KAAA,WAAA,KAAA,KAAA,UACA,GAAA,KAAA,WAEA,GAAA,MAAA,GACA,KAAA,aAEA,KAAA,UAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,cAGA,GAAA,UACA,GAAA,EACA,IAAA,KAAA,aAAA,KAAA,QACA,MAAA,EAOA,QAAA,KAAA,SACA,IAAA,OACA,IAAA,OACA,IAAA,aACA,IAAA,SACA,MAAA,OAGA,MADA,GAAA,KAAA,KACA,EAGA,KAAA,QAAA,MAAA,EAFA,IAOA,IAAA,GAAA,EAAA,GACA,KACA,EAAA,gBAAA,WAGA,MAAA,GAAA,gBAAA,MAAA,EAAA,YAEA,EAAA,gBAAA,SAAA,GACA,EAAA,gBAAA,KAIA,EAAA,IAAA,IAEA,MChlBA,WAIA,SAAA,UAAA,OACA,SAAA,UAAA,KAAA,SAAA,GACA,GAAA,GAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,EACA,OAAA,YACA,GAAA,GAAA,EAAA,OAEA,OADA,GAAA,KAAA,MAAA,EAAA,WACA,EAAA,MAAA,EAAA,OAKA,OAAA,UCnBA,SAAA,GAoCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAIA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAGA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAGA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAEA,GAAA,GAGA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,KAKA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,QAAA,SAAA,GACA,EAAA,WAAA,GACA,EAAA,+BAiBA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAEA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,IAAA,IAAA,GAAA,EAAA,QAAA,CAGA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAaA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAoFA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,cACA,KAAA,gBACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAAA,OAQA,OAPA,GAAA,WAAA,EAAA,WAAA,QACA,EAAA,aAAA,EAAA,aAAA,QACA,EAAA,gBAAA,EAAA,gBACA,EAAA,YAAA,EAAA,YACA,EAAA,cAAA,EAAA,cACA,EAAA,mBAAA,EAAA,mBACA,EAAA,SAAA,EAAA,SACA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAGA,QAAA,KACA,EAAA,EAAA,OAQA,QAAA,GAAA,GACA,MAAA,KAAA,GAAA,IAAA,EAWA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAIA,GAAA,EAAA,GACA,EAEA,KAUA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1TA,GAAA,GAAA,GAAA,SAGA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KAiGA,EAAA,CAcA,GAAA,WACA,QAAA,SAAA,EAAA,GAIA,GAHA,EAAA,EAAA,IAGA,EAAA,YAAA,EAAA,aAAA,EAAA,eAGA,EAAA,oBAAA,EAAA,YAGA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAGA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAGA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAOA,KAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBACA,EAAA,QAAA,CACA,OASA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAGA,EAAA,gBAGA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,kBACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,GAkCA,IAAA,GAAA,CAwEA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAMA,IAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EACA,IAAA,EAEA,YADA,EAAA,EAAA,GAAA,OAIA,GAAA,KAAA,SAGA,GAAA,GAAA,GAGA,aAAA,WACA,KAAA,cAAA,KAAA,SAGA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,iBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,iBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAGA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,oBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,oBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,oBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,oBAAA,iBAAA,MAAA,IAQA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,0BAEA,EAAA,QAAA,SAAA,GAEA,KAAA,iBAAA,EAGA,KAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,SAGA,OAGA,YAAA,SAAA,GAMA,OAFA,EAAA,2BAEA,EAAA,MACA,IAAA,kBAGA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,OAGA,EAAA,GAAA,GAAA,aAAA,EACA,GAAA,cAAA,EACA,EAAA,mBAAA,CAGA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QACA,KAAA,EAAA,gBAAA,QAAA,IACA,KAAA,EAAA,gBAAA,QAAA,GANA,OAUA,EAAA,kBACA,EAAA,GAGA,GAGA,MAEA,KAAA,2BAEA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAGA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAWA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GACA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EACA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAIA,EAJA,SASA,MAIA,EAAA,mBAAA,EAEA,EAAA,mBACA,EAAA,iBAAA,IAGA,MCzhBA,OAAA,YAAA,OAAA,cAAA,UCCA,SAAA,GAuCA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IACA,GAMA,QAAA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAIA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GASA,GACA,QAVA,CACA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAGA,GAAA,iBAAA,EAAA,IAMA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EAIA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GAAA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,GACA,IACA,IAVA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAWA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,GAAA,OAAA,KAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,QAIA,KAUA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,UACA,EAAA,QAAA,YAAA,EAAA,OAAA,WACA,EAAA,eAuBA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,WAAA,EAAA,IAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MACA,GACA,GAAA,OAAA,KAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,IAvJA,GAAA,GAAA,SACA,EAAA,IAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,UAAA,KAAA,UAAA,WAGA,EAAA,QAAA,OAAA,mBACA,EAAA,SAAA,GACA,MAAA,GAAA,kBAAA,aAAA,GAAA,GAGA,EAAA,EAAA,UAMA,GACA,IAAA,WACA,GAAA,GAAA,YAAA,eAAA,SAAA,gBAIA,aAAA,SAAA,WACA,SAAA,QAAA,SAAA,QAAA,OAAA,GAAA,KACA,OAAA,GAAA,IAEA,cAAA,EAGA,QAAA,eAAA,SAAA,iBAAA,GACA,OAAA,eAAA,EAAA,iBAAA,EAeA,IAAA,GAAA,EAAA,WAAA,cACA,EAAA,kBA6EA,KACA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YACA,EAAA,EAAA,cAGA,QAAA,SAAA,MAAA,WAAA,IA0BA,WACA,GAAA,YAAA,SAAA,WAEA,IAAA,GAAA,GADA,EAAA,SAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAWA,EAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAKA,EAAA,UAAA,EACA,EAAA,eAAA,EACA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,iBAAA,EACA,EAAA,KAAA,GAEA,OAAA,aC/LA,SAAA,GAGA,GACA,IADA,EAAA,KACA,EAAA,KACA,EAAA,EAAA,MAMA,EAAA,SAAA,EAAA,GACA,KAAA,SACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,SAAA,EACA,KAAA,WAGA,GAAA,WAEA,SAAA,SAAA,GAEA,KAAA,UAAA,EAAA,MAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAGA,QAAA,SAAA,GAEA,KAAA,WAEA,KAAA,QAAA,GAEA,KAAA,aAGA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GAIA,MAFA,MAAA,QAAA,GAAA,KAAA,IAEA,CAGA,OAAA,MAAA,MAAA,IACA,KAAA,OAAA,EAAA,EAAA,KAAA,MAAA,IAEA,KAAA,QAEA,IAGA,KAAA,QAAA,IAAA,IAEA,IAGA,MAAA,SAAA,EAAA,GAEA,GADA,EAAA,MAAA,QAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,UAAA,CAEA,GAAA,GAAA,EAAA,MAAA,KACA,EAAA,EAAA,GACA,EAAA,EAAA,EAEA,GADA,EAAA,QAAA,WAAA,GACA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IACA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAiBA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAGA,KAAA,OAAA,EAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAEA,MAAA,QAAA,GAAA,MAGA,KAAA,aACA,KAAA,SACA,KAAA,aAGA,UAAA,WACA,KAAA,UACA,KAAA,eAMA,EAAA,IACA,OAAA,EAEA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KACA,MAAA,EAAA,QACA,IAAA,EAAA,QAGA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eAqBA,QApBA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OACA,EAAA,iBAAA,mBAAA,WACA,GAAA,IAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,kBAAA,YACA,EAAA,IACA,IAAA,EACA,GAAA,GAAA,MAAA,EAAA,OAAA,EAAA,GACA,SAAA,OAAA,EACA,CAEA,GAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,MAGA,EAAA,OACA,GAGA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAMA,EAAA,IAAA,EACA,EAAA,OAAA,GAEA,OAAA,aCpLA,SAAA,GA0RA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,sCAAA,mBAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,YAAA,EAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EAAA,CACA,EAAA,EAAA,cAAA,OAEA,IAAA,GAAA,IAAA,KAAA,MAAA,KAAA,KAAA,SAAA,IAAA,IAGA,EAAA,EAAA,YAAA,MAAA,wBACA,GAAA,GAAA,EAAA,IAAA,EAEA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,EA7TA,GAAA,GAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,KACA,EAAA,EAAA,iBAUA,GAGA,kBAAA,YAAA,EAAA,IAGA,kBACA,YAAA,EAAA,IACA,uBACA,QACA,qBACA,kCACA,KAAA,KAEA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAGA,mBAGA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAIA,MAAA,SAAA,GACA,GAAA,KAAA,SAAA,GAEA,YADA,EAAA,OAAA,QAAA,IAAA,yBAAA,EAAA,WAGA,IAAA,GAAA,KAAA,KAAA,IAAA,EAAA,WACA,KACA,KAAA,YAAA,GACA,EAAA,KAAA,KAAA,KAIA,aAAA,SAAA,EAAA,GACA,KAAA,gBAAA,KAAA,GACA,GACA,KAAA,aAYA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAGA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,KAAA,2BAAA,GACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,EACA,KAAA,2BAAA,EAAA,kBAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,IAGA,2BAAA,SAAA,GACA,GAAA,GAAA,KAAA,gBAAA,QAAA,EACA,IAAA,GACA,KAAA,gBAAA,OAAA,EAAA,IAIA,YAAA,SAAA,GAmBA,GAfA,YAAA,sBACA,YAAA,qBAAA,GAEA,EAAA,SACA,EAAA,OAAA,gBAAA,GAEA,KAAA,oBAAA,GAGA,EAAA,cADA,EAAA,aAAA,EAAA,QACA,GAAA,aAAA,QAAA,SAAA,IAEA,GAAA,aAAA,SAAA,SAAA,KAIA,EAAA,UAEA,IADA,GAAA,GACA,EAAA,UAAA,QACA,EAAA,EAAA,UAAA,QACA,GACA,GAAA,OAAA,GAIA,MAAA,aAGA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAIA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAGA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,KAAA,qBAAA,IAGA,qBAAA,SAAA,GAEA,IADA,GAAA,GAAA,EACA,EAAA,cAAA,cACA,EAAA,EAAA,cAAA,YAEA,OAAA,IAGA,qBAAA,SAAA,GAIA,IAAA,GAHA,GAAA,KAAA,qBAAA,EAAA,iBAAA,GACA,EAAA,EAAA,mBAAA,EAAA,oBAAA,EACA,EAAA,EAAA,mBACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,kBAEA,GAAA,WAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GACA,EAAA,YAOA,IALA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAIA,GAAA,UAAA,EAAA,UAAA,CACA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CACA,GAAA,CAIA,KAAA,GAAA,GAHA,EAAA,EAAA,MAAA,SACA,EAAA,EAAA,EAAA,OAAA,EAEA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAEA,EAAA,GAAA,QAAA,EAAA,aAKA,GACA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAWA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IACA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WACA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,KAAA,qBAAA,IAIA,YAAA,WAEA,MADA,MAAA,cACA,KAAA,iBAAA,KAAA,iBAAA,IACA,KAAA,uBAGA,iBAAA,SAAA,EAAA,GAGA,GAAA,GAAA,KAAA,UAAA,QAAA,GAAA,EAAA,CACA,KAAA,UAAA,KAAA,EAEA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,KAAA,sBAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IAAA,KAAA,SAAA,GACA,MAAA,MAAA,YAAA,GACA,EAAA,GAAA,KAAA,iBAAA,EAAA,OAAA,GAAA,EAEA,OAMA,MAAA,IAGA,mBAAA,WACA,MAAA,MAAA,gBAAA,IAIA,sBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBACA,KAAA,kBAGA,SAAA,SAAA,GACA,MAAA,GAAA,gBAGA,oBAAA,SAAA,GACA,MAAA,MAAA,gBAAA,QAAA,IAAA,GAGA,YAAA,SAAA,GACA,MAAA,GAAA,IAAA,SAAA,EAAA,QACA,GAEA,IAgDA,EAAA,sBACA,EAAA,qCAEA,GAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAEA,OADA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GACA,GAGA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAEA,OADA,GAAA,KAAA,YAAA,EAAA,EAAA,IAIA,YAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,IAAA,EAAA,IAAA,KAOA,GAAA,OAAA,EACA,EAAA,KAAA,GAEA,aCtWA,SAAA,GAqGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EAOA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,CACA,aAAA,YACA,EAAA,SAAA,eAAA,mBAAA,IAGA,EAAA,KAAA,CAEA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UACA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OAmBA,OAlBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAMA,YAAA,YAEA,EAAA,KAAA,UAAA,GAIA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAEA,EAjJA,GAAA,GAAA,EAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,IAAA,EA4KA,GAAA,UA5KA,CAGA,GAAA,GAAA,EAAA,aAEA,GADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OAQA,GAEA,aAGA,yBAAA,YAAA,EAAA,IAGA,yBACA,YAAA,EAAA,KACA,KAAA,KAEA,SAAA,SAAA,GACA,EAAA,QAAA,IAIA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAEA,GAAA,SAAA,IAGA,aAAA,SAAA,GAEA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAIA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAGA,OAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAOA,GANA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAIA,EAAA,WAAA,EACA,EAAA,QAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAEA,UAAA,IAEA,EAAA,EAAA,KAAA,EAAA,EAAA,GAAA,GACA,IACA,EAAA,aAAA,EAGA,KAAA,aAAA,IAGA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAGA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAGA,UAAA,WACA,EAAA,cAMA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GAqDA,KAAA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WACA,GAAA,GAAA,SAAA,cAAA,OACA,OAAA,GAAA,EAAA,KAAA,OAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAIA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAKA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,IAUA,EAAA,SAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,GAEA,OAAA,aC3LA,SAAA,GAWA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAQA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IACA,EAAA,EAAA,cACA,EAAA,EAAA,SAAA,IAIA,EAAA,EAAA,GACA,GACA,EAAA,SAAA,GAEA,EAAA,IAAA,GACA,EAAA,aAAA,EAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAKA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAGA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,sBAAA,IAaA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IA9DA,GACA,IADA,EAAA,iBACA,EAAA,UACA,EAAA,EAAA,OAkDA,EAAA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,kBAEA,EAAA,GAAA,kBAAA,EASA,GAAA,QAAA,EACA,EAAA,QAAA,GAEA,aCzEA,WAUA,QAAA,KACA,YAAA,SAAA,aAAA,GANA,GAAA,GAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,QAGA,aAAA,YAQA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YACA,IAEA,SAAA,iBAAA,mBAAA,OCrBA,OAAA,eAAA,OAAA,iBAAA,UCCA,SAAA,GAQA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GACA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAEA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAMA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,MAEA,GAAA,EAAA,KAEA,EAAA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IACA,OAEA,GAAA,GAIA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,EADA,SAOA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UACA,EAAA,EAAA,SAAA,EACA,IAAA,EAIA,MAHA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GACA,EAAA,KAAA,QAAA,YACA,GAKA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IACA,EAAA,EAAA,SAAA,GACA,EAAA,KAiBA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,IACA,EAAA,CACA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAIA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAEA,MAGA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAWA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,YAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WACA,EAAA,qBAGA,EAAA,KAAA,QAAA,YAIA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GACA,EAAA,KAIA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBACA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAMA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAFA,GAAA,GAAA,EACA,EAAA,EAAA,UACA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAIA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAGA,KADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,GACA,EAAA,EAAA,iBAKA,QAAA,GAAA,GACA,EAAA,GAGA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YACA,EAAA,WAAA,CAEA,IADA,GAAA,GAAA,EAAA,WAAA,GACA,GAAA,IAAA,WAAA,EAAA,MACA,EAAA,EAAA,UAEA,IAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,YAAA,EACA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAGA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAGA,EAAA,QAAA,SAAA,GAEA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAGA,EAAA,QAKA,EAAA,KAAA,QAAA,WAGA,QAAA,GAAA,GAKA,IAHA,IAAA,EAAA,EAAA,WAGA,EAAA,YACA,EAAA,EAAA,UAGA,IAAA,GAAA,EAAA,UACA,KACA,EAAA,EAAA,eACA,KAMA,QAAA,GAAA,GACA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,GAAA,kBAAA,EACA,GAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IACA,EAAA,WAAA,GAGA,QAAA,GAAA,GACA,EAAA,GAGA,QAAA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAYA,QAAA,GAAA,GACA,KACA,EAAA,GACA,EAAA,KAIA,QAAA,GAAA,GAEA,GADA,EAAA,EAAA,KACA,EAAA,QAAA,IAAA,GAAA,CAGA,EAAA,KAAA,EAIA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAGA,GAAA,IA9VA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAiGA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAEA,IAkOA,GAlOA,GAAA,EACA,KAmMA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAwDA,GAAA,iBAAA,EACA,EAAA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAEA,OAAA,gBCtWA,SAAA,GA2EA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,KACA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAGA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAIA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CA+BA,OA5BA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAGA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAEA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAEA,EAAA,OAEA,EAAA,oBAAA,UAEA,EAAA,KAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,GACA,EAAA,EAAA,SAAA,QAAA,OAKA,QAAA,GAAA,GAMA,IAAA,GAAA,GAHA,EAAA,EAAA,QAGA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAGA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAGA,IAAA,OAAA,UAAA,CAEA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,KACA,EAAA,OAAA,eAAA,EAEA,KAAA,EAAA,YACA,EAAA,GASA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GACA,EAAA,OAAA,eAAA,GACA,EAAA,UAAA,EACA,EAAA,CAGA,GAAA,OAAA,GAMA,QAAA,GAAA,GAOA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAgBA,MAdA,GAAA,IACA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,EAAA,GAEA,EAAA,cAAA,EAEA,EAAA,GAEA,EAAA,aAAA,GAEA,EAAA,eAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAKA,EAAA,EAAA,EAAA,UAAA,EAAA,QACA,EAAA,UAAA,EAAA,WAIA,QAAA,GAAA,EAAA,EAAA,GASA,IALA,GAAA,MAEA,EAAA,EAGA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAIA,QAAA,GAAA,GAEA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAGA,GAAA,GAAA,EAAA,YACA,GAAA,aAAA,SAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAAA,GAEA,IAAA,GAAA,EAAA,eACA,GAAA,gBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,KAAA,IAEA,EAAA,aAAA,aAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aACA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GACA,KAAA,yBAAA,EAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,EAAA,EAAA,eADA,OAKA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAGA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAGA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAIA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAEA,OADA,GAAA,aAAA,KAAA,GACA,EAEA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAGA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QACA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,KAAA,KAAA,EAIA,OAFA,GAAA,WAAA,GAEA,EAlYA,IACA,EAAA,OAAA,gBAAA,UAEA,IAAA,GAAA,EAAA,MAIA,EAAA,QAAA,SAAA,iBAGA,GAAA,EAAA,UAAA,IAAA,OAAA,qBAAA,OAAA,aAAA,YAAA,UAEA,IAAA,EAAA,CAGA,GAAA,GAAA,YAGA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EACA,EAAA,YAAA,EACA,EAAA,uBAEA,CA8GA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAuKA,KAkBA,EAAA,+BA8DA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EACA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAaA,EAAA,QAAA,EAKA,GAAA,EAgBA,GAfA,OAAA,WAAA,EAeA,SAAA,EAAA,GACA,MAAA,aAAA,IAfA,SAAA,EAAA,GAEA,IADA,GAAA,GAAA,EACA,GAAA,CAIA,GAAA,IAAA,EAAA,UACA,OAAA,CAEA,GAAA,EAAA,UAEA,OAAA,GASA,EAAA,WAAA,EACA,EAAA,gBAAA,EAGA,SAAA,SAAA,SAAA,gBAEA,EAAA,UAAA,EACA,EAAA,UAAA,GAEA,OAAA,gBCndA,SAAA,GA6CA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WACA,EAAA,aAAA,SAAA,EA3CA,GAAA,GAAA,EAAA,iBAIA,GACA,WACA,YAAA,EAAA,KAEA,KACA,KAAA,aAEA,MAAA,SAAA,GACA,IAAA,EAAA,SAAA,CAEA,EAAA,UAAA,CAEA,IAAA,GAAA,EAAA,iBAAA,EAAA,UAEA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,IAAA,EAAA,YAAA,KAIA,eAAA,gBAAA,GAEA,eAAA,gBAAA,KAGA,UAAA,SAAA,GAEA,EAAA,IACA,KAAA,YAAA,IAGA,YAAA,SAAA,GACA,EAAA,QACA,EAAA,MAAA,EAAA,UAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAIA,GAAA,OAAA,EACA,EAAA,iBAAA,GAEA,OAAA,gBC1DA,SAAA,GAGA,QAAA,KAEA,eAAA,OAAA,MAAA,UAEA,eAAA,gBAAA,UAEA,OAAA,cACA,YAAA,qBAAA,SAAA,GACA,eAAA,OAAA,MAAA,EAAA,UAKA,eAAA,OAAA,EAIA,WAAA,WAEA,eAAA,UAAA,KAAA,MACA,OAAA,cACA,eAAA,QAAA,eAAA,UAAA,YAAA,WAGA,SAAA,cACA,GAAA,aAAA,sBAAA,SAAA,OAmBA,GAbA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,EAAA,KACA,IAAA,GAAA,SAAA,YAAA,cAEA,OADA,GAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,QAAA,EAAA,YAAA,EAAA,QACA,GAEA,OAAA,YAAA,UAAA,OAAA,MAAA,WAMA,aAAA,SAAA,YAAA,EAAA,MAAA,MACA,QAGA,IAAA,gBAAA,SAAA,YAAA,OAAA,aACA,OAAA,cAAA,OAAA,YAAA,MAIA,CACA,GAAA,GAAA,OAAA,cAAA,YAAA,MACA,oBAAA,kBACA,QAAA,iBAAA,EAAA,OANA,MASA,OAAA,gBC7DA,WAEA,GAAA,OAAA,kBAAA,CAGA,GAAA,IAAA,aAAA,iBAAA,kBACA,mBAGA,IACA,GAAA,QAAA,SAAA,GACA,EAAA,GAAA,eAAA,KAIA,EAAA,QAAA,SAAA,GACA,eAAA,GAAA,SAAA,GACA,MAAA,GAAA,GAAA,KAAA,WCjBA,SAAA,GAEA,YAkEA,SAAA,KACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,KAAA,IAAA,OAAA,oIAjEA,IAAA,OAAA,YAAA,CACA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA;GAKA,OAAA,wBACA,OAAA,sBAAA,WACA,GAAA,GAAA,OAAA,6BACA,OAAA,wBAEA,OAAA,GACA,SAAA,GACA,MAAA,GAAA,WACA,EAAA,YAAA,UAGA,SAAA,GACA,MAAA,QAAA,WAAA,EAAA,IAAA,SAKA,OAAA,uBACA,OAAA,qBAAA,WACA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAWA,IAAA,MAEA,EAAA,SAAA,GACA,gBAAA,IAAA,IAAA,UAAA,QACA,MAAA,UAAA,KAAA,KAAA,UAAA,SAAA,gBAEA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,SAAA,GACA,EAAA,oBAAA,WACA,KAAA,0CAEA,GACA,EAAA,GAEA,EAAA,MAgBA,YAAA,UACA,IAEA,iBAAA,mBAAA,IAGA,OAAA,UCvFA,WAWA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,sIAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAEA,UCvBA,SAAA,GAEA,QAAA,GAAA,EAAA,GAKA,MAJA,GAAA,MACA,EAAA,MACA,GAAA,IAEA,EAAA,MAAA,KAAA,EAAA,IAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GACA,MACA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GAEA,EAAA,EAAA,MAAA,KACA,MACA,SAEA,EAAA,EAAA,EAAA,GAGA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAUA,GAAA,QAAA,EAEA,EAAA,WAAA,EACA,EAAA,MAAA,GAEA","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.log('Warning: 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        return this;\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(observer) {\n    if (observer.scheduled_)\n      return;\n\n    observer.scheduled_ = true;\n    globalMutationObservers.push(observer);\n\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        mo.scheduled_ = false;\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    // 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      scheduleCallback(observer);\n      observer.records_.push(record);\n    }\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    this.scheduled_ = false;\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      // Make sure we remove transient observers at the end of microtask, even\n      // if we didn't get any change records.\n      scheduleCallback(this.observer);\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      if (textContent == null) 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    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\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 IMPORT_LINK_TYPE = 'import';\r\nvar hasNative = (IMPORT_LINK_TYPE in document.createElement('link'));\r\nvar useNative = hasNative;\r\nvar isIE = /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\n\r\nvar rootDocument = 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(rootDocument, '_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 whenReady(callback, doc) {\r\n  doc = doc || rootDocument;\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) && callback) {\r\n       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\nwhenReady(function() {\r\n  HTMLImports.ready = true;\r\n  HTMLImports.readyTime = new Date().getTime();\r\n  rootDocument.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 = whenReady;\r\nscope.rootDocument = rootDocument;\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.isIE = isIE;\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\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\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\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\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\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\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\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n\n  };\n\n  xhr = xhr || {\n    async: true,\n\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\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\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\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\n// imports\nvar rootDocument = scope.rootDocument;\nvar flags = scope.flags;\nvar isIE = scope.isIE;\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\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\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n\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\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n\n  dynamicElements: [],\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\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\n  parseDynamic: function(elt, quiet) {\n    this.dynamicElements.push(elt);\n    if (!quiet) {\n      this.parseNext();\n    }\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\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    this.markDynamicParsingComplete(elt);\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n      this.markDynamicParsingComplete(elt.__importElement);\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n\n  markDynamicParsingComplete: function(elt) {\n    var i = this.dynamicElements.indexOf(elt);\n    if (i >= 0) {\n      this.dynamicElements.splice(i, 1);\n    }\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\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\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\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    this.addElementToDocument(elt);\n  },\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\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\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\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\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    this._mayParse = [];\n    return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || \n        this.nextToParseDynamic());\n  },\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\n  nextToParseDynamic: function() {\n    return this.dynamicElements[0];\n  },\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 === rootDocument ? this.documentSelectors :\n        this.importsSelectors;\n  },\n\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n\n  needsDynamicParsing: function(elt) {\n    return (this.dynamicElements.indexOf(elt) >= 0);\n  },\n\n  hasResource: function(node) {\n    if (nodeIsImport(node) && (node.import === undefined)) {\n      return false;\n    }\n    return true;\n  }\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\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\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\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\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\n// imports\nvar useNative = scope.useNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\n\nif (!useNative) {\n\n  // imports\n  var rootDocument = scope.rootDocument;\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\n    documents: {},\n    \n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    \n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    \n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\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    \n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\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 === rootDocument ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\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    \n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    \n    loadedAll: function() {\n      parser.parseNext();\n    }\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(rootDocument, '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})(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\n// imports\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importer = scope.importer;\nvar parser = scope.parser;\n\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\n\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\n// IFF the owning document has already parsed, then parsable elements\n// need to be marked for dynamic parsing.\nfunction addedNodes(nodes) {\n  var owner, parsed;\n  for (var i=0, l=nodes.length, n, loading; (i<l) && (n=nodes[i]); i++) {\n    if (!owner) {\n      owner = n.ownerDocument;\n      parsed = parser.isParsed(owner);\n    }\n    // note: the act of loading kicks the parser, so we use parseDynamic's\n    // 2nd argument to control if this added node needs to kick the parser.\n    loading = shouldLoadNode(n);\n    if (loading) {\n      importer.loadNode(n);\n    }\n    if (shouldParseNode(n) && parsed) {\n      parser.parseDynamic(n, loading);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\nfunction shouldParseNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      parser.parseSelectorsForNode(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  observe(root);\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\nfunction takeRecords(node) {\r\n  // If the optional node is not supplied, assume we mean the whole document.\r\n  if (!node) node = wrapIfNeeded(document);\r\n\r\n  // Find the root of the tree, which will be an Document or ShadowRoot.\r\n  while (node.parentNode) {\r\n    node = node.parentNode;\r\n  }\r\n\r\n  var observer = node.__observer;\r\n  if (observer) {\r\n    handler(observer.takeRecords());\r\n    takeMutations();\r\n  }\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  if (inRoot.__observer) return;\r\n\r\n  // For each ShadowRoot, we create a new MutationObserver, so the root can be\r\n  // garbage collected once all references to the `inRoot` node are gone.\r\n  var observer = new MutationObserver(handler);\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n  inRoot.__observer = observer;\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/lib/webcomponents.js b/pkg/web_components/lib/webcomponents.js
new file mode 100644
index 0000000..8e6523a
--- /dev/null
+++ b/pkg/web_components/lib/webcomponents.js
@@ -0,0 +1,6373 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+window.WebComponents = window.WebComponents || {};
+
+(function(scope) {
+  var flags = scope.flags || {};
+  var file = "webcomponents.js";
+  var script = document.querySelector('script[src*="' + file + '"]');
+  if (!flags.noOpts) {
+    location.search.slice(1).split("&").forEach(function(o) {
+      o = o.split("=");
+      o[0] && (flags[o[0]] = o[1] || true);
+    });
+    if (script) {
+      for (var i = 0, a; a = script.attributes[i]; i++) {
+        if (a.name !== "src") {
+          flags[a.name] = a.value || true;
+        }
+      }
+    }
+    if (flags.log) {
+      var parts = flags.log.split(",");
+      flags.log = {};
+      parts.forEach(function(f) {
+        flags.log[f] = true;
+      });
+    } else {
+      flags.log = {};
+    }
+  }
+  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
+  if (flags.shadow === "native") {
+    flags.shadow = false;
+  } else {
+    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
+  }
+  if (flags.register) {
+    window.CustomElements = window.CustomElements || {
+      flags: {}
+    };
+    window.CustomElements.flags.register = flags.register;
+  }
+  scope.flags = flags;
+})(WebComponents);
+
+if (WebComponents.flags.shadow) {
+  if (typeof WeakMap === "undefined") {
+    (function() {
+      var defineProperty = Object.defineProperty;
+      var counter = Date.now() % 1e9;
+      var WeakMap = function() {
+        this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
+      };
+      WeakMap.prototype = {
+        set: function(key, value) {
+          var entry = key[this.name];
+          if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
+            value: [ key, value ],
+            writable: true
+          });
+          return this;
+        },
+        get: function(key) {
+          var entry;
+          return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
+        },
+        "delete": function(key) {
+          var entry = key[this.name];
+          if (!entry || entry[0] !== key) return false;
+          entry[0] = entry[1] = undefined;
+          return true;
+        },
+        has: function(key) {
+          var entry = key[this.name];
+          if (!entry) return false;
+          return entry[0] === key;
+        }
+      };
+      window.WeakMap = WeakMap;
+    })();
+  }
+  window.ShadowDOMPolyfill = {};
+  (function(scope) {
+    "use strict";
+    var constructorTable = new WeakMap();
+    var nativePrototypeTable = new WeakMap();
+    var wrappers = Object.create(null);
+    function detectEval() {
+      if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) {
+        return false;
+      }
+      if (navigator.getDeviceStorage) {
+        return false;
+      }
+      try {
+        var f = new Function("return true;");
+        return f();
+      } catch (ex) {
+        return false;
+      }
+    }
+    var hasEval = detectEval();
+    function assert(b) {
+      if (!b) throw new Error("Assertion failed");
+    }
+    var defineProperty = Object.defineProperty;
+    var getOwnPropertyNames = Object.getOwnPropertyNames;
+    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+    function mixin(to, from) {
+      var names = getOwnPropertyNames(from);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+      }
+      return to;
+    }
+    function mixinStatics(to, from) {
+      var names = getOwnPropertyNames(from);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        switch (name) {
+         case "arguments":
+         case "caller":
+         case "length":
+         case "name":
+         case "prototype":
+         case "toString":
+          continue;
+        }
+        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+      }
+      return to;
+    }
+    function oneOf(object, propertyNames) {
+      for (var i = 0; i < propertyNames.length; i++) {
+        if (propertyNames[i] in object) return propertyNames[i];
+      }
+    }
+    var nonEnumerableDataDescriptor = {
+      value: undefined,
+      configurable: true,
+      enumerable: false,
+      writable: true
+    };
+    function defineNonEnumerableDataProperty(object, name, value) {
+      nonEnumerableDataDescriptor.value = value;
+      defineProperty(object, name, nonEnumerableDataDescriptor);
+    }
+    getOwnPropertyNames(window);
+    function getWrapperConstructor(node) {
+      var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
+      var wrapperConstructor = constructorTable.get(nativePrototype);
+      if (wrapperConstructor) return wrapperConstructor;
+      var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
+      var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
+      registerInternal(nativePrototype, GeneratedWrapper, node);
+      return GeneratedWrapper;
+    }
+    function addForwardingProperties(nativePrototype, wrapperPrototype) {
+      installProperty(nativePrototype, wrapperPrototype, true);
+    }
+    function registerInstanceProperties(wrapperPrototype, instanceObject) {
+      installProperty(instanceObject, wrapperPrototype, false);
+    }
+    var isFirefox = /Firefox/.test(navigator.userAgent);
+    var dummyDescriptor = {
+      get: function() {},
+      set: function(v) {},
+      configurable: true,
+      enumerable: true
+    };
+    function isEventHandlerName(name) {
+      return /^on[a-z]+$/.test(name);
+    }
+    function isIdentifierName(name) {
+      return /^\w[a-zA-Z_0-9]*$/.test(name);
+    }
+    function getGetter(name) {
+      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() {
+        return this.__impl4cf1e782hg__[name];
+      };
+    }
+    function getSetter(name) {
+      return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) {
+        this.__impl4cf1e782hg__[name] = v;
+      };
+    }
+    function getMethod(name) {
+      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() {
+        return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);
+      };
+    }
+    function getDescriptor(source, name) {
+      try {
+        return Object.getOwnPropertyDescriptor(source, name);
+      } catch (ex) {
+        return dummyDescriptor;
+      }
+    }
+    var isBrokenSafari = function() {
+      var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType");
+      return descr && !descr.get && !descr.set;
+    }();
+    function installProperty(source, target, allowMethod, opt_blacklist) {
+      var names = getOwnPropertyNames(source);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        if (name === "polymerBlackList_") continue;
+        if (name in target) continue;
+        if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;
+        if (isFirefox) {
+          source.__lookupGetter__(name);
+        }
+        var descriptor = getDescriptor(source, name);
+        var getter, setter;
+        if (allowMethod && typeof descriptor.value === "function") {
+          target[name] = getMethod(name);
+          continue;
+        }
+        var isEvent = isEventHandlerName(name);
+        if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);
+        if (descriptor.writable || descriptor.set || isBrokenSafari) {
+          if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);
+        }
+        defineProperty(target, name, {
+          get: getter,
+          set: setter,
+          configurable: descriptor.configurable,
+          enumerable: descriptor.enumerable
+        });
+      }
+    }
+    function register(nativeConstructor, wrapperConstructor, opt_instance) {
+      var nativePrototype = nativeConstructor.prototype;
+      registerInternal(nativePrototype, wrapperConstructor, opt_instance);
+      mixinStatics(wrapperConstructor, nativeConstructor);
+    }
+    function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
+      var wrapperPrototype = wrapperConstructor.prototype;
+      assert(constructorTable.get(nativePrototype) === undefined);
+      constructorTable.set(nativePrototype, wrapperConstructor);
+      nativePrototypeTable.set(wrapperPrototype, nativePrototype);
+      addForwardingProperties(nativePrototype, wrapperPrototype);
+      if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);
+      defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor);
+      wrapperConstructor.prototype = wrapperPrototype;
+    }
+    function isWrapperFor(wrapperConstructor, nativeConstructor) {
+      return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;
+    }
+    function registerObject(object) {
+      var nativePrototype = Object.getPrototypeOf(object);
+      var superWrapperConstructor = getWrapperConstructor(nativePrototype);
+      var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
+      registerInternal(nativePrototype, GeneratedWrapper, object);
+      return GeneratedWrapper;
+    }
+    function createWrapperConstructor(superWrapperConstructor) {
+      function GeneratedWrapper(node) {
+        superWrapperConstructor.call(this, node);
+      }
+      var p = Object.create(superWrapperConstructor.prototype);
+      p.constructor = GeneratedWrapper;
+      GeneratedWrapper.prototype = p;
+      return GeneratedWrapper;
+    }
+    function isWrapper(object) {
+      return object && object.__impl4cf1e782hg__;
+    }
+    function isNative(object) {
+      return !isWrapper(object);
+    }
+    function wrap(impl) {
+      if (impl === null) return null;
+      assert(isNative(impl));
+      return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));
+    }
+    function unwrap(wrapper) {
+      if (wrapper === null) return null;
+      assert(isWrapper(wrapper));
+      return wrapper.__impl4cf1e782hg__;
+    }
+    function unsafeUnwrap(wrapper) {
+      return wrapper.__impl4cf1e782hg__;
+    }
+    function setWrapper(impl, wrapper) {
+      wrapper.__impl4cf1e782hg__ = impl;
+      impl.__wrapper8e3dd93a60__ = wrapper;
+    }
+    function unwrapIfNeeded(object) {
+      return object && isWrapper(object) ? unwrap(object) : object;
+    }
+    function wrapIfNeeded(object) {
+      return object && !isWrapper(object) ? wrap(object) : object;
+    }
+    function rewrap(node, wrapper) {
+      if (wrapper === null) return;
+      assert(isNative(node));
+      assert(wrapper === undefined || isWrapper(wrapper));
+      node.__wrapper8e3dd93a60__ = wrapper;
+    }
+    var getterDescriptor = {
+      get: undefined,
+      configurable: true,
+      enumerable: true
+    };
+    function defineGetter(constructor, name, getter) {
+      getterDescriptor.get = getter;
+      defineProperty(constructor.prototype, name, getterDescriptor);
+    }
+    function defineWrapGetter(constructor, name) {
+      defineGetter(constructor, name, function() {
+        return wrap(this.__impl4cf1e782hg__[name]);
+      });
+    }
+    function forwardMethodsToWrapper(constructors, names) {
+      constructors.forEach(function(constructor) {
+        names.forEach(function(name) {
+          constructor.prototype[name] = function() {
+            var w = wrapIfNeeded(this);
+            return w[name].apply(w, arguments);
+          };
+        });
+      });
+    }
+    scope.assert = assert;
+    scope.constructorTable = constructorTable;
+    scope.defineGetter = defineGetter;
+    scope.defineWrapGetter = defineWrapGetter;
+    scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
+    scope.isWrapper = isWrapper;
+    scope.isWrapperFor = isWrapperFor;
+    scope.mixin = mixin;
+    scope.nativePrototypeTable = nativePrototypeTable;
+    scope.oneOf = oneOf;
+    scope.registerObject = registerObject;
+    scope.registerWrapper = register;
+    scope.rewrap = rewrap;
+    scope.setWrapper = setWrapper;
+    scope.unsafeUnwrap = unsafeUnwrap;
+    scope.unwrap = unwrap;
+    scope.unwrapIfNeeded = unwrapIfNeeded;
+    scope.wrap = wrap;
+    scope.wrapIfNeeded = wrapIfNeeded;
+    scope.wrappers = wrappers;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    function newSplice(index, removed, addedCount) {
+      return {
+        index: index,
+        removed: removed,
+        addedCount: addedCount
+      };
+    }
+    var EDIT_LEAVE = 0;
+    var EDIT_UPDATE = 1;
+    var EDIT_ADD = 2;
+    var EDIT_DELETE = 3;
+    function ArraySplice() {}
+    ArraySplice.prototype = {
+      calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+        var rowCount = oldEnd - oldStart + 1;
+        var columnCount = currentEnd - currentStart + 1;
+        var distances = new Array(rowCount);
+        for (var i = 0; i < rowCount; i++) {
+          distances[i] = new Array(columnCount);
+          distances[i][0] = i;
+        }
+        for (var j = 0; j < columnCount; j++) distances[0][j] = j;
+        for (var i = 1; i < rowCount; i++) {
+          for (var j = 1; j < columnCount; j++) {
+            if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else {
+              var north = distances[i - 1][j] + 1;
+              var west = distances[i][j - 1] + 1;
+              distances[i][j] = north < west ? north : west;
+            }
+          }
+        }
+        return distances;
+      },
+      spliceOperationsFromEditDistances: function(distances) {
+        var i = distances.length - 1;
+        var j = distances[0].length - 1;
+        var current = distances[i][j];
+        var edits = [];
+        while (i > 0 || j > 0) {
+          if (i == 0) {
+            edits.push(EDIT_ADD);
+            j--;
+            continue;
+          }
+          if (j == 0) {
+            edits.push(EDIT_DELETE);
+            i--;
+            continue;
+          }
+          var northWest = distances[i - 1][j - 1];
+          var west = distances[i - 1][j];
+          var north = distances[i][j - 1];
+          var min;
+          if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;
+          if (min == northWest) {
+            if (northWest == current) {
+              edits.push(EDIT_LEAVE);
+            } else {
+              edits.push(EDIT_UPDATE);
+              current = northWest;
+            }
+            i--;
+            j--;
+          } else if (min == west) {
+            edits.push(EDIT_DELETE);
+            i--;
+            current = west;
+          } else {
+            edits.push(EDIT_ADD);
+            j--;
+            current = north;
+          }
+        }
+        edits.reverse();
+        return edits;
+      },
+      calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+        var prefixCount = 0;
+        var suffixCount = 0;
+        var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+        if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);
+        if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+        currentStart += prefixCount;
+        oldStart += prefixCount;
+        currentEnd -= suffixCount;
+        oldEnd -= suffixCount;
+        if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];
+        if (currentStart == currentEnd) {
+          var splice = newSplice(currentStart, [], 0);
+          while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);
+          return [ splice ];
+        } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+        var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+        var splice = undefined;
+        var splices = [];
+        var index = currentStart;
+        var oldIndex = oldStart;
+        for (var i = 0; i < ops.length; i++) {
+          switch (ops[i]) {
+           case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+            index++;
+            oldIndex++;
+            break;
+
+           case EDIT_UPDATE:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.addedCount++;
+            index++;
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+
+           case EDIT_ADD:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.addedCount++;
+            index++;
+            break;
+
+           case EDIT_DELETE:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          }
+        }
+        if (splice) {
+          splices.push(splice);
+        }
+        return splices;
+      },
+      sharedPrefix: function(current, old, searchLength) {
+        for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;
+        return searchLength;
+      },
+      sharedSuffix: function(current, old, searchLength) {
+        var index1 = current.length;
+        var index2 = old.length;
+        var count = 0;
+        while (count < searchLength && this.equals(current[--index1], old[--index2])) count++;
+        return count;
+      },
+      calculateSplices: function(current, previous) {
+        return this.calcSplices(current, 0, current.length, previous, 0, previous.length);
+      },
+      equals: function(currentValue, previousValue) {
+        return currentValue === previousValue;
+      }
+    };
+    scope.ArraySplice = ArraySplice;
+  })(window.ShadowDOMPolyfill);
+  (function(context) {
+    "use strict";
+    var OriginalMutationObserver = window.MutationObserver;
+    var callbacks = [];
+    var pending = false;
+    var timerFunc;
+    function handle() {
+      pending = false;
+      var copies = callbacks.slice(0);
+      callbacks = [];
+      for (var i = 0; i < copies.length; i++) {
+        (0, copies[i])();
+      }
+    }
+    if (OriginalMutationObserver) {
+      var counter = 1;
+      var observer = new OriginalMutationObserver(handle);
+      var textNode = document.createTextNode(counter);
+      observer.observe(textNode, {
+        characterData: true
+      });
+      timerFunc = function() {
+        counter = (counter + 1) % 2;
+        textNode.data = counter;
+      };
+    } else {
+      timerFunc = window.setTimeout;
+    }
+    function setEndOfMicrotask(func) {
+      callbacks.push(func);
+      if (pending) return;
+      pending = true;
+      timerFunc(handle, 0);
+    }
+    context.setEndOfMicrotask = setEndOfMicrotask;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var setEndOfMicrotask = scope.setEndOfMicrotask;
+    var wrapIfNeeded = scope.wrapIfNeeded;
+    var wrappers = scope.wrappers;
+    var registrationsTable = new WeakMap();
+    var globalMutationObservers = [];
+    var isScheduled = false;
+    function scheduleCallback(observer) {
+      if (observer.scheduled_) return;
+      observer.scheduled_ = true;
+      globalMutationObservers.push(observer);
+      if (isScheduled) return;
+      setEndOfMicrotask(notifyObservers);
+      isScheduled = true;
+    }
+    function notifyObservers() {
+      isScheduled = false;
+      while (globalMutationObservers.length) {
+        var notifyList = globalMutationObservers;
+        globalMutationObservers = [];
+        notifyList.sort(function(x, y) {
+          return x.uid_ - y.uid_;
+        });
+        for (var i = 0; i < notifyList.length; i++) {
+          var mo = notifyList[i];
+          mo.scheduled_ = false;
+          var queue = mo.takeRecords();
+          removeTransientObserversFor(mo);
+          if (queue.length) {
+            mo.callback_(queue, mo);
+          }
+        }
+      }
+    }
+    function MutationRecord(type, target) {
+      this.type = type;
+      this.target = target;
+      this.addedNodes = new wrappers.NodeList();
+      this.removedNodes = new wrappers.NodeList();
+      this.previousSibling = null;
+      this.nextSibling = null;
+      this.attributeName = null;
+      this.attributeNamespace = null;
+      this.oldValue = null;
+    }
+    function registerTransientObservers(ancestor, node) {
+      for (;ancestor; ancestor = ancestor.parentNode) {
+        var registrations = registrationsTable.get(ancestor);
+        if (!registrations) continue;
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.options.subtree) registration.addTransientObserver(node);
+        }
+      }
+    }
+    function removeTransientObserversFor(observer) {
+      for (var i = 0; i < observer.nodes_.length; i++) {
+        var node = observer.nodes_[i];
+        var registrations = registrationsTable.get(node);
+        if (!registrations) return;
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          if (registration.observer === observer) registration.removeTransientObservers();
+        }
+      }
+    }
+    function enqueueMutation(target, type, data) {
+      var interestedObservers = Object.create(null);
+      var associatedStrings = Object.create(null);
+      for (var node = target; node; node = node.parentNode) {
+        var registrations = registrationsTable.get(node);
+        if (!registrations) continue;
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          var options = registration.options;
+          if (node !== target && !options.subtree) continue;
+          if (type === "attributes" && !options.attributes) continue;
+          if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {
+            continue;
+          }
+          if (type === "characterData" && !options.characterData) continue;
+          if (type === "childList" && !options.childList) continue;
+          var observer = registration.observer;
+          interestedObservers[observer.uid_] = observer;
+          if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) {
+            associatedStrings[observer.uid_] = data.oldValue;
+          }
+        }
+      }
+      for (var uid in interestedObservers) {
+        var observer = interestedObservers[uid];
+        var record = new MutationRecord(type, target);
+        if ("name" in data && "namespace" in data) {
+          record.attributeName = data.name;
+          record.attributeNamespace = data.namespace;
+        }
+        if (data.addedNodes) record.addedNodes = data.addedNodes;
+        if (data.removedNodes) record.removedNodes = data.removedNodes;
+        if (data.previousSibling) record.previousSibling = data.previousSibling;
+        if (data.nextSibling) record.nextSibling = data.nextSibling;
+        if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];
+        scheduleCallback(observer);
+        observer.records_.push(record);
+      }
+    }
+    var slice = Array.prototype.slice;
+    function MutationObserverOptions(options) {
+      this.childList = !!options.childList;
+      this.subtree = !!options.subtree;
+      if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) {
+        this.attributes = true;
+      } else {
+        this.attributes = !!options.attributes;
+      }
+      if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData;
+      if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) {
+        throw new TypeError();
+      }
+      this.characterData = !!options.characterData;
+      this.attributeOldValue = !!options.attributeOldValue;
+      this.characterDataOldValue = !!options.characterDataOldValue;
+      if ("attributeFilter" in options) {
+        if (options.attributeFilter == null || typeof options.attributeFilter !== "object") {
+          throw new TypeError();
+        }
+        this.attributeFilter = slice.call(options.attributeFilter);
+      } else {
+        this.attributeFilter = null;
+      }
+    }
+    var uidCounter = 0;
+    function MutationObserver(callback) {
+      this.callback_ = callback;
+      this.nodes_ = [];
+      this.records_ = [];
+      this.uid_ = ++uidCounter;
+      this.scheduled_ = false;
+    }
+    MutationObserver.prototype = {
+      constructor: MutationObserver,
+      observe: function(target, options) {
+        target = wrapIfNeeded(target);
+        var newOptions = new MutationObserverOptions(options);
+        var registration;
+        var registrations = registrationsTable.get(target);
+        if (!registrations) registrationsTable.set(target, registrations = []);
+        for (var i = 0; i < registrations.length; i++) {
+          if (registrations[i].observer === this) {
+            registration = registrations[i];
+            registration.removeTransientObservers();
+            registration.options = newOptions;
+          }
+        }
+        if (!registration) {
+          registration = new Registration(this, target, newOptions);
+          registrations.push(registration);
+          this.nodes_.push(target);
+        }
+      },
+      disconnect: function() {
+        this.nodes_.forEach(function(node) {
+          var registrations = registrationsTable.get(node);
+          for (var i = 0; i < registrations.length; i++) {
+            var registration = registrations[i];
+            if (registration.observer === this) {
+              registrations.splice(i, 1);
+              break;
+            }
+          }
+        }, this);
+        this.records_ = [];
+      },
+      takeRecords: function() {
+        var copyOfRecords = this.records_;
+        this.records_ = [];
+        return copyOfRecords;
+      }
+    };
+    function Registration(observer, target, options) {
+      this.observer = observer;
+      this.target = target;
+      this.options = options;
+      this.transientObservedNodes = [];
+    }
+    Registration.prototype = {
+      addTransientObserver: function(node) {
+        if (node === this.target) return;
+        scheduleCallback(this.observer);
+        this.transientObservedNodes.push(node);
+        var registrations = registrationsTable.get(node);
+        if (!registrations) registrationsTable.set(node, registrations = []);
+        registrations.push(this);
+      },
+      removeTransientObservers: function() {
+        var transientObservedNodes = this.transientObservedNodes;
+        this.transientObservedNodes = [];
+        for (var i = 0; i < transientObservedNodes.length; i++) {
+          var node = transientObservedNodes[i];
+          var registrations = registrationsTable.get(node);
+          for (var j = 0; j < registrations.length; j++) {
+            if (registrations[j] === this) {
+              registrations.splice(j, 1);
+              break;
+            }
+          }
+        }
+      }
+    };
+    scope.enqueueMutation = enqueueMutation;
+    scope.registerTransientObservers = registerTransientObservers;
+    scope.wrappers.MutationObserver = MutationObserver;
+    scope.wrappers.MutationRecord = MutationRecord;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    function TreeScope(root, parent) {
+      this.root = root;
+      this.parent = parent;
+    }
+    TreeScope.prototype = {
+      get renderer() {
+        if (this.root instanceof scope.wrappers.ShadowRoot) {
+          return scope.getRendererForHost(this.root.host);
+        }
+        return null;
+      },
+      contains: function(treeScope) {
+        for (;treeScope; treeScope = treeScope.parent) {
+          if (treeScope === this) return true;
+        }
+        return false;
+      }
+    };
+    function setTreeScope(node, treeScope) {
+      if (node.treeScope_ !== treeScope) {
+        node.treeScope_ = treeScope;
+        for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
+          sr.treeScope_.parent = treeScope;
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          setTreeScope(child, treeScope);
+        }
+      }
+    }
+    function getTreeScope(node) {
+      if (node instanceof scope.wrappers.Window) {
+        debugger;
+      }
+      if (node.treeScope_) return node.treeScope_;
+      var parent = node.parentNode;
+      var treeScope;
+      if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);
+      return node.treeScope_ = treeScope;
+    }
+    scope.TreeScope = TreeScope;
+    scope.getTreeScope = getTreeScope;
+    scope.setTreeScope = setTreeScope;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrappers = scope.wrappers;
+    var wrappedFuns = new WeakMap();
+    var listenersTable = new WeakMap();
+    var handledEventsTable = new WeakMap();
+    var currentlyDispatchingEvents = new WeakMap();
+    var targetTable = new WeakMap();
+    var currentTargetTable = new WeakMap();
+    var relatedTargetTable = new WeakMap();
+    var eventPhaseTable = new WeakMap();
+    var stopPropagationTable = new WeakMap();
+    var stopImmediatePropagationTable = new WeakMap();
+    var eventHandlersTable = new WeakMap();
+    var eventPathTable = new WeakMap();
+    function isShadowRoot(node) {
+      return node instanceof wrappers.ShadowRoot;
+    }
+    function rootOfNode(node) {
+      return getTreeScope(node).root;
+    }
+    function getEventPath(node, event) {
+      var path = [];
+      var current = node;
+      path.push(current);
+      while (current) {
+        var destinationInsertionPoints = getDestinationInsertionPoints(current);
+        if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
+          for (var i = 0; i < destinationInsertionPoints.length; i++) {
+            var insertionPoint = destinationInsertionPoints[i];
+            if (isShadowInsertionPoint(insertionPoint)) {
+              var shadowRoot = rootOfNode(insertionPoint);
+              var olderShadowRoot = shadowRoot.olderShadowRoot;
+              if (olderShadowRoot) path.push(olderShadowRoot);
+            }
+            path.push(insertionPoint);
+          }
+          current = destinationInsertionPoints[destinationInsertionPoints.length - 1];
+        } else {
+          if (isShadowRoot(current)) {
+            if (inSameTree(node, current) && eventMustBeStopped(event)) {
+              break;
+            }
+            current = current.host;
+            path.push(current);
+          } else {
+            current = current.parentNode;
+            if (current) path.push(current);
+          }
+        }
+      }
+      return path;
+    }
+    function eventMustBeStopped(event) {
+      if (!event) return false;
+      switch (event.type) {
+       case "abort":
+       case "error":
+       case "select":
+       case "change":
+       case "load":
+       case "reset":
+       case "resize":
+       case "scroll":
+       case "selectstart":
+        return true;
+      }
+      return false;
+    }
+    function isShadowInsertionPoint(node) {
+      return node instanceof HTMLShadowElement;
+    }
+    function getDestinationInsertionPoints(node) {
+      return scope.getDestinationInsertionPoints(node);
+    }
+    function eventRetargetting(path, currentTarget) {
+      if (path.length === 0) return currentTarget;
+      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
+      var currentTargetTree = getTreeScope(currentTarget);
+      var originalTarget = path[0];
+      var originalTargetTree = getTreeScope(originalTarget);
+      var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
+      for (var i = 0; i < path.length; i++) {
+        var node = path[i];
+        if (getTreeScope(node) === relativeTargetTree) return node;
+      }
+      return path[path.length - 1];
+    }
+    function getTreeScopeAncestors(treeScope) {
+      var ancestors = [];
+      for (;treeScope; treeScope = treeScope.parent) {
+        ancestors.push(treeScope);
+      }
+      return ancestors;
+    }
+    function lowestCommonInclusiveAncestor(tsA, tsB) {
+      var ancestorsA = getTreeScopeAncestors(tsA);
+      var ancestorsB = getTreeScopeAncestors(tsB);
+      var result = null;
+      while (ancestorsA.length > 0 && ancestorsB.length > 0) {
+        var a = ancestorsA.pop();
+        var b = ancestorsB.pop();
+        if (a === b) result = a; else break;
+      }
+      return result;
+    }
+    function getTreeScopeRoot(ts) {
+      if (!ts.parent) return ts;
+      return getTreeScopeRoot(ts.parent);
+    }
+    function relatedTargetResolution(event, currentTarget, relatedTarget) {
+      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
+      var currentTargetTree = getTreeScope(currentTarget);
+      var relatedTargetTree = getTreeScope(relatedTarget);
+      var relatedTargetEventPath = getEventPath(relatedTarget, event);
+      var lowestCommonAncestorTree;
+      var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
+      if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;
+      for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {
+        var adjustedRelatedTarget;
+        for (var i = 0; i < relatedTargetEventPath.length; i++) {
+          var node = relatedTargetEventPath[i];
+          if (getTreeScope(node) === commonAncestorTree) return node;
+        }
+      }
+      return null;
+    }
+    function inSameTree(a, b) {
+      return getTreeScope(a) === getTreeScope(b);
+    }
+    var NONE = 0;
+    var CAPTURING_PHASE = 1;
+    var AT_TARGET = 2;
+    var BUBBLING_PHASE = 3;
+    var pendingError;
+    function dispatchOriginalEvent(originalEvent) {
+      if (handledEventsTable.get(originalEvent)) return;
+      handledEventsTable.set(originalEvent, true);
+      dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
+      if (pendingError) {
+        var err = pendingError;
+        pendingError = null;
+        throw err;
+      }
+    }
+    function isLoadLikeEvent(event) {
+      switch (event.type) {
+       case "load":
+       case "beforeunload":
+       case "unload":
+        return true;
+      }
+      return false;
+    }
+    function dispatchEvent(event, originalWrapperTarget) {
+      if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError");
+      currentlyDispatchingEvents.set(event, true);
+      scope.renderAllPending();
+      var eventPath;
+      var overrideTarget;
+      var win;
+      if (isLoadLikeEvent(event) && !event.bubbles) {
+        var doc = originalWrapperTarget;
+        if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
+          overrideTarget = doc;
+          eventPath = [];
+        }
+      }
+      if (!eventPath) {
+        if (originalWrapperTarget instanceof wrappers.Window) {
+          win = originalWrapperTarget;
+          eventPath = [];
+        } else {
+          eventPath = getEventPath(originalWrapperTarget, event);
+          if (!isLoadLikeEvent(event)) {
+            var doc = eventPath[eventPath.length - 1];
+            if (doc instanceof wrappers.Document) win = doc.defaultView;
+          }
+        }
+      }
+      eventPathTable.set(event, eventPath);
+      if (dispatchCapturing(event, eventPath, win, overrideTarget)) {
+        if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
+          dispatchBubbling(event, eventPath, win, overrideTarget);
+        }
+      }
+      eventPhaseTable.set(event, NONE);
+      currentTargetTable.delete(event, null);
+      currentlyDispatchingEvents.delete(event);
+      return event.defaultPrevented;
+    }
+    function dispatchCapturing(event, eventPath, win, overrideTarget) {
+      var phase = CAPTURING_PHASE;
+      if (win) {
+        if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;
+      }
+      for (var i = eventPath.length - 1; i > 0; i--) {
+        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;
+      }
+      return true;
+    }
+    function dispatchAtTarget(event, eventPath, win, overrideTarget) {
+      var phase = AT_TARGET;
+      var currentTarget = eventPath[0] || win;
+      return invoke(currentTarget, event, phase, eventPath, overrideTarget);
+    }
+    function dispatchBubbling(event, eventPath, win, overrideTarget) {
+      var phase = BUBBLING_PHASE;
+      for (var i = 1; i < eventPath.length; i++) {
+        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return;
+      }
+      if (win && eventPath.length > 0) {
+        invoke(win, event, phase, eventPath, overrideTarget);
+      }
+    }
+    function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
+      var listeners = listenersTable.get(currentTarget);
+      if (!listeners) return true;
+      var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
+      if (target === currentTarget) {
+        if (phase === CAPTURING_PHASE) return true;
+        if (phase === BUBBLING_PHASE) phase = AT_TARGET;
+      } else if (phase === BUBBLING_PHASE && !event.bubbles) {
+        return true;
+      }
+      if ("relatedTarget" in event) {
+        var originalEvent = unwrap(event);
+        var unwrappedRelatedTarget = originalEvent.relatedTarget;
+        if (unwrappedRelatedTarget) {
+          if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {
+            var relatedTarget = wrap(unwrappedRelatedTarget);
+            var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);
+            if (adjusted === target) return true;
+          } else {
+            adjusted = null;
+          }
+          relatedTargetTable.set(event, adjusted);
+        }
+      }
+      eventPhaseTable.set(event, phase);
+      var type = event.type;
+      var anyRemoved = false;
+      targetTable.set(event, target);
+      currentTargetTable.set(event, currentTarget);
+      listeners.depth++;
+      for (var i = 0, len = listeners.length; i < len; i++) {
+        var listener = listeners[i];
+        if (listener.removed) {
+          anyRemoved = true;
+          continue;
+        }
+        if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {
+          continue;
+        }
+        try {
+          if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);
+          if (stopImmediatePropagationTable.get(event)) return false;
+        } catch (ex) {
+          if (!pendingError) pendingError = ex;
+        }
+      }
+      listeners.depth--;
+      if (anyRemoved && listeners.depth === 0) {
+        var copy = listeners.slice();
+        listeners.length = 0;
+        for (var i = 0; i < copy.length; i++) {
+          if (!copy[i].removed) listeners.push(copy[i]);
+        }
+      }
+      return !stopPropagationTable.get(event);
+    }
+    function Listener(type, handler, capture) {
+      this.type = type;
+      this.handler = handler;
+      this.capture = Boolean(capture);
+    }
+    Listener.prototype = {
+      equals: function(that) {
+        return this.handler === that.handler && this.type === that.type && this.capture === that.capture;
+      },
+      get removed() {
+        return this.handler === null;
+      },
+      remove: function() {
+        this.handler = null;
+      }
+    };
+    var OriginalEvent = window.Event;
+    OriginalEvent.prototype.polymerBlackList_ = {
+      returnValue: true,
+      keyLocation: true
+    };
+    function Event(type, options) {
+      if (type instanceof OriginalEvent) {
+        var impl = type;
+        if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) {
+          return new BeforeUnloadEvent(impl);
+        }
+        setWrapper(impl, this);
+      } else {
+        return wrap(constructEvent(OriginalEvent, "Event", type, options));
+      }
+    }
+    Event.prototype = {
+      get target() {
+        return targetTable.get(this);
+      },
+      get currentTarget() {
+        return currentTargetTable.get(this);
+      },
+      get eventPhase() {
+        return eventPhaseTable.get(this);
+      },
+      get path() {
+        var eventPath = eventPathTable.get(this);
+        if (!eventPath) return [];
+        return eventPath.slice();
+      },
+      stopPropagation: function() {
+        stopPropagationTable.set(this, true);
+      },
+      stopImmediatePropagation: function() {
+        stopPropagationTable.set(this, true);
+        stopImmediatePropagationTable.set(this, true);
+      }
+    };
+    registerWrapper(OriginalEvent, Event, document.createEvent("Event"));
+    function unwrapOptions(options) {
+      if (!options || !options.relatedTarget) return options;
+      return Object.create(options, {
+        relatedTarget: {
+          value: unwrap(options.relatedTarget)
+        }
+      });
+    }
+    function registerGenericEvent(name, SuperEvent, prototype) {
+      var OriginalEvent = window[name];
+      var GenericEvent = function(type, options) {
+        if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));
+      };
+      GenericEvent.prototype = Object.create(SuperEvent.prototype);
+      if (prototype) mixin(GenericEvent.prototype, prototype);
+      if (OriginalEvent) {
+        try {
+          registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp"));
+        } catch (ex) {
+          registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));
+        }
+      }
+      return GenericEvent;
+    }
+    var UIEvent = registerGenericEvent("UIEvent", Event);
+    var CustomEvent = registerGenericEvent("CustomEvent", Event);
+    var relatedTargetProto = {
+      get relatedTarget() {
+        var relatedTarget = relatedTargetTable.get(this);
+        if (relatedTarget !== undefined) return relatedTarget;
+        return wrap(unwrap(this).relatedTarget);
+      }
+    };
+    function getInitFunction(name, relatedTargetIndex) {
+      return function() {
+        arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
+        var impl = unwrap(this);
+        impl[name].apply(impl, arguments);
+      };
+    }
+    var mouseEventProto = mixin({
+      initMouseEvent: getInitFunction("initMouseEvent", 14)
+    }, relatedTargetProto);
+    var focusEventProto = mixin({
+      initFocusEvent: getInitFunction("initFocusEvent", 5)
+    }, relatedTargetProto);
+    var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto);
+    var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto);
+    var defaultInitDicts = Object.create(null);
+    var supportsEventConstructors = function() {
+      try {
+        new window.FocusEvent("focus");
+      } catch (ex) {
+        return false;
+      }
+      return true;
+    }();
+    function constructEvent(OriginalEvent, name, type, options) {
+      if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));
+      var event = unwrap(document.createEvent(name));
+      var defaultDict = defaultInitDicts[name];
+      var args = [ type ];
+      Object.keys(defaultDict).forEach(function(key) {
+        var v = options != null && key in options ? options[key] : defaultDict[key];
+        if (key === "relatedTarget") v = unwrap(v);
+        args.push(v);
+      });
+      event["init" + name].apply(event, args);
+      return event;
+    }
+    if (!supportsEventConstructors) {
+      var configureEventConstructor = function(name, initDict, superName) {
+        if (superName) {
+          var superDict = defaultInitDicts[superName];
+          initDict = mixin(mixin({}, superDict), initDict);
+        }
+        defaultInitDicts[name] = initDict;
+      };
+      configureEventConstructor("Event", {
+        bubbles: false,
+        cancelable: false
+      });
+      configureEventConstructor("CustomEvent", {
+        detail: null
+      }, "Event");
+      configureEventConstructor("UIEvent", {
+        view: null,
+        detail: 0
+      }, "Event");
+      configureEventConstructor("MouseEvent", {
+        screenX: 0,
+        screenY: 0,
+        clientX: 0,
+        clientY: 0,
+        ctrlKey: false,
+        altKey: false,
+        shiftKey: false,
+        metaKey: false,
+        button: 0,
+        relatedTarget: null
+      }, "UIEvent");
+      configureEventConstructor("FocusEvent", {
+        relatedTarget: null
+      }, "UIEvent");
+    }
+    var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
+    function BeforeUnloadEvent(impl) {
+      Event.call(this, impl);
+    }
+    BeforeUnloadEvent.prototype = Object.create(Event.prototype);
+    mixin(BeforeUnloadEvent.prototype, {
+      get returnValue() {
+        return unsafeUnwrap(this).returnValue;
+      },
+      set returnValue(v) {
+        unsafeUnwrap(this).returnValue = v;
+      }
+    });
+    if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
+    function isValidListener(fun) {
+      if (typeof fun === "function") return true;
+      return fun && fun.handleEvent;
+    }
+    function isMutationEvent(type) {
+      switch (type) {
+       case "DOMAttrModified":
+       case "DOMAttributeNameChanged":
+       case "DOMCharacterDataModified":
+       case "DOMElementNameChanged":
+       case "DOMNodeInserted":
+       case "DOMNodeInsertedIntoDocument":
+       case "DOMNodeRemoved":
+       case "DOMNodeRemovedFromDocument":
+       case "DOMSubtreeModified":
+        return true;
+      }
+      return false;
+    }
+    var OriginalEventTarget = window.EventTarget;
+    function EventTarget(impl) {
+      setWrapper(impl, this);
+    }
+    var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ];
+    [ Node, Window ].forEach(function(constructor) {
+      var p = constructor.prototype;
+      methodNames.forEach(function(name) {
+        Object.defineProperty(p, name + "_", {
+          value: p[name]
+        });
+      });
+    });
+    function getTargetToListenAt(wrapper) {
+      if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;
+      return unwrap(wrapper);
+    }
+    EventTarget.prototype = {
+      addEventListener: function(type, fun, capture) {
+        if (!isValidListener(fun) || isMutationEvent(type)) return;
+        var listener = new Listener(type, fun, capture);
+        var listeners = listenersTable.get(this);
+        if (!listeners) {
+          listeners = [];
+          listeners.depth = 0;
+          listenersTable.set(this, listeners);
+        } else {
+          for (var i = 0; i < listeners.length; i++) {
+            if (listener.equals(listeners[i])) return;
+          }
+        }
+        listeners.push(listener);
+        var target = getTargetToListenAt(this);
+        target.addEventListener_(type, dispatchOriginalEvent, true);
+      },
+      removeEventListener: function(type, fun, capture) {
+        capture = Boolean(capture);
+        var listeners = listenersTable.get(this);
+        if (!listeners) return;
+        var count = 0, found = false;
+        for (var i = 0; i < listeners.length; i++) {
+          if (listeners[i].type === type && listeners[i].capture === capture) {
+            count++;
+            if (listeners[i].handler === fun) {
+              found = true;
+              listeners[i].remove();
+            }
+          }
+        }
+        if (found && count === 1) {
+          var target = getTargetToListenAt(this);
+          target.removeEventListener_(type, dispatchOriginalEvent, true);
+        }
+      },
+      dispatchEvent: function(event) {
+        var nativeEvent = unwrap(event);
+        var eventType = nativeEvent.type;
+        handledEventsTable.set(nativeEvent, false);
+        scope.renderAllPending();
+        var tempListener;
+        if (!hasListenerInAncestors(this, eventType)) {
+          tempListener = function() {};
+          this.addEventListener(eventType, tempListener, true);
+        }
+        try {
+          return unwrap(this).dispatchEvent_(nativeEvent);
+        } finally {
+          if (tempListener) this.removeEventListener(eventType, tempListener, true);
+        }
+      }
+    };
+    function hasListener(node, type) {
+      var listeners = listenersTable.get(node);
+      if (listeners) {
+        for (var i = 0; i < listeners.length; i++) {
+          if (!listeners[i].removed && listeners[i].type === type) return true;
+        }
+      }
+      return false;
+    }
+    function hasListenerInAncestors(target, type) {
+      for (var node = unwrap(target); node; node = node.parentNode) {
+        if (hasListener(wrap(node), type)) return true;
+      }
+      return false;
+    }
+    if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);
+    function wrapEventTargetMethods(constructors) {
+      forwardMethodsToWrapper(constructors, methodNames);
+    }
+    var originalElementFromPoint = document.elementFromPoint;
+    function elementFromPoint(self, document, x, y) {
+      scope.renderAllPending();
+      var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
+      if (!element) return null;
+      var path = getEventPath(element, null);
+      var idx = path.lastIndexOf(self);
+      if (idx == -1) return null; else path = path.slice(0, idx);
+      return eventRetargetting(path, self);
+    }
+    function getEventHandlerGetter(name) {
+      return function() {
+        var inlineEventHandlers = eventHandlersTable.get(this);
+        return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;
+      };
+    }
+    function getEventHandlerSetter(name) {
+      var eventType = name.slice(2);
+      return function(value) {
+        var inlineEventHandlers = eventHandlersTable.get(this);
+        if (!inlineEventHandlers) {
+          inlineEventHandlers = Object.create(null);
+          eventHandlersTable.set(this, inlineEventHandlers);
+        }
+        var old = inlineEventHandlers[name];
+        if (old) this.removeEventListener(eventType, old.wrapped, false);
+        if (typeof value === "function") {
+          var wrapped = function(e) {
+            var rv = value.call(this, e);
+            if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv;
+          };
+          this.addEventListener(eventType, wrapped, false);
+          inlineEventHandlers[name] = {
+            value: value,
+            wrapped: wrapped
+          };
+        }
+      };
+    }
+    scope.elementFromPoint = elementFromPoint;
+    scope.getEventHandlerGetter = getEventHandlerGetter;
+    scope.getEventHandlerSetter = getEventHandlerSetter;
+    scope.wrapEventTargetMethods = wrapEventTargetMethods;
+    scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
+    scope.wrappers.CustomEvent = CustomEvent;
+    scope.wrappers.Event = Event;
+    scope.wrappers.EventTarget = EventTarget;
+    scope.wrappers.FocusEvent = FocusEvent;
+    scope.wrappers.MouseEvent = MouseEvent;
+    scope.wrappers.UIEvent = UIEvent;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var UIEvent = scope.wrappers.UIEvent;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalTouchEvent = window.TouchEvent;
+    if (!OriginalTouchEvent) return;
+    var nativeEvent;
+    try {
+      nativeEvent = document.createEvent("TouchEvent");
+    } catch (ex) {
+      return;
+    }
+    var nonEnumDescriptor = {
+      enumerable: false
+    };
+    function nonEnum(obj, prop) {
+      Object.defineProperty(obj, prop, nonEnumDescriptor);
+    }
+    function Touch(impl) {
+      setWrapper(impl, this);
+    }
+    Touch.prototype = {
+      get target() {
+        return wrap(unsafeUnwrap(this).target);
+      }
+    };
+    var descr = {
+      configurable: true,
+      enumerable: true,
+      get: null
+    };
+    [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) {
+      descr.get = function() {
+        return unsafeUnwrap(this)[name];
+      };
+      Object.defineProperty(Touch.prototype, name, descr);
+    });
+    function TouchList() {
+      this.length = 0;
+      nonEnum(this, "length");
+    }
+    TouchList.prototype = {
+      item: function(index) {
+        return this[index];
+      }
+    };
+    function wrapTouchList(nativeTouchList) {
+      var list = new TouchList();
+      for (var i = 0; i < nativeTouchList.length; i++) {
+        list[i] = new Touch(nativeTouchList[i]);
+      }
+      list.length = i;
+      return list;
+    }
+    function TouchEvent(impl) {
+      UIEvent.call(this, impl);
+    }
+    TouchEvent.prototype = Object.create(UIEvent.prototype);
+    mixin(TouchEvent.prototype, {
+      get touches() {
+        return wrapTouchList(unsafeUnwrap(this).touches);
+      },
+      get targetTouches() {
+        return wrapTouchList(unsafeUnwrap(this).targetTouches);
+      },
+      get changedTouches() {
+        return wrapTouchList(unsafeUnwrap(this).changedTouches);
+      },
+      initTouchEvent: function() {
+        throw new Error("Not implemented");
+      }
+    });
+    registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
+    scope.wrappers.Touch = Touch;
+    scope.wrappers.TouchEvent = TouchEvent;
+    scope.wrappers.TouchList = TouchList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var nonEnumDescriptor = {
+      enumerable: false
+    };
+    function nonEnum(obj, prop) {
+      Object.defineProperty(obj, prop, nonEnumDescriptor);
+    }
+    function NodeList() {
+      this.length = 0;
+      nonEnum(this, "length");
+    }
+    NodeList.prototype = {
+      item: function(index) {
+        return this[index];
+      }
+    };
+    nonEnum(NodeList.prototype, "item");
+    function wrapNodeList(list) {
+      if (list == null) return list;
+      var wrapperList = new NodeList();
+      for (var i = 0, length = list.length; i < length; i++) {
+        wrapperList[i] = wrap(list[i]);
+      }
+      wrapperList.length = length;
+      return wrapperList;
+    }
+    function addWrapNodeListMethod(wrapperConstructor, name) {
+      wrapperConstructor.prototype[name] = function() {
+        return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    scope.wrappers.NodeList = NodeList;
+    scope.addWrapNodeListMethod = addWrapNodeListMethod;
+    scope.wrapNodeList = wrapNodeList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    scope.wrapHTMLCollection = scope.wrapNodeList;
+    scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var NodeList = scope.wrappers.NodeList;
+    var TreeScope = scope.TreeScope;
+    var assert = scope.assert;
+    var defineWrapGetter = scope.defineWrapGetter;
+    var enqueueMutation = scope.enqueueMutation;
+    var getTreeScope = scope.getTreeScope;
+    var isWrapper = scope.isWrapper;
+    var mixin = scope.mixin;
+    var registerTransientObservers = scope.registerTransientObservers;
+    var registerWrapper = scope.registerWrapper;
+    var setTreeScope = scope.setTreeScope;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var wrapIfNeeded = scope.wrapIfNeeded;
+    var wrappers = scope.wrappers;
+    function assertIsNodeWrapper(node) {
+      assert(node instanceof Node);
+    }
+    function createOneElementNodeList(node) {
+      var nodes = new NodeList();
+      nodes[0] = node;
+      nodes.length = 1;
+      return nodes;
+    }
+    var surpressMutations = false;
+    function enqueueRemovalForInsertedNodes(node, parent, nodes) {
+      enqueueMutation(parent, "childList", {
+        removedNodes: nodes,
+        previousSibling: node.previousSibling,
+        nextSibling: node.nextSibling
+      });
+    }
+    function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
+      enqueueMutation(df, "childList", {
+        removedNodes: nodes
+      });
+    }
+    function collectNodes(node, parentNode, previousNode, nextNode) {
+      if (node instanceof DocumentFragment) {
+        var nodes = collectNodesForDocumentFragment(node);
+        surpressMutations = true;
+        for (var i = nodes.length - 1; i >= 0; i--) {
+          node.removeChild(nodes[i]);
+          nodes[i].parentNode_ = parentNode;
+        }
+        surpressMutations = false;
+        for (var i = 0; i < nodes.length; i++) {
+          nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
+          nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
+        }
+        if (previousNode) previousNode.nextSibling_ = nodes[0];
+        if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];
+        return nodes;
+      }
+      var nodes = createOneElementNodeList(node);
+      var oldParent = node.parentNode;
+      if (oldParent) {
+        oldParent.removeChild(node);
+      }
+      node.parentNode_ = parentNode;
+      node.previousSibling_ = previousNode;
+      node.nextSibling_ = nextNode;
+      if (previousNode) previousNode.nextSibling_ = node;
+      if (nextNode) nextNode.previousSibling_ = node;
+      return nodes;
+    }
+    function collectNodesNative(node) {
+      if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);
+      var nodes = createOneElementNodeList(node);
+      var oldParent = node.parentNode;
+      if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);
+      return nodes;
+    }
+    function collectNodesForDocumentFragment(node) {
+      var nodes = new NodeList();
+      var i = 0;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        nodes[i++] = child;
+      }
+      nodes.length = i;
+      enqueueRemovalForInsertedDocumentFragment(node, nodes);
+      return nodes;
+    }
+    function snapshotNodeList(nodeList) {
+      return nodeList;
+    }
+    function nodeWasAdded(node, treeScope) {
+      setTreeScope(node, treeScope);
+      node.nodeIsInserted_();
+    }
+    function nodesWereAdded(nodes, parent) {
+      var treeScope = getTreeScope(parent);
+      for (var i = 0; i < nodes.length; i++) {
+        nodeWasAdded(nodes[i], treeScope);
+      }
+    }
+    function nodeWasRemoved(node) {
+      setTreeScope(node, new TreeScope(node, null));
+    }
+    function nodesWereRemoved(nodes) {
+      for (var i = 0; i < nodes.length; i++) {
+        nodeWasRemoved(nodes[i]);
+      }
+    }
+    function ensureSameOwnerDocument(parent, child) {
+      var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;
+      if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);
+    }
+    function adoptNodesIfNeeded(owner, nodes) {
+      if (!nodes.length) return;
+      var ownerDoc = owner.ownerDocument;
+      if (ownerDoc === nodes[0].ownerDocument) return;
+      for (var i = 0; i < nodes.length; i++) {
+        scope.adoptNodeNoRemove(nodes[i], ownerDoc);
+      }
+    }
+    function unwrapNodesForInsertion(owner, nodes) {
+      adoptNodesIfNeeded(owner, nodes);
+      var length = nodes.length;
+      if (length === 1) return unwrap(nodes[0]);
+      var df = unwrap(owner.ownerDocument.createDocumentFragment());
+      for (var i = 0; i < length; i++) {
+        df.appendChild(unwrap(nodes[i]));
+      }
+      return df;
+    }
+    function clearChildNodes(wrapper) {
+      if (wrapper.firstChild_ !== undefined) {
+        var child = wrapper.firstChild_;
+        while (child) {
+          var tmp = child;
+          child = child.nextSibling_;
+          tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
+        }
+      }
+      wrapper.firstChild_ = wrapper.lastChild_ = undefined;
+    }
+    function removeAllChildNodes(wrapper) {
+      if (wrapper.invalidateShadowRenderer()) {
+        var childWrapper = wrapper.firstChild;
+        while (childWrapper) {
+          assert(childWrapper.parentNode === wrapper);
+          var nextSibling = childWrapper.nextSibling;
+          var childNode = unwrap(childWrapper);
+          var parentNode = childNode.parentNode;
+          if (parentNode) originalRemoveChild.call(parentNode, childNode);
+          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null;
+          childWrapper = nextSibling;
+        }
+        wrapper.firstChild_ = wrapper.lastChild_ = null;
+      } else {
+        var node = unwrap(wrapper);
+        var child = node.firstChild;
+        var nextSibling;
+        while (child) {
+          nextSibling = child.nextSibling;
+          originalRemoveChild.call(node, child);
+          child = nextSibling;
+        }
+      }
+    }
+    function invalidateParent(node) {
+      var p = node.parentNode;
+      return p && p.invalidateShadowRenderer();
+    }
+    function cleanupNodes(nodes) {
+      for (var i = 0, n; i < nodes.length; i++) {
+        n = nodes[i];
+        n.parentNode.removeChild(n);
+      }
+    }
+    var originalImportNode = document.importNode;
+    var originalCloneNode = window.Node.prototype.cloneNode;
+    function cloneNode(node, deep, opt_doc) {
+      var clone;
+      if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
+      if (deep) {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          clone.appendChild(cloneNode(child, true, opt_doc));
+        }
+        if (node instanceof wrappers.HTMLTemplateElement) {
+          var cloneContent = clone.content;
+          for (var child = node.content.firstChild; child; child = child.nextSibling) {
+            cloneContent.appendChild(cloneNode(child, true, opt_doc));
+          }
+        }
+      }
+      return clone;
+    }
+    function contains(self, child) {
+      if (!child || getTreeScope(self) !== getTreeScope(child)) return false;
+      for (var node = child; node; node = node.parentNode) {
+        if (node === self) return true;
+      }
+      return false;
+    }
+    var OriginalNode = window.Node;
+    function Node(original) {
+      assert(original instanceof OriginalNode);
+      EventTarget.call(this, original);
+      this.parentNode_ = undefined;
+      this.firstChild_ = undefined;
+      this.lastChild_ = undefined;
+      this.nextSibling_ = undefined;
+      this.previousSibling_ = undefined;
+      this.treeScope_ = undefined;
+    }
+    var OriginalDocumentFragment = window.DocumentFragment;
+    var originalAppendChild = OriginalNode.prototype.appendChild;
+    var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;
+    var originalInsertBefore = OriginalNode.prototype.insertBefore;
+    var originalRemoveChild = OriginalNode.prototype.removeChild;
+    var originalReplaceChild = OriginalNode.prototype.replaceChild;
+    var isIe = /Trident/.test(navigator.userAgent);
+    var removeChildOriginalHelper = isIe ? function(parent, child) {
+      try {
+        originalRemoveChild.call(parent, child);
+      } catch (ex) {
+        if (!(parent instanceof OriginalDocumentFragment)) throw ex;
+      }
+    } : function(parent, child) {
+      originalRemoveChild.call(parent, child);
+    };
+    Node.prototype = Object.create(EventTarget.prototype);
+    mixin(Node.prototype, {
+      appendChild: function(childWrapper) {
+        return this.insertBefore(childWrapper, null);
+      },
+      insertBefore: function(childWrapper, refWrapper) {
+        assertIsNodeWrapper(childWrapper);
+        var refNode;
+        if (refWrapper) {
+          if (isWrapper(refWrapper)) {
+            refNode = unwrap(refWrapper);
+          } else {
+            refNode = refWrapper;
+            refWrapper = wrap(refNode);
+          }
+        } else {
+          refWrapper = null;
+          refNode = null;
+        }
+        refWrapper && assert(refWrapper.parentNode === this);
+        var nodes;
+        var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;
+        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);
+        if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
+        if (useNative) {
+          ensureSameOwnerDocument(this, childWrapper);
+          clearChildNodes(this);
+          originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
+        } else {
+          if (!previousNode) this.firstChild_ = nodes[0];
+          if (!refWrapper) {
+            this.lastChild_ = nodes[nodes.length - 1];
+            if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;
+          }
+          var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
+          if (parentNode) {
+            originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);
+          } else {
+            adoptNodesIfNeeded(this, nodes);
+          }
+        }
+        enqueueMutation(this, "childList", {
+          addedNodes: nodes,
+          nextSibling: refWrapper,
+          previousSibling: previousNode
+        });
+        nodesWereAdded(nodes, this);
+        return childWrapper;
+      },
+      removeChild: function(childWrapper) {
+        assertIsNodeWrapper(childWrapper);
+        if (childWrapper.parentNode !== this) {
+          var found = false;
+          var childNodes = this.childNodes;
+          for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {
+            if (ieChild === childWrapper) {
+              found = true;
+              break;
+            }
+          }
+          if (!found) {
+            throw new Error("NotFoundError");
+          }
+        }
+        var childNode = unwrap(childWrapper);
+        var childWrapperNextSibling = childWrapper.nextSibling;
+        var childWrapperPreviousSibling = childWrapper.previousSibling;
+        if (this.invalidateShadowRenderer()) {
+          var thisFirstChild = this.firstChild;
+          var thisLastChild = this.lastChild;
+          var parentNode = childNode.parentNode;
+          if (parentNode) removeChildOriginalHelper(parentNode, childNode);
+          if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;
+          if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;
+          if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
+          if (childWrapperNextSibling) {
+            childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;
+          }
+          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;
+        } else {
+          clearChildNodes(this);
+          removeChildOriginalHelper(unsafeUnwrap(this), childNode);
+        }
+        if (!surpressMutations) {
+          enqueueMutation(this, "childList", {
+            removedNodes: createOneElementNodeList(childWrapper),
+            nextSibling: childWrapperNextSibling,
+            previousSibling: childWrapperPreviousSibling
+          });
+        }
+        registerTransientObservers(this, childWrapper);
+        return childWrapper;
+      },
+      replaceChild: function(newChildWrapper, oldChildWrapper) {
+        assertIsNodeWrapper(newChildWrapper);
+        var oldChildNode;
+        if (isWrapper(oldChildWrapper)) {
+          oldChildNode = unwrap(oldChildWrapper);
+        } else {
+          oldChildNode = oldChildWrapper;
+          oldChildWrapper = wrap(oldChildNode);
+        }
+        if (oldChildWrapper.parentNode !== this) {
+          throw new Error("NotFoundError");
+        }
+        var nextNode = oldChildWrapper.nextSibling;
+        var previousNode = oldChildWrapper.previousSibling;
+        var nodes;
+        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);
+        if (useNative) {
+          nodes = collectNodesNative(newChildWrapper);
+        } else {
+          if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;
+          nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
+        }
+        if (!useNative) {
+          if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];
+          if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];
+          oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;
+          if (oldChildNode.parentNode) {
+            originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);
+          }
+        } else {
+          ensureSameOwnerDocument(this, newChildWrapper);
+          clearChildNodes(this);
+          originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);
+        }
+        enqueueMutation(this, "childList", {
+          addedNodes: nodes,
+          removedNodes: createOneElementNodeList(oldChildWrapper),
+          nextSibling: nextNode,
+          previousSibling: previousNode
+        });
+        nodeWasRemoved(oldChildWrapper);
+        nodesWereAdded(nodes, this);
+        return oldChildWrapper;
+      },
+      nodeIsInserted_: function() {
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          child.nodeIsInserted_();
+        }
+      },
+      hasChildNodes: function() {
+        return this.firstChild !== null;
+      },
+      get parentNode() {
+        return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
+      },
+      get firstChild() {
+        return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
+      },
+      get lastChild() {
+        return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
+      },
+      get nextSibling() {
+        return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
+      },
+      get previousSibling() {
+        return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
+      },
+      get parentElement() {
+        var p = this.parentNode;
+        while (p && p.nodeType !== Node.ELEMENT_NODE) {
+          p = p.parentNode;
+        }
+        return p;
+      },
+      get textContent() {
+        var s = "";
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          if (child.nodeType != Node.COMMENT_NODE) {
+            s += child.textContent;
+          }
+        }
+        return s;
+      },
+      set textContent(textContent) {
+        if (textContent == null) textContent = "";
+        var removedNodes = snapshotNodeList(this.childNodes);
+        if (this.invalidateShadowRenderer()) {
+          removeAllChildNodes(this);
+          if (textContent !== "") {
+            var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
+            this.appendChild(textNode);
+          }
+        } else {
+          clearChildNodes(this);
+          unsafeUnwrap(this).textContent = textContent;
+        }
+        var addedNodes = snapshotNodeList(this.childNodes);
+        enqueueMutation(this, "childList", {
+          addedNodes: addedNodes,
+          removedNodes: removedNodes
+        });
+        nodesWereRemoved(removedNodes);
+        nodesWereAdded(addedNodes, this);
+      },
+      get childNodes() {
+        var wrapperList = new NodeList();
+        var i = 0;
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          wrapperList[i++] = child;
+        }
+        wrapperList.length = i;
+        return wrapperList;
+      },
+      cloneNode: function(deep) {
+        return cloneNode(this, deep);
+      },
+      contains: function(child) {
+        return contains(this, wrapIfNeeded(child));
+      },
+      compareDocumentPosition: function(otherNode) {
+        return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
+      },
+      normalize: function() {
+        var nodes = snapshotNodeList(this.childNodes);
+        var remNodes = [];
+        var s = "";
+        var modNode;
+        for (var i = 0, n; i < nodes.length; i++) {
+          n = nodes[i];
+          if (n.nodeType === Node.TEXT_NODE) {
+            if (!modNode && !n.data.length) this.removeNode(n); else if (!modNode) modNode = n; else {
+              s += n.data;
+              remNodes.push(n);
+            }
+          } else {
+            if (modNode && remNodes.length) {
+              modNode.data += s;
+              cleanupNodes(remNodes);
+            }
+            remNodes = [];
+            s = "";
+            modNode = null;
+            if (n.childNodes.length) n.normalize();
+          }
+        }
+        if (modNode && remNodes.length) {
+          modNode.data += s;
+          cleanupNodes(remNodes);
+        }
+      }
+    });
+    defineWrapGetter(Node, "ownerDocument");
+    registerWrapper(OriginalNode, Node, document.createDocumentFragment());
+    delete Node.prototype.querySelector;
+    delete Node.prototype.querySelectorAll;
+    Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
+    scope.cloneNode = cloneNode;
+    scope.nodeWasAdded = nodeWasAdded;
+    scope.nodeWasRemoved = nodeWasRemoved;
+    scope.nodesWereAdded = nodesWereAdded;
+    scope.nodesWereRemoved = nodesWereRemoved;
+    scope.originalInsertBefore = originalInsertBefore;
+    scope.originalRemoveChild = originalRemoveChild;
+    scope.snapshotNodeList = snapshotNodeList;
+    scope.wrappers.Node = Node;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLCollection = scope.wrappers.HTMLCollection;
+    var NodeList = scope.wrappers.NodeList;
+    var getTreeScope = scope.getTreeScope;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var originalDocumentQuerySelector = document.querySelector;
+    var originalElementQuerySelector = document.documentElement.querySelector;
+    var originalDocumentQuerySelectorAll = document.querySelectorAll;
+    var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
+    var originalDocumentGetElementsByTagName = document.getElementsByTagName;
+    var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
+    var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
+    var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
+    var OriginalElement = window.Element;
+    var OriginalDocument = window.HTMLDocument || window.Document;
+    function filterNodeList(list, index, result, deep) {
+      var wrappedItem = null;
+      var root = null;
+      for (var i = 0, length = list.length; i < length; i++) {
+        wrappedItem = wrap(list[i]);
+        if (!deep && (root = getTreeScope(wrappedItem).root)) {
+          if (root instanceof scope.wrappers.ShadowRoot) {
+            continue;
+          }
+        }
+        result[index++] = wrappedItem;
+      }
+      return index;
+    }
+    function shimSelector(selector) {
+      return String(selector).replace(/\/deep\//g, " ");
+    }
+    function findOne(node, selector) {
+      var m, el = node.firstElementChild;
+      while (el) {
+        if (el.matches(selector)) return el;
+        m = findOne(el, selector);
+        if (m) return m;
+        el = el.nextElementSibling;
+      }
+      return null;
+    }
+    function matchesSelector(el, selector) {
+      return el.matches(selector);
+    }
+    var XHTML_NS = "http://www.w3.org/1999/xhtml";
+    function matchesTagName(el, localName, localNameLowerCase) {
+      var ln = el.localName;
+      return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
+    }
+    function matchesEveryThing() {
+      return true;
+    }
+    function matchesLocalNameOnly(el, ns, localName) {
+      return el.localName === localName;
+    }
+    function matchesNameSpace(el, ns) {
+      return el.namespaceURI === ns;
+    }
+    function matchesLocalNameNS(el, ns, localName) {
+      return el.namespaceURI === ns && el.localName === localName;
+    }
+    function findElements(node, index, result, p, arg0, arg1) {
+      var el = node.firstElementChild;
+      while (el) {
+        if (p(el, arg0, arg1)) result[index++] = el;
+        index = findElements(el, index, result, p, arg0, arg1);
+        el = el.nextElementSibling;
+      }
+      return index;
+    }
+    function querySelectorAllFiltered(p, index, result, selector, deep) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, selector, null);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementQuerySelectorAll.call(target, selector);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentQuerySelectorAll.call(target, selector);
+      } else {
+        return findElements(this, index, result, p, selector, null);
+      }
+      return filterNodeList(list, index, result, deep);
+    }
+    var SelectorsInterface = {
+      querySelector: function(selector) {
+        var shimmed = shimSelector(selector);
+        var deep = shimmed !== selector;
+        selector = shimmed;
+        var target = unsafeUnwrap(this);
+        var wrappedItem;
+        var root = getTreeScope(this).root;
+        if (root instanceof scope.wrappers.ShadowRoot) {
+          return findOne(this, selector);
+        } else if (target instanceof OriginalElement) {
+          wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
+        } else if (target instanceof OriginalDocument) {
+          wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
+        } else {
+          return findOne(this, selector);
+        }
+        if (!wrappedItem) {
+          return wrappedItem;
+        } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
+          if (root instanceof scope.wrappers.ShadowRoot) {
+            return findOne(this, selector);
+          }
+        }
+        return wrappedItem;
+      },
+      querySelectorAll: function(selector) {
+        var shimmed = shimSelector(selector);
+        var deep = shimmed !== selector;
+        selector = shimmed;
+        var result = new NodeList();
+        result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);
+        return result;
+      }
+    };
+    function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, localName, lowercase);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementGetElementsByTagName.call(target, localName, lowercase);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);
+      } else {
+        return findElements(this, index, result, p, localName, lowercase);
+      }
+      return filterNodeList(list, index, result, false);
+    }
+    function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, ns, localName);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
+      } else {
+        return findElements(this, index, result, p, ns, localName);
+      }
+      return filterNodeList(list, index, result, false);
+    }
+    var GetElementsByInterface = {
+      getElementsByTagName: function(localName) {
+        var result = new HTMLCollection();
+        var match = localName === "*" ? matchesEveryThing : matchesTagName;
+        result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());
+        return result;
+      },
+      getElementsByClassName: function(className) {
+        return this.querySelectorAll("." + className);
+      },
+      getElementsByTagNameNS: function(ns, localName) {
+        var result = new HTMLCollection();
+        var match = null;
+        if (ns === "*") {
+          match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly;
+        } else {
+          match = localName === "*" ? matchesNameSpace : matchesLocalNameNS;
+        }
+        result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);
+        return result;
+      }
+    };
+    scope.GetElementsByInterface = GetElementsByInterface;
+    scope.SelectorsInterface = SelectorsInterface;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var NodeList = scope.wrappers.NodeList;
+    function forwardElement(node) {
+      while (node && node.nodeType !== Node.ELEMENT_NODE) {
+        node = node.nextSibling;
+      }
+      return node;
+    }
+    function backwardsElement(node) {
+      while (node && node.nodeType !== Node.ELEMENT_NODE) {
+        node = node.previousSibling;
+      }
+      return node;
+    }
+    var ParentNodeInterface = {
+      get firstElementChild() {
+        return forwardElement(this.firstChild);
+      },
+      get lastElementChild() {
+        return backwardsElement(this.lastChild);
+      },
+      get childElementCount() {
+        var count = 0;
+        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
+          count++;
+        }
+        return count;
+      },
+      get children() {
+        var wrapperList = new NodeList();
+        var i = 0;
+        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
+          wrapperList[i++] = child;
+        }
+        wrapperList.length = i;
+        return wrapperList;
+      },
+      remove: function() {
+        var p = this.parentNode;
+        if (p) p.removeChild(this);
+      }
+    };
+    var ChildNodeInterface = {
+      get nextElementSibling() {
+        return forwardElement(this.nextSibling);
+      },
+      get previousElementSibling() {
+        return backwardsElement(this.previousSibling);
+      }
+    };
+    scope.ChildNodeInterface = ChildNodeInterface;
+    scope.ParentNodeInterface = ParentNodeInterface;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var ChildNodeInterface = scope.ChildNodeInterface;
+    var Node = scope.wrappers.Node;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var OriginalCharacterData = window.CharacterData;
+    function CharacterData(node) {
+      Node.call(this, node);
+    }
+    CharacterData.prototype = Object.create(Node.prototype);
+    mixin(CharacterData.prototype, {
+      get textContent() {
+        return this.data;
+      },
+      set textContent(value) {
+        this.data = value;
+      },
+      get data() {
+        return unsafeUnwrap(this).data;
+      },
+      set data(value) {
+        var oldValue = unsafeUnwrap(this).data;
+        enqueueMutation(this, "characterData", {
+          oldValue: oldValue
+        });
+        unsafeUnwrap(this).data = value;
+      }
+    });
+    mixin(CharacterData.prototype, ChildNodeInterface);
+    registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(""));
+    scope.wrappers.CharacterData = CharacterData;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var CharacterData = scope.wrappers.CharacterData;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    function toUInt32(x) {
+      return x >>> 0;
+    }
+    var OriginalText = window.Text;
+    function Text(node) {
+      CharacterData.call(this, node);
+    }
+    Text.prototype = Object.create(CharacterData.prototype);
+    mixin(Text.prototype, {
+      splitText: function(offset) {
+        offset = toUInt32(offset);
+        var s = this.data;
+        if (offset > s.length) throw new Error("IndexSizeError");
+        var head = s.slice(0, offset);
+        var tail = s.slice(offset);
+        this.data = head;
+        var newTextNode = this.ownerDocument.createTextNode(tail);
+        if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling);
+        return newTextNode;
+      }
+    });
+    registerWrapper(OriginalText, Text, document.createTextNode(""));
+    scope.wrappers.Text = Text;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    function invalidateClass(el) {
+      scope.invalidateRendererBasedOnAttribute(el, "class");
+    }
+    function DOMTokenList(impl, ownerElement) {
+      setWrapper(impl, this);
+      this.ownerElement_ = ownerElement;
+    }
+    DOMTokenList.prototype = {
+      constructor: DOMTokenList,
+      get length() {
+        return unsafeUnwrap(this).length;
+      },
+      item: function(index) {
+        return unsafeUnwrap(this).item(index);
+      },
+      contains: function(token) {
+        return unsafeUnwrap(this).contains(token);
+      },
+      add: function() {
+        unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+      },
+      remove: function() {
+        unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+      },
+      toggle: function(token) {
+        var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+        return rv;
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    scope.wrappers.DOMTokenList = DOMTokenList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var ChildNodeInterface = scope.ChildNodeInterface;
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var Node = scope.wrappers.Node;
+    var DOMTokenList = scope.wrappers.DOMTokenList;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var addWrapNodeListMethod = scope.addWrapNodeListMethod;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var oneOf = scope.oneOf;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrappers = scope.wrappers;
+    var OriginalElement = window.Element;
+    var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) {
+      return OriginalElement.prototype[name];
+    });
+    var matchesName = matchesNames[0];
+    var originalMatches = OriginalElement.prototype[matchesName];
+    function invalidateRendererBasedOnAttribute(element, name) {
+      var p = element.parentNode;
+      if (!p || !p.shadowRoot) return;
+      var renderer = scope.getRendererForHost(p);
+      if (renderer.dependsOnAttribute(name)) renderer.invalidate();
+    }
+    function enqueAttributeChange(element, name, oldValue) {
+      enqueueMutation(element, "attributes", {
+        name: name,
+        namespace: null,
+        oldValue: oldValue
+      });
+    }
+    var classListTable = new WeakMap();
+    function Element(node) {
+      Node.call(this, node);
+    }
+    Element.prototype = Object.create(Node.prototype);
+    mixin(Element.prototype, {
+      createShadowRoot: function() {
+        var newShadowRoot = new wrappers.ShadowRoot(this);
+        unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
+        var renderer = scope.getRendererForHost(this);
+        renderer.invalidate();
+        return newShadowRoot;
+      },
+      get shadowRoot() {
+        return unsafeUnwrap(this).polymerShadowRoot_ || null;
+      },
+      setAttribute: function(name, value) {
+        var oldValue = unsafeUnwrap(this).getAttribute(name);
+        unsafeUnwrap(this).setAttribute(name, value);
+        enqueAttributeChange(this, name, oldValue);
+        invalidateRendererBasedOnAttribute(this, name);
+      },
+      removeAttribute: function(name) {
+        var oldValue = unsafeUnwrap(this).getAttribute(name);
+        unsafeUnwrap(this).removeAttribute(name);
+        enqueAttributeChange(this, name, oldValue);
+        invalidateRendererBasedOnAttribute(this, name);
+      },
+      matches: function(selector) {
+        return originalMatches.call(unsafeUnwrap(this), selector);
+      },
+      get classList() {
+        var list = classListTable.get(this);
+        if (!list) {
+          classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));
+        }
+        return list;
+      },
+      get className() {
+        return unsafeUnwrap(this).className;
+      },
+      set className(v) {
+        this.setAttribute("class", v);
+      },
+      get id() {
+        return unsafeUnwrap(this).id;
+      },
+      set id(v) {
+        this.setAttribute("id", v);
+      }
+    });
+    matchesNames.forEach(function(name) {
+      if (name !== "matches") {
+        Element.prototype[name] = function(selector) {
+          return this.matches(selector);
+        };
+      }
+    });
+    if (OriginalElement.prototype.webkitCreateShadowRoot) {
+      Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
+    }
+    mixin(Element.prototype, ChildNodeInterface);
+    mixin(Element.prototype, GetElementsByInterface);
+    mixin(Element.prototype, ParentNodeInterface);
+    mixin(Element.prototype, SelectorsInterface);
+    registerWrapper(OriginalElement, Element, document.createElementNS(null, "x"));
+    scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
+    scope.matchesNames = matchesNames;
+    scope.wrappers.Element = Element;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var defineGetter = scope.defineGetter;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var nodesWereAdded = scope.nodesWereAdded;
+    var nodesWereRemoved = scope.nodesWereRemoved;
+    var registerWrapper = scope.registerWrapper;
+    var snapshotNodeList = scope.snapshotNodeList;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrappers = scope.wrappers;
+    var escapeAttrRegExp = /[&\u00A0"]/g;
+    var escapeDataRegExp = /[&\u00A0<>]/g;
+    function escapeReplace(c) {
+      switch (c) {
+       case "&":
+        return "&amp;";
+
+       case "<":
+        return "&lt;";
+
+       case ">":
+        return "&gt;";
+
+       case '"':
+        return "&quot;";
+
+       case " ":
+        return "&nbsp;";
+      }
+    }
+    function escapeAttr(s) {
+      return s.replace(escapeAttrRegExp, escapeReplace);
+    }
+    function escapeData(s) {
+      return s.replace(escapeDataRegExp, escapeReplace);
+    }
+    function makeSet(arr) {
+      var set = {};
+      for (var i = 0; i < arr.length; i++) {
+        set[arr[i]] = true;
+      }
+      return set;
+    }
+    var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]);
+    var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]);
+    function getOuterHTML(node, parentNode) {
+      switch (node.nodeType) {
+       case Node.ELEMENT_NODE:
+        var tagName = node.tagName.toLowerCase();
+        var s = "<" + tagName;
+        var attrs = node.attributes;
+        for (var i = 0, attr; attr = attrs[i]; i++) {
+          s += " " + attr.name + '="' + escapeAttr(attr.value) + '"';
+        }
+        s += ">";
+        if (voidElements[tagName]) return s;
+        return s + getInnerHTML(node) + "</" + tagName + ">";
+
+       case Node.TEXT_NODE:
+        var data = node.data;
+        if (parentNode && plaintextParents[parentNode.localName]) return data;
+        return escapeData(data);
+
+       case Node.COMMENT_NODE:
+        return "<!--" + node.data + "-->";
+
+       default:
+        console.error(node);
+        throw new Error("not implemented");
+      }
+    }
+    function getInnerHTML(node) {
+      if (node instanceof wrappers.HTMLTemplateElement) node = node.content;
+      var s = "";
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        s += getOuterHTML(child, node);
+      }
+      return s;
+    }
+    function setInnerHTML(node, value, opt_tagName) {
+      var tagName = opt_tagName || "div";
+      node.textContent = "";
+      var tempElement = unwrap(node.ownerDocument.createElement(tagName));
+      tempElement.innerHTML = value;
+      var firstChild;
+      while (firstChild = tempElement.firstChild) {
+        node.appendChild(wrap(firstChild));
+      }
+    }
+    var oldIe = /MSIE/.test(navigator.userAgent);
+    var OriginalHTMLElement = window.HTMLElement;
+    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+    function HTMLElement(node) {
+      Element.call(this, node);
+    }
+    HTMLElement.prototype = Object.create(Element.prototype);
+    mixin(HTMLElement.prototype, {
+      get innerHTML() {
+        return getInnerHTML(this);
+      },
+      set innerHTML(value) {
+        if (oldIe && plaintextParents[this.localName]) {
+          this.textContent = value;
+          return;
+        }
+        var removedNodes = snapshotNodeList(this.childNodes);
+        if (this.invalidateShadowRenderer()) {
+          if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);
+        } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {
+          setInnerHTML(this.content, value);
+        } else {
+          unsafeUnwrap(this).innerHTML = value;
+        }
+        var addedNodes = snapshotNodeList(this.childNodes);
+        enqueueMutation(this, "childList", {
+          addedNodes: addedNodes,
+          removedNodes: removedNodes
+        });
+        nodesWereRemoved(removedNodes);
+        nodesWereAdded(addedNodes, this);
+      },
+      get outerHTML() {
+        return getOuterHTML(this, this.parentNode);
+      },
+      set outerHTML(value) {
+        var p = this.parentNode;
+        if (p) {
+          p.invalidateShadowRenderer();
+          var df = frag(p, value);
+          p.replaceChild(df, this);
+        }
+      },
+      insertAdjacentHTML: function(position, text) {
+        var contextElement, refNode;
+        switch (String(position).toLowerCase()) {
+         case "beforebegin":
+          contextElement = this.parentNode;
+          refNode = this;
+          break;
+
+         case "afterend":
+          contextElement = this.parentNode;
+          refNode = this.nextSibling;
+          break;
+
+         case "afterbegin":
+          contextElement = this;
+          refNode = this.firstChild;
+          break;
+
+         case "beforeend":
+          contextElement = this;
+          refNode = null;
+          break;
+
+         default:
+          return;
+        }
+        var df = frag(contextElement, text);
+        contextElement.insertBefore(df, refNode);
+      },
+      get hidden() {
+        return this.hasAttribute("hidden");
+      },
+      set hidden(v) {
+        if (v) {
+          this.setAttribute("hidden", "");
+        } else {
+          this.removeAttribute("hidden");
+        }
+      }
+    });
+    function frag(contextElement, html) {
+      var p = unwrap(contextElement.cloneNode(false));
+      p.innerHTML = html;
+      var df = unwrap(document.createDocumentFragment());
+      var c;
+      while (c = p.firstChild) {
+        df.appendChild(c);
+      }
+      return wrap(df);
+    }
+    function getter(name) {
+      return function() {
+        scope.renderAllPending();
+        return unsafeUnwrap(this)[name];
+      };
+    }
+    function getterRequiresRendering(name) {
+      defineGetter(HTMLElement, name, getter(name));
+    }
+    [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering);
+    function getterAndSetterRequiresRendering(name) {
+      Object.defineProperty(HTMLElement.prototype, name, {
+        get: getter(name),
+        set: function(v) {
+          scope.renderAllPending();
+          unsafeUnwrap(this)[name] = v;
+        },
+        configurable: true,
+        enumerable: true
+      });
+    }
+    [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering);
+    function methodRequiresRendering(name) {
+      Object.defineProperty(HTMLElement.prototype, name, {
+        value: function() {
+          scope.renderAllPending();
+          return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
+        },
+        configurable: true,
+        enumerable: true
+      });
+    }
+    [ "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering);
+    registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b"));
+    scope.wrappers.HTMLElement = HTMLElement;
+    scope.getInnerHTML = getInnerHTML;
+    scope.setInnerHTML = setInnerHTML;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
+    function HTMLCanvasElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLCanvasElement.prototype, {
+      getContext: function() {
+        var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
+        return context && wrap(context);
+      }
+    });
+    registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas"));
+    scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLContentElement = window.HTMLContentElement;
+    function HTMLContentElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLContentElement.prototype, {
+      constructor: HTMLContentElement,
+      get select() {
+        return this.getAttribute("select");
+      },
+      set select(value) {
+        this.setAttribute("select", value);
+      },
+      setAttribute: function(n, v) {
+        HTMLElement.prototype.setAttribute.call(this, n, v);
+        if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true);
+      }
+    });
+    if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
+    scope.wrappers.HTMLContentElement = HTMLContentElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var OriginalHTMLFormElement = window.HTMLFormElement;
+    function HTMLFormElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLFormElement.prototype, {
+      get elements() {
+        return wrapHTMLCollection(unwrap(this).elements);
+      }
+    });
+    registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form"));
+    scope.wrappers.HTMLFormElement = HTMLFormElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var rewrap = scope.rewrap;
+    var OriginalHTMLImageElement = window.HTMLImageElement;
+    function HTMLImageElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img"));
+    function Image(width, height) {
+      if (!(this instanceof Image)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("img"));
+      HTMLElement.call(this, node);
+      rewrap(node, this);
+      if (width !== undefined) node.width = width;
+      if (height !== undefined) node.height = height;
+    }
+    Image.prototype = HTMLImageElement.prototype;
+    scope.wrappers.HTMLImageElement = HTMLImageElement;
+    scope.wrappers.Image = Image;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var NodeList = scope.wrappers.NodeList;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLShadowElement = window.HTMLShadowElement;
+    function HTMLShadowElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
+    HTMLShadowElement.prototype.constructor = HTMLShadowElement;
+    if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
+    scope.wrappers.HTMLShadowElement = HTMLShadowElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var contentTable = new WeakMap();
+    var templateContentsOwnerTable = new WeakMap();
+    function getTemplateContentsOwner(doc) {
+      if (!doc.defaultView) return doc;
+      var d = templateContentsOwnerTable.get(doc);
+      if (!d) {
+        d = doc.implementation.createHTMLDocument("");
+        while (d.lastChild) {
+          d.removeChild(d.lastChild);
+        }
+        templateContentsOwnerTable.set(doc, d);
+      }
+      return d;
+    }
+    function extractContent(templateElement) {
+      var doc = getTemplateContentsOwner(templateElement.ownerDocument);
+      var df = unwrap(doc.createDocumentFragment());
+      var child;
+      while (child = templateElement.firstChild) {
+        df.appendChild(child);
+      }
+      return df;
+    }
+    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+    function HTMLTemplateElement(node) {
+      HTMLElement.call(this, node);
+      if (!OriginalHTMLTemplateElement) {
+        var content = extractContent(node);
+        contentTable.set(this, wrap(content));
+      }
+    }
+    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTemplateElement.prototype, {
+      constructor: HTMLTemplateElement,
+      get content() {
+        if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);
+        return contentTable.get(this);
+      }
+    });
+    if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
+    scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLMediaElement = window.HTMLMediaElement;
+    if (!OriginalHTMLMediaElement) return;
+    function HTMLMediaElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio"));
+    scope.wrappers.HTMLMediaElement = HTMLMediaElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var rewrap = scope.rewrap;
+    var OriginalHTMLAudioElement = window.HTMLAudioElement;
+    if (!OriginalHTMLAudioElement) return;
+    function HTMLAudioElement(node) {
+      HTMLMediaElement.call(this, node);
+    }
+    HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
+    registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio"));
+    function Audio(src) {
+      if (!(this instanceof Audio)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("audio"));
+      HTMLMediaElement.call(this, node);
+      rewrap(node, this);
+      node.setAttribute("preload", "auto");
+      if (src !== undefined) node.setAttribute("src", src);
+    }
+    Audio.prototype = HTMLAudioElement.prototype;
+    scope.wrappers.HTMLAudioElement = HTMLAudioElement;
+    scope.wrappers.Audio = Audio;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var rewrap = scope.rewrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLOptionElement = window.HTMLOptionElement;
+    function trimText(s) {
+      return s.replace(/\s+/g, " ").trim();
+    }
+    function HTMLOptionElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLOptionElement.prototype, {
+      get text() {
+        return trimText(this.textContent);
+      },
+      set text(value) {
+        this.textContent = trimText(String(value));
+      },
+      get form() {
+        return wrap(unwrap(this).form);
+      }
+    });
+    registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option"));
+    function Option(text, value, defaultSelected, selected) {
+      if (!(this instanceof Option)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("option"));
+      HTMLElement.call(this, node);
+      rewrap(node, this);
+      if (text !== undefined) node.text = text;
+      if (value !== undefined) node.setAttribute("value", value);
+      if (defaultSelected === true) node.setAttribute("selected", "");
+      node.selected = selected === true;
+    }
+    Option.prototype = HTMLOptionElement.prototype;
+    scope.wrappers.HTMLOptionElement = HTMLOptionElement;
+    scope.wrappers.Option = Option;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLSelectElement = window.HTMLSelectElement;
+    function HTMLSelectElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLSelectElement.prototype, {
+      add: function(element, before) {
+        if (typeof before === "object") before = unwrap(before);
+        unwrap(this).add(unwrap(element), before);
+      },
+      remove: function(indexOrNode) {
+        if (indexOrNode === undefined) {
+          HTMLElement.prototype.remove.call(this);
+          return;
+        }
+        if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode);
+        unwrap(this).remove(indexOrNode);
+      },
+      get form() {
+        return wrap(unwrap(this).form);
+      }
+    });
+    registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select"));
+    scope.wrappers.HTMLSelectElement = HTMLSelectElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var OriginalHTMLTableElement = window.HTMLTableElement;
+    function HTMLTableElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableElement.prototype, {
+      get caption() {
+        return wrap(unwrap(this).caption);
+      },
+      createCaption: function() {
+        return wrap(unwrap(this).createCaption());
+      },
+      get tHead() {
+        return wrap(unwrap(this).tHead);
+      },
+      createTHead: function() {
+        return wrap(unwrap(this).createTHead());
+      },
+      createTFoot: function() {
+        return wrap(unwrap(this).createTFoot());
+      },
+      get tFoot() {
+        return wrap(unwrap(this).tFoot);
+      },
+      get tBodies() {
+        return wrapHTMLCollection(unwrap(this).tBodies);
+      },
+      createTBody: function() {
+        return wrap(unwrap(this).createTBody());
+      },
+      get rows() {
+        return wrapHTMLCollection(unwrap(this).rows);
+      },
+      insertRow: function(index) {
+        return wrap(unwrap(this).insertRow(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table"));
+    scope.wrappers.HTMLTableElement = HTMLTableElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
+    function HTMLTableSectionElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableSectionElement.prototype, {
+      constructor: HTMLTableSectionElement,
+      get rows() {
+        return wrapHTMLCollection(unwrap(this).rows);
+      },
+      insertRow: function(index) {
+        return wrap(unwrap(this).insertRow(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead"));
+    scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
+    function HTMLTableRowElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableRowElement.prototype, {
+      get cells() {
+        return wrapHTMLCollection(unwrap(this).cells);
+      },
+      insertCell: function(index) {
+        return wrap(unwrap(this).insertCell(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr"));
+    scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLContentElement = scope.wrappers.HTMLContentElement;
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+    var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
+    function HTMLUnknownElement(node) {
+      switch (node.localName) {
+       case "content":
+        return new HTMLContentElement(node);
+
+       case "shadow":
+        return new HTMLShadowElement(node);
+
+       case "template":
+        return new HTMLTemplateElement(node);
+      }
+      HTMLElement.call(this, node);
+    }
+    HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
+    scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerObject = scope.registerObject;
+    var SVG_NS = "http://www.w3.org/2000/svg";
+    var svgTitleElement = document.createElementNS(SVG_NS, "title");
+    var SVGTitleElement = registerObject(svgTitleElement);
+    var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
+    if (!("classList" in svgTitleElement)) {
+      var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList");
+      Object.defineProperty(HTMLElement.prototype, "classList", descr);
+      delete Element.prototype.classList;
+    }
+    scope.wrappers.SVGElement = SVGElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalSVGUseElement = window.SVGUseElement;
+    var SVG_NS = "http://www.w3.org/2000/svg";
+    var gWrapper = wrap(document.createElementNS(SVG_NS, "g"));
+    var useElement = document.createElementNS(SVG_NS, "use");
+    var SVGGElement = gWrapper.constructor;
+    var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
+    var parentInterface = parentInterfacePrototype.constructor;
+    function SVGUseElement(impl) {
+      parentInterface.call(this, impl);
+    }
+    SVGUseElement.prototype = Object.create(parentInterfacePrototype);
+    if ("instanceRoot" in useElement) {
+      mixin(SVGUseElement.prototype, {
+        get instanceRoot() {
+          return wrap(unwrap(this).instanceRoot);
+        },
+        get animatedInstanceRoot() {
+          return wrap(unwrap(this).animatedInstanceRoot);
+        }
+      });
+    }
+    registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
+    scope.wrappers.SVGUseElement = SVGUseElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalSVGElementInstance = window.SVGElementInstance;
+    if (!OriginalSVGElementInstance) return;
+    function SVGElementInstance(impl) {
+      EventTarget.call(this, impl);
+    }
+    SVGElementInstance.prototype = Object.create(EventTarget.prototype);
+    mixin(SVGElementInstance.prototype, {
+      get correspondingElement() {
+        return wrap(unsafeUnwrap(this).correspondingElement);
+      },
+      get correspondingUseElement() {
+        return wrap(unsafeUnwrap(this).correspondingUseElement);
+      },
+      get parentNode() {
+        return wrap(unsafeUnwrap(this).parentNode);
+      },
+      get childNodes() {
+        throw new Error("Not implemented");
+      },
+      get firstChild() {
+        return wrap(unsafeUnwrap(this).firstChild);
+      },
+      get lastChild() {
+        return wrap(unsafeUnwrap(this).lastChild);
+      },
+      get previousSibling() {
+        return wrap(unsafeUnwrap(this).previousSibling);
+      },
+      get nextSibling() {
+        return wrap(unsafeUnwrap(this).nextSibling);
+      }
+    });
+    registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
+    scope.wrappers.SVGElementInstance = SVGElementInstance;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
+    function CanvasRenderingContext2D(impl) {
+      setWrapper(impl, this);
+    }
+    mixin(CanvasRenderingContext2D.prototype, {
+      get canvas() {
+        return wrap(unsafeUnwrap(this).canvas);
+      },
+      drawImage: function() {
+        arguments[0] = unwrapIfNeeded(arguments[0]);
+        unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
+      },
+      createPattern: function() {
+        arguments[0] = unwrap(arguments[0]);
+        return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
+      }
+    });
+    registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d"));
+    scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
+    if (!OriginalWebGLRenderingContext) return;
+    function WebGLRenderingContext(impl) {
+      setWrapper(impl, this);
+    }
+    mixin(WebGLRenderingContext.prototype, {
+      get canvas() {
+        return wrap(unsafeUnwrap(this).canvas);
+      },
+      texImage2D: function() {
+        arguments[5] = unwrapIfNeeded(arguments[5]);
+        unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
+      },
+      texSubImage2D: function() {
+        arguments[6] = unwrapIfNeeded(arguments[6]);
+        unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
+      }
+    });
+    var instanceProperties = /WebKit/.test(navigator.userAgent) ? {
+      drawingBufferHeight: null,
+      drawingBufferWidth: null
+    } : {};
+    registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);
+    scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalRange = window.Range;
+    function Range(impl) {
+      setWrapper(impl, this);
+    }
+    Range.prototype = {
+      get startContainer() {
+        return wrap(unsafeUnwrap(this).startContainer);
+      },
+      get endContainer() {
+        return wrap(unsafeUnwrap(this).endContainer);
+      },
+      get commonAncestorContainer() {
+        return wrap(unsafeUnwrap(this).commonAncestorContainer);
+      },
+      setStart: function(refNode, offset) {
+        unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
+      },
+      setEnd: function(refNode, offset) {
+        unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
+      },
+      setStartBefore: function(refNode) {
+        unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
+      },
+      setStartAfter: function(refNode) {
+        unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
+      },
+      setEndBefore: function(refNode) {
+        unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
+      },
+      setEndAfter: function(refNode) {
+        unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
+      },
+      selectNode: function(refNode) {
+        unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
+      },
+      selectNodeContents: function(refNode) {
+        unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
+      },
+      compareBoundaryPoints: function(how, sourceRange) {
+        return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
+      },
+      extractContents: function() {
+        return wrap(unsafeUnwrap(this).extractContents());
+      },
+      cloneContents: function() {
+        return wrap(unsafeUnwrap(this).cloneContents());
+      },
+      insertNode: function(node) {
+        unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
+      },
+      surroundContents: function(newParent) {
+        unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
+      },
+      cloneRange: function() {
+        return wrap(unsafeUnwrap(this).cloneRange());
+      },
+      isPointInRange: function(node, offset) {
+        return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
+      },
+      comparePoint: function(node, offset) {
+        return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
+      },
+      intersectsNode: function(node) {
+        return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    if (OriginalRange.prototype.createContextualFragment) {
+      Range.prototype.createContextualFragment = function(html) {
+        return wrap(unsafeUnwrap(this).createContextualFragment(html));
+      };
+    }
+    registerWrapper(window.Range, Range, document.createRange());
+    scope.wrappers.Range = Range;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var mixin = scope.mixin;
+    var registerObject = scope.registerObject;
+    var DocumentFragment = registerObject(document.createDocumentFragment());
+    mixin(DocumentFragment.prototype, ParentNodeInterface);
+    mixin(DocumentFragment.prototype, SelectorsInterface);
+    mixin(DocumentFragment.prototype, GetElementsByInterface);
+    var Comment = registerObject(document.createComment(""));
+    scope.wrappers.Comment = Comment;
+    scope.wrappers.DocumentFragment = DocumentFragment;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var DocumentFragment = scope.wrappers.DocumentFragment;
+    var TreeScope = scope.TreeScope;
+    var elementFromPoint = scope.elementFromPoint;
+    var getInnerHTML = scope.getInnerHTML;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var rewrap = scope.rewrap;
+    var setInnerHTML = scope.setInnerHTML;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var shadowHostTable = new WeakMap();
+    var nextOlderShadowTreeTable = new WeakMap();
+    var spaceCharRe = /[ \t\n\r\f]/;
+    function ShadowRoot(hostWrapper) {
+      var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
+      DocumentFragment.call(this, node);
+      rewrap(node, this);
+      var oldShadowRoot = hostWrapper.shadowRoot;
+      nextOlderShadowTreeTable.set(this, oldShadowRoot);
+      this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
+      shadowHostTable.set(this, hostWrapper);
+    }
+    ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
+    mixin(ShadowRoot.prototype, {
+      constructor: ShadowRoot,
+      get innerHTML() {
+        return getInnerHTML(this);
+      },
+      set innerHTML(value) {
+        setInnerHTML(this, value);
+        this.invalidateShadowRenderer();
+      },
+      get olderShadowRoot() {
+        return nextOlderShadowTreeTable.get(this) || null;
+      },
+      get host() {
+        return shadowHostTable.get(this) || null;
+      },
+      invalidateShadowRenderer: function() {
+        return shadowHostTable.get(this).invalidateShadowRenderer();
+      },
+      elementFromPoint: function(x, y) {
+        return elementFromPoint(this, this.ownerDocument, x, y);
+      },
+      getElementById: function(id) {
+        if (spaceCharRe.test(id)) return null;
+        return this.querySelector('[id="' + id + '"]');
+      }
+    });
+    scope.wrappers.ShadowRoot = ShadowRoot;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var HTMLContentElement = scope.wrappers.HTMLContentElement;
+    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+    var Node = scope.wrappers.Node;
+    var ShadowRoot = scope.wrappers.ShadowRoot;
+    var assert = scope.assert;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var oneOf = scope.oneOf;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var ArraySplice = scope.ArraySplice;
+    function updateWrapperUpAndSideways(wrapper) {
+      wrapper.previousSibling_ = wrapper.previousSibling;
+      wrapper.nextSibling_ = wrapper.nextSibling;
+      wrapper.parentNode_ = wrapper.parentNode;
+    }
+    function updateWrapperDown(wrapper) {
+      wrapper.firstChild_ = wrapper.firstChild;
+      wrapper.lastChild_ = wrapper.lastChild;
+    }
+    function updateAllChildNodes(parentNodeWrapper) {
+      assert(parentNodeWrapper instanceof Node);
+      for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {
+        updateWrapperUpAndSideways(childWrapper);
+      }
+      updateWrapperDown(parentNodeWrapper);
+    }
+    function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
+      var parentNode = unwrap(parentNodeWrapper);
+      var newChild = unwrap(newChildWrapper);
+      var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
+      remove(newChildWrapper);
+      updateWrapperUpAndSideways(newChildWrapper);
+      if (!refChildWrapper) {
+        parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
+        if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
+        var lastChildWrapper = wrap(parentNode.lastChild);
+        if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
+      } else {
+        if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;
+        refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
+      }
+      scope.originalInsertBefore.call(parentNode, newChild, refChild);
+    }
+    function remove(nodeWrapper) {
+      var node = unwrap(nodeWrapper);
+      var parentNode = node.parentNode;
+      if (!parentNode) return;
+      var parentNodeWrapper = wrap(parentNode);
+      updateWrapperUpAndSideways(nodeWrapper);
+      if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
+      if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
+      if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;
+      if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;
+      scope.originalRemoveChild.call(parentNode, node);
+    }
+    var distributedNodesTable = new WeakMap();
+    var destinationInsertionPointsTable = new WeakMap();
+    var rendererForHostTable = new WeakMap();
+    function resetDistributedNodes(insertionPoint) {
+      distributedNodesTable.set(insertionPoint, []);
+    }
+    function getDistributedNodes(insertionPoint) {
+      var rv = distributedNodesTable.get(insertionPoint);
+      if (!rv) distributedNodesTable.set(insertionPoint, rv = []);
+      return rv;
+    }
+    function getChildNodesSnapshot(node) {
+      var result = [], i = 0;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        result[i++] = child;
+      }
+      return result;
+    }
+    var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]);
+    var pendingDirtyRenderers = [];
+    var renderTimer;
+    function renderAllPending() {
+      for (var i = 0; i < pendingDirtyRenderers.length; i++) {
+        var renderer = pendingDirtyRenderers[i];
+        var parentRenderer = renderer.parentRenderer;
+        if (parentRenderer && parentRenderer.dirty) continue;
+        renderer.render();
+      }
+      pendingDirtyRenderers = [];
+    }
+    function handleRequestAnimationFrame() {
+      renderTimer = null;
+      renderAllPending();
+    }
+    function getRendererForHost(host) {
+      var renderer = rendererForHostTable.get(host);
+      if (!renderer) {
+        renderer = new ShadowRenderer(host);
+        rendererForHostTable.set(host, renderer);
+      }
+      return renderer;
+    }
+    function getShadowRootAncestor(node) {
+      var root = getTreeScope(node).root;
+      if (root instanceof ShadowRoot) return root;
+      return null;
+    }
+    function getRendererForShadowRoot(shadowRoot) {
+      return getRendererForHost(shadowRoot.host);
+    }
+    var spliceDiff = new ArraySplice();
+    spliceDiff.equals = function(renderNode, rawNode) {
+      return unwrap(renderNode.node) === rawNode;
+    };
+    function RenderNode(node) {
+      this.skip = false;
+      this.node = node;
+      this.childNodes = [];
+    }
+    RenderNode.prototype = {
+      append: function(node) {
+        var rv = new RenderNode(node);
+        this.childNodes.push(rv);
+        return rv;
+      },
+      sync: function(opt_added) {
+        if (this.skip) return;
+        var nodeWrapper = this.node;
+        var newChildren = this.childNodes;
+        var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
+        var added = opt_added || new WeakMap();
+        var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
+        var newIndex = 0, oldIndex = 0;
+        var lastIndex = 0;
+        for (var i = 0; i < splices.length; i++) {
+          var splice = splices[i];
+          for (;lastIndex < splice.index; lastIndex++) {
+            oldIndex++;
+            newChildren[newIndex++].sync(added);
+          }
+          var removedCount = splice.removed.length;
+          for (var j = 0; j < removedCount; j++) {
+            var wrapper = wrap(oldChildren[oldIndex++]);
+            if (!added.get(wrapper)) remove(wrapper);
+          }
+          var addedCount = splice.addedCount;
+          var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
+          for (var j = 0; j < addedCount; j++) {
+            var newChildRenderNode = newChildren[newIndex++];
+            var newChildWrapper = newChildRenderNode.node;
+            insertBefore(nodeWrapper, newChildWrapper, refNode);
+            added.set(newChildWrapper, true);
+            newChildRenderNode.sync(added);
+          }
+          lastIndex += addedCount;
+        }
+        for (var i = lastIndex; i < newChildren.length; i++) {
+          newChildren[i].sync(added);
+        }
+      }
+    };
+    function ShadowRenderer(host) {
+      this.host = host;
+      this.dirty = false;
+      this.invalidateAttributes();
+      this.associateNode(host);
+    }
+    ShadowRenderer.prototype = {
+      render: function(opt_renderNode) {
+        if (!this.dirty) return;
+        this.invalidateAttributes();
+        var host = this.host;
+        this.distribution(host);
+        var renderNode = opt_renderNode || new RenderNode(host);
+        this.buildRenderTree(renderNode, host);
+        var topMostRenderer = !opt_renderNode;
+        if (topMostRenderer) renderNode.sync();
+        this.dirty = false;
+      },
+      get parentRenderer() {
+        return getTreeScope(this.host).renderer;
+      },
+      invalidate: function() {
+        if (!this.dirty) {
+          this.dirty = true;
+          var parentRenderer = this.parentRenderer;
+          if (parentRenderer) parentRenderer.invalidate();
+          pendingDirtyRenderers.push(this);
+          if (renderTimer) return;
+          renderTimer = window[request](handleRequestAnimationFrame, 0);
+        }
+      },
+      distribution: function(root) {
+        this.resetAllSubtrees(root);
+        this.distributionResolution(root);
+      },
+      resetAll: function(node) {
+        if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);
+        this.resetAllSubtrees(node);
+      },
+      resetAllSubtrees: function(node) {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.resetAll(child);
+        }
+        if (node.shadowRoot) this.resetAll(node.shadowRoot);
+        if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);
+      },
+      distributionResolution: function(node) {
+        if (isShadowHost(node)) {
+          var shadowHost = node;
+          var pool = poolPopulation(shadowHost);
+          var shadowTrees = getShadowTrees(shadowHost);
+          for (var i = 0; i < shadowTrees.length; i++) {
+            this.poolDistribution(shadowTrees[i], pool);
+          }
+          for (var i = shadowTrees.length - 1; i >= 0; i--) {
+            var shadowTree = shadowTrees[i];
+            var shadow = getShadowInsertionPoint(shadowTree);
+            if (shadow) {
+              var olderShadowRoot = shadowTree.olderShadowRoot;
+              if (olderShadowRoot) {
+                pool = poolPopulation(olderShadowRoot);
+              }
+              for (var j = 0; j < pool.length; j++) {
+                destributeNodeInto(pool[j], shadow);
+              }
+            }
+            this.distributionResolution(shadowTree);
+          }
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.distributionResolution(child);
+        }
+      },
+      poolDistribution: function(node, pool) {
+        if (node instanceof HTMLShadowElement) return;
+        if (node instanceof HTMLContentElement) {
+          var content = node;
+          this.updateDependentAttributes(content.getAttribute("select"));
+          var anyDistributed = false;
+          for (var i = 0; i < pool.length; i++) {
+            var node = pool[i];
+            if (!node) continue;
+            if (matches(node, content)) {
+              destributeNodeInto(node, content);
+              pool[i] = undefined;
+              anyDistributed = true;
+            }
+          }
+          if (!anyDistributed) {
+            for (var child = content.firstChild; child; child = child.nextSibling) {
+              destributeNodeInto(child, content);
+            }
+          }
+          return;
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.poolDistribution(child, pool);
+        }
+      },
+      buildRenderTree: function(renderNode, node) {
+        var children = this.compose(node);
+        for (var i = 0; i < children.length; i++) {
+          var child = children[i];
+          var childRenderNode = renderNode.append(child);
+          this.buildRenderTree(childRenderNode, child);
+        }
+        if (isShadowHost(node)) {
+          var renderer = getRendererForHost(node);
+          renderer.dirty = false;
+        }
+      },
+      compose: function(node) {
+        var children = [];
+        var p = node.shadowRoot || node;
+        for (var child = p.firstChild; child; child = child.nextSibling) {
+          if (isInsertionPoint(child)) {
+            this.associateNode(p);
+            var distributedNodes = getDistributedNodes(child);
+            for (var j = 0; j < distributedNodes.length; j++) {
+              var distributedNode = distributedNodes[j];
+              if (isFinalDestination(child, distributedNode)) children.push(distributedNode);
+            }
+          } else {
+            children.push(child);
+          }
+        }
+        return children;
+      },
+      invalidateAttributes: function() {
+        this.attributes = Object.create(null);
+      },
+      updateDependentAttributes: function(selector) {
+        if (!selector) return;
+        var attributes = this.attributes;
+        if (/\.\w+/.test(selector)) attributes["class"] = true;
+        if (/#\w+/.test(selector)) attributes["id"] = true;
+        selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
+          attributes[name] = true;
+        });
+      },
+      dependsOnAttribute: function(name) {
+        return this.attributes[name];
+      },
+      associateNode: function(node) {
+        unsafeUnwrap(node).polymerShadowRenderer_ = this;
+      }
+    };
+    function poolPopulation(node) {
+      var pool = [];
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        if (isInsertionPoint(child)) {
+          pool.push.apply(pool, getDistributedNodes(child));
+        } else {
+          pool.push(child);
+        }
+      }
+      return pool;
+    }
+    function getShadowInsertionPoint(node) {
+      if (node instanceof HTMLShadowElement) return node;
+      if (node instanceof HTMLContentElement) return null;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        var res = getShadowInsertionPoint(child);
+        if (res) return res;
+      }
+      return null;
+    }
+    function destributeNodeInto(child, insertionPoint) {
+      getDistributedNodes(insertionPoint).push(child);
+      var points = destinationInsertionPointsTable.get(child);
+      if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);
+    }
+    function getDestinationInsertionPoints(node) {
+      return destinationInsertionPointsTable.get(node);
+    }
+    function resetDestinationInsertionPoints(node) {
+      destinationInsertionPointsTable.set(node, undefined);
+    }
+    var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
+    function matches(node, contentElement) {
+      var select = contentElement.getAttribute("select");
+      if (!select) return true;
+      select = select.trim();
+      if (!select) return true;
+      if (!(node instanceof Element)) return false;
+      if (!selectorStartCharRe.test(select)) return false;
+      try {
+        return node.matches(select);
+      } catch (ex) {
+        return false;
+      }
+    }
+    function isFinalDestination(insertionPoint, node) {
+      var points = getDestinationInsertionPoints(node);
+      return points && points[points.length - 1] === insertionPoint;
+    }
+    function isInsertionPoint(node) {
+      return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;
+    }
+    function isShadowHost(shadowHost) {
+      return shadowHost.shadowRoot;
+    }
+    function getShadowTrees(host) {
+      var trees = [];
+      for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
+        trees.push(tree);
+      }
+      return trees;
+    }
+    function render(host) {
+      new ShadowRenderer(host).render();
+    }
+    Node.prototype.invalidateShadowRenderer = function(force) {
+      var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
+      if (renderer) {
+        renderer.invalidate();
+        return true;
+      }
+      return false;
+    };
+    HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {
+      renderAllPending();
+      return getDistributedNodes(this);
+    };
+    Element.prototype.getDestinationInsertionPoints = function() {
+      renderAllPending();
+      return getDestinationInsertionPoints(this) || [];
+    };
+    HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {
+      this.invalidateShadowRenderer();
+      var shadowRoot = getShadowRootAncestor(this);
+      var renderer;
+      if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);
+      unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
+      if (renderer) renderer.invalidate();
+    };
+    scope.getRendererForHost = getRendererForHost;
+    scope.getShadowTrees = getShadowTrees;
+    scope.renderAllPending = renderAllPending;
+    scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
+    scope.visual = {
+      insertBefore: insertBefore,
+      remove: remove
+    };
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var assert = scope.assert;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ];
+    function createWrapperConstructor(name) {
+      if (!window[name]) return;
+      assert(!scope.wrappers[name]);
+      var GeneratedWrapper = function(node) {
+        HTMLElement.call(this, node);
+      };
+      GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
+      mixin(GeneratedWrapper.prototype, {
+        get form() {
+          return wrap(unwrap(this).form);
+        }
+      });
+      registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));
+      scope.wrappers[name] = GeneratedWrapper;
+    }
+    elementsWithFormProperty.forEach(createWrapperConstructor);
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalSelection = window.Selection;
+    function Selection(impl) {
+      setWrapper(impl, this);
+    }
+    Selection.prototype = {
+      get anchorNode() {
+        return wrap(unsafeUnwrap(this).anchorNode);
+      },
+      get focusNode() {
+        return wrap(unsafeUnwrap(this).focusNode);
+      },
+      addRange: function(range) {
+        unsafeUnwrap(this).addRange(unwrap(range));
+      },
+      collapse: function(node, index) {
+        unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
+      },
+      containsNode: function(node, allowPartial) {
+        return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
+      },
+      extend: function(node, offset) {
+        unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
+      },
+      getRangeAt: function(index) {
+        return wrap(unsafeUnwrap(this).getRangeAt(index));
+      },
+      removeRange: function(range) {
+        unsafeUnwrap(this).removeRange(unwrap(range));
+      },
+      selectAllChildren: function(node) {
+        unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    registerWrapper(window.Selection, Selection, window.getSelection());
+    scope.wrappers.Selection = Selection;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var Node = scope.wrappers.Node;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var Selection = scope.wrappers.Selection;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var ShadowRoot = scope.wrappers.ShadowRoot;
+    var TreeScope = scope.TreeScope;
+    var cloneNode = scope.cloneNode;
+    var defineWrapGetter = scope.defineWrapGetter;
+    var elementFromPoint = scope.elementFromPoint;
+    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+    var matchesNames = scope.matchesNames;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var renderAllPending = scope.renderAllPending;
+    var rewrap = scope.rewrap;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrapEventTargetMethods = scope.wrapEventTargetMethods;
+    var wrapNodeList = scope.wrapNodeList;
+    var implementationTable = new WeakMap();
+    function Document(node) {
+      Node.call(this, node);
+      this.treeScope_ = new TreeScope(this, null);
+    }
+    Document.prototype = Object.create(Node.prototype);
+    defineWrapGetter(Document, "documentElement");
+    defineWrapGetter(Document, "body");
+    defineWrapGetter(Document, "head");
+    function wrapMethod(name) {
+      var original = document[name];
+      Document.prototype[name] = function() {
+        return wrap(original.apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "getElementById" ].forEach(wrapMethod);
+    var originalAdoptNode = document.adoptNode;
+    function adoptNodeNoRemove(node, doc) {
+      originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
+      adoptSubtree(node, doc);
+    }
+    function adoptSubtree(node, doc) {
+      if (node.shadowRoot) doc.adoptNode(node.shadowRoot);
+      if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        adoptSubtree(child, doc);
+      }
+    }
+    function adoptOlderShadowRoots(shadowRoot, doc) {
+      var oldShadowRoot = shadowRoot.olderShadowRoot;
+      if (oldShadowRoot) doc.adoptNode(oldShadowRoot);
+    }
+    var originalGetSelection = document.getSelection;
+    mixin(Document.prototype, {
+      adoptNode: function(node) {
+        if (node.parentNode) node.parentNode.removeChild(node);
+        adoptNodeNoRemove(node, this);
+        return node;
+      },
+      elementFromPoint: function(x, y) {
+        return elementFromPoint(this, this, x, y);
+      },
+      importNode: function(node, deep) {
+        return cloneNode(node, deep, unsafeUnwrap(this));
+      },
+      getSelection: function() {
+        renderAllPending();
+        return new Selection(originalGetSelection.call(unwrap(this)));
+      },
+      getElementsByName: function(name) {
+        return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]");
+      }
+    });
+    if (document.registerElement) {
+      var originalRegisterElement = document.registerElement;
+      Document.prototype.registerElement = function(tagName, object) {
+        var prototype, extendsOption;
+        if (object !== undefined) {
+          prototype = object.prototype;
+          extendsOption = object.extends;
+        }
+        if (!prototype) prototype = Object.create(HTMLElement.prototype);
+        if (scope.nativePrototypeTable.get(prototype)) {
+          throw new Error("NotSupportedError");
+        }
+        var proto = Object.getPrototypeOf(prototype);
+        var nativePrototype;
+        var prototypes = [];
+        while (proto) {
+          nativePrototype = scope.nativePrototypeTable.get(proto);
+          if (nativePrototype) break;
+          prototypes.push(proto);
+          proto = Object.getPrototypeOf(proto);
+        }
+        if (!nativePrototype) {
+          throw new Error("NotSupportedError");
+        }
+        var newPrototype = Object.create(nativePrototype);
+        for (var i = prototypes.length - 1; i >= 0; i--) {
+          newPrototype = Object.create(newPrototype);
+        }
+        [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) {
+          var f = prototype[name];
+          if (!f) return;
+          newPrototype[name] = function() {
+            if (!(wrap(this) instanceof CustomElementConstructor)) {
+              rewrap(this);
+            }
+            f.apply(wrap(this), arguments);
+          };
+        });
+        var p = {
+          prototype: newPrototype
+        };
+        if (extendsOption) p.extends = extendsOption;
+        function CustomElementConstructor(node) {
+          if (!node) {
+            if (extendsOption) {
+              return document.createElement(extendsOption, tagName);
+            } else {
+              return document.createElement(tagName);
+            }
+          }
+          setWrapper(node, this);
+        }
+        CustomElementConstructor.prototype = prototype;
+        CustomElementConstructor.prototype.constructor = CustomElementConstructor;
+        scope.constructorTable.set(newPrototype, CustomElementConstructor);
+        scope.nativePrototypeTable.set(prototype, newPrototype);
+        var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);
+        return CustomElementConstructor;
+      };
+      forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]);
+    }
+    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ].concat(matchesNames));
+    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]);
+    mixin(Document.prototype, GetElementsByInterface);
+    mixin(Document.prototype, ParentNodeInterface);
+    mixin(Document.prototype, SelectorsInterface);
+    mixin(Document.prototype, {
+      get implementation() {
+        var implementation = implementationTable.get(this);
+        if (implementation) return implementation;
+        implementation = new DOMImplementation(unwrap(this).implementation);
+        implementationTable.set(this, implementation);
+        return implementation;
+      },
+      get defaultView() {
+        return wrap(unwrap(this).defaultView);
+      }
+    });
+    registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(""));
+    if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);
+    wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);
+    function DOMImplementation(impl) {
+      setWrapper(impl, this);
+    }
+    function wrapImplMethod(constructor, name) {
+      var original = document.implementation[name];
+      constructor.prototype[name] = function() {
+        return wrap(original.apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    function forwardImplMethod(constructor, name) {
+      var original = document.implementation[name];
+      constructor.prototype[name] = function() {
+        return original.apply(unsafeUnwrap(this), arguments);
+      };
+    }
+    wrapImplMethod(DOMImplementation, "createDocumentType");
+    wrapImplMethod(DOMImplementation, "createDocument");
+    wrapImplMethod(DOMImplementation, "createHTMLDocument");
+    forwardImplMethod(DOMImplementation, "hasFeature");
+    registerWrapper(window.DOMImplementation, DOMImplementation);
+    forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocumentType", "createDocument", "createHTMLDocument", "hasFeature" ]);
+    scope.adoptNodeNoRemove = adoptNodeNoRemove;
+    scope.wrappers.DOMImplementation = DOMImplementation;
+    scope.wrappers.Document = Document;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var Selection = scope.wrappers.Selection;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var renderAllPending = scope.renderAllPending;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalWindow = window.Window;
+    var originalGetComputedStyle = window.getComputedStyle;
+    var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
+    var originalGetSelection = window.getSelection;
+    function Window(impl) {
+      EventTarget.call(this, impl);
+    }
+    Window.prototype = Object.create(EventTarget.prototype);
+    OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
+      return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
+    };
+    if (originalGetDefaultComputedStyle) {
+      OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
+        return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);
+      };
+    }
+    OriginalWindow.prototype.getSelection = function() {
+      return wrap(this || window).getSelection();
+    };
+    delete window.getComputedStyle;
+    delete window.getDefaultComputedStyle;
+    delete window.getSelection;
+    [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) {
+      OriginalWindow.prototype[name] = function() {
+        var w = wrap(this || window);
+        return w[name].apply(w, arguments);
+      };
+      delete window[name];
+    });
+    mixin(Window.prototype, {
+      getComputedStyle: function(el, pseudo) {
+        renderAllPending();
+        return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
+      },
+      getSelection: function() {
+        renderAllPending();
+        return new Selection(originalGetSelection.call(unwrap(this)));
+      },
+      get document() {
+        return wrap(unwrap(this).document);
+      }
+    });
+    if (originalGetDefaultComputedStyle) {
+      Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
+        renderAllPending();
+        return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
+      };
+    }
+    registerWrapper(OriginalWindow, Window, window);
+    scope.wrappers.Window = Window;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unwrap = scope.unwrap;
+    var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
+    var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;
+    if (OriginalDataTransferSetDragImage) {
+      OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
+        OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
+      };
+    }
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unwrap = scope.unwrap;
+    var OriginalFormData = window.FormData;
+    if (!OriginalFormData) return;
+    function FormData(formElement) {
+      var impl;
+      if (formElement instanceof OriginalFormData) {
+        impl = formElement;
+      } else {
+        impl = new OriginalFormData(formElement && unwrap(formElement));
+      }
+      setWrapper(impl, this);
+    }
+    registerWrapper(OriginalFormData, FormData, new OriginalFormData());
+    scope.wrappers.FormData = FormData;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var originalSend = XMLHttpRequest.prototype.send;
+    XMLHttpRequest.prototype.send = function(obj) {
+      return originalSend.call(this, unwrapIfNeeded(obj));
+    };
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var isWrapperFor = scope.isWrapperFor;
+    var elements = {
+      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"
+    };
+    function overrideConstructor(tagName) {
+      var nativeConstructorName = elements[tagName];
+      var nativeConstructor = window[nativeConstructorName];
+      if (!nativeConstructor) return;
+      var element = document.createElement(tagName);
+      var wrapperConstructor = element.constructor;
+      window[nativeConstructorName] = wrapperConstructor;
+    }
+    Object.keys(elements).forEach(overrideConstructor);
+    Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
+      window[name] = scope.wrappers[name];
+    });
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    var ShadowCSS = {
+      strictStyling: false,
+      registry: {},
+      shimStyling: function(root, name, extendsName) {
+        var scopeStyles = this.prepareRoot(root, name, extendsName);
+        var typeExtension = this.isTypeExtension(extendsName);
+        var scopeSelector = this.makeScopeSelector(name, typeExtension);
+        var cssText = stylesToCssText(scopeStyles, true);
+        cssText = this.scopeCssText(cssText, scopeSelector);
+        if (root) {
+          root.shimmedStyle = cssText;
+        }
+        this.addCssToDocument(cssText, name);
+      },
+      shimStyle: function(style, selector) {
+        return this.shimCssText(style.textContent, selector);
+      },
+      shimCssText: function(cssText, selector) {
+        cssText = this.insertDirectives(cssText);
+        return this.scopeCssText(cssText, selector);
+      },
+      makeScopeSelector: function(name, typeExtension) {
+        if (name) {
+          return typeExtension ? "[is=" + name + "]" : name;
+        }
+        return "";
+      },
+      isTypeExtension: function(extendsName) {
+        return extendsName && extendsName.indexOf("-") < 0;
+      },
+      prepareRoot: function(root, name, extendsName) {
+        var def = this.registerRoot(root, name, extendsName);
+        this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
+        this.removeStyles(root, def.rootStyles);
+        if (this.strictStyling) {
+          this.applyScopeToContent(root, name);
+        }
+        return def.scopeStyles;
+      },
+      removeStyles: function(root, styles) {
+        for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
+          s.parentNode.removeChild(s);
+        }
+      },
+      registerRoot: function(root, name, extendsName) {
+        var def = this.registry[name] = {
+          root: root,
+          name: name,
+          extendsName: extendsName
+        };
+        var styles = this.findStyles(root);
+        def.rootStyles = styles;
+        def.scopeStyles = def.rootStyles;
+        var extendee = this.registry[def.extendsName];
+        if (extendee) {
+          def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
+        }
+        return def;
+      },
+      findStyles: function(root) {
+        if (!root) {
+          return [];
+        }
+        var styles = root.querySelectorAll("style");
+        return Array.prototype.filter.call(styles, function(s) {
+          return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
+        });
+      },
+      applyScopeToContent: function(root, name) {
+        if (root) {
+          Array.prototype.forEach.call(root.querySelectorAll("*"), function(node) {
+            node.setAttribute(name, "");
+          });
+          Array.prototype.forEach.call(root.querySelectorAll("template"), function(template) {
+            this.applyScopeToContent(template.content, name);
+          }, this);
+        }
+      },
+      insertDirectives: function(cssText) {
+        cssText = this.insertPolyfillDirectivesInCssText(cssText);
+        return this.insertPolyfillRulesInCssText(cssText);
+      },
+      insertPolyfillDirectivesInCssText: function(cssText) {
+        cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
+          return p1.slice(0, -2) + "{";
+        });
+        return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
+          return p1 + " {";
+        });
+      },
+      insertPolyfillRulesInCssText: function(cssText) {
+        cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
+          return p1.slice(0, -1);
+        });
+        return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
+          var rule = match.replace(p1, "").replace(p2, "");
+          return p3 + rule;
+        });
+      },
+      scopeCssText: function(cssText, scopeSelector) {
+        var unscoped = this.extractUnscopedRulesFromCssText(cssText);
+        cssText = this.insertPolyfillHostInCssText(cssText);
+        cssText = this.convertColonHost(cssText);
+        cssText = this.convertColonHostContext(cssText);
+        cssText = this.convertShadowDOMSelectors(cssText);
+        if (scopeSelector) {
+          var self = this, cssText;
+          withCssRules(cssText, function(rules) {
+            cssText = self.scopeRules(rules, scopeSelector);
+          });
+        }
+        cssText = cssText + "\n" + unscoped;
+        return cssText.trim();
+      },
+      extractUnscopedRulesFromCssText: function(cssText) {
+        var r = "", m;
+        while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
+          r += m[1].slice(0, -1) + "\n\n";
+        }
+        while (m = cssContentUnscopedRuleRe.exec(cssText)) {
+          r += m[0].replace(m[2], "").replace(m[1], m[3]) + "\n\n";
+        }
+        return r;
+      },
+      convertColonHost: function(cssText) {
+        return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer);
+      },
+      convertColonHostContext: function(cssText) {
+        return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer);
+      },
+      convertColonRule: function(cssText, regExp, partReplacer) {
+        return cssText.replace(regExp, function(m, p1, p2, p3) {
+          p1 = polyfillHostNoCombinator;
+          if (p2) {
+            var parts = p2.split(","), r = [];
+            for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) {
+              p = p.trim();
+              r.push(partReplacer(p1, p, p3));
+            }
+            return r.join(",");
+          } else {
+            return p1 + p3;
+          }
+        });
+      },
+      colonHostContextPartReplacer: function(host, part, suffix) {
+        if (part.match(polyfillHost)) {
+          return this.colonHostPartReplacer(host, part, suffix);
+        } else {
+          return host + part + suffix + ", " + part + " " + host + suffix;
+        }
+      },
+      colonHostPartReplacer: function(host, part, suffix) {
+        return host + part.replace(polyfillHost, "") + suffix;
+      },
+      convertShadowDOMSelectors: function(cssText) {
+        for (var i = 0; i < shadowDOMSelectorsRe.length; i++) {
+          cssText = cssText.replace(shadowDOMSelectorsRe[i], " ");
+        }
+        return cssText;
+      },
+      scopeRules: function(cssRules, scopeSelector) {
+        var cssText = "";
+        if (cssRules) {
+          Array.prototype.forEach.call(cssRules, function(rule) {
+            if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
+              cssText += this.scopeSelector(rule.selectorText, scopeSelector, this.strictStyling) + " {\n	";
+              cssText += this.propertiesFromRule(rule) + "\n}\n\n";
+            } else if (rule.type === CSSRule.MEDIA_RULE) {
+              cssText += "@media " + rule.media.mediaText + " {\n";
+              cssText += this.scopeRules(rule.cssRules, scopeSelector);
+              cssText += "\n}\n\n";
+            } else {
+              try {
+                if (rule.cssText) {
+                  cssText += rule.cssText + "\n\n";
+                }
+              } catch (x) {
+                if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {
+                  cssText += this.ieSafeCssTextFromKeyFrameRule(rule);
+                }
+              }
+            }
+          }, this);
+        }
+        return cssText;
+      },
+      ieSafeCssTextFromKeyFrameRule: function(rule) {
+        var cssText = "@keyframes " + rule.name + " {";
+        Array.prototype.forEach.call(rule.cssRules, function(rule) {
+          cssText += " " + rule.keyText + " {" + rule.style.cssText + "}";
+        });
+        cssText += " }";
+        return cssText;
+      },
+      scopeSelector: function(selector, scopeSelector, strict) {
+        var r = [], parts = selector.split(",");
+        parts.forEach(function(p) {
+          p = p.trim();
+          if (this.selectorNeedsScoping(p, scopeSelector)) {
+            p = strict && !p.match(polyfillHostNoCombinator) ? this.applyStrictSelectorScope(p, scopeSelector) : this.applySelectorScope(p, scopeSelector);
+          }
+          r.push(p);
+        }, this);
+        return r.join(", ");
+      },
+      selectorNeedsScoping: function(selector, scopeSelector) {
+        if (Array.isArray(scopeSelector)) {
+          return true;
+        }
+        var re = this.makeScopeMatcher(scopeSelector);
+        return !selector.match(re);
+      },
+      makeScopeMatcher: function(scopeSelector) {
+        scopeSelector = scopeSelector.replace(/\[/g, "\\[").replace(/\[/g, "\\]");
+        return new RegExp("^(" + scopeSelector + ")" + selectorReSuffix, "m");
+      },
+      applySelectorScope: function(selector, selectorScope) {
+        return Array.isArray(selectorScope) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope);
+      },
+      applySelectorScopeList: function(selector, scopeSelectorList) {
+        var r = [];
+        for (var i = 0, s; s = scopeSelectorList[i]; i++) {
+          r.push(this.applySimpleSelectorScope(selector, s));
+        }
+        return r.join(", ");
+      },
+      applySimpleSelectorScope: function(selector, scopeSelector) {
+        if (selector.match(polyfillHostRe)) {
+          selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
+          return selector.replace(polyfillHostRe, scopeSelector + " ");
+        } else {
+          return scopeSelector + " " + selector;
+        }
+      },
+      applyStrictSelectorScope: function(selector, scopeSelector) {
+        scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, "$1");
+        var splits = [ " ", ">", "+", "~" ], scoped = selector, attrName = "[" + scopeSelector + "]";
+        splits.forEach(function(sep) {
+          var parts = scoped.split(sep);
+          scoped = parts.map(function(p) {
+            var t = p.trim().replace(polyfillHostRe, "");
+            if (t && splits.indexOf(t) < 0 && t.indexOf(attrName) < 0) {
+              p = t.replace(/([^:]*)(:*)(.*)/, "$1" + attrName + "$2$3");
+            }
+            return p;
+          }).join(sep);
+        });
+        return scoped;
+      },
+      insertPolyfillHostInCssText: function(selector) {
+        return selector.replace(colonHostContextRe, polyfillHostContext).replace(colonHostRe, polyfillHost);
+      },
+      propertiesFromRule: function(rule) {
+        var cssText = rule.style.cssText;
+        if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
+          cssText = cssText.replace(/content:[^;]*;/g, "content: '" + rule.style.content + "';");
+        }
+        var style = rule.style;
+        for (var i in style) {
+          if (style[i] === "initial") {
+            cssText += i + ": initial; ";
+          }
+        }
+        return cssText;
+      },
+      replaceTextInStyles: function(styles, action) {
+        if (styles && action) {
+          if (!(styles instanceof Array)) {
+            styles = [ styles ];
+          }
+          Array.prototype.forEach.call(styles, function(s) {
+            s.textContent = action.call(this, s.textContent);
+          }, this);
+        }
+      },
+      addCssToDocument: function(cssText, name) {
+        if (cssText.match("@import")) {
+          addOwnSheet(cssText, name);
+        } else {
+          addCssToDocument(cssText);
+        }
+      }
+    };
+    var selectorRe = /([^{]*)({[\s\S]*?})/gim, cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\s{,(]*)/gim, cssPartRe = /::part\(([^)]*)\)/gim, polyfillHost = "-shadowcsshost", polyfillHostContext = "-shadowcsscontext", parenSuffix = ")(?:\\((" + "(?:\\([^)(]*\\)|[^)(]*)+?" + ")\\))?([^,{]*)";
+    var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ /\^\^/g, /\^/g, /\/shadow\//g, /\/shadow-deep\//g, /::shadow/g, /\/deep\//g, /::content/g ];
+    function stylesToCssText(styles, preserveComments) {
+      var cssText = "";
+      Array.prototype.forEach.call(styles, function(s) {
+        cssText += s.textContent + "\n\n";
+      });
+      if (!preserveComments) {
+        cssText = cssText.replace(cssCommentRe, "");
+      }
+      return cssText;
+    }
+    function cssTextToStyle(cssText) {
+      var style = document.createElement("style");
+      style.textContent = cssText;
+      return style;
+    }
+    function cssToRules(cssText) {
+      var style = cssTextToStyle(cssText);
+      document.head.appendChild(style);
+      var rules = [];
+      if (style.sheet) {
+        try {
+          rules = style.sheet.cssRules;
+        } catch (e) {}
+      } else {
+        console.warn("sheet not found", style);
+      }
+      style.parentNode.removeChild(style);
+      return rules;
+    }
+    var frame = document.createElement("iframe");
+    frame.style.display = "none";
+    function initFrame() {
+      frame.initialized = true;
+      document.body.appendChild(frame);
+      var doc = frame.contentDocument;
+      var base = doc.createElement("base");
+      base.href = document.baseURI;
+      doc.head.appendChild(base);
+    }
+    function inFrame(fn) {
+      if (!frame.initialized) {
+        initFrame();
+      }
+      document.body.appendChild(frame);
+      fn(frame.contentDocument);
+      document.body.removeChild(frame);
+    }
+    var isChrome = navigator.userAgent.match("Chrome");
+    function withCssRules(cssText, callback) {
+      if (!callback) {
+        return;
+      }
+      var rules;
+      if (cssText.match("@import") && isChrome) {
+        var style = cssTextToStyle(cssText);
+        inFrame(function(doc) {
+          doc.head.appendChild(style.impl);
+          rules = Array.prototype.slice.call(style.sheet.cssRules, 0);
+          callback(rules);
+        });
+      } else {
+        rules = cssToRules(cssText);
+        callback(rules);
+      }
+    }
+    function rulesToCss(cssRules) {
+      for (var i = 0, css = []; i < cssRules.length; i++) {
+        css.push(cssRules[i].cssText);
+      }
+      return css.join("\n\n");
+    }
+    function addCssToDocument(cssText) {
+      if (cssText) {
+        getSheet().appendChild(document.createTextNode(cssText));
+      }
+    }
+    function addOwnSheet(cssText, name) {
+      var style = cssTextToStyle(cssText);
+      style.setAttribute(name, "");
+      style.setAttribute(SHIMMED_ATTRIBUTE, "");
+      document.head.appendChild(style);
+    }
+    var SHIM_ATTRIBUTE = "shim-shadowdom";
+    var SHIMMED_ATTRIBUTE = "shim-shadowdom-css";
+    var NO_SHIM_ATTRIBUTE = "no-shim";
+    var sheet;
+    function getSheet() {
+      if (!sheet) {
+        sheet = document.createElement("style");
+        sheet.setAttribute(SHIMMED_ATTRIBUTE, "");
+        sheet[SHIMMED_ATTRIBUTE] = true;
+      }
+      return sheet;
+    }
+    if (window.ShadowDOMPolyfill) {
+      addCssToDocument("style { display: none !important; }\n");
+      var doc = ShadowDOMPolyfill.wrap(document);
+      var head = doc.querySelector("head");
+      head.insertBefore(getSheet(), head.childNodes[0]);
+      document.addEventListener("DOMContentLoaded", function() {
+        var urlResolver = scope.urlResolver;
+        if (window.HTMLImports && !HTMLImports.useNative) {
+          var SHIM_SHEET_SELECTOR = "link[rel=stylesheet]" + "[" + SHIM_ATTRIBUTE + "]";
+          var SHIM_STYLE_SELECTOR = "style[" + SHIM_ATTRIBUTE + "]";
+          HTMLImports.importer.documentPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
+          HTMLImports.importer.importsPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
+          HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(",");
+          var originalParseGeneric = HTMLImports.parser.parseGeneric;
+          HTMLImports.parser.parseGeneric = function(elt) {
+            if (elt[SHIMMED_ATTRIBUTE]) {
+              return;
+            }
+            var style = elt.__importElement || elt;
+            if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
+              originalParseGeneric.call(this, elt);
+              return;
+            }
+            if (elt.__resource) {
+              style = elt.ownerDocument.createElement("style");
+              style.textContent = elt.__resource;
+            }
+            HTMLImports.path.resolveUrlsInStyle(style);
+            style.textContent = ShadowCSS.shimStyle(style);
+            style.removeAttribute(SHIM_ATTRIBUTE, "");
+            style.setAttribute(SHIMMED_ATTRIBUTE, "");
+            style[SHIMMED_ATTRIBUTE] = true;
+            if (style.parentNode !== head) {
+              if (elt.parentNode === head) {
+                head.replaceChild(style, elt);
+              } else {
+                this.addElementToDocument(style);
+              }
+            }
+            style.__importParsed = true;
+            this.markParsingComplete(elt);
+            this.parseNext();
+          };
+          var hasResource = HTMLImports.parser.hasResource;
+          HTMLImports.parser.hasResource = function(node) {
+            if (node.localName === "link" && node.rel === "stylesheet" && node.hasAttribute(SHIM_ATTRIBUTE)) {
+              return node.__resource;
+            } else {
+              return hasResource.call(this, node);
+            }
+          };
+        }
+      });
+    }
+    scope.ShadowCSS = ShadowCSS;
+  })(window.WebComponents);
+}
+
+(function(scope) {
+  if (window.ShadowDOMPolyfill) {
+    window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
+    window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
+  } else {
+    window.wrap = window.unwrap = function(n) {
+      return n;
+    };
+  }
+})(window.WebComponents);
+
+(function(global) {
+  var registrationsTable = new WeakMap();
+  var setImmediate;
+  if (/Trident/.test(navigator.userAgent)) {
+    setImmediate = setTimeout;
+  } else if (window.setImmediate) {
+    setImmediate = window.setImmediate;
+  } else {
+    var setImmediateQueue = [];
+    var sentinel = String(Math.random());
+    window.addEventListener("message", function(e) {
+      if (e.data === sentinel) {
+        var queue = setImmediateQueue;
+        setImmediateQueue = [];
+        queue.forEach(function(func) {
+          func();
+        });
+      }
+    });
+    setImmediate = function(func) {
+      setImmediateQueue.push(func);
+      window.postMessage(sentinel, "*");
+    };
+  }
+  var isScheduled = false;
+  var scheduledObservers = [];
+  function scheduleCallback(observer) {
+    scheduledObservers.push(observer);
+    if (!isScheduled) {
+      isScheduled = true;
+      setImmediate(dispatchCallbacks);
+    }
+  }
+  function wrapIfNeeded(node) {
+    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
+  }
+  function dispatchCallbacks() {
+    isScheduled = false;
+    var observers = scheduledObservers;
+    scheduledObservers = [];
+    observers.sort(function(o1, o2) {
+      return o1.uid_ - o2.uid_;
+    });
+    var anyNonEmpty = false;
+    observers.forEach(function(observer) {
+      var queue = observer.takeRecords();
+      removeTransientObserversFor(observer);
+      if (queue.length) {
+        observer.callback_(queue, observer);
+        anyNonEmpty = true;
+      }
+    });
+    if (anyNonEmpty) dispatchCallbacks();
+  }
+  function removeTransientObserversFor(observer) {
+    observer.nodes_.forEach(function(node) {
+      var registrations = registrationsTable.get(node);
+      if (!registrations) return;
+      registrations.forEach(function(registration) {
+        if (registration.observer === observer) registration.removeTransientObservers();
+      });
+    });
+  }
+  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
+    for (var node = target; node; node = node.parentNode) {
+      var registrations = registrationsTable.get(node);
+      if (registrations) {
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          var options = registration.options;
+          if (node !== target && !options.subtree) continue;
+          var record = callback(options);
+          if (record) registration.enqueue(record);
+        }
+      }
+    }
+  }
+  var uidCounter = 0;
+  function JsMutationObserver(callback) {
+    this.callback_ = callback;
+    this.nodes_ = [];
+    this.records_ = [];
+    this.uid_ = ++uidCounter;
+  }
+  JsMutationObserver.prototype = {
+    observe: function(target, options) {
+      target = wrapIfNeeded(target);
+      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
+        throw new SyntaxError();
+      }
+      var registrations = registrationsTable.get(target);
+      if (!registrations) registrationsTable.set(target, registrations = []);
+      var registration;
+      for (var i = 0; i < registrations.length; i++) {
+        if (registrations[i].observer === this) {
+          registration = registrations[i];
+          registration.removeListeners();
+          registration.options = options;
+          break;
+        }
+      }
+      if (!registration) {
+        registration = new Registration(this, target, options);
+        registrations.push(registration);
+        this.nodes_.push(target);
+      }
+      registration.addListeners();
+    },
+    disconnect: function() {
+      this.nodes_.forEach(function(node) {
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.observer === this) {
+            registration.removeListeners();
+            registrations.splice(i, 1);
+            break;
+          }
+        }
+      }, this);
+      this.records_ = [];
+    },
+    takeRecords: function() {
+      var copyOfRecords = this.records_;
+      this.records_ = [];
+      return copyOfRecords;
+    }
+  };
+  function MutationRecord(type, target) {
+    this.type = type;
+    this.target = target;
+    this.addedNodes = [];
+    this.removedNodes = [];
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.attributeName = null;
+    this.attributeNamespace = null;
+    this.oldValue = null;
+  }
+  function copyMutationRecord(original) {
+    var record = new MutationRecord(original.type, original.target);
+    record.addedNodes = original.addedNodes.slice();
+    record.removedNodes = original.removedNodes.slice();
+    record.previousSibling = original.previousSibling;
+    record.nextSibling = original.nextSibling;
+    record.attributeName = original.attributeName;
+    record.attributeNamespace = original.attributeNamespace;
+    record.oldValue = original.oldValue;
+    return record;
+  }
+  var currentRecord, recordWithOldValue;
+  function getRecord(type, target) {
+    return currentRecord = new MutationRecord(type, target);
+  }
+  function getRecordWithOldValue(oldValue) {
+    if (recordWithOldValue) return recordWithOldValue;
+    recordWithOldValue = copyMutationRecord(currentRecord);
+    recordWithOldValue.oldValue = oldValue;
+    return recordWithOldValue;
+  }
+  function clearRecords() {
+    currentRecord = recordWithOldValue = undefined;
+  }
+  function recordRepresentsCurrentMutation(record) {
+    return record === recordWithOldValue || record === currentRecord;
+  }
+  function selectRecord(lastRecord, newRecord) {
+    if (lastRecord === newRecord) return lastRecord;
+    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
+    return null;
+  }
+  function Registration(observer, target, options) {
+    this.observer = observer;
+    this.target = target;
+    this.options = options;
+    this.transientObservedNodes = [];
+  }
+  Registration.prototype = {
+    enqueue: function(record) {
+      var records = this.observer.records_;
+      var length = records.length;
+      if (records.length > 0) {
+        var lastRecord = records[length - 1];
+        var recordToReplaceLast = selectRecord(lastRecord, record);
+        if (recordToReplaceLast) {
+          records[length - 1] = recordToReplaceLast;
+          return;
+        }
+      } else {
+        scheduleCallback(this.observer);
+      }
+      records[length] = record;
+    },
+    addListeners: function() {
+      this.addListeners_(this.target);
+    },
+    addListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
+      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
+      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
+      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
+    },
+    removeListeners: function() {
+      this.removeListeners_(this.target);
+    },
+    removeListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
+      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
+      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
+      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
+    },
+    addTransientObserver: function(node) {
+      if (node === this.target) return;
+      this.addListeners_(node);
+      this.transientObservedNodes.push(node);
+      var registrations = registrationsTable.get(node);
+      if (!registrations) registrationsTable.set(node, registrations = []);
+      registrations.push(this);
+    },
+    removeTransientObservers: function() {
+      var transientObservedNodes = this.transientObservedNodes;
+      this.transientObservedNodes = [];
+      transientObservedNodes.forEach(function(node) {
+        this.removeListeners_(node);
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          if (registrations[i] === this) {
+            registrations.splice(i, 1);
+            break;
+          }
+        }
+      }, this);
+    },
+    handleEvent: function(e) {
+      e.stopImmediatePropagation();
+      switch (e.type) {
+       case "DOMAttrModified":
+        var name = e.attrName;
+        var namespace = e.relatedNode.namespaceURI;
+        var target = e.target;
+        var record = new getRecord("attributes", target);
+        record.attributeName = name;
+        record.attributeNamespace = namespace;
+        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.attributes) return;
+          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
+            return;
+          }
+          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
+          return record;
+        });
+        break;
+
+       case "DOMCharacterDataModified":
+        var target = e.target;
+        var record = getRecord("characterData", target);
+        var oldValue = e.prevValue;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.characterData) return;
+          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
+          return record;
+        });
+        break;
+
+       case "DOMNodeRemoved":
+        this.addTransientObserver(e.target);
+
+       case "DOMNodeInserted":
+        var target = e.relatedNode;
+        var changedNode = e.target;
+        var addedNodes, removedNodes;
+        if (e.type === "DOMNodeInserted") {
+          addedNodes = [ changedNode ];
+          removedNodes = [];
+        } else {
+          addedNodes = [];
+          removedNodes = [ changedNode ];
+        }
+        var previousSibling = changedNode.previousSibling;
+        var nextSibling = changedNode.nextSibling;
+        var record = getRecord("childList", target);
+        record.addedNodes = addedNodes;
+        record.removedNodes = removedNodes;
+        record.previousSibling = previousSibling;
+        record.nextSibling = nextSibling;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.childList) return;
+          return record;
+        });
+      }
+      clearRecords();
+    }
+  };
+  global.JsMutationObserver = JsMutationObserver;
+  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;
+})(this);
+
+window.HTMLImports = window.HTMLImports || {
+  flags: {}
+};
+
+(function(scope) {
+  var IMPORT_LINK_TYPE = "import";
+  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
+  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
+  var wrap = function(node) {
+    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
+  };
+  var rootDocument = wrap(document);
+  var currentScriptDescriptor = {
+    get: function() {
+      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
+      return wrap(script);
+    },
+    configurable: true
+  };
+  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
+  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
+  var isIE = /Trident/.test(navigator.userAgent);
+  function whenReady(callback, doc) {
+    doc = doc || rootDocument;
+    whenDocumentReady(function() {
+      watchImportsLoad(callback, doc);
+    }, doc);
+  }
+  var requiredReadyState = isIE ? "complete" : "interactive";
+  var READY_EVENT = "readystatechange";
+  function isDocumentReady(doc) {
+    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
+  }
+  function whenDocumentReady(callback, doc) {
+    if (!isDocumentReady(doc)) {
+      var checkReady = function() {
+        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
+          doc.removeEventListener(READY_EVENT, checkReady);
+          whenDocumentReady(callback, doc);
+        }
+      };
+      doc.addEventListener(READY_EVENT, checkReady);
+    } else if (callback) {
+      callback();
+    }
+  }
+  function markTargetLoaded(event) {
+    event.target.__loaded = true;
+  }
+  function watchImportsLoad(callback, doc) {
+    var imports = doc.querySelectorAll("link[rel=import]");
+    var loaded = 0, l = imports.length;
+    function checkDone(d) {
+      if (loaded == l && callback) {
+        callback();
+      }
+    }
+    function loadedImport(e) {
+      markTargetLoaded(e);
+      loaded++;
+      checkDone();
+    }
+    if (l) {
+      for (var i = 0, imp; i < l && (imp = imports[i]); i++) {
+        if (isImportLoaded(imp)) {
+          loadedImport.call(imp, {
+            target: imp
+          });
+        } else {
+          imp.addEventListener("load", loadedImport);
+          imp.addEventListener("error", loadedImport);
+        }
+      }
+    } else {
+      checkDone();
+    }
+  }
+  function isImportLoaded(link) {
+    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
+  }
+  if (useNative) {
+    new MutationObserver(function(mxns) {
+      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
+        if (m.addedNodes) {
+          handleImports(m.addedNodes);
+        }
+      }
+    }).observe(document.head, {
+      childList: true
+    });
+    function handleImports(nodes) {
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        if (isImport(n)) {
+          handleImport(n);
+        }
+      }
+    }
+    function isImport(element) {
+      return element.localName === "link" && element.rel === "import";
+    }
+    function handleImport(element) {
+      var loaded = element.import;
+      if (loaded) {
+        markTargetLoaded({
+          target: element
+        });
+      } else {
+        element.addEventListener("load", markTargetLoaded);
+        element.addEventListener("error", markTargetLoaded);
+      }
+    }
+    (function() {
+      if (document.readyState === "loading") {
+        var imports = document.querySelectorAll("link[rel=import]");
+        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
+          handleImport(imp);
+        }
+      }
+    })();
+  }
+  whenReady(function() {
+    HTMLImports.ready = true;
+    HTMLImports.readyTime = new Date().getTime();
+    rootDocument.dispatchEvent(new CustomEvent("HTMLImportsLoaded", {
+      bubbles: true
+    }));
+  });
+  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+  scope.useNative = useNative;
+  scope.rootDocument = rootDocument;
+  scope.whenReady = whenReady;
+  scope.isIE = isIE;
+})(HTMLImports);
+
+(function(scope) {
+  var modules = [];
+  var addModule = function(module) {
+    modules.push(module);
+  };
+  var initializeModules = function() {
+    modules.forEach(function(module) {
+      module(scope);
+    });
+  };
+  scope.addModule = addModule;
+  scope.initializeModules = initializeModules;
+})(HTMLImports);
+
+HTMLImports.addModule(function(scope) {
+  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+  var path = {
+    resolveUrlsInStyle: function(style) {
+      var doc = style.ownerDocument;
+      var resolver = doc.createElement("a");
+      style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
+      return style;
+    },
+    resolveUrlsInCssText: function(cssText, urlObj) {
+      var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
+      r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
+      return r;
+    },
+    replaceUrls: function(text, urlObj, regexp) {
+      return text.replace(regexp, function(m, pre, url, post) {
+        var urlPath = url.replace(/["']/g, "");
+        urlObj.href = urlPath;
+        urlPath = urlObj.href;
+        return pre + "'" + urlPath + "'" + post;
+      });
+    }
+  };
+  scope.path = path;
+});
+
+HTMLImports.addModule(function(scope) {
+  xhr = {
+    async: true,
+    ok: function(request) {
+      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
+    },
+    load: function(url, next, nextContext) {
+      var request = new XMLHttpRequest();
+      if (scope.flags.debug || scope.flags.bust) {
+        url += "?" + Math.random();
+      }
+      request.open("GET", url, xhr.async);
+      request.addEventListener("readystatechange", function(e) {
+        if (request.readyState === 4) {
+          var locationHeader = request.getResponseHeader("Location");
+          var redirectedUrl = null;
+          if (locationHeader) {
+            var redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
+          }
+          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
+        }
+      });
+      request.send();
+      return request;
+    },
+    loadDocument: function(url, next, nextContext) {
+      this.load(url, next, nextContext).responseType = "document";
+    }
+  };
+  scope.xhr = xhr;
+});
+
+HTMLImports.addModule(function(scope) {
+  var xhr = scope.xhr;
+  var flags = scope.flags;
+  var Loader = function(onLoad, onComplete) {
+    this.cache = {};
+    this.onload = onLoad;
+    this.oncomplete = onComplete;
+    this.inflight = 0;
+    this.pending = {};
+  };
+  Loader.prototype = {
+    addNodes: function(nodes) {
+      this.inflight += nodes.length;
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        this.require(n);
+      }
+      this.checkDone();
+    },
+    addNode: function(node) {
+      this.inflight++;
+      this.require(node);
+      this.checkDone();
+    },
+    require: function(elt) {
+      var url = elt.src || elt.href;
+      elt.__nodeUrl = url;
+      if (!this.dedupe(url, elt)) {
+        this.fetch(url, elt);
+      }
+    },
+    dedupe: function(url, elt) {
+      if (this.pending[url]) {
+        this.pending[url].push(elt);
+        return true;
+      }
+      var resource;
+      if (this.cache[url]) {
+        this.onload(url, elt, this.cache[url]);
+        this.tail();
+        return true;
+      }
+      this.pending[url] = [ elt ];
+      return false;
+    },
+    fetch: function(url, elt) {
+      flags.load && console.log("fetch", url, elt);
+      if (url.match(/^data:/)) {
+        var pieces = url.split(",");
+        var header = pieces[0];
+        var body = pieces[1];
+        if (header.indexOf(";base64") > -1) {
+          body = atob(body);
+        } else {
+          body = decodeURIComponent(body);
+        }
+        setTimeout(function() {
+          this.receive(url, elt, null, body);
+        }.bind(this), 0);
+      } else {
+        var receiveXhr = function(err, resource, redirectedUrl) {
+          this.receive(url, elt, err, resource, redirectedUrl);
+        }.bind(this);
+        xhr.load(url, receiveXhr);
+      }
+    },
+    receive: function(url, elt, err, resource, redirectedUrl) {
+      this.cache[url] = resource;
+      var $p = this.pending[url];
+      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
+        this.onload(url, p, resource, err, redirectedUrl);
+        this.tail();
+      }
+      this.pending[url] = null;
+    },
+    tail: function() {
+      --this.inflight;
+      this.checkDone();
+    },
+    checkDone: function() {
+      if (!this.inflight) {
+        this.oncomplete();
+      }
+    }
+  };
+  scope.Loader = Loader;
+});
+
+HTMLImports.addModule(function(scope) {
+  var Observer = function(addCallback) {
+    this.addCallback = addCallback;
+    this.mo = new MutationObserver(this.handler.bind(this));
+  };
+  Observer.prototype = {
+    handler: function(mutations) {
+      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
+        if (m.type === "childList" && m.addedNodes.length) {
+          this.addedNodes(m.addedNodes);
+        }
+      }
+    },
+    addedNodes: function(nodes) {
+      if (this.addCallback) {
+        this.addCallback(nodes);
+      }
+      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
+        if (n.children && n.children.length) {
+          this.addedNodes(n.children);
+        }
+      }
+    },
+    observe: function(root) {
+      this.mo.observe(root, {
+        childList: true,
+        subtree: true
+      });
+    }
+  };
+  scope.Observer = Observer;
+});
+
+HTMLImports.addModule(function(scope) {
+  var path = scope.path;
+  var rootDocument = scope.rootDocument;
+  var flags = scope.flags;
+  var isIE = scope.isIE;
+  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
+  var importParser = {
+    documentSelectors: IMPORT_SELECTOR,
+    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]", "style", "script:not([type])", 'script[type="text/javascript"]' ].join(","),
+    map: {
+      link: "parseLink",
+      script: "parseScript",
+      style: "parseStyle"
+    },
+    dynamicElements: [],
+    parseNext: function() {
+      var next = this.nextToParse();
+      if (next) {
+        this.parse(next);
+      }
+    },
+    parse: function(elt) {
+      if (this.isParsed(elt)) {
+        flags.parse && console.log("[%s] is already parsed", elt.localName);
+        return;
+      }
+      var fn = this[this.map[elt.localName]];
+      if (fn) {
+        this.markParsing(elt);
+        fn.call(this, elt);
+      }
+    },
+    parseDynamic: function(elt, quiet) {
+      this.dynamicElements.push(elt);
+      if (!quiet) {
+        this.parseNext();
+      }
+    },
+    markParsing: function(elt) {
+      flags.parse && console.log("parsing", elt);
+      this.parsingElement = elt;
+    },
+    markParsingComplete: function(elt) {
+      elt.__importParsed = true;
+      this.markDynamicParsingComplete(elt);
+      if (elt.__importElement) {
+        elt.__importElement.__importParsed = true;
+        this.markDynamicParsingComplete(elt.__importElement);
+      }
+      this.parsingElement = null;
+      flags.parse && console.log("completed", elt);
+    },
+    markDynamicParsingComplete: function(elt) {
+      var i = this.dynamicElements.indexOf(elt);
+      if (i >= 0) {
+        this.dynamicElements.splice(i, 1);
+      }
+    },
+    parseImport: function(elt) {
+      if (HTMLImports.__importsParsingHook) {
+        HTMLImports.__importsParsingHook(elt);
+      }
+      if (elt.import) {
+        elt.import.__importParsed = true;
+      }
+      this.markParsingComplete(elt);
+      if (elt.__resource && !elt.__error) {
+        elt.dispatchEvent(new CustomEvent("load", {
+          bubbles: false
+        }));
+      } else {
+        elt.dispatchEvent(new CustomEvent("error", {
+          bubbles: false
+        }));
+      }
+      if (elt.__pending) {
+        var fn;
+        while (elt.__pending.length) {
+          fn = elt.__pending.shift();
+          if (fn) {
+            fn({
+              target: elt
+            });
+          }
+        }
+      }
+      this.parseNext();
+    },
+    parseLink: function(linkElt) {
+      if (nodeIsImport(linkElt)) {
+        this.parseImport(linkElt);
+      } else {
+        linkElt.href = linkElt.href;
+        this.parseGeneric(linkElt);
+      }
+    },
+    parseStyle: function(elt) {
+      var src = elt;
+      elt = cloneStyle(elt);
+      elt.__importElement = src;
+      this.parseGeneric(elt);
+    },
+    parseGeneric: function(elt) {
+      this.trackElement(elt);
+      this.addElementToDocument(elt);
+    },
+    rootImportForElement: function(elt) {
+      var n = elt;
+      while (n.ownerDocument.__importLink) {
+        n = n.ownerDocument.__importLink;
+      }
+      return n;
+    },
+    addElementToDocument: function(elt) {
+      var port = this.rootImportForElement(elt.__importElement || elt);
+      var l = port.__insertedElements = port.__insertedElements || 0;
+      var refNode = port.nextElementSibling;
+      for (var i = 0; i < l; i++) {
+        refNode = refNode && refNode.nextElementSibling;
+      }
+      port.parentNode.insertBefore(elt, refNode);
+    },
+    trackElement: function(elt, callback) {
+      var self = this;
+      var done = function(e) {
+        if (callback) {
+          callback(e);
+        }
+        self.markParsingComplete(elt);
+        self.parseNext();
+      };
+      elt.addEventListener("load", done);
+      elt.addEventListener("error", done);
+      if (isIE && elt.localName === "style") {
+        var fakeLoad = false;
+        if (elt.textContent.indexOf("@import") == -1) {
+          fakeLoad = true;
+        } else if (elt.sheet) {
+          fakeLoad = true;
+          var csr = elt.sheet.cssRules;
+          var len = csr ? csr.length : 0;
+          for (var i = 0, r; i < len && (r = csr[i]); i++) {
+            if (r.type === CSSRule.IMPORT_RULE) {
+              fakeLoad = fakeLoad && Boolean(r.styleSheet);
+            }
+          }
+        }
+        if (fakeLoad) {
+          elt.dispatchEvent(new CustomEvent("load", {
+            bubbles: false
+          }));
+        }
+      }
+    },
+    parseScript: function(scriptElt) {
+      var script = document.createElement("script");
+      script.__importElement = scriptElt;
+      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
+      scope.currentScript = scriptElt;
+      this.trackElement(script, function(e) {
+        script.parentNode.removeChild(script);
+        scope.currentScript = null;
+      });
+      this.addElementToDocument(script);
+    },
+    nextToParse: function() {
+      this._mayParse = [];
+      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
+    },
+    nextToParseInDoc: function(doc, link) {
+      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)) {
+            if (this.hasResource(n)) {
+              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
+            } else {
+              return;
+            }
+          }
+        }
+      }
+      return link;
+    },
+    nextToParseDynamic: function() {
+      return this.dynamicElements[0];
+    },
+    parseSelectorsForNode: function(node) {
+      var doc = node.ownerDocument || node;
+      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
+    },
+    isParsed: function(node) {
+      return node.__importParsed;
+    },
+    needsDynamicParsing: function(elt) {
+      return this.dynamicElements.indexOf(elt) >= 0;
+    },
+    hasResource: function(node) {
+      if (nodeIsImport(node) && node.import === undefined) {
+        return false;
+      }
+      return true;
+    }
+  };
+  function nodeIsImport(elt) {
+    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
+  }
+  function generateScriptDataUrl(script) {
+    var scriptContent = generateScriptContent(script);
+    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
+  }
+  function generateScriptContent(script) {
+    return script.textContent + generateSourceMapHint(script);
+  }
+  function generateSourceMapHint(script) {
+    var owner = script.ownerDocument;
+    owner.__importedScripts = owner.__importedScripts || 0;
+    var moniker = script.ownerDocument.baseURI;
+    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
+    owner.__importedScripts++;
+    return "\n//# sourceURL=" + moniker + num + ".js\n";
+  }
+  function cloneStyle(style) {
+    var clone = style.ownerDocument.createElement("style");
+    clone.textContent = style.textContent;
+    path.resolveUrlsInStyle(clone);
+    return clone;
+  }
+  scope.parser = importParser;
+  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
+});
+
+HTMLImports.addModule(function(scope) {
+  var flags = scope.flags;
+  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
+  var rootDocument = scope.rootDocument;
+  var Loader = scope.Loader;
+  var Observer = scope.Observer;
+  var parser = scope.parser;
+  var importer = {
+    documents: {},
+    documentPreloadSelectors: IMPORT_SELECTOR,
+    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
+    loadNode: function(node) {
+      importLoader.addNode(node);
+    },
+    loadSubtree: function(parent) {
+      var nodes = this.marshalNodes(parent);
+      importLoader.addNodes(nodes);
+    },
+    marshalNodes: function(parent) {
+      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
+    },
+    loadSelectorsForNode: function(node) {
+      var doc = node.ownerDocument || node;
+      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
+    },
+    loaded: function(url, elt, resource, err, redirectedUrl) {
+      flags.load && console.log("loaded", url, elt);
+      elt.__resource = resource;
+      elt.__error = err;
+      if (isImportLink(elt)) {
+        var doc = this.documents[url];
+        if (doc === undefined) {
+          doc = err ? null : makeDocument(resource, redirectedUrl || url);
+          if (doc) {
+            doc.__importLink = elt;
+            this.bootDocument(doc);
+          }
+          this.documents[url] = doc;
+        }
+        elt.import = doc;
+      }
+      parser.parseNext();
+    },
+    bootDocument: function(doc) {
+      this.loadSubtree(doc);
+      this.observer.observe(doc);
+      parser.parseNext();
+    },
+    loadedAll: function() {
+      parser.parseNext();
+    }
+  };
+  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
+  importer.observer = new Observer();
+  function isImportLink(elt) {
+    return isLinkRel(elt, IMPORT_LINK_TYPE);
+  }
+  function isLinkRel(elt, rel) {
+    return elt.localName === "link" && elt.getAttribute("rel") === rel;
+  }
+  function makeDocument(resource, url) {
+    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
+    doc._URL = url;
+    var base = doc.createElement("base");
+    base.setAttribute("href", url);
+    if (!doc.baseURI) {
+      doc.baseURI = url;
+    }
+    var meta = doc.createElement("meta");
+    meta.setAttribute("charset", "utf-8");
+    doc.head.appendChild(meta);
+    doc.head.appendChild(base);
+    doc.body.innerHTML = resource;
+    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
+      HTMLTemplateElement.bootstrap(doc);
+    }
+    return doc;
+  }
+  if (!document.baseURI) {
+    var baseURIDescriptor = {
+      get: function() {
+        var base = document.querySelector("base");
+        return base ? base.href : window.location.href;
+      },
+      configurable: true
+    };
+    Object.defineProperty(document, "baseURI", baseURIDescriptor);
+    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
+  }
+  scope.importer = importer;
+  scope.importLoader = importLoader;
+});
+
+HTMLImports.addModule(function(scope) {
+  var parser = scope.parser;
+  var importer = scope.importer;
+  var dynamic = {
+    added: function(nodes) {
+      var owner, parsed;
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        if (!owner) {
+          owner = n.ownerDocument;
+          parsed = parser.isParsed(owner);
+        }
+        loading = this.shouldLoadNode(n);
+        if (loading) {
+          importer.loadNode(n);
+        }
+        if (this.shouldParseNode(n) && parsed) {
+          parser.parseDynamic(n, loading);
+        }
+      }
+    },
+    shouldLoadNode: function(node) {
+      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
+    },
+    shouldParseNode: function(node) {
+      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
+    }
+  };
+  importer.observer.addCallback = dynamic.added.bind(dynamic);
+  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
+});
+
+(function(scope) {
+  initializeModules = scope.initializeModules;
+  if (scope.useNative) {
+    return;
+  }
+  if (typeof window.CustomEvent !== "function") {
+    window.CustomEvent = function(inType, dictionary) {
+      var e = document.createEvent("HTMLEvents");
+      e.initEvent(inType, dictionary.bubbles === false ? false : true, dictionary.cancelable === false ? false : true, dictionary.detail);
+      return e;
+    };
+  }
+  initializeModules();
+  var rootDocument = scope.rootDocument;
+  function bootstrap() {
+    HTMLImports.importer.bootDocument(rootDocument);
+  }
+  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
+    bootstrap();
+  } else {
+    document.addEventListener("DOMContentLoaded", bootstrap);
+  }
+})(HTMLImports);
+
+window.CustomElements = window.CustomElements || {
+  flags: {}
+};
+
+(function(scope) {
+  var flags = scope.flags;
+  var modules = [];
+  var addModule = function(module) {
+    modules.push(module);
+  };
+  var initializeModules = function() {
+    modules.forEach(function(module) {
+      module(scope);
+    });
+  };
+  scope.addModule = addModule;
+  scope.initializeModules = initializeModules;
+  scope.hasNative = Boolean(document.registerElement);
+  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
+})(CustomElements);
+
+CustomElements.addModule(function(scope) {
+  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : "none";
+  function forSubtree(node, cb) {
+    findAllElements(node, function(e) {
+      if (cb(e)) {
+        return true;
+      }
+      forRoots(e, cb);
+    });
+    forRoots(node, cb);
+  }
+  function findAllElements(node, find, data) {
+    var e = node.firstElementChild;
+    if (!e) {
+      e = node.firstChild;
+      while (e && e.nodeType !== Node.ELEMENT_NODE) {
+        e = e.nextSibling;
+      }
+    }
+    while (e) {
+      if (find(e, data) !== true) {
+        findAllElements(e, find, data);
+      }
+      e = e.nextElementSibling;
+    }
+    return null;
+  }
+  function forRoots(node, cb) {
+    var root = node.shadowRoot;
+    while (root) {
+      forSubtree(root, cb);
+      root = root.olderShadowRoot;
+    }
+  }
+  var processingDocuments;
+  function forDocumentTree(doc, cb) {
+    processingDocuments = [];
+    _forDocumentTree(doc, cb);
+    processingDocuments = null;
+  }
+  function _forDocumentTree(doc, cb) {
+    doc = wrap(doc);
+    if (processingDocuments.indexOf(doc) >= 0) {
+      return;
+    }
+    processingDocuments.push(doc);
+    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) {
+        _forDocumentTree(n.import, cb);
+      }
+    }
+    cb(doc);
+  }
+  scope.forDocumentTree = forDocumentTree;
+  scope.forSubtree = forSubtree;
+});
+
+CustomElements.addModule(function(scope) {
+  var flags = scope.flags;
+  var forSubtree = scope.forSubtree;
+  var forDocumentTree = scope.forDocumentTree;
+  function addedNode(node) {
+    return added(node) || addedSubtree(node);
+  }
+  function added(node) {
+    if (scope.upgrade(node)) {
+      return true;
+    }
+    attached(node);
+  }
+  function addedSubtree(node) {
+    forSubtree(node, function(e) {
+      if (added(e)) {
+        return true;
+      }
+    });
+  }
+  function attachedNode(node) {
+    attached(node);
+    if (inDocument(node)) {
+      forSubtree(node, function(e) {
+        attached(e);
+      });
+    }
+  }
+  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;
+  scope.hasPolyfillMutations = hasPolyfillMutations;
+  var isPendingMutations = false;
+  var pendingMutations = [];
+  function deferMutation(fn) {
+    pendingMutations.push(fn);
+    if (!isPendingMutations) {
+      isPendingMutations = true;
+      setTimeout(takeMutations);
+    }
+  }
+  function takeMutations() {
+    isPendingMutations = false;
+    var $p = pendingMutations;
+    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
+      p();
+    }
+    pendingMutations = [];
+  }
+  function attached(element) {
+    if (hasPolyfillMutations) {
+      deferMutation(function() {
+        _attached(element);
+      });
+    } else {
+      _attached(element);
+    }
+  }
+  function _attached(element) {
+    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
+      if (!element.__attached && inDocument(element)) {
+        element.__attached = true;
+        if (element.attachedCallback) {
+          element.attachedCallback();
+        }
+      }
+    }
+  }
+  function detachedNode(node) {
+    detached(node);
+    forSubtree(node, function(e) {
+      detached(e);
+    });
+  }
+  function detached(element) {
+    if (hasPolyfillMutations) {
+      deferMutation(function() {
+        _detached(element);
+      });
+    } else {
+      _detached(element);
+    }
+  }
+  function _detached(element) {
+    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
+      if (element.__attached && !inDocument(element)) {
+        element.__attached = false;
+        if (element.detachedCallback) {
+          element.detachedCallback();
+        }
+      }
+    }
+  }
+  function inDocument(element) {
+    var p = element;
+    var doc = wrap(document);
+    while (p) {
+      if (p == doc) {
+        return true;
+      }
+      p = p.parentNode || p.host;
+    }
+  }
+  function watchShadow(node) {
+    if (node.shadowRoot && !node.shadowRoot.__watched) {
+      flags.dom && console.log("watching shadow-root for: ", node.localName);
+      var root = node.shadowRoot;
+      while (root) {
+        observe(root);
+        root = root.olderShadowRoot;
+      }
+    }
+  }
+  function handler(mutations) {
+    if (flags.dom) {
+      var mx = mutations[0];
+      if (mx && mx.type === "childList" && mx.addedNodes) {
+        if (mx.addedNodes) {
+          var d = mx.addedNodes[0];
+          while (d && d !== document && !d.host) {
+            d = d.parentNode;
+          }
+          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
+          u = u.split("/?").shift().split("/").pop();
+        }
+      }
+      console.group("mutations (%d) [%s]", mutations.length, u || "");
+    }
+    mutations.forEach(function(mx) {
+      if (mx.type === "childList") {
+        forEach(mx.addedNodes, function(n) {
+          if (!n.localName) {
+            return;
+          }
+          addedNode(n);
+        });
+        forEach(mx.removedNodes, function(n) {
+          if (!n.localName) {
+            return;
+          }
+          detachedNode(n);
+        });
+      }
+    });
+    flags.dom && console.groupEnd();
+  }
+  function takeRecords(node) {
+    node = wrap(node);
+    if (!node) {
+      node = wrap(document);
+    }
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+    var observer = node.__observer;
+    if (observer) {
+      handler(observer.takeRecords());
+      takeMutations();
+    }
+  }
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+  function observe(inRoot) {
+    if (inRoot.__observer) {
+      return;
+    }
+    var observer = new MutationObserver(handler);
+    observer.observe(inRoot, {
+      childList: true,
+      subtree: true
+    });
+    inRoot.__observer = observer;
+  }
+  function upgradeDocument(doc) {
+    doc = wrap(doc);
+    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
+    addedNode(doc);
+    observe(doc);
+    flags.dom && console.groupEnd();
+  }
+  function upgradeDocumentTree(doc) {
+    forDocumentTree(doc, upgradeDocument);
+  }
+  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
+  Element.prototype.createShadowRoot = function() {
+    var root = originalCreateShadowRoot.call(this);
+    CustomElements.watchShadow(this);
+    return root;
+  };
+  scope.watchShadow = watchShadow;
+  scope.upgradeDocumentTree = upgradeDocumentTree;
+  scope.upgradeSubtree = addedSubtree;
+  scope.upgradeAll = addedNode;
+  scope.attachedNode = attachedNode;
+  scope.takeRecords = takeRecords;
+});
+
+CustomElements.addModule(function(scope) {
+  var flags = scope.flags;
+  function upgrade(node) {
+    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
+      var is = node.getAttribute("is");
+      var definition = scope.getRegisteredDefinition(is || node.localName);
+      if (definition) {
+        if (is && definition.tag == node.localName) {
+          return upgradeWithDefinition(node, definition);
+        } else if (!is && !definition.extends) {
+          return upgradeWithDefinition(node, definition);
+        }
+      }
+    }
+  }
+  function upgradeWithDefinition(element, definition) {
+    flags.upgrade && console.group("upgrade:", element.localName);
+    if (definition.is) {
+      element.setAttribute("is", definition.is);
+    }
+    implementPrototype(element, definition);
+    element.__upgraded__ = true;
+    created(element);
+    scope.attachedNode(element);
+    scope.upgradeSubtree(element);
+    flags.upgrade && console.groupEnd();
+    return element;
+  }
+  function implementPrototype(element, definition) {
+    if (Object.__proto__) {
+      element.__proto__ = definition.prototype;
+    } else {
+      customMixin(element, definition.prototype, definition.native);
+      element.__proto__ = definition.prototype;
+    }
+  }
+  function customMixin(inTarget, inSrc, inNative) {
+    var used = {};
+    var p = inSrc;
+    while (p !== inNative && p !== HTMLElement.prototype) {
+      var keys = Object.getOwnPropertyNames(p);
+      for (var i = 0, k; k = keys[i]; i++) {
+        if (!used[k]) {
+          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
+          used[k] = 1;
+        }
+      }
+      p = Object.getPrototypeOf(p);
+    }
+  }
+  function created(element) {
+    if (element.createdCallback) {
+      element.createdCallback();
+    }
+  }
+  scope.upgrade = upgrade;
+  scope.upgradeWithDefinition = upgradeWithDefinition;
+  scope.implementPrototype = implementPrototype;
+});
+
+CustomElements.addModule(function(scope) {
+  var upgradeDocumentTree = scope.upgradeDocumentTree;
+  var upgrade = scope.upgrade;
+  var upgradeWithDefinition = scope.upgradeWithDefinition;
+  var implementPrototype = scope.implementPrototype;
+  var useNative = scope.useNative;
+  function register(name, options) {
+    var definition = options || {};
+    if (!name) {
+      throw new Error("document.registerElement: first argument `name` must not be empty");
+    }
+    if (name.indexOf("-") < 0) {
+      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
+    }
+    if (isReservedTag(name)) {
+      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
+    }
+    if (getRegisteredDefinition(name)) {
+      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
+    }
+    if (!definition.prototype) {
+      definition.prototype = Object.create(HTMLElement.prototype);
+    }
+    definition.__name = name.toLowerCase();
+    definition.lifecycle = definition.lifecycle || {};
+    definition.ancestry = ancestry(definition.extends);
+    resolveTagName(definition);
+    resolvePrototypeChain(definition);
+    overrideAttributeApi(definition.prototype);
+    registerDefinition(definition.__name, definition);
+    definition.ctor = generateConstructor(definition);
+    definition.ctor.prototype = definition.prototype;
+    definition.prototype.constructor = definition.ctor;
+    if (scope.ready) {
+      upgradeDocumentTree(document);
+    }
+    return definition.ctor;
+  }
+  function overrideAttributeApi(prototype) {
+    if (prototype.setAttribute._polyfilled) {
+      return;
+    }
+    var setAttribute = prototype.setAttribute;
+    prototype.setAttribute = function(name, value) {
+      changeAttribute.call(this, name, value, setAttribute);
+    };
+    var removeAttribute = prototype.removeAttribute;
+    prototype.removeAttribute = function(name) {
+      changeAttribute.call(this, name, null, removeAttribute);
+    };
+    prototype.setAttribute._polyfilled = true;
+  }
+  function changeAttribute(name, value, operation) {
+    name = name.toLowerCase();
+    var oldValue = this.getAttribute(name);
+    operation.apply(this, arguments);
+    var newValue = this.getAttribute(name);
+    if (this.attributeChangedCallback && newValue !== oldValue) {
+      this.attributeChangedCallback(name, oldValue, newValue);
+    }
+  }
+  function isReservedTag(name) {
+    for (var i = 0; i < reservedTagList.length; i++) {
+      if (name === reservedTagList[i]) {
+        return true;
+      }
+    }
+  }
+  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
+  function ancestry(extnds) {
+    var extendee = getRegisteredDefinition(extnds);
+    if (extendee) {
+      return ancestry(extendee.extends).concat([ extendee ]);
+    }
+    return [];
+  }
+  function resolveTagName(definition) {
+    var baseTag = definition.extends;
+    for (var i = 0, a; a = definition.ancestry[i]; i++) {
+      baseTag = a.is && a.tag;
+    }
+    definition.tag = baseTag || definition.__name;
+    if (baseTag) {
+      definition.is = definition.__name;
+    }
+  }
+  function resolvePrototypeChain(definition) {
+    if (!Object.__proto__) {
+      var nativePrototype = HTMLElement.prototype;
+      if (definition.is) {
+        var inst = document.createElement(definition.tag);
+        var expectedPrototype = Object.getPrototypeOf(inst);
+        if (expectedPrototype === definition.prototype) {
+          nativePrototype = expectedPrototype;
+        }
+      }
+      var proto = definition.prototype, ancestor;
+      while (proto && proto !== nativePrototype) {
+        ancestor = Object.getPrototypeOf(proto);
+        proto.__proto__ = ancestor;
+        proto = ancestor;
+      }
+      definition.native = nativePrototype;
+    }
+  }
+  function instantiate(definition) {
+    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
+  }
+  var registry = {};
+  function getRegisteredDefinition(name) {
+    if (name) {
+      return registry[name.toLowerCase()];
+    }
+  }
+  function registerDefinition(name, definition) {
+    registry[name] = definition;
+  }
+  function generateConstructor(definition) {
+    return function() {
+      return instantiate(definition);
+    };
+  }
+  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
+  function createElementNS(namespace, tag, typeExtension) {
+    if (namespace === HTML_NAMESPACE) {
+      return createElement(tag, typeExtension);
+    } else {
+      return domCreateElementNS(namespace, tag);
+    }
+  }
+  function createElement(tag, typeExtension) {
+    var definition = getRegisteredDefinition(typeExtension || tag);
+    if (definition) {
+      if (tag == definition.tag && typeExtension == definition.is) {
+        return new definition.ctor();
+      }
+      if (!typeExtension && !definition.is) {
+        return new definition.ctor();
+      }
+    }
+    var element;
+    if (typeExtension) {
+      element = createElement(tag);
+      element.setAttribute("is", typeExtension);
+      return element;
+    }
+    element = domCreateElement(tag);
+    if (tag.indexOf("-") >= 0) {
+      implementPrototype(element, HTMLElement);
+    }
+    return element;
+  }
+  function cloneNode(deep) {
+    var n = domCloneNode.call(this, deep);
+    upgrade(n);
+    return n;
+  }
+  var domCreateElement = document.createElement.bind(document);
+  var domCreateElementNS = document.createElementNS.bind(document);
+  var domCloneNode = Node.prototype.cloneNode;
+  var isInstance;
+  if (!Object.__proto__ && !useNative) {
+    isInstance = function(obj, ctor) {
+      var p = obj;
+      while (p) {
+        if (p === ctor.prototype) {
+          return true;
+        }
+        p = p.__proto__;
+      }
+      return false;
+    };
+  } else {
+    isInstance = function(obj, base) {
+      return obj instanceof base;
+    };
+  }
+  document.registerElement = register;
+  document.createElement = createElement;
+  document.createElementNS = createElementNS;
+  Node.prototype.cloneNode = cloneNode;
+  scope.registry = registry;
+  scope.instanceof = isInstance;
+  scope.reservedTagList = reservedTagList;
+  scope.getRegisteredDefinition = getRegisteredDefinition;
+  document.register = document.registerElement;
+});
+
+(function(scope) {
+  var useNative = scope.useNative;
+  var initializeModules = scope.initializeModules;
+  if (useNative) {
+    var nop = function() {};
+    scope.watchShadow = nop;
+    scope.upgrade = nop;
+    scope.upgradeAll = nop;
+    scope.upgradeDocumentTree = nop;
+    scope.upgradeSubtree = nop;
+    scope.takeRecords = nop;
+    scope.instanceof = function(obj, base) {
+      return obj instanceof base;
+    };
+  } else {
+    initializeModules();
+  }
+  var upgradeDocumentTree = scope.upgradeDocumentTree;
+  if (!window.wrap) {
+    if (window.ShadowDOMPolyfill) {
+      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
+      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
+    } else {
+      window.wrap = window.unwrap = function(node) {
+        return node;
+      };
+    }
+  }
+  function bootstrap() {
+    upgradeDocumentTree(wrap(document));
+    if (window.HTMLImports) {
+      HTMLImports.__importsParsingHook = function(elt) {
+        upgradeDocumentTree(wrap(elt.import));
+      };
+    }
+    CustomElements.ready = true;
+    setTimeout(function() {
+      CustomElements.readyTime = Date.now();
+      if (window.HTMLImports) {
+        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
+      }
+      document.dispatchEvent(new CustomEvent("WebComponentsReady", {
+        bubbles: true
+      }));
+    });
+  }
+  if (typeof window.CustomEvent !== "function") {
+    window.CustomEvent = function(inType, params) {
+      params = params || {};
+      var e = document.createEvent("CustomEvent");
+      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
+      return e;
+    };
+    window.CustomEvent.prototype = window.Event.prototype;
+  }
+  if (document.readyState === "complete" || scope.flags.eager) {
+    bootstrap();
+  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
+    bootstrap();
+  } else {
+    var loadEvent = window.HTMLImports && !HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
+    window.addEventListener(loadEvent, bootstrap);
+  }
+})(window.CustomElements);
+
+(function(scope) {
+  if (!Function.prototype.bind) {
+    Function.prototype.bind = function(scope) {
+      var self = this;
+      var args = Array.prototype.slice.call(arguments, 1);
+      return function() {
+        var args2 = args.slice();
+        args2.push.apply(args2, arguments);
+        return self.apply(scope, args2);
+      };
+    };
+  }
+})(window.WebComponents);
+
+(function(scope) {
+  "use strict";
+  if (!window.performance) {
+    var start = Date.now();
+    window.performance = {
+      now: function() {
+        return Date.now() - start;
+      }
+    };
+  }
+  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, 1e3 / 60);
+      };
+    }();
+  }
+  if (!window.cancelAnimationFrame) {
+    window.cancelAnimationFrame = function() {
+      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
+        clearTimeout(id);
+      };
+    }();
+  }
+  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;
+  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">');
+      };
+    }
+  }
+  if (HTMLImports.useNative) {
+    installPolymerWarning();
+  } else {
+    addEventListener("DOMContentLoaded", installPolymerWarning);
+  }
+})(window.WebComponents);
+
+(function(scope) {
+  var style = document.createElement("style");
+  style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
+  var head = document.querySelector("head");
+  head.insertBefore(style, head.firstChild);
+})(window.WebComponents);
+
+(function(scope) {
+  window.Platform = scope;
+})(window.WebComponents);
diff --git a/pkg/web_components/lib/webcomponents.min.js b/pkg/web_components/lib/webcomponents.min.js
new file mode 100644
index 0000000..9118695
--- /dev/null
+++ b/pkg/web_components/lib/webcomponents.min.js
@@ -0,0 +1,14 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents.js",r=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){e=e.split("="),e[0]&&(t[e[0]]=e[1]||!0)}),r)for(var o,i=0;o=r.attributes[i];i++)"src"!==o.name&&(t[o.name]=o.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,t.shadow="native"===t.shadow?!1:t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(WebComponents),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];k(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}k(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,k(e,t,U)}function s(e){var t=e.__proto__||Object.getPrototypeOf(e),n=R.get(t);if(n)return n;var r=s(t),o=E(r);return g(t,o,e),o}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^\w[a-zA-Z_0-9]*$/.test(e)}function p(e){return A&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function f(e){return A&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function h(e){return A&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return q}}function w(t,n,r){for(var o=W(t),i=0;i<o.length;i++){var a=o[i];if("polymerBlackList_"!==a&&!(a in n||t.polymerBlackList_&&t.polymerBlackList_[a])){B&&t.__lookupGetter__(a);var s,c,l=m(t,a);if(r&&"function"==typeof l.value)n[a]=h(a);else{var d=u(a);s=d?e.getEventHandlerGetter(a):p(a),(l.writable||l.set||V)&&(c=d?e.getEventHandlerSetter(a):f(a)),k(n,a,{get:s,set:c,configurable:l.configurable,enumerable:l.enumerable})}}}}function v(e,t,n){var r=e.prototype;g(r,t,n),o(t,e)}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),P.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function S(e){return e&&e.__impl4cf1e782hg__}function T(e){return!S(e)}function M(e){return null===e?null:(n(T(e)),e.__wrapper8e3dd93a60__||(e.__wrapper8e3dd93a60__=new(s(e))(e)))}function _(e){return null===e?null:(n(S(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&S(e)?_(e):e}function C(e){return e&&!S(e)?M(e):e}function D(e,t){null!==t&&(n(T(e)),n(void 0===t||S(t)),e.__wrapper8e3dd93a60__=t)}function j(e,t,n){G.get=n,k(e.prototype,t,G)}function H(e,t){j(e,t,function(){return M(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,P=new WeakMap,I=Object.create(null),A=t(),k=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var B=/Firefox/.test(navigator.userAgent),q={get:function(){},set:function(){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.assert=n,e.constructorTable=R,e.defineGetter=j,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isWrapper=S,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=P,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=D,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=_,e.unwrapIfNeeded=N,e.wrap=M,e.wrapIfNeeded=C,e.wrappers=I}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,f=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,f)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,f-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var h=t(n,[],0);u>l;)h.removed.push(c[l++]);return[h]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),h=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:h&&(w.push(h),h=void 0),v++,g++;break;case o:h||(h=t(v,[],0)),h.addedCount++,v++,h.removed.push(c[g]),g++;break;case i:h||(h=t(v,[],0)),h.addedCount++,v++;break;case a:h||(h=t(v,[],0)),h.removed.push(c[g]),g++}return h&&w.push(h),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)e[t]()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,h.push(e),m||(u(n),m=!0))}function n(){for(m=!1;h.length;){var e=h;h=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=f.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=f.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=f.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&!("attributes"===n&&!d.attributes||"attributes"===n&&d.attributeFilter&&(null!==o.namespace||-1===d.attributeFilter.indexOf(o.name))||"characterData"===n&&!d.characterData||"childList"===n&&!d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var h in i){var p=i[h],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[h]&&(m.oldValue=a[h]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,this.attributes="attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?!!e.attributes:!0,this.characterData="characterDataOldValue"in e&&!("characterData"in e)?!0:!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,f=new WeakMap,h=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=f.get(e);o||f.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=f.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=f.get(e);n||f.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=f.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return k(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var f=n(p),h=f.olderShadowRoot;h&&s.push(h)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=k(t),r=e[0],o=k(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(k(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=k(t),a=k(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(k(d)===c)return d}return null}function d(e,t){return k(e)===k(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),h(V(e),V(e.target)),I)){var t=I;throw I=null,t}}function f(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function h(t,n){if(Y.get(t))throw new Error("InvalidStateError");Y.set(t,!0),e.renderAllPending();var o,i,a;if(f(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!f(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return nt.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),Z.set(t,rt),$.delete(t,null),Y.delete(t),t.defaultPrevented}function m(e,t,n,r){var o=ot;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=it,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=at,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===ot)return!0;n===at&&(n=it)}else if(n===at&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;J.set(t,p)}}Z.set(t,n);var f=t.type,h=!1;X.set(t,a),$.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)h=!0;else if(!(v.type!==f||!v.capture&&n===ot||v.capture&&n===at))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),et.get(t))return!1}catch(g){I||(I=g)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof st))return V(M(st,"Event",e,t));var n=e;return gt||"beforeunload"!==n.type||this instanceof _?void U(n,this):new _(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:q(e.relatedTarget)}}):e}function S(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(M(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function T(e,t){return function(){arguments[t]=q(arguments[t]);var n=q(this);n[e].apply(n,arguments)}}function M(e,t,n,r){if(wt)return new e(n,E(r));var o=q(document.createEvent(t)),i=mt[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=q(t)),a.push(t)}),o["init"+t].apply(o,a),o}function _(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),q(e)}function D(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function j(e,t){for(var n=q(e);n;n=n.parentNode)if(D(V(n),t))return!0;return!1}function H(e){A(e,yt)}function x(t,n,o,i){e.renderAllPending();var a=V(Et.call(B(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=tt.get(this);return t&&t[e]&&t[e].value||null}}function P(e){var t=e.slice(2);return function(n){var r=tt.get(this);r||(r=Object.create(null),tt.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var I,A=e.forwardMethodsToWrapper,k=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,B=e.unsafeUnwrap,q=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,Y=new WeakMap,X=new WeakMap,$=new WeakMap,J=new WeakMap,Z=new WeakMap,Q=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,rt=0,ot=1,it=2,at=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var st=window.Event;st.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return $.get(this)},get eventPhase(){return Z.get(this)},get path(){var e=nt.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),et.set(this,!0)}},F(st,y,document.createEvent("Event"));var ct=S("UIEvent",y),lt=S("CustomEvent",y),ut={get relatedTarget(){var e=J.get(this);return void 0!==e?e:V(q(this).relatedTarget)}},dt=W({initMouseEvent:T("initMouseEvent",14)},ut),pt=W({initFocusEvent:T("initFocusEvent",5)},ut),ft=S("MouseEvent",ct,dt),ht=S("FocusEvent",ct,pt),mt=Object.create(null),wt=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!wt){var vt=function(e,t,n){if(n){var r=mt[n];t=W(W({},r),t)}mt[e]=t};vt("Event",{bubbles:!1,cancelable:!1}),vt("CustomEvent",{detail:null},"Event"),vt("UIEvent",{view:null,detail:0},"Event"),vt("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),vt("FocusEvent",{relatedTarget:null},"UIEvent")}var gt=window.BeforeUnloadEvent;_.prototype=Object.create(y.prototype),W(_.prototype,{get returnValue(){return B(this).returnValue},set returnValue(e){B(this).returnValue=e}}),gt&&F(gt,_);var bt=window.EventTarget,yt=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;yt.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=q(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;j(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return q(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},bt&&F(bt,N);var Et=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=P,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=_,e.wrappers.CustomEvent=lt,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=ht,e.wrappers.MouseEvent=ft,e.wrappers.UIEvent=ct}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var f;try{f=document.createEvent("TouchEvent")}catch(h){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,f),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof S)}function n(e){var t=new M;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new M,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new _(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function f(e,t){var n=e.nodeType===S.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function h(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){h(e,t);var n=t.length;if(1===n)return I(t[0]);for(var r=I(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(I(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=I(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=I(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=k(n?B.call(n,P(e),!1):q.call(P(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function S(e){O(e instanceof V),T.call(this,e),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 T=e.wrappers.EventTarget,M=e.wrappers.NodeList,_=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,D=e.isWrapper,j=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,P=e.unsafeUnwrap,I=e.unwrap,A=e.unwrapIfNeeded,k=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,B=document.importNode,q=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.insertBefore,Y=V.prototype.removeChild,X=V.prototype.replaceChild,$=/Trident/.test(navigator.userAgent),J=$?function(e,t){try{Y.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){Y.call(e,t)};S.prototype=Object.create(T.prototype),j(S.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?D(n)?r=I(n):(r=n,n=k(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)f(this,e),w(this),K.call(P(this),I(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:P(this);l?K.call(l,m(this,o),r):h(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=I(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(P(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(D(r)?o=I(r):(o=r,r=k(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(f(this,e),w(this),X.call(P(this),I(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&X.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:k(P(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:k(P(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:k(P(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:k(P(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:k(P(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==S.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=S.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=P(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),P(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new M,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(P(this),A(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===S.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeNode(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(S,"ownerDocument"),x(V,S,document.createDocumentFragment()),delete S.prototype.querySelector,delete S.prototype.querySelectorAll,S.prototype=j(Object.create(T.prototype),S.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=K,e.originalRemoveChild=Y,e.snapshotNodeList=c,e.wrappers.Node=S}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=g(t[s]),!o&&(a=w(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\//g," ")}function r(e,t){for(var n,o=e.firstElementChild;o;){if(o.matches(t))return o;if(n=r(o,t))return n;o=o.nextElementSibling}return null}function o(e,t){return e.matches(t)}function i(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===C}function a(){return!0}function s(e,t,n){return e.localName===n}function c(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function u(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=u(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,null);if(c instanceof L)s=S.call(c,i);else{if(!(c instanceof N))return u(this,r,o,n,i,null);s=E.call(c,i)}return t(s,r,o,a)}function p(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,a);if(c instanceof L)s=M.call(c,i,a);else{if(!(c instanceof N))return u(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof N))return u(this,r,o,n,i,a);s=_.call(c,i,a)}return t(s,r,o,!1)}var h=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,w=e.getTreeScope,v=e.unsafeUnwrap,g=e.wrap,b=document.querySelector,y=document.documentElement.querySelector,E=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,_=document.getElementsByTagNameNS,O=document.documentElement.getElementsByTagNameNS,L=window.Element,N=window.HTMLDocument||window.Document,C="http://www.w3.org/1999/xhtml",D={querySelector:function(t){var o=n(t),i=o!==t;t=o;var a,s=v(this),c=w(this).root;if(c instanceof e.wrappers.ShadowRoot)return r(this,t);if(s instanceof L)a=g(y.call(s,t));else{if(!(s instanceof N))return r(this,t);a=g(b.call(s,t))}return a&&!i&&(c=w(a).root)&&c instanceof e.wrappers.ShadowRoot?r(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var i=new m;return i.length=d.call(this,o,0,i,e,r),i}},j={getElementsByTagName:function(e){var t=new h,n="*"===e?a:i;return t.length=p.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new h,r=null;return r="*"===e?"*"===t?a:s:"*"===t?c:l,n.length=f.call(this,r,0,n,e||null,t),n
+}};e.GetElementsByInterface=j,e.SelectorsInterface=D}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}};e.ChildNodeInterface=i,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){e.invalidateRendererBasedOnAttribute(t,"class")}function n(e,t){r(e,this),this.ownerElement_=t}var r=e.setWrapper,o=e.unsafeUnwrap;n.prototype={constructor:n,get length(){return o(this).length},item:function(e){return o(this).item(e)},contains:function(e){return o(this).contains(e)},add:function(){o(this).add.apply(o(this),arguments),t(this.ownerElement_)},remove:function(){o(this).remove.apply(o(this),arguments),t(this.ownerElement_)},toggle:function(){var e=o(this).toggle.apply(o(this),arguments);return t(this.ownerElement_),e},toString:function(){return o(this).toString()}},e.wrappers.DOMTokenList=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.wrappers.DOMTokenList,c=e.ParentNodeInterface,l=e.SelectorsInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},matches:function(e){return g.call(f(this),e)},get classList(){var e=b.get(this);return e||b.set(this,e=new s(f(this).classList,this)),e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(O,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,i=e.tagName.toLowerCase(),s="<"+i,c=e.attributes,l=0;o=c[l];l++)s+=" "+o.name+'="'+n(o.value)+'"';return s+=">",N[i]?s:s+a(e)+"</"+i+">";case Node.TEXT_NODE:var u=e.data;return t&&C[t.localName]?u:r(u);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function a(e){e instanceof _.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=i(n,e);return t}function s(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function c(e){h.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function u(t){return function(){return e.renderAllPending(),S(this)[t]}}function d(e){m(c,e,u(e))}function p(t){Object.defineProperty(c.prototype,t,{get:u(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(c.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var h=e.wrappers.Element,m=e.defineGetter,w=e.enqueueMutation,v=e.mixin,g=e.nodesWereAdded,b=e.nodesWereRemoved,y=e.registerWrapper,E=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,_=e.wrappers,O=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,N=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),j=window.HTMLElement,H=window.HTMLTemplateElement;c.prototype=Object.create(h.prototype),v(c.prototype,{get innerHTML(){return a(this)},set innerHTML(e){if(D&&C[this.localName])return void(this.textContent=e);var t=E(this.childNodes);this.invalidateShadowRenderer()?this instanceof _.HTMLTemplateElement?s(this.content,e):s(this,e,this.tagName):!H&&this instanceof _.HTMLTemplateElement?s(this.content,e):S(this).innerHTML=e;var n=E(this.childNodes);w(this,"childList",{addedNodes:n,removedNodes:t}),b(t),g(n,this)},get outerHTML(){return i(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(p),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),y(j,c,document.createElement("b")),e.wrappers.HTMLElement=c,e.getInnerHTML=a,e.setInnerHTML=s}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.wrappers.Element,n=e.wrappers.HTMLElement,r=e.registerObject,o="http://www.w3.org/2000/svg",i=document.createElementNS(o,"title"),a=r(i),s=Object.getPrototypeOf(a.prototype).constructor;if(!("classList"in i)){var c=Object.getOwnPropertyDescriptor(t.prototype,"classList");Object.defineProperty(n.prototype,"classList",c),delete t.prototype.classList}e.wrappers.SVGElement=s}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.WebGLRenderingContext;if(c){n(t.prototype,{get canvas(){return s(i(this).canvas)},texImage2D:function(){arguments[5]=a(arguments[5]),i(this).texImage2D.apply(i(this),arguments)},texSubImage2D:function(){arguments[6]=a(arguments[6]),i(this).texSubImage2D.apply(i(this),arguments)}});var l=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};r(c,t,l),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Range;t.prototype={get startContainer(){return s(o(this).startContainer)},get endContainer(){return s(o(this).endContainer)},get commonAncestorContainer(){return s(o(this).commonAncestorContainer)},setStart:function(e,t){o(this).setStart(a(e),t)},setEnd:function(e,t){o(this).setEnd(a(e),t)},setStartBefore:function(e){o(this).setStartBefore(a(e))},setStartAfter:function(e){o(this).setStartAfter(a(e))},setEndBefore:function(e){o(this).setEndBefore(a(e))},setEndAfter:function(e){o(this).setEndAfter(a(e))},selectNode:function(e){o(this).selectNode(a(e))},selectNodeContents:function(e){o(this).selectNodeContents(a(e))},compareBoundaryPoints:function(e,t){return o(this).compareBoundaryPoints(e,i(t))},extractContents:function(){return s(o(this).extractContents())},cloneContents:function(){return s(o(this).cloneContents())},insertNode:function(e){o(this).insertNode(a(e))},surroundContents:function(e){o(this).surroundContents(a(e))},cloneRange:function(){return s(o(this).cloneRange())},isPointInRange:function(e,t){return o(this).isPointInRange(a(e),t)},comparePoint:function(e,t){return o(this).comparePoint(a(e),t)},intersectsNode:function(e){return o(this).intersectsNode(a(e))},toString:function(){return o(this).toString()}},c.prototype.createContextualFragment&&(t.prototype.createContextualFragment=function(e){return s(o(this).createContextualFragment(e))}),n(window.Range,t,document.createRange()),e.wrappers.Range=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.GetElementsByInterface,n=e.ParentNodeInterface,r=e.SelectorsInterface,o=e.mixin,i=e.registerObject,a=i(document.createDocumentFragment());o(a.prototype,n),o(a.prototype,r),o(a.prototype,t);var s=i(document.createComment(""));e.wrappers.Comment=s,e.wrappers.DocumentFragment=a}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),p.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=new WeakMap,f=new WeakMap,h=/[ \t\n\r\f]/;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return p.get(this)||null},invalidateShadowRenderer:function(){return p.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getElementById:function(e){return h.test(e)?null:this.querySelector('[id="'+e+'"]')}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){I.set(e,[])}function i(e){var t=I.get(e);return t||I.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){M=null,s()}function l(e){var t=k.get(e);return t||(t=new f(e),k.set(e,t)),t}function u(e){var t=D(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function f(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function h(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=A.get(e);n?n.push(t):A.set(e,[t])}function v(e){return A.get(e)}function g(e){A.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof _))return!1;if(!B.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function S(e){return e.shadowRoot}function T(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var M,_=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,D=(e.assert,e.getTreeScope),j=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,P=e.ArraySplice,I=new WeakMap,A=new WeakMap,k=new WeakMap,W=j(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new P;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var f=c[p];d<f.index;d++)u++,o[l++].sync(s);for(var h=f.removed.length,m=0;h>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=f.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},f.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return D(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),M)return;M=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(S(e)){for(var t=e,n=h(t),r=T(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(S(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var B=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(){var e=H(this).polymerShadowRenderer_;return e?(e.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},_.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=T,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}{var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap;window.Selection}t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(i(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},extend:function(e,t){o(this).extend(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(a(e))},toString:function(){return o(this).toString()}},n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new m(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return N(n.apply(O(this),arguments))}}function r(e,t){j.call(O(t),L(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof h&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){_(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){return N(n.apply(O(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(O(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.wrappers.Selection,f=e.SelectorsInterface,h=e.wrappers.ShadowRoot,m=e.TreeScope,w=e.cloneNode,v=e.defineWrapGetter,g=e.elementFromPoint,b=e.forwardMethodsToWrapper,y=e.matchesNames,E=e.mixin,S=e.registerWrapper,T=e.renderAllPending,M=e.rewrap,_=e.setWrapper,O=e.unsafeUnwrap,L=e.unwrap,N=e.wrap,C=e.wrapEventTargetMethods,D=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),v(t,"documentElement"),v(t,"body"),v(t,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(n);var j=document.adoptNode,H=document.getSelection;if(E(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return g(this,this,e,t)},importNode:function(e,t){return w(e,t,O(this))},getSelection:function(){return T(),new p(H.call(L(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}}),document.registerElement){var x=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void _(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n.extends),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){N(this)instanceof r||M(this),t.apply(N(this),arguments)})});var d={prototype:l};i&&(d.extends=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);x.call(L(this),t,d);return r},b([window.HTMLDocument||window.Document],["registerElement"])}b([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(y)),b([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),E(t.prototype,l),E(t.prototype,d),E(t.prototype,f),E(t.prototype,{get implementation(){var e=D.get(this);return e?e:(e=new a(L(this).implementation),D.set(this,e),e)},get defaultView(){return N(L(this).defaultView)}}),S(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&S(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),s(a,"createDocumentType"),s(a,"createDocument"),s(a,"createHTMLDocument"),c(a,"hasFeature"),S(window.DOMImplementation,a),b([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t
+}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&j){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return D||(D=document.createElement("style"),D.setAttribute(x,""),D[x]=!0),D}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(f,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(h,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,S,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n	",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+e+")"+T,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(_,b).replace(M,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,f=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,h=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),S=new RegExp("("+b+y,"gim"),T="([>\\s~+[.,{:][\\s\\S]*)?$",M=/\:host/gim,_=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g]),C=document.createElement("iframe");C.style.display="none";var D,j=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var P=ShadowDOMPolyfill.wrap(document),I=P.querySelector("head");I.insertBefore(l(),I.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==I&&(e.parentNode===I?I.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return S=new s(e,t)}function u(e){return T?T:(T=c(S),T.oldValue=e,T)}function d(){S=T=void 0}function p(e){return e===T||e===S}function f(e,t){return e===t?e:T&&p(e)?T:null}function h(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var m,w=new WeakMap;if(/Trident/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new h(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var S,T;h.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=f(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,r=e.relatedNode,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var f=p.previousSibling,h=p.nextSibling,o=l("childList",r);o.addedNodes=s,o.removedNodes=c,o.previousSibling=f,o.nextSibling=h,i(r,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||h,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===v)&&(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){s==c&&e&&e()}function r(e){o(e),s++,n()}var i=t.querySelectorAll("link[rel=import]"),s=0,c=i.length;if(c)for(var l,u=0;c>u&&(l=i[u]);u++)a(l)?r.call(l,{target:l}):(l.addEventListener("load",r),l.addEventListener("error",r));else n()}function a(e){return d?e.__loaded||e.import&&"loading"!==e.import.readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e.import;t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),f=function(e){return p?ShadowDOMPolyfill.wrapIfNeeded(e):e},h=f(document),m={get:function(){var e=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(h,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),h.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=h,e.whenReady=t,e.isIE=w}(HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(HTMLImports),HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e){var t=e.ownerDocument,n=t.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,n),e},resolveUrlsInCssText:function(e,r){var o=this.replaceUrls(e,r,t);return o=this.replaceUrls(o,r,n)},replaceUrls:function(e,t,n){return e.replace(n,function(e,n,r,o){var i=r.replace(/["']/g,"");return t.href=i,i=t.href,n+"'"+i+"'"+o})}};e.path=r}),HTMLImports.addModule(function(e){xhr={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(t,n,r){var o=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(t+="?"+Math.random()),o.open("GET",t,xhr.async),o.addEventListener("readystatechange",function(){if(4===o.readyState){var e=o.getResponseHeader("Location"),t=null;if(e)var t="/"===e.substr(0,1)?location.origin+e:e;n.call(r,!xhr.ok(o)&&o,o.response||o.responseText,t)}}),o.send(),o},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}},e.xhr=xhr}),HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(e),e.import&&(e.import.__importParsed=!0),this.markParsingComplete(e),e.dispatchEvent(e.__resource&&!e.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){for(var t=this.rootImportForElement(e.__importElement||e),n=t.__insertedElements=t.__insertedElements||0,r=t.nextElementSibling,o=0;n>o;o++)r=r&&r.nextElementSibling;t.parentNode.insertBefore(e,r)},trackElement:function(e,t){var n=this,r=function(r){t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(){r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.import,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.import?!1:!0}};e.parser=p,e.IMPORT_SELECTOR=d}),HTMLImports.addModule(function(e){function t(e){return n(e,i)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e,t){var n=document.implementation.createHTMLDocument(i);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||(n.baseURI=t);var o=n.createElement("meta");return o.setAttribute("charset","utf-8"),n.head.appendChild(o),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var o=e.flags,i=e.IMPORT_LINK_TYPE,a=e.IMPORT_SELECTOR,s=e.rootDocument,c=e.Loader,l=e.Observer,u=e.parser,d={documents:{},documentPreloadSelectors:a,importsPreloadSelectors:[a].join(","),loadNode:function(e){p.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);p.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,i,a,s){if(o.load&&console.log("loaded",e,n),n.__resource=i,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(i,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.import=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},p=new c(d.loaded.bind(d),d.loadedAll.bind(d));if(d.observer=new l,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(s,"baseURI",f)}e.importer=d,e.importLoader=p}),HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a=0,s=e.length;s>a&&(i=e[a]);a++)r||(r=i.ownerDocument,o=t.isParsed(r)),loading=this.shouldLoadNode(i),loading&&n.loadNode(i),this.shouldParseNode(i)&&o&&t.parseDynamic(i,loading)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){HTMLImports.importer.bootDocument(n)}if(initializeModules=e.initializeModules,!e.useNative){"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){var n=document.createEvent("HTMLEvents");return n.initEvent(e,t.bubbles===!1?!1:!0,t.cancelable===!1?!1:!0,t.detail),n}),initializeModules();var n=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative)}(CustomElements),CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){a=[],i(e,t),a=null}function i(e,t){if(e=wrap(e),!(a.indexOf(e)>=0)){a.push(e);for(var n,r=e.querySelectorAll("link[rel="+s+"]"),o=0,c=r.length;c>o&&(n=r[o]);o++)n.import&&i(n.import,t);t(e)}}var a,s=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),CustomElements.addModule(function(e){function t(e){return n(e)||r(e)}function n(t){return e.upgrade(t)?!0:void s(t)}function r(e){y(e,function(e){return n(e)?!0:void 0})}function o(e){s(e),p(e)&&y(e,function(e){s(e)})}function i(e){M.push(e),T||(T=!0,setTimeout(a))}function a(){T=!1;for(var e,t=M,n=0,r=t.length;r>n&&(e=t[n]);n++)e();M=[]}function s(e){S?i(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&!e.__attached&&p(e)&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function l(e){u(e),y(e,function(e){u(e)})}function u(e){S?i(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&e.__attached&&!p(e)&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function p(e){for(var t=e,n=wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){b.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)w(t),t=t.olderShadowRoot}}function h(e){if(b.dom){var n=e[0];if(n&&"childList"===n.type&&n.addedNodes&&n.addedNodes){for(var r=n.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var o=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";
+o=o.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",e.length,o||"")}e.forEach(function(e){"childList"===e.type&&(_(e.addedNodes,function(e){e.localName&&t(e)}),_(e.removedNodes,function(e){e.localName&&l(e)}))}),b.dom&&console.groupEnd()}function m(e){for(e=wrap(e),e||(e=wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(t.takeRecords()),a())}function w(e){if(!e.__observer){var t=new MutationObserver(h);t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=wrap(e),b.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop()),t(e),w(e),b.dom&&console.groupEnd()}function g(e){E(e,v)}var b=e.flags,y=e.forSubtree,E=e.forDocumentTree,S=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=S;var T=!1,M=[],_=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var e=O.call(this);return CustomElements.watchShadow(this),e},e.watchShadow=f,e.upgradeDocumentTree=g,e.upgradeSubtree=r,e.upgradeAll=t,e.attachedNode=o,e.takeRecords=m}),CustomElements.addModule(function(e){function t(t){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),o=e.getRegisteredDefinition(r||t.localName);if(o){if(r&&o.tag==t.localName)return n(t,o);if(!r&&!o.extends)return n(t,o)}}}function n(t,n){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),e.attachedNode(t),e.upgradeSubtree(t),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t.native),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c.extends),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t.extends).concat([t]):[]}function a(e){for(var t,n=e.extends,r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag),r=Object.getPrototypeOf(n);r===e.prototype&&(t=r)}for(var o,i=e.prototype;i&&i!==t;)o=Object.getPrototypeOf(i),i.__proto__=o,i=o;e.native=t}}function c(e){return g(M(e.tag),e)}function l(e){return e?S[e.toLowerCase()]:void 0}function u(e,t){S[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===T?f(t,n):_(e,t)}function f(e,t){var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=f(e),r.setAttribute("is",t),r):(r=M(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function h(e){var t=O.call(this,e);return v(t),t}var m,w=e.upgradeDocumentTree,v=e.upgrade,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],S={},T="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),_=document.createElementNS.bind(document),O=Node.prototype.cloneNode;m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},document.registerElement=t,document.createElement=f,document.createElementNS=p,Node.prototype.cloneNode=h,e.registry=S,e.instanceof=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(wrap(document)),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(e){i(wrap(e.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}))})}var n=e.useNative,r=e.initializeModules;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e.instanceof=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var a=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(a,t)}else t()}(window.CustomElements),function(){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){"use strict";function t(){window.Polymer===o&&(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 n=Date.now();window.performance={now:function(){return Date.now()-n}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var r=[],o=function(e){"string"!=typeof e&&1===arguments.length&&Array.prototype.push.call(arguments,document._currentScript),r.push(arguments)};window.Polymer=o,e.consumeDeclarations=function(t){e.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},t&&t(r),r=null},HTMLImports.useNative?t():addEventListener("DOMContentLoaded",t)}(window.WebComponents),function(){var e=document.createElement("style");e.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var t=document.querySelector("head");t.insertBefore(e,t.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index 4e6872b..abfc43f 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.9.0+1
+version: 0.10.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
@@ -11,16 +11,3 @@
   bundle code and HTML as if they were libraries.
 environment:
   sdk: ">=1.4.0-dev.6.6 <2.0.0"
-dependencies:
-  code_transformers: ">=0.2.2 <0.3.0"
-transformers:
-# TODO(sigmund): once we have some easier way to do global app-level
-# transformers, we might want to remove this transformer here and only apply it
-# in apps that need it.
-- code_transformers/src/delete_file:
-    $include:
-      - lib/platform.concat.js
-      - lib/platform.concat.js.map
-      - lib/platform.js.map
-- code_transformers/src/remove_sourcemap_comment:
-    $include: lib/platform.js
diff --git a/pkg/web_components/test/interop_test.html b/pkg/web_components/test/interop_test.html
index 4eb1521..bd5a95a 100644
--- a/pkg/web_components/test/interop_test.html
+++ b/pkg/web_components/test/interop_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
   <script src="/packages/web_components/interop_support.js"></script>
 </head>
diff --git a/pkg/web_components/test/location_wrapper_test.html b/pkg/web_components/test/location_wrapper_test.html
index b5f20b6..3d264b1 100644
--- a/pkg/web_components/test/location_wrapper_test.html
+++ b/pkg/web_components/test/location_wrapper_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html b/runtime/bin/vmservice/observatory/deployed/web/index.html
index 5b8be97..0893722 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html
@@ -1,8 +1,8 @@
-<!DOCTYPE html><html style="height: 100%"><head><script src="packages/web_components/dart_support.js"></script>
-
+<!DOCTYPE html><html style="height: 100%"><head>
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
-  <script src="packages/web_components/platform.js"></script>
+  <script src="packages/web_components/webcomponents.min.js"></script>
+<script src="packages/web_components/dart_support.js"></script>
   
   
   
@@ -289,7 +289,7 @@
 
 </style>
 
-<script src="packages/polymer/src/js/polymer/polymer.js"></script>
+<script src="packages/polymer/src/js/polymer/polymer.min.js"></script>
 
 <script>
 // TODO(sigmund): remove this script tag (dartbug.com/19650). This empty
@@ -298,262 +298,9 @@
 
 <!-- unminified for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
-<script src="src/js/polymer/polymer.concat.js"></script>
+<script src="src/js/polymer/polymer.js"></script>
 -->
-<script type="text/javascript" src="https://www.google.com/jsapi"></script><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+<script type="text/javascript" src="https://www.google.com/jsapi"></script><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
 
 
@@ -615,260 +362,7 @@
 </polymer-element>
 
 <polymer-element name="object-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ nameIsEmpty }}">
       <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
     </template>
@@ -882,260 +376,7 @@
 
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -1288,260 +529,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       nav {
         position: fixed;
@@ -1887,260 +875,7 @@
 
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -2171,260 +906,7 @@
 
 
 <polymer-element name="class-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style><span><a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a></span></template>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><span><a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 
@@ -2436,260 +918,7 @@
 
 <polymer-element name="class-tree" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .table {
         border-collapse: collapse!important;
@@ -2812,260 +1041,7 @@
 
 <polymer-element name="error-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -3208,260 +1184,7 @@
 
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ ref.isStatic] }}">static</template>
       <template if="{{ ref.isFinal }}">final</template>
@@ -3485,260 +1208,7 @@
 
 
 <polymer-element name="function-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><!-- These comments are here to allow newlines.
      --><template if="{{ ref.isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; ref.parent == null &amp;&amp; ref.owningClass != null }}"><!--
        --><class-ref ref="{{ ref.owningClass] }}"></class-ref>.</template><!--
@@ -3755,260 +1225,7 @@
 
 
 <polymer-element name="library-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ nameIsEmpty }}">
       <a on-click="{{ goto }}" _href="{{ url }}">unnamed</a>
     </template>
@@ -4177,260 +1394,7 @@
 
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
 </template>
 </polymer-element>
@@ -4440,260 +1404,7 @@
 
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -4878,260 +1589,7 @@
 
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a on-click="{{ goto }}" _href="{{ url }}">*{{ name }}</a>
@@ -5156,260 +1614,7 @@
 
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -5599,260 +1804,7 @@
 
 <polymer-element name="debugger-page" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .container {
         height: 100%;
@@ -5905,260 +1857,7 @@
 
 <polymer-element name="debugger-stack" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ stack == null }}">
       Loading stack frames
     </template>
@@ -6178,260 +1877,7 @@
 
 <polymer-element name="debugger-frame" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .frameOuter {
         position: relative;
@@ -6523,260 +1969,7 @@
 
 <polymer-element name="debugger-console" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textBox {
         position: absolute;
@@ -6792,260 +1985,7 @@
 
 <polymer-element name="debugger-input" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textBox {
         font: 400 16px 'Montserrat', sans-serif;
@@ -7064,260 +2004,7 @@
 
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -7345,260 +2032,7 @@
 
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -7690,260 +2124,7 @@
 
 <polymer-element name="flag-list" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
@@ -7980,260 +2161,7 @@
 
 <polymer-element name="flag-item" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span style="color:#aaa">// {{ flag['comment'] }}</span>
     <div style="padding: 3px 0">
       <b>{{ flag['name'] }}</b>
@@ -8258,260 +2186,7 @@
 
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -8628,260 +2303,7 @@
 
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .hover {
       position: fixed;
@@ -8922,260 +2344,7 @@
 
 <polymer-element name="io-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -9234,260 +2403,7 @@
 
 <polymer-element name="io-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ ref.type == 'Socket' }}">
       <io-socket-ref ref="{{ ref }}"></io-socket-ref>
     </template>
@@ -9508,260 +2424,7 @@
 
 <polymer-element name="io-http-server-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -9788,520 +2451,14 @@
 
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-http-server-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10355,520 +2512,14 @@
 
 <polymer-element name="io-http-server-connection-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-http-server-connection-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10902,520 +2553,14 @@
 
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-socket-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -11442,260 +2587,7 @@
 
 <polymer-element name="io-socket-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -11791,520 +2683,14 @@
 
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-web-socket-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -12331,260 +2717,7 @@
 
 <polymer-element name="io-web-socket-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -12610,520 +2743,14 @@
 
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-random-access-file-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13150,260 +2777,7 @@
 
 <polymer-element name="io-random-access-file-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13437,260 +2811,7 @@
 
 <polymer-element name="io-process-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13717,260 +2838,7 @@
 
 <polymer-element name="io-process-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ small }}">
       <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
     </template>
@@ -13982,260 +2850,7 @@
 
 <polymer-element name="io-process-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -14316,260 +2931,7 @@
 
 
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
 </template>
 </polymer-element>
@@ -14585,260 +2947,7 @@
 
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="flex-row">
       <div class="flex-item-10-percent">
         <img src="packages/observatory/src/elements/img/isolate_icon.png">
@@ -14946,260 +3055,7 @@
         white-space: pre;
       }
     </style>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -15300,260 +3156,7 @@
 
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -15699,260 +3302,7 @@
 
 <polymer-element name="inbound-reference" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div>
       from <any-service-ref ref="{{ source }}"></any-service-ref>
       <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
@@ -15991,260 +3341,7 @@
 
 <polymer-element name="object-common" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="memberList">
 
       <div class="memberItem">
@@ -16340,260 +3437,7 @@
 
 <polymer-element name="context-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <a on-click="{{ goto }}" _href="{{ url }}"><em>Context</em> ({{ ref.length }})</a>
       <curly-block callback="{{ expander() }}">
@@ -16623,260 +3467,7 @@
 
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -17080,260 +3671,7 @@
 
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -17470,260 +3808,7 @@
 
 <polymer-element name="metrics-page" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       ul li:hover:not(.selected) {
         background-color: #FFF3E3;
@@ -17783,260 +3868,7 @@
 
 <polymer-element name="metric-details" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="content-centered">
       <div class="memberList">
         <div class="memberItem">
@@ -18095,260 +3927,7 @@
 
 <polymer-element name="metrics-graph" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .graph {
         min-height: 600px;
@@ -18377,260 +3956,7 @@
 
 <polymer-element name="object-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
@@ -18667,260 +3993,7 @@
 
 <polymer-element name="context-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ context.isolate }}"></isolate-nav-menu>
@@ -18989,260 +4062,7 @@
 
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
@@ -19508,260 +4328,7 @@
 
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -19952,260 +4519,7 @@
 
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -20246,260 +4560,7 @@
 
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -20565,260 +4626,7 @@
 
 <polymer-element name="trace-view" extends="observatory-element">
    <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ tracer != null }}">
       <div class="memberList">
@@ -20846,260 +4654,7 @@
 
 <polymer-element name="map-viewer" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ map.length > 0 }}">
       <curly-block callback="{{ expander() }}">
@@ -21131,260 +4686,7 @@
 
 <polymer-element name="list-viewer" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ list.length > 0 }}">
       <curly-block callback="{{ expander() }}">
@@ -21430,260 +4732,7 @@
 
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -21707,260 +4756,7 @@
 
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -21991,260 +4787,7 @@
         background: #ff0000;
       }
     </style>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ isCurrentTarget }}">
         <a on-click="{{ connectToVm }}" _href="{{ gotoLink('/vm') }}">{{ target.name }} (Connected)</a>
@@ -22261,260 +4804,7 @@
 
 <polymer-element name="vm-connect" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textbox {
         width: 20em;
@@ -22582,260 +4872,7 @@
 
 
 <polymer-element name="vm-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index.html._data b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
index 9e8e93a..d47babe 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/debugger.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
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 908d076..b0e84c5 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
@@ -1,60 +1,39 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
+(function($){
+function dart(){this.x=0
+delete this.x
+}var A=new dart
 var B=new dart
-delete B.x
 var C=new dart
-delete C.x
 var D=new dart
-delete D.x
 var E=new dart
-delete E.x
 var F=new dart
-delete F.x
 var G=new dart
-delete G.x
 var H=new dart
-delete H.x
 var J=new dart
-delete J.x
 var K=new dart
-delete K.x
 var L=new dart
-delete L.x
 var M=new dart
-delete M.x
 var N=new dart
-delete N.x
 var O=new dart
-delete O.x
 var P=new dart
-delete P.x
 var Q=new dart
-delete Q.x
 var R=new dart
-delete R.x
 var S=new dart
-delete S.x
 var T=new dart
-delete T.x
 var U=new dart
-delete U.x
 var V=new dart
-delete V.x
 var W=new dart
-delete W.x
 var X=new dart
-delete X.x
 var Y=new dart
-delete Y.x
 var Z=new dart
-delete Z.x
 function I(){}
 init()
 $=I.p
-var $$={}
+var $$=Object.create(null)
 ;(function(a){"use strict"
-function map(b){b={x:b}
+function map(b){b=Object.create(null)
+b.x=0
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
 if(h==="^")continue
@@ -80,46 +59,48 @@
 var c=b.$methodsWithOptionalArguments
 if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
 if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
-j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
-h.$stubName=b5
-b8.push(b5)
-for(var f=0;f<b4.length;f+=2){h=b4[f+1]
-if(typeof h!="function")break
-h.$stubName=b4[f+2]
-g.push(h)
-if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
-b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
-b4=b4.slice(++f)
-var c=b4[0]
-var b=c>>1
-var a0=(c&1)===1
-var a1=c===3
-var a2=c===1
-var a3=b4[1]
-var a4=a3>>1
-var a5=(a3&1)===1
-var a6=b+a4!=g[0].length
-var a7=b4[2]
-var a8=2*a4+b+3
-var a9=b4.length>a8
-if(d){h=tearOff(g,b4,b6,b5,a6)
-b3[b5].$getter=h
-h.$getterStub=true
-if(b6)init.globalFunctions[b5]=h
-b7[d]=b3[d]=h
-g.push(h)
-if(d)b8.push(d)
-h.$stubName=d
-h.$callName=null
-if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
-g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
-var b1=b4[a8]
-var b2=b1
-if(d)b0[d]=b2
-if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
-g[0].$reflectionName=b2
-g[0].$metadataIndex=a8+1
-if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+j.push(h)}}}function addStubs(b4,b5,b6,b7,b8,b9){var h=0,g=b5[h],f
+if(typeof g=="string"){f=b5[++h]}else{f=g
+g=b6}var e=[b8[b6]=b4[b6]=b4[g]=f]
+f.$stubName=b6
+b9.push(b6)
+for(;h<b5.length;h+=2){f=b5[h+1]
+if(typeof f!="function")break
+f.$stubName=b5[h+2]
+e.push(f)
+if(f.$stubName){b8[f.$stubName]=b4[f.$stubName]=f
+b9.push(f.$stubName)}}for(var d=0;d<e.length;h++,d++){e[d].$callName=b5[h+1]}var c=b5[++h]
+b5=b5.slice(++h)
+var b=b5[0]
+var a0=b>>1
+var a1=(b&1)===1
+var a2=b===3
+var a3=b===1
+var a4=b5[1]
+var a5=a4>>1
+var a6=(a4&1)===1
+var a7=a0+a5!=e[0].length
+var a8=b5[2]
+var a9=2*a5+a0+3
+var b0=b5.length>a9
+if(c){f=tearOff(e,b5,b7,b6,a7)
+b4[b6].$getter=f
+f.$getterStub=true
+if(b7)init.globalFunctions[b6]=f
+b8[c]=b4[c]=f
+e.push(f)
+if(c)b9.push(c)
+f.$stubName=c
+f.$callName=null
+if(a7)init.interceptedNames[c]=true}if(b0){for(var d=0;d<e.length;d++){e[d].$reflectable=1
+e[d].$reflectionInfo=b5}var b1=b7?init.mangledGlobalNames:init.mangledNames
+var b2=b5[a9]
+var b3=b2
+if(c)b1[c]=b3
+if(a2){b3+="="}else if(!a3){b3+=":"+a0+":"+a5}b1[b6]=b3
+e[0].$reflectionName=b3
+e[0].$metadataIndex=a9+1
+if(a5)b4[b2+"*"]=e[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
 return e?function(f){if(h===null)h=H.qmC(this,b,c,false,[f],d)
 return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qmC(this,b,c,false,[],d)
 return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
@@ -153,11 +134,11 @@
 x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["","",,J,{
+"^":"a;tT:Q>"}}],["","",,J,{
 "^":"",
-x:function(a){return void 0},
-uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+t:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+MZ: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
@@ -165,162 +146,167 @@
 if(!0===y)return a
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
-if(z.e===x)throw H.b(P.nO("Return interceptor for "+H.d(y(a,z))))}w=H.Am(a)
+if(z.e===x)throw H.b(P.nO("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.Sx
+if(y==null||y===Object.prototype)return C.ZQ
 else return C.vB}return w},
-e1g:function(a){var z,y,x,w
-z=$.AuW
+TZ:function(a){var z,y,x,w
+z=$.uv
 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},
-Dc:function(a){var z,y,x
-z=J.e1g(a)
+for(z=y.length,x=J.t(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
+if(x.m(a,y[w]))return w}return},
+Fb:function(a){var z,y,x
+z=J.TZ(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-KE:function(a,b){var z,y,x
-z=J.e1g(a)
+YC:function(a,b){var z,y,x
+z=J.TZ(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
 Gv:{
 "^":"a;",
-n:function(a,b){return a===b},
-giO:function(a){return H.wP(a)},
-bu:[function(a){return H.a5(a)},"$0","gCR",0,0,73],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,74],
+m:function(a,b){return a===b},
+giO:function(a){return H.eQ(a)},
+X:["fN",function(a){return H.a5(a)},"$0","gCR",0,0,0],
+P:["bi",function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,75],
 gbx:function(a){return new H.cu(H.wO(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|PushManager|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gCR",0,0,73],
+X:[function(a){return String(a)},"$0","gCR",0,0,0],
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.Ow},
+gbx:function(a){return C.nd},
 $isSQ:true},
 CDU:{
 "^":"Gv;",
-n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gCR",0,0,73],
+m:function(a,b){return null==b},
+X:[function(a){return"null"},"$0","gCR",0,0,0],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gkh",2,0,null,74]},
+P:[function(a,b){return this.bi(a,b)},"$1","gkh",2,0,null,75]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Bc}},
+gbx:function(a){return C.Ho}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
 "^":"Ue1;",
-bu:[function(a){return String(a)},"$0","gCR",0,0,73]},
-Q:{
+X:[function(a){return String(a)},"$0","gCR",0,0,0]},
+G:{
 "^":"Gv;",
+uy:function(a,b){if(!!a.immutable$list)throw H.b(P.f(b))},
+PP:function(a,b){if(!!a.fixed$length)throw H.b(P.f(b))},
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-W4:function(a,b){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("removeAt"))
+W4:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0||b>=a.length)throw H.b(P.D(b,null,null))
+this.PP(a,"removeAt")
 return a.splice(b,1)[0]},
-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"))
+aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0||b>a.length)throw H.b(P.D(b,null,null))
+this.PP(a,"insert")
 a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(a,b,c)},
+UG:function(a,b,c){this.PP(a,"insertAll")
+H.FR(a,b,c)},
 Rz:function(a,b){var z
-if(!!a.fixed$length)H.vh(P.f("remove"))
-for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
+this.PP(a,"remove")
+for(z=0;z<a.length;++z)if(J.mG(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.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],
+ev:function(a,b){return H.J(new H.U5(a,b),[H.u3(H.J(new H.ii(),[H.u3(a,0)]),0)])},
+Ft:[function(a,b){return H.J(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,"G")},31],
 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:"xP",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+for(z=J.Nx(b);z.D();)this.h(a,z.gk())},
+V1:function(a){this.sv(a,0)},
+aN:function(a,b){var z,y
+z=a.length
+for(y=0;y<z;++y){b.$1(a[y])
+if(z!==a.length)throw H.b(P.a4(a))}},
+ez:[function(a,b){return H.J(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"G")},31],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
-y.fixed$length=init
+y.fixed$length=Array
 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.wb(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.J(new H.ii(),[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.wb(),[H.u3(a,0)])
-H.xF(a,b,c)
+D6:function(a,b,c){if(b<0||b>a.length)throw H.b(P.ve(b,0,a.length,null,null))
+if(c<b||c>a.length)throw H.b(P.ve(c,b,a.length,null,null))
+if(b===c)return H.J([],[H.u3(a,0)])
+return H.J(a.slice(b,c),[H.u3(a,0)])},
+Mu:function(a,b,c){var z=H.J(new H.ii(),[H.u3(a,0)])
+P.iZ(b,c,a.length,null,null,null)
 return H.c1(a,b,c,H.u3(z,0))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 oq:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("removeRange"))
+this.PP(a,"removeRange")
 z=a.length
-if(b<0||b>z)throw H.b(P.TE(b,0,z))
-if(c<b||c>z)throw H.b(P.TE(c,b,z))
+if(b<0||b>z)throw H.b(P.ve(b,0,z,null,null))
+if(c<b||c>z)throw H.b(P.ve(c,b,z,null,null))
 H.tb(a,c,a,b,z-c)
-this.sB(a,z-(c-b))},
+this.sv(a,z-(c-b))},
 Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+GT:function(a,b){this.uy(a,"sort")
 H.ig(a,b)},
 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.lO(a,b,a.length-1)},
+Pk:function(a,b,c){return H.EHn(a,b,c==null?a.length-1:c)},
 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
+for(z=0;z<a.length;++z)if(J.mG(a[z],b))return!0
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
+X:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,0],
 tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.u3(a,0)])
-else{z=H.VM(a.slice(),[H.u3(a,0)])
-z.fixed$length=init
+if(b)return H.J(a.slice(),[H.u3(a,0)])
+else{z=H.J(a.slice(),[H.u3(a,0)])
+z.fixed$length=Array
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
+Oe:function(a){var z=P.fM(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)])},
-giO:function(a){return H.wP(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
+gu:function(a){return H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
+giO:function(a){return H.eQ(a)},
+gv:function(a){return a.length},
+sv:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0)throw H.b(P.D(b,null,null))
+this.PP(a,"set length")
 a.length=b},
-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))
+p:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 return a[b]},
-u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
+q:function(a,b,c){this.uy(a,"indexed set")
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 a[b]=c},
-$isQ:true,
+$isG:true,
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-P:{
+F:{
 "^":"Gv;",
 iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a<b)return-1
 else if(a>b)return 1
 else if(a===b){if(a===0){z=this.gzP(b)
@@ -330,7 +316,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -341,42 +327,43 @@
 RE:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:[function(a,b){var z,y
-if(typeof b!=="number")H.vh(P.u(b))
+H.eI(b)
 z=J.Wx(b)
-if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
+if(z.w(b,0)||z.A(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gVz",2,0,14,75],
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
+return y},"$1","gfE",2,0,16,76],
+WZ:function(a,b){H.eI(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"
-else return""+a},"$0","gCR",0,0,73],
+X:[function(a){if(a===0&&1/a<0)return"-0.0"
+else return""+a},"$0","gCR",0,0,0],
 giO:function(a){return a&0x1FFFFFFF},
-J:function(a){return-a},
-g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+G:function(a){return-a},
+g:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+T:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+S:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+R:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
+V:function(a,b){var z
+if(typeof b!=="number")throw H.b(P.p(b))
 z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
 else return z+b},
-Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else{if(typeof b!=="number")H.vh(P.u(b))
+W:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
+else{if(typeof b!=="number")H.vh(P.p(b))
 return this.yu(a/b)}},
 BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
-O:function(a,b){if(b<0)throw H.b(P.u(b))
+L:function(a,b){if(b<0)throw H.b(P.p(b))
 return b>31?0:a<<b>>>0},
 iK:function(a,b){return b>31?0:a<<b>>>0},
-m:function(a,b){var z
-if(b<0)throw H.b(P.u(b))
+l:function(a,b){var z
+if(b<0)throw H.b(P.p(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
@@ -384,94 +371,104 @@
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
-PK:function(a,b){if(b<0)throw H.b(P.u(b))
+bf:function(a,b){if(b<0)throw H.b(P.p(b))
 return b>31?0:a>>>b},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+i:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+s:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+w:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+A:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+B:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+C:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a>=b},
-gbx:function(a){return C.WU},
-$islf:true,
-static:{"^":"SAz,HS"}},
+gbx:function(a){return C.yT},
+$isFK:true,
+static:{"^":"SAz,N6l"}},
 imn:{
-"^":"P;",
+"^":"F;",
 gbx:function(a){return C.yw},
-$isVf:true,
-$islf:true,
+$isCP:true,
+$isFK:true,
 $isKN:true},
-VA7:{
-"^":"P;",
-gbx:function(a){return C.cz},
-$isVf:true,
-$islf:true},
-O:{
+VA:{
+"^":"F;",
+gbx:function(a){return C.hc},
+$isCP:true,
+$isFK:true},
+E:{
 "^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
+O2:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0)throw H.b(P.D(b,null,null))
+if(b>=a.length)throw H.b(P.D(b,null,null))
 return a.charCodeAt(b)},
-dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+ww:function(a,b,c){H.Yx(b)
+H.m1(c)
+if(c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 return H.ZT(a,b,c)},
-dd:function(a,b){return this.dm(a,b,0)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
+dd:function(a,b){return this.ww(a,b,0)},
+wL:function(a,b,c){var z,y
+if(c<0||c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 z=a.length
-y=b.length
-if(c+z>y)return
-for(x=0;x<z;++x){w=c+x
-if(w<0)H.vh(P.N(w))
-if(w>=y)H.vh(P.N(w))
-w=b.charCodeAt(w)
-if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
-g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
+if(c+z>b.length)return
+for(y=0;y<z;++y)if(this.O2(b,c+y)!==this.O2(a,y))return
+return new H.Vo(c,b,a)},
+g:function(a,b){if(typeof b!=="string")throw H.b(P.p(b))
 return a+b},
 C1:function(a,b){var z,y
+H.Yx(b)
 z=b.length
 y=a.length
 if(z>y)return!1
 return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.Gu(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
+h8:function(a,b,c){H.Yx(c)
+return H.AD(a,b,c)},
+Fr:function(a,b){if(b==null)H.vh(P.p(null))
 if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Yr)
-else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-Ys:function(a,b,c){var z
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
+else if(!!J.t(b).$isVR&&b.gIa().exec('').length-2===0)return a.split(b.gYr())
+else return this.vA(a,b)},
+vA:function(a,b){var z,y,x,w,v,u,t
+z=H.J([],[P.I])
+for(y=J.Nx(J.qv(b,a)),x=0,w=1;y.D();){v=y.gk()
+u=J.y1(v)
+t=v.gwQ()
+w=J.D5(t,u)
+if(J.mG(w,0)&&J.mG(x,u))continue
+z.push(this.Nj(a,x,u))
+x=t}if(J.UN(x,a.length)||J.vU(w,0))z.push(this.yn(a,x))
+return z},
+Qi:function(a,b,c){var z
+H.m1(c)
+if(c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.Ys(a,b,0)},
+nC:function(a,b){return this.Qi(a,b,0)},
 Nj:function(a,b,c){var z
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.p(b))
 if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
+if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.p(c))
 z=J.Wx(b)
-if(z.C(b,0))throw H.b(P.N(b))
-if(z.D(b,c))throw H.b(P.N(b))
-if(J.xZ(c,a.length))throw H.b(P.N(c))
+if(z.w(b,0))throw H.b(P.D(b,null,null))
+if(z.A(b,c))throw H.b(P.D(b,null,null))
+if(J.vU(c,a.length))throw H.b(P.D(c,null,null))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-if(this.j(z,0)===133){x=J.mm(z,1)
+if(this.O2(z,0)===133){x=J.mm(z,1)
 if(x===y)return""}else x=0
 w=y-1
-v=this.j(z,w)===133?J.r9(z,w):y
+v=this.O2(z,w)===133?J.r9(z,w):y
 if(x===0&&v===y)return z
 return z.substring(x,v)},
-U:function(a,b){var z,y
-if(typeof b!=="number")return H.s(b)
+R:function(a,b){var z,y
+if(typeof b!=="number")return H.o(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
 if(b!==b>>>0)throw H.b(C.Eq)
@@ -479,80 +476,74 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-YX:function(a,b,c){var z=b-a.length
+Zp: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)},
+return this.R(c,z)+a},
+gNq:function(a){return new J.mN(a)},
 XU:function(a,b,c){var z,y,x,w
-if(b==null)H.vh(P.u(null))
-if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
+if(b==null)H.vh(P.p(null))
+if(c<0||c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
+z=J.t(b)
 if(!!z.$isVR){y=b.UZ(a,c)
-return y==null?-1:y.pX.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
+return y==null?-1:y.a.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
 OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
-c=a.length
+if(c==null)c=a.length
+else if(c<0||c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 z=b.length
+if(typeof c!=="number")return c.g()
 y=a.length
 if(c+z>y)c=y-z
 return a.lastIndexOf(b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-eM:function(a,b,c){if(b==null)H.vh(P.u(null))
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
+eM:function(a,b,c){if(b==null)H.vh(P.p(null))
+if(c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 return H.m2(a,b,c)},
 tg:function(a,b){return this.eM(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:function(a,b){var z
-if(typeof b!=="string")throw H.b(P.u(b))
+if(typeof b!=="string")throw H.b(P.p(b))
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gCR",0,0,73],
+X:[function(a){return a},"$0","gCR",0,0,0],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
 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.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))
+gbx:function(a){return C.yE},
+gv:function(a){return a.length},
+p:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 return a[b]},
-$isqU:true,
+$isI:true,
 static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},mm:function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
-y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
-for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
-IA:{
-"^":"w2Y;vF",
-gB:function(a){return this.vF.length},
-t:function(a,b){var z,y
-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))
-if(y.F(b,z.length))H.vh(P.N(b))
-return z.charCodeAt(b)},
+for(z=a.length;b<z;){y=C.yo.O2(a,b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y
+for(;b>0;b=z){z=b-1
+y=C.yo.O2(a,z)
+if(y!==32&&y!==13&&!J.Ga(y))break}return b}}},
+mN:{
+"^":"w2Y;Q",
+gv:function(a){return this.Q.length},
+p:function(a,b){return C.yo.O2(this.Q,b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$aseD:function(){return[P.KN]},
+$asE9h:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
+init.globalState.e.bL()
 return z},
-cv:function(){--init.globalState.Xz.kv},
+cv:function(){--init.globalState.e.a},
 wW:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
@@ -561,31 +552,31 @@
 if(b==null){b=[]
 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.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
+if(!J.t(y).$isWO)throw H.b(P.p("Arguments to main must be a List: "+H.d(y)))
+y=new H.pq(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++
+if(init.globalState.r===!0)return
+y=init.globalState.Q++
 x=P.L5(null,null,null,P.KN,H.HX)
-w=P.Ls(null,null,null,P.KN)
+w=P.fM(null,null,null,P.KN)
 v=new H.HX(0,null,!1)
-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))
+u=new H.Du(y,x,w,new I(),v,new H.iV(H.Uh()),new H.iV(H.Uh()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
-init.globalState.Nr=u
-init.globalState.N0=u
+init.globalState.d=u
+init.globalState.c=u
 y=H.G3()
 x=H.KT(y,[y]).Zg(a)
-if(x)u.vV(0,new H.mP(z,a))
+if(x)u.vV(0,new H.Fx(z,a))
 else{y=H.KT(y,[y,y]).Zg(a)
-if(y)u.vV(0,new H.Fx(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
+if(y)u.vV(0,new H.PKK(z,a))
+else u.vV(0,a)}init.globalState.e.bL()},
 yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.cL()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.cL()
+if(init.globalState.r===!0)return H.cL()
 return},
 cL:function(){var z,y
 z=new Error().stack
@@ -596,580 +587,576 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.Hhn(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.Hhn(y.t(z,"msg"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hhn(y.t(z,"replyTo"))
-y=init.globalState.Hg++
+switch(y.p(z,"command")){case"start":init.globalState.a=y.p(z,"id")
+x=y.p(z,"functionName")
+w=x==null?init.globalState.cx:H.WL(x)
+v=y.p(z,"args")
+u=H.Ln(y.p(z,"msg"))
+t=y.p(z,"isSpawnUri")
+s=y.p(z,"startPaused")
+r=H.Ln(y.p(z,"replyTo"))
+y=init.globalState.Q++
 q=P.L5(null,null,null,P.KN,H.HX)
-p=P.Ls(null,null,null,P.KN)
+p=P.fM(null,null,null,P.KN)
 o=new H.HX(0,null,!1)
-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))
+n=new H.Du(y,q,p,new I(),o,new H.iV(H.Uh()),new H.iV(H.Uh()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(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"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
+init.globalState.e.Q.B7(0,new H.IY(n,new H.xn(w,v,u,t,s,r),"worker-start"))
+init.globalState.c=n
+init.globalState.e.bL()
 break
 case"spawn-worker":break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
+case"message":if(y.p(z,"port")!=null)J.H4(y.p(z,"port"),y.p(z,"msg"))
+init.globalState.e.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
+case"close":init.globalState.ch.Rz(0,$.AW().p(0,a))
 a.terminate()
-init.globalState.Xz.bL()
+init.globalState.e.bL()
 break
-case"log":H.yb(y.t(z,"msg"))
+case"log":H.yb(y.p(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))
+case"print":if(init.globalState.r===!0){y=init.globalState.z
+q=H.GyL(P.B(["command","print","msg",z],null,null))
 y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
+self.postMessage(q)}else P.FL(y.p(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+case"error":throw H.b(y.p(z,"msg"))}},"$2","dM",4,0,null,3,4],
 yb: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))
+if(init.globalState.r===!0){y=init.globalState.z
+x=H.GyL(P.B(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
-z=new H.oP(w,null)
+z=new H.XO(w,null)
 throw H.b(P.eG(z))}},
+WL:function(a){return init.globalFunctions[a]()},
 Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.H9=$.H9+("_"+y)
+z=init.globalState.c
+y=z.Q
+$.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.er
-x=init.globalState.N0.jO
-w=z.Qy
-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)
-init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+y=z.d
+x=init.globalState.c.Q
+w=z.e
+J.H4(f,["spawned",new H.VU(y,x),w,z.f])
+x=new H.Vg(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.e.Q.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.oV())
-z.dZ=new H.m3(null)
-return z.h7(a)}else{z=new H.fL(new H.oV())
-z.dZ=new H.m3(null)
+if(init.globalState.x===!0){z=new H.Bjm(0,new H.cx())
+z.Q=new H.fP(null)
+return z.h7(a)}else{z=new H.fL(new H.cx())
+z.Q=new H.fP(null)
 return z.h7(a)}},
-Hhn:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
+Ln:function(a){if(init.globalState.x===!0)return new H.hq(null).ug(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"},
-mP:{
-"^":"TpZ:76;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
 Fx:{
-"^":"TpZ:76;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-dl:{
-"^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
+"^":"r:77;Q,a",
+$0:function(){this.a.$1(this.Q.a)}},
+PKK:{
+"^":"r:77;Q,a",
+$0:function(){this.a.$2(this.Q.a,null)}},
+pq:{
+"^":"a;Q,a,b,c,d,e,f,r,x,i2:y<,z,ch,w2:cx<",
 N8:function(a){var z,y,x
 z=self.window==null
 y=self.Worker
 x=z&&!!self.postMessage
-this.EF=x
+this.r=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
-this.ji=y
-this.Ws=z&&!x
-y=H.IY
-x=H.VM(new P.nd(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.wX(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()
-this.rj=z
+this.x=y
+this.f=z&&!x
+this.e=new H.ae(P.NZ2(null,H.IY),0)
+this.y=P.L5(null,null,null,P.KN,H.Du)
+this.ch=P.L5(null,null,null,P.KN,null)
+if(this.r===!0){z=new H.JH()
+this.z=z
 self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
 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<,er<,Qy,PX,xF?,UF<,Vp<,bm,QC,fB,P0,pa,ir",
-oz:function(a,b){if(!this.Qy.n(0,a))return
-if(this.bm.h(0,b)&&!this.UF)this.UF=!0
+static:{wI:[function(a){return H.GyL(P.B(["command","print","msg",a],null,null))},"$1","UB",2,0,null,2]}},
+Du:{
+"^":"a;jO:Q>,a,b,En:c<,WE:d<,e,f,xF:r?,RW:x<,C9:y<,z,ch,cx,cy,db,dx",
+V0:function(a,b){if(!this.e.m(0,a))return
+if(this.z.h(0,b)&&!this.x)this.x=!0
 this.CX()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.bm
+cK:function(a){var z,y,x,w,v,u
+if(!this.x)return
+z=this.z
 z.Rz(0,a)
-if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.Q===0){for(z=this.y;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
-y=init.globalState.Xz.Rk
-w=y.QN
-v=y.E3
+y=init.globalState.e.Q
+w=y.a
+v=y.Q
 u=v.length
 w=(w-1&u-1)>>>0
-y.QN=w
+y.a=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.Bq)y.OO();++y.Z1}this.UF=!1}this.CX()},
-Ma:function(a){var z=this.QC
+if(w===y.b)y.OO();++y.c}this.x=!1}this.CX()},
+Ma:function(a){var z=this.ch
 if(z==null){z=[]
-this.QC=z}if(J.kE(z,a))return
-this.QC.push(a)},
-IB:function(a){var z=this.QC
+this.ch=z}if(J.kE(z,a))return
+this.ch.push(a)},
+IB:function(a){var z=this.ch
 if(z==null)return
 J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
+JZ:function(a,b){if(!this.f.m(0,a))return
+this.db=b},
 ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.P0
+z=J.t(b)
+if(!z.m(b,0))y=z.m(b,1)&&!this.cy
 else y=!0
 if(y){J.H4(a,null)
-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=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
-this.fB=z}z.B7(0,y)},
+return}y=new H.BZ(a)
+if(z.m(b,2)){init.globalState.e.Q.B7(0,new H.IY(this,y,"ping"))
+return}z=this.cx
+if(z==null){z=P.NZ2(null,null)
+this.cx=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
+if(!this.f.m(0,a))return
+z=J.t(b)
+if(!z.m(b,0))y=z.m(b,1)&&!this.cy
 else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
+if(y){this.f7()
+return}if(z.m(b,2)){z=init.globalState.e
 y=this.gIm()
-z.Rk.B7(0,new H.IY(this,y,"kill"))
-return}z=this.fB
-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())},
+z.Q.B7(0,new H.IY(this,y,"kill"))
+return}z=this.cx
+if(z==null){z=P.NZ2(null,null)
+this.cx=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
-z=this.ir
-if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
+z=this.dx
+if(z.Q===0){if(this.db===!0&&this===init.globalState.d)return
 if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
-y.fixed$length=init
-y[0]=J.AG(a)
-y[1]=b==null?null:J.AG(b)
-for(z=H.VM(new P.zQ(z,z.HU,null,null),[null]),z.Qx=z.vY.HH;z.G();)J.H4(z.fD,y)},
+y.fixed$length=Array
+y[0]=J.Lz(a)
+y[1]=b==null?null:J.Lz(b)
+for(z=H.J(new P.zQ(z,z.f,null,null),[null]),z.b=z.Q.d;z.D();)J.H4(z.c,y)},
 vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
+z=init.globalState.c
+init.globalState.c=this
+$=this.c
 y=null
-this.P0=!0
+this.cy=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.oP(v,null)
+w=new H.XO(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
-init.globalState.N0=z
+if(this.db===!0){this.f7()
+if(this===init.globalState.d)throw v}}finally{this.cy=!1
+init.globalState.c=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],
+if(this.cx!=null)for(;u=this.cx,!u.gl0(u);)this.cx.AR().$0()}return y},"$1","gZ2",2,0,78,79],
 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.p(a,0)){case"pause":this.V0(z.p(a,1),z.p(a,2))
 break
-case"resume":this.NR(z.t(a,1))
+case"resume":this.cK(z.p(a,1))
 break
-case"add-ondone":this.Ma(z.t(a,1))
+case"add-ondone":this.Ma(z.p(a,1))
 break
-case"remove-ondone":this.IB(z.t(a,1))
+case"remove-ondone":this.IB(z.p(a,1))
 break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
+case"set-errors-fatal":this.JZ(z.p(a,1),z.p(a,2))
 break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
+case"ping":this.ZC(z.p(a,1),z.p(a,2))
 break
-case"kill":this.w1(z.t(a,1),z.t(a,2))
+case"kill":this.w1(z.p(a,1),z.p(a,2))
 break
-case"getErrors":this.ir.h(0,z.t(a,1))
+case"getErrors":this.dx.h(0,z.p(a,1))
 break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
+case"stopErrors":this.dx.Rz(0,z.p(a,1))
 break}},
-Ie:function(a){return this.A4.t(0,a)},
-ac:function(a,b){var z=this.A4
+iQ:function(a){return this.a.p(0,a)},
+ac:function(a,b){var z=this.a
 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.Dm()},
-Dm:[function(){var z,y
-z=this.fB
+z.q(0,a,b)},
+CX:function(){if(this.a.Q-this.b.Q>0||this.x||!this.r)init.globalState.y.q(0,this.Q,this)
+else this.f7()},
+f7:[function(){var z,y
+z=this.cx
 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.Ff.BG()
+for(z=this.a,y=z.gUQ(z),y=H.J(new H.MH(null,J.Nx(y.Q),y.a),[H.u3(y,0),H.u3(y,1)]);y.D();)y.Q.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.Ff,null)
-this.QC=null}},"$0","gIm",0,0,17],
-$isaX:true},
-NYh:{
-"^":"TpZ:17;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-wX:{
-"^":"a;Rk>,kv",
-mj:function(){var z=this.Rk
-if(z.QN===z.Bq)return
+this.b.V1(0)
+init.globalState.y.Rz(0,this.Q)
+this.dx.V1(0)
+z=this.ch
+if(z!=null){for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.H4(z.c,null)
+this.ch=null}},"$0","gIm",0,0,1],
+$isDu:true},
+BZ:{
+"^":"r:1;Q",
+$0:[function(){J.H4(this.Q,null)},"$0",null,0,0,null,"call"]},
+ae:{
+"^":"a;Rk:Q>,a",
+mj:function(){var z=this.Q
+if(z.a===z.b)return
 return z.AR()},
-d5:function(){var z,y,x
+xB: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."))
+if(z==null){if(init.globalState.d!=null&&init.globalState.y.NZ(0,init.globalState.d.Q)&&init.globalState.f===!0&&init.globalState.d.a.Q===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
-x=H.GyL(P.EF(["command","close"],null,null))
+if(y.r===!0&&y.y.Q===0&&y.e.a===0){y=y.z
+x=H.GyL(P.B(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.d5(););},
+IV:function(){if(self.window!=null)new H.Rm(this).$0()
+else for(;this.xB(););},
 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)
+if(init.globalState.r!==!0)this.IV()
+else try{this.IV()}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-w=init.globalState.rj
-v=H.GyL(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
+y=new H.XO(x,null)
+w=init.globalState.z
+v=H.GyL(P.B(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"TpZ:17;a",
-$0:[function(){if(!this.a.d5())return
-P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:1;Q",
+$0:[function(){if(!this.Q.xB())return
+P.cH(C.RT,this)},"$0",null,0,0,null,"call"]},
 IY:{
-"^":"a;od*,xh,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gVp().push(this)
-return}J.QT(this.od,this.xh)},"$0","gpE",0,0,17],
+"^":"a;od:Q*,a,G1:b>",
+Fn:[function(a){if(this.Q.gRW()){this.Q.gC9().push(this)
+return}J.QT(this.Q,this.a)},"$0","gpE",0,0,1],
 $isIY:true},
 JH:{
 "^":"a;"},
-jl3:{
-"^":"TpZ:76;a,b,c,d,e,f",
-$0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
-$isEH:true},
-zX:{
-"^":"TpZ:17;a,b,c,d,e",
+xn:{
+"^":"r:77;Q,a,b,c,d,e",
+$0:[function(){H.Di(this.Q,this.a,this.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"]},
+Vg:{
+"^":"r:1;Q,a,b,c,d",
 $0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
+this.d.sxF(!0)
+if(this.c!==!0)this.Q.$1(this.b)
+else{z=this.Q
 y=H.G3()
 x=H.KT(y,[y,y]).Zg(z)
-if(x)z.$2(this.b,this.c)
+if(x)z.$2(this.a,this.b)
 else{y=H.KT(y,[y]).Zg(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
+if(y)z.$1(this.a)
+else z.$0()}}},"$0",null,0,0,null,"call"]},
 Iy4:{
 "^":"a;",
-$ispW:true,
-$ishq:true},
-Kg:{
-"^":"Iy4;kx,AJ",
+$isbCx:true,
+$isXY:true},
+VU:{
+"^":"Iy4;a,Q",
 wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.AJ
-x=init.globalState.i2.t(0,y)
+y=this.Q
+x=init.globalState.y.p(0,y)
 if(x==null)return
-w=this.kx
-if(w.geL())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
+w=this.a
+if(w.gGl())return
+v=init.globalState.c!=null&&init.globalState.c.Q!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.ger()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
+if(x.gWE()===w){x.Ds(z.a)
+return}y=init.globalState.e
 w="receive "+H.d(b)
-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).$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",
+y.Q.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isVU&&J.mG(this.a,b.a)},
+giO:function(a){return J.iF(this.a)},
+$isVU:true,
+$isbCx:true,
+$isXY:true},
+cR:{
+"^":"r:77;Q,a,b",
 $0:[function(){var z,y
-z=this.b.kx
-if(!z.geL()){if(this.c){y=this.a
-y.a=H.Hhn(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+z=this.a.a
+if(!z.gGl()){if(this.b){y=this.Q
+y.a=H.Ln(y.a)}J.ocJ(z,this.Q.a)}},"$0",null,0,0,null,"call"]},
 bM:{
-"^":"Iy4;Bi,ma,AJ",
+"^":"Iy4;a,b,Q",
 wR:function(a,b){var z,y
-z=H.GyL(P.EF(["command","message","port",this,"msg",b],null,null))
-if(init.globalState.EF===!0){init.globalState.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.Bi)
+z=H.GyL(P.B(["command","message","port",this,"msg",b],null,null))
+if(init.globalState.r===!0){init.globalState.z.toString
+self.postMessage(z)}else{y=init.globalState.ch.p(0,this.a)
 if(y!=null)y.postMessage(z)}},
-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)},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isbM&&J.mG(this.a,b.a)&&J.mG(this.Q,b.Q)&&J.mG(this.b,b.b)},
 giO:function(a){var z,y,x
-z=J.Eh(this.Bi,16)
-y=J.Eh(this.AJ,8)
-x=this.ma
-if(typeof x!=="number")return H.s(x)
+z=J.o3(this.a,16)
+y=J.o3(this.Q,8)
+x=this.b
+if(typeof x!=="number")return H.o(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$ispW:true,
-$ishq:true},
+$isbCx:true,
+$isXY:true},
 HX:{
-"^":"a;a7>,Oy,eL<",
-mY:function(a){return this.Oy.$1(a)},
-BG:function(){this.eL=!0
-this.Oy=null},
+"^":"a;TU:Q>,a,Gl:b<",
+mY:function(a){return this.a.$1(a)},
+BG:function(){this.b=!0
+this.a=null},
 xO:function(a){var z,y
-if(this.eL)return
-this.eL=!0
-this.Oy=null
-z=init.globalState.N0
-y=this.a7
-z.A4.Rz(0,y)
-z.fW.Rz(0,y)
+if(this.b)return
+this.b=!0
+this.a=null
+z=init.globalState.c
+y=this.Q
+z.a.Rz(0,y)
+z.b.Rz(0,y)
 z.CX()},
-yU:function(a,b){if(this.eL)return
+yU:function(a,b){if(this.b)return
 this.mY(b)},
 $isHX:true,
 static:{"^":"tye"}},
-RS:{
-"^":"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.$iskuS)return["capability",a.a7]
-throw H.b("Capability not serializable: "+a.bu(0))}},
+Bjm:{
+"^":"jP1;a,Q",
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.a,a.Q,J.iF(a.a)]
+if(!!a.$isbM)return["sendport",a.a,a.Q,a.b]
+throw H.b("Illegal underlying port "+a.X(0))},
+yf:function(a){if(!!a.$isiV)return["capability",a.Q]
+throw H.b("Capability not serializable: "+a.X(0))},
+Ms:function(a){var z=!!a.$isr?a.$name:null
+if(z==null)throw H.b(P.f("only top-level functions can be sent."))
+return["function",z]}},
 fL:{
-"^":"ooy;dZ",
-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.$iskuS)return new H.kuS(a.a7)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
-"^":"fPc;Bw",
+"^":"ooy;Q",
+DE:function(a){if(!!a.$isVU)return new H.VU(a.a,a.Q)
+if(!!a.$isbM)return new H.bM(a.a,a.b,a.Q)
+throw H.b("Illegal underlying port "+a.X(0))},
+yf:function(a){if(!!a.$isiV)return new H.iV(a.Q)
+throw H.b("Capability not serializable: "+a.X(0))},
+Ms:function(a){var z=!!a.$isr?a.$name:null
+if(z==null)throw H.b(P.f("only top-level functions can be sent."))
+return H.WL(z)}},
+hq:{
+"^":"fPc;Q",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-w=z.t(a,3)
-if(J.xC(y,init.globalState.NO)){v=init.globalState.i2.t(0,x)
+y=z.p(a,1)
+x=z.p(a,2)
+w=z.p(a,3)
+if(J.mG(y,init.globalState.a)){v=init.globalState.y.p(0,x)
 if(v==null)return
-u=v.Ie(w)
+u=v.iQ(w)
 if(u==null)return
-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;At",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.At.push(b)
+return new H.VU(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.iV(J.Tf(a,1))},
+Bz:function(a){return H.WL(J.Tf(a,1))}},
+fP:{
+"^":"a;Q",
+p:function(a,b){return b.__MessageTraverser__attached_info__},
+q:function(a,b,c){this.Q.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.At=[]},
+CH:function(a){this.Q=[]},
 F4:function(){var z,y,x
-for(z=this.At.length,y=0;y<z;++y){x=this.At
+for(z=this.Q.length,y=0;y<z;++y){x=this.Q
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.At=null}},
-oV:{
+x[y].__MessageTraverser__attached_info__=null}this.Q=null}},
+cx:{
 "^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
+p:function(a,b){return},
+q:function(a,b,c){},
 CH:function(a){},
 F4:function(){}},
 HU5:{
 "^":"a;",
 h7:function(a){var z
-if(H.vM(a))return this.Wp(a)
-this.dZ.CH(0)
+if(H.vM(a))return this.nl(a)
+this.Q.CH(0)
 z=null
-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)
+try{z=this.I2(a)}finally{this.Q.F4()}return z},
+I2:function(a){var z
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.nl(a)
+z=J.t(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.TI(a)
-if(!!z.$ispW)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$isw)return this.w5(a)
+if(!!z.$isbCx)return this.DE(a)
+if(!!z.$isXY)return this.yf(a)
+if(!!z.$isEH)return this.Ms(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
 "^":"HU5;",
-Wp:function(a){return a},
+nl:function(a){return a},
 wb:function(a){var z,y,x,w
-z=this.dZ.t(0,a)
+z=this.Q.p(0,a)
 if(z!=null)return z
 y=J.U6(a)
-x=y.gB(a)
+x=y.gv(a)
 z=Array(x)
-z.fixed$length=init
-this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
+z.fixed$length=Array
+this.Q.q(0,a,z)
+for(w=0;w<x;++w)z[w]=this.I2(y.p(a,w))
 return z},
-TI:function(a){var z,y
+w5:function(a){var z,y
 z={}
-y=this.dZ.t(0,a)
+y=this.Q.p(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.dZ.u(0,a,y)
+this.Q.q(0,a,y)
 J.Me(a,new H.RK(z,this))
 return z.a},
+Ms:function(a){return H.vh(P.nO(null))},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 RK:{
-"^":"TpZ:81;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
-$isEH:true},
-hz:{
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.a
+J.H9(this.Q.a,z.I2(a),z.I2(b))}},
+jP1:{
 "^":"HU5;",
-Wp:function(a){return a},
+nl:function(a){return a},
 wb:function(a){var z,y
-z=this.dZ.t(0,a)
+z=this.Q.p(0,a)
 if(z!=null)return["ref",z]
-y=this.uP++
-this.dZ.u(0,a,y)
+y=this.a++
+this.Q.q(0,a,y)
 return["list",y,this.IP(a)]},
-TI:function(a){var z,y,x
-z=this.dZ.t(0,a)
+w5:function(a){var z,y,x
+z=this.Q.p(0,a)
 if(z!=null)return["ref",z]
-y=this.uP++
-this.dZ.u(0,a,y)
+y=this.a++
+this.Q.q(0,a,y)
 x=J.RE(a)
 return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=z.gB(a)
+y=z.gv(a)
 x=[]
-C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.B3(z.t(a,w))
+C.Nm.sv(x,y)
+for(w=0;w<y;++w){v=this.I2(z.p(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))}},
+yf:function(a){return H.vh(P.nO(null))},
+Ms:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
-this.Bw=P.YM(null,null,null,null,null)
+ug:function(a){if(H.ZR(a))return a
+this.Q=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
-switch(z.t(a,0)){case"ref":y=z.t(a,1)
-return this.Bw.t(0,y)
-case"list":return this.vo(a)
+switch(z.p(a,0)){case"ref":y=z.p(a,1)
+return this.Q.p(0,y)
+case"list":return this.GC(a)
 case"map":return this.p1(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
+case"function":return this.Bz(a)
 default:return this.fp(a)}},
-vo:function(a){var z,y,x,w,v
+GC:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.Bw.u(0,y,x)
+y=z.p(a,1)
+x=z.p(a,2)
+this.Q.q(0,y,x)
 z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
+w=z.gv(x)
+if(typeof w!=="number")return H.o(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.H6(z.t(x,v)))
+for(;v<w;++v)z.q(x,v,this.H6(z.p(x,v)))
 return x},
 p1:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
-x=y.t(a,1)
-this.Bw.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
+x=y.p(a,1)
+this.Q.q(0,x,z)
+w=y.p(a,2)
+v=y.p(a,3)
 y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
+u=y.gv(w)
+if(typeof u!=="number")return H.o(u)
 t=J.U6(v)
 s=0
-for(;s<u;++s)z.u(0,this.H6(y.t(w,s)),this.H6(t.t(v,s)))
+for(;s<u;++s)z.q(0,this.H6(y.p(w,s)),this.H6(t.p(v,s)))
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"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
+"^":"a;Q,a,b",
+Gv:function(){if(self.setTimeout!=null){if(this.a)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.b==null)return
 H.cv()
-var z=this.Iw
-if(this.bf)self.clearTimeout(z)
+var z=this.b
+if(this.Q)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
-this.Iw=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
+this.b=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.e.a
+this.b=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.r===!0
 else z=!1
-if(z){this.Iw=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.TD=!0}else if(self.setTimeout!=null){++init.globalState.Xz.kv
-this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
+if(z){this.b=1
+z=init.globalState.e
+y=init.globalState.c
+z.Q.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
+this.a=!0}else if(self.setTimeout!=null){++init.globalState.e.a
+this.b=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},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
-"^":"TpZ:17;a,b",
-$0:[function(){this.a.Iw=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:1;Q,a",
+$0:[function(){this.Q.b=null
+this.a.$0()},"$0",null,0,0,null,"call"]},
 vt:{
-"^":"TpZ:17;c,d",
-$0:[function(){this.c.Iw=null
+"^":"r:1;Q,a",
+$0:[function(){this.Q.b=null
 H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+this.a.$0()},"$0",null,0,0,null,"call"]},
 DH:{
-"^":"TpZ:76;a,b",
-$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-kuS:{
-"^":"a;a7>",
+"^":"r:77;Q,a",
+$0:[function(){this.a.$1(this.Q)},"$0",null,0,0,null,"call"]},
+iV:{
+"^":"a;TU:Q>",
 giO:function(a){var z,y,x
-z=this.a7
+z=this.Q
 y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(y)
+x=y.l(z,0)
+y=y.W(z,4294967296)
+if(typeof y!=="number")return H.o(y)
 z=x^y
 z=(~z>>>0)+(z<<15>>>0)&4294967295
 z=((z^z>>>12)>>>0)*5&4294967295
 z=((z^z>>>4)>>>0)*2057&4294967295
 return(z^z>>>16)>>>0},
-n:function(a,b){var z,y
+m:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$iskuS){z=this.a7
-y=b.a7
+if(!!J.t(b).$isiV){z=this.Q
+y=b.Q
 return z==null?y==null:z===y}return!1},
-$iskuS:true,
-$ishq:true}}],["","",,H,{
+$isiV:true,
+$isXY:true}}],["","",,H,{
 "^":"",
-Gp:function(a,b){var z
+wVW:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
+if(z!=null)return z}return!!J.t(a).$isXj},
 d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
-z=J.AG(a)
-if(typeof z!=="string")throw H.b(P.u(a))
+z=J.Lz(a)
+if(typeof z!=="string")throw H.b(P.p(a))
 return z},
-wP:function(a){var z=a.$identityHash
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
+nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,5],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.kk()
-if(typeof a!=="string")H.vh(P.u(a))
+if(c==null)c=H.UR()
+H.Yx(a)
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
 if(2>=y)return H.e(z,2)
@@ -1187,31 +1174,31 @@
 w=z[1]
 y=J.U6(w)
 v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
+while(!0){u=y.gv(w)
+if(typeof u!=="number")return H.o(u)
 if(!(v<u))break
-y.j(w,0)
-if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
+y.O2(w,0)
+if(y.O2(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
 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.kk()
+H.Yx(a)
+if(b==null)b=H.UR()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.rr(a)
+if(isNaN(z)){y=J.Q7(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},
 lh:function(a){var z,y
-z=C.w2(J.x(a))
+z=C.w2(J.t(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.j(z,0)===36)z=C.yo.yn(z,1)
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.O2(z,0)===36)z=C.yo.yn(z,1)
 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],
-Xe:function(){var z,y
+Qn:[function(){return Date.now()},"$0","EY",0,0,6],
+w4:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
-$.hG=H.EY()
+$.Zg=H.EY()
 if(typeof window=="undefined")return
 z=window
 if(z==null)return
@@ -1219,7 +1206,7 @@
 if(y==null)return
 if(typeof y.now!="function")return
 $.xG=1000000
-$.hG=new H.ww(y)},
+$.Zg=new H.ww(y)},
 RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
@@ -1231,44 +1218,45 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.Ff
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
+for(;y.D();){x=y.c
+if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.p(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)},
-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))
+z.push(56320+(x&1023))}else throw H.b(P.p(x))}return H.RF(z)},
+LY:function(a){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
+if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.p(y))
+if(y<0)throw H.b(P.p(y))
 if(y>65535)return H.Cq(a)}return H.RF(a)},
 mx:function(a){var z
-if(typeof a!=="number")return H.s(a)
+if(typeof a!=="number")return H.o(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.ve(a,0,1114111,null,null))},
 fu:function(a,b,c,d,e,f,g,h){var z,y,x,w
-if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(typeof d!=="number"||Math.floor(d)!==d)H.vh(P.u(d))
-if(typeof e!=="number"||Math.floor(e)!==e)H.vh(P.u(e))
-if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
-z=J.bI(b,1)
+H.m1(a)
+H.m1(b)
+H.m1(c)
+H.m1(d)
+H.m1(e)
+H.m1(f)
+H.m1(g)
+z=J.D5(b,1)
 y=h?Date.UTC(a,z,c,d,e,f,g):new Date(a,z,c,d,e,f,g).valueOf()
 if(isNaN(y)||y<-8640000000000000||y>8640000000000000)return
 x=J.Wx(a)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
+if(x.B(a,0)||x.w(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
 return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.rq)
+o2:function(a){if(a.date===void 0)a.date=new Date(a.Q)
 return a.date},
-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},
-VKg:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+KL:function(a){return a.a?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
+ch:function(a){return a.a?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
+Sw:function(a){return a.a?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.p(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))
+wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.p(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1278,19 +1266,19 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+return J.DZ(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
 eC:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
-if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
+if(c!=null&&!c.gl0(c)){y=J.t(a)["call*"]
 if(y==null)return H.zo(a,b,c)
 x=H.zh(y)
-if(x==null||!x.Mo)return H.zo(a,b,c)
-b=b!=null?P.F(b,!0,null):[]
-w=x.Rv
+if(x==null||!x.e)return H.zo(a,b,c)
+b=b!=null?P.z(b,!0,null):[]
+w=x.c
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
+for(u=x.d,t=0;t<u;++t){s=t+w
+v.q(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1300,10 +1288,16 @@
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
 return y.apply(a,r)},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
-if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
+o:function(a){throw H.b(P.p(a))},
+e:function(a,b){if(a==null)J.wS(a)
+if(typeof b!=="number"||Math.floor(b)!==b)H.o(b)
+throw H.b(P.D(b,null,null))},
+eI:function(a){if(typeof a!=="number")throw H.b(P.p(a))
+return a},
+m1:function(a){if(typeof a!=="number"||Math.floor(a)!==a)throw H.b(P.p(a))
+return a},
+Yx:function(a){if(typeof a!=="string")throw H.b(P.p(a))
+return a},
 b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -1311,10 +1305,10 @@
 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","p3",0,0,null],
+tM:[function(){return J.Lz(this.dartException)},"$0","nRV",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)
+z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
 if("dartException" in a)return z.$1(a.dartException)
@@ -1325,11 +1319,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=$.Up()
+u=$.bN()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Kr()
+q=$.Y9()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1350,27 +1344,27 @@
 if(v){v=m==null?null:m.method
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.KY()
-return z.$1(new P.OY(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
+return z.$1(new P.OY(!1,null,null,null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
 return a},
 CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.wP(a)},
+else return H.eQ(a)},
 dJ:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},
-El:[function(a,b,c,d,e,f,g){var z=J.x(c)
-if(z.n(c,0))return H.dB(b,new H.TL(a))
-else if(z.n(c,1))return H.dB(b,new H.uZ(a,d))
-else if(z.n(c,2))return H.dB(b,new H.OQ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.Qx(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
-else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,5,6,7,8,9,10,11],
+b.q(0,a[y],a[x])}return b},
+El:[function(a,b,c,d,e,f,g){var z=J.t(c)
+if(z.m(c,0))return H.dB(b,new H.TL(a))
+else if(z.m(c,1))return H.dB(b,new H.uZ(a,d))
+else if(z.m(c,2))return H.dB(b,new H.OQ(a,d,e))
+else if(z.m(c,3))return H.dB(b,new H.Qx(a,d,e,f))
+else if(z.m(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
+else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,7,8,9,10,11,12,13],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.El)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.c,H.El)
 a.$identity=z
 return z},
 HA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -1378,8 +1372,8 @@
 z.$stubName
 y=z.$callName
 z.$reflectionInfo=c
-x=H.zh(z).AM
-w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
+x=H.zh(z).f
+w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.q(null,null,null,null).constructor.prototype)
 w.$initialize=w.constructor
 if(d)v=function(){this.$initialize()}
 else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
@@ -1390,7 +1384,7 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.CW(a,z,t)
+s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
@@ -1400,7 +1394,7 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.CW(a,o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
 vq:function(a,b,c,d){var z=H.DVi
@@ -1411,23 +1405,23 @@
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 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.Kv(a,b)
+SD:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.HfE(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=$.mJs
+if(y===0){w=$.bf
 if(w==null){w=H.Iq("self")
-$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.bf=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=$.mJs
+v=$.bf
 if(v==null){v=H.Iq("self")
-$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
@@ -1444,7 +1438,7 @@
 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)}},
-Kv:function(a,b){var z,y,x,w,v,u,t,s
+HfE:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
 if(y==null){y=H.Iq("receiver")
@@ -1462,29 +1456,30 @@
 t=$.OK
 $.OK=J.WB(t,1)
 return new Function(y+H.d(t)+"}")()},
-qmC:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
+qmC:function(a,b,c,d,e,f){b.fixed$length=Array
+c.fixed$length=Array
 return H.HA(a,b,c,!!d,e,f)},
 aE:function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gv(b))))},
 Go:function(a,b){var z
-if(a!=null)z=typeof a==="object"&&J.x(a)[b]
+if(a!=null)z=typeof a==="object"&&J.t(a)[b]
 else z=!0
 if(z)return a
 H.aE(a,b)},
 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.tu(z)
+if(b==null||b.length===0)return new H.Hsk(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-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
+Uh:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+Za:function(a){return init.getIsolateTag(a)},
+K:function(a){return new H.cu(a,null)},
+J: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.Y9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Z9(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)
@@ -1492,30 +1487,30 @@
 Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
+else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.X(a)
 else return},
 ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.IN+=", "
+else z.Q+=", "
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.IN+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-wO:function(a){var z=J.x(a).constructor.builtin$cls
+z.Q+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+wO:function(a){var z=J.t(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+Z9: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},
 RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
-y=J.x(a)
+y=J.t(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
+return H.hv(H.Z9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1526,7 +1521,7 @@
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
 z=H.oX(a)
-a=J.x(a)
+a=J.t(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
 return H.t1(y,b)},
@@ -1547,7 +1542,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
+return H.hv(H.Z9(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
@@ -1562,7 +1557,7 @@
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
+z.fixed$length=Array
 y=z
 for(z=y.length,x=0;x<z;++x){w=y[x]
 if(!Object.hasOwnProperty.call(a,w))return!1
@@ -1594,9 +1589,9 @@
 ml:function(a,b,c){return a.apply(b,c)},
 U6j:function(a){var z=$.dZ
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-bl:function(a){return H.wP(a)},
-bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-Am:function(a){var z,y,x,w,v,u
+wzi:function(a){return H.eQ(a)},
+iwd:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.dZ.$1(a)
 y=$.q4[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1622,15 +1617,13 @@
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.uM(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
+B1:function(a,b){var z=Object.getPrototypeOf(a)
+Object.defineProperty(z,init.dispatchPropertyName,{value:J.Qu(b,z,null,null),enumerable:false,writable:true,configurable:true})
 return b},
-Va:function(a){return J.uM(a,!1,null,!!a.$isXj)},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
 ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.uM(z,!1,null,!!z.$isXj)
-else return J.uM(z,c,null,null)},
+if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
+else return J.Qu(z,c,null,null)},
 XD:function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},
@@ -1667,71 +1660,71 @@
 $.x7=new H.rh(t)},
 ud:function(a,b){return a(b)||b},
 ZT:function(a,b,c){var z,y,x,w,v
-z=H.VM([],[P.Od])
+z=H.J([],[P.Od])
 y=b.length
 x=a.length
 for(;!0;){w=C.yo.XU(b,a,c)
 if(w===-1)break
-z.push(new H.tQ(w,b,a))
+z.push(new H.Vo(w,b,a))
 v=w+x
 if(v===y)break
 else c=w===v?c+1:v}return z},
-m2:function(a,b,c){var z,y
+m2:function(a,b,c){var z
 if(typeof b==="string")return C.yo.XU(a,b,c)!==-1
-else{z=J.x(b)
+else{z=J.t(b)
 if(!!z.$isVR){z=C.yo.yn(a,c)
-y=b.Yr
-return y.test(z)}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
-Gu:function(a,b,c){var z,y,x,w
+return b.a.test(H.Yx(z))}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
+AD:function(a,b,c){var z,y,x,w
+H.Yx(c)
 if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
-w=z.IN+=w
-z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+w=z.Q+=w
+z.Q=w+c}w=z.Q
+return w.charCodeAt(0)==0?w:w}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)},
-gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+gl0:function(a){return J.mG(this.gv(this),0)},
+gor:function(a){return!J.mG(this.gv(this),0)},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 K2:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.K2()},
+q:function(a,b,c){return this.K2()},
 Rz:function(a,b){return this.K2()},
 V1:function(a){return this.K2()},
 FV:function(a,b){return this.K2()},
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 LPe:{
-"^":"ysD;B>,M2,md",
+"^":"ysD;v:Q>,a,b",
 NZ:function(a,b){if(typeof b!=="string")return!1
 if("__proto__"===b)return!1
-return this.M2.hasOwnProperty(b)},
-t:function(a,b){if(!this.NZ(0,b))return
+return this.a.hasOwnProperty(b)},
+p:function(a,b){if(!this.NZ(0,b))return
 return this.Uf(b)},
-Uf:function(a){return this.M2[a]},
+Uf:function(a){return this.a[a]},
 aN:function(a,b){var z,y,x
-z=this.md
+z=this.b
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-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))},
+gvc:function(a){return H.J(new H.AV(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(this.b,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},
-Ns:{
-"^":"mW;Nt",
-gA:function(a){return J.mY(this.Nt.md)}},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.Uf(a)},"$1",null,2,0,null,81,"call"]},
+AV:{
+"^":"mW;Q",
+gu:function(a){return J.Nx(this.Q.b)}},
 LI:{
-"^":"a;r9,yl,Jt,TX,Y2,Ok",
-gWa:function(){return this.r9},
-gUA:function(){return this.Jt===0},
+"^":"a;Q,a,b,c,d,e",
+gWa:function(){return this.Q},
+gUA:function(){return this.b===0},
 gnd:function(){var z,y,x,w
-if(this.Jt===1)return C.xD
-z=this.TX
-y=z.length-this.Y2.length
+if(this.b===1)return C.xD
+z=this.c
+y=z.length-this.d.length
 if(y===0)return C.xD
 x=[]
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
@@ -1739,99 +1732,96 @@
 x.fixed$length=!0
 return x},
 gVm:function(){var z,y,x,w,v,u,t,s
-if(this.Jt!==0)return P.Fl(P.IN,null)
-z=this.Y2
+if(this.b!==0)return P.A(P.IN,null)
+z=this.d
 y=z.length
-x=this.TX
+x=this.c
 w=x.length-y
-if(y===0)return P.Fl(P.IN,null)
+if(y===0)return P.A(P.IN,null)
 v=P.L5(null,null,null,P.IN,null)
 for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
 t=z[u]
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
-v.u(0,new H.tx(t),x[s])}return v},
+v.q(0,new H.tx(t),x[s])}return v},
 static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[a+this.hG+3]
+"^":"a;Q,Rn:a>,b,c,d,e,f,r",
+XL:function(a){var z=this.a[a+this.d+3]
 return init.metadata[z]},
-BX:function(a,b){var z=this.Rv
-if(typeof b!=="number")return b.C()
+BX:function(a,b){var z=this.c
+if(typeof b!=="number")return b.w()
 if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
+return this.a[3+b-z]},
+Fk:function(a){var z=this.c
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
+if(!this.e||this.d===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
+KE:function(a){var z=this.c
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.XL(a)
+if(!this.e||this.d===1)return this.XL(a)
 return this.XL(this.e4(a-z))},
 e4:function(a){var z,y,x,w,v,u
 z={}
-if(this.NE==null){y=this.hG
-this.NE=Array(y)
-x=P.Fl(P.qU,P.KN)
-for(w=this.Rv,v=0;v<y;++v){u=w+v
-x.u(0,this.XL(u),u)}z.a=0
+if(this.r==null){y=this.d
+this.r=Array(y)
+x=P.A(P.I,P.KN)
+for(w=this.c,v=0;v<y;++v){u=w+v
+x.q(0,this.XL(u),u)}z.a=0
 y=x.gvc(x).br(0)
+C.Nm.uy(y,"sort")
 H.ig(y,null)
-H.bQ(y,new H.V5(z,this,x))}z=this.NE
+C.Nm.aN(y,new H.V5(z,this,x))}z=this.r
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4A,FV,OcN,H6",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,Tj,H6",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
-z.fixed$length=init
+z.fixed$length=Array
 z=z
 y=z[0]
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 V5:{
-"^":"TpZ:3;a,b,c",
+"^":"r:5;Q,a,b",
 $1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
+z=this.a.r
+y=this.Q.a++
+x=this.b.p(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
+z[y]=x}},
 ww:{
-"^":"TpZ:76;a",
-$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return C.CD.yu(Math.floor(1000*this.Q.now()))}},
 Cj:{
-"^":"TpZ:82;a,b,c",
-$2:function(a,b){var z=this.a
+"^":"r:82;Q,a,b",
+$2:function(a,b){var z=this.Q
 z.b=z.b+"$"+H.d(a)
-this.c.push(a)
-this.b.push(b);++z.a},
-$isEH:true},
+this.b.push(a)
+this.a.push(b);++z.a}},
 u8:{
-"^":"TpZ:82;a,b",
-$2:function(a,b){var z=this.b
-if(z.NZ(0,a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
+"^":"r:82;Q,a",
+$2:function(a,b){var z=this.a
+if(z.NZ(0,a))z.q(0,a,b)
+else this.Q.a=!0}},
 Zr:{
-"^":"a;zj,TX,v7,Wb,Xr,lT",
+"^":"a;Q,a,b,c,d,e",
 qS:function(a){var z,y,x
-z=new RegExp(this.zj).exec(a)
+z=new RegExp(this.Q).exec(a)
 if(z==null)return
-y={}
-x=this.TX
+y=Object.create(null)
+x=this.a
 if(x!==-1)y.arguments=z[x+1]
-x=this.v7
+x=this.b
 if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Wb
+x=this.c
 if(x!==-1)y.expr=z[x+1]
-x=this.Xr
+x=this.d
 if(x!==-1)y.method=z[x+1]
-x=this.lT
+x=this.e
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,xq,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=[]
@@ -1843,20 +1833,20 @@
 return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
 try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 W0:{
-"^":"XS;yy,Xr",
-bu:[function(a){var z=this.Xr
-if(z==null)return"NullError: "+H.d(this.yy)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,73],
+"^":"XS;Q,a",
+X:[function(a){var z=this.a
+if(z==null)return"NullError: "+H.d(this.Q)
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,0],
 $isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;yy,Xr,lT",
-bu:[function(a){var z,y
-z=this.Xr
-if(z==null)return"NoSuchMethodError: "+H.d(this.yy)
-y=this.lT
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.yy)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.yy)+")"},"$0","gCR",0,0,73],
+"^":"XS;Q,a,b",
+X:[function(a){var z,y
+z=this.a
+if(z==null)return"NoSuchMethodError: "+H.d(this.Q)
+y=this.b
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.Q)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.Q)+")"},"$0","gCR",0,0,0],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1865,119 +1855,114 @@
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;yy",
-bu:[function(a){var z=this.yy
-return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
-Hk:{
-"^":"TpZ:12;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-oP:{
-"^":"a;Np,j0",
-bu:[function(a){var z,y
-z=this.j0
+"^":"XS;Q",
+X:[function(a){var z=this.Q
+return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,0]},
+Am:{
+"^":"r:14;Q",
+$1:function(a){if(!!J.t(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.Q
+return a}},
+XO:{
+"^":"a;Q,a",
+X:[function(a){var z,y
+z=this.a
 if(z!=null)return z
-z=this.Np
+z=this.Q
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
-this.j0=z
-return z},"$0","gCR",0,0,73]},
+this.a=z
+return z},"$0","gCR",0,0,0]},
 TL:{
-"^":"TpZ:76;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return this.Q.$0()}},
 uZ:{
-"^":"TpZ:76;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
 OQ:{
-"^":"TpZ:76;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:function(){return this.Q.$2(this.a,this.b)}},
 Qx:{
-"^":"TpZ:76;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
+"^":"r:77;Q,a,b,c",
+$0:function(){return this.Q.$3(this.a,this.b,this.c)}},
 RM:{
-"^":"TpZ:76;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-TpZ:{
+"^":"r:77;Q,a,b,c,d",
+$0:function(){return this.Q.$4(this.a,this.b,this.c,this.d)}},
+r:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gCR",0,0,73],
+X:[function(a){return"Closure"},"$0","gCR",0,0,0],
+$isr:true,
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
-"^":"TpZ;"},
-v:{
-"^":"Bp;tx,J6,lT,JL",
-n:function(a,b){if(b==null)return!1
+"^":"r;"},
+q:{
+"^":"Bp;Q,a,b,c",
+m:function(a,b){if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.tx===b.tx&&this.J6===b.J6&&this.lT===b.lT},
+if(!J.t(b).$isq)return!1
+return this.Q===b.Q&&this.a===b.a&&this.b===b.b},
 giO:function(a){var z,y
-z=this.lT
-if(z==null)y=H.wP(this.tx)
-else y=typeof z!=="object"?J.v1(z):H.wP(z)
-return J.UN(y,H.wP(this.J6))},
-$isv:true,
-static:{"^":"mJs,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
+z=this.b
+if(z==null)y=H.eQ(this.Q)
+else y=typeof z!=="object"?J.v1(z):H.eQ(z)
+return J.y5(y,H.eQ(this.a))},
+$isq:true,
+static:{"^":"bf,P4",DVi:function(a){return a.Q},HY:function(a){return a.b},bO:function(){var z=$.bf
 if(z==null){z=H.Iq("self")
-$.mJs=z}return z},Iq:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
+z=new H.q("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
+y.fixed$length=Array
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}}}},
 Pe:{
-"^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
 $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))}}},
-Eqv:{
-"^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.Eqv(a)}}},
+bb:{
+"^":"XS;G1:Q>",
+X:[function(a){return"RuntimeError: "+H.d(this.Q)},"$0","gCR",0,0,0],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
-"^":"lbp;dw,Iq,is,vL",
+"^":"lbp;Q,a,b,c",
 Zg:function(a){var z=this.LC(a)
 return z==null?!1:H.J4(z,this.za())},
-LC:function(a){var z=J.x(a)
+LC:function(a){var z=J.t(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
 z={func:"dynafunc"}
-y=this.dw
-x=J.x(y)
+y=this.Q
+x=J.t(y)
 if(!!x.$isNG)z.void=true
 else if(!x.$isi6)z.ret=y.za()
-y=this.Iq
+y=this.a
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
+y=this.b
 if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.vL
-if(y!=null){w={}
+y=this.c
+if(y!=null){w=Object.create(null)
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
 w[t]=y[t].za()}z.named=w}return z},
-bu:[function(a){var z,y,x,w,v,u,t,s
-z=this.Iq
+X:[function(a){var z,y,x,w,v,u,t,s
+z=this.a
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
 x+=H.d(u)}else{x="("
-w=!1}z=this.is
+w=!1}z=this.b
 if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
 for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.vL
+x+=H.d(u)}x+="]"}else{z=this.c
 if(z!=null){x=(w?x+", ":x)+"{"
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gCR",0,0,73],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.Q))},"$0","gCR",0,0,0],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -1985,84 +1970,81 @@
 return z}}},
 i6:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
+X:[function(a){return"dynamic"},"$0","gCR",0,0,0],
 za:function(){return},
 $isi6:true},
-tu:{
-"^":"lbp;oc>",
+Hsk:{
+"^":"lbp;oc:Q>",
 za:function(){var z,y
-z=this.oc
+z=this.Q
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gCR",0,0,73]},
+X:[function(a){return this.Q},"$0","gCR",0,0,0]},
 KEA:{
-"^":"lbp;oc>,re,Et",
+"^":"lbp;oc:Q>,a,b",
 za:function(){var z,y
-z=this.Et
+z=this.b
 if(z!=null)return z
-z=this.oc
+z=this.Q
 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.Ff.za())
-this.Et=y
+for(z=this.a,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)y.push(z.c.za())
+this.b=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
+X:[function(a){return H.d(this.Q)+"<"+J.ZG(this.a,", ")+">"},"$0","gCR",0,0,0]},
 cu:{
-"^":"a;VX,UX",
-bu:[function(a){var z,y
-z=this.UX
+"^":"a;Q,a",
+X:[function(a){var z,y
+z=this.a
 if(z!=null)return z
-y=this.VX.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.UX=y
-return y},"$0","gCR",0,0,73],
-giO:function(a){return J.v1(this.VX)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.VX,b.VX)},
+y=this.Q.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+this.a=y
+return y},"$0","gCR",0,0,0],
+giO:function(a){return J.v1(this.Q)},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$iscu&&J.mG(this.Q,b.Q)},
 $iscu:true,
-$isLz:true},
+$isUU:true},
 dC:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q(a)}},
 VX:{
-"^":"TpZ:83;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
+"^":"r:83;Q",
+$2:function(a,b){return this.Q(a,b)}},
 rh:{
-"^":"TpZ:3;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
+"^":"r:5;Q",
+$1:function(a){return this.Q(a)}},
 VR:{
-"^":"a;zO,Yr,HN,mV",
-gHc:function(){var z=this.HN
+"^":"a;Q,Yr:a<,b,c",
+X:[function(a){return"RegExp/"+this.Q+"/"},"$0","gCR",0,0,0],
+gHc:function(){var z=this.b
 if(z!=null)return z
-z=this.Yr
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
-this.HN=z
+z=this.a
+z=H.Vq(this.Q,z.multiline,!z.ignoreCase,!0)
+this.b=z
 return z},
-gIa:function(){var z=this.mV
+gIa:function(){var z=this.c
 if(z!=null)return z
-z=this.Yr
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.mV=z
+z=this.a
+z=H.Vq(this.Q+"|()",z.multiline,!z.ignoreCase,!0)
+this.c=z
 return z},
-ik:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Yr.exec(a)
+ik:function(a){var z=this.a.exec(H.Yx(a))
 if(z==null)return
 return H.yx(this,z)},
-B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Yr.test(a)},
+zD:function(a){return this.a.test(H.Yx(a))},
 e5:function(a){var z,y
 z=this.ik(a)
-if(z!=null){y=z.pX
+if(z!=null){y=z.a
 if(0>=y.length)return H.e(y,0)
 return y[0]}return},
-dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+ww:function(a,b,c){H.Yx(b)
+H.m1(c)
+if(c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 return new H.KW(this,b,c)},
-dd:function(a,b){return this.dm(a,b,0)},
+dd:function(a,b){return this.ww(a,b,0)},
 UZ:function(a,b){var z,y
 z=this.gHc()
 z.lastIndex=b
@@ -2078,191 +2060,200 @@
 w=x-1
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
-C.Nm.sB(y,w)
+C.Nm.sv(y,w)
 return H.yx(this,y)},
 wL:function(a,b,c){var z
-if(c>=0){z=J.q8(b)
-if(typeof z!=="number")return H.s(z)
+if(c>=0){z=J.wS(b)
+if(typeof z!=="number")return H.o(z)
 z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
+if(z)throw H.b(P.ve(c,0,J.wS(b),null,null))
 return this.Oj(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{Vq:function(a,b,c,d){var z,y,x,w,v
+H.Yx(a)
 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.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
-"^":"a;zO,pX",
-t:function(a,b){var z=this.pX
+"^":"a;Q,a",
+gJ:function(a){return this.a.index},
+gwQ:function(){var z,y
+z=this.a
+y=z.index
+if(0>=z.length)return H.e(z,0)
+z=J.wS(z[0])
+if(typeof z!=="number")return H.o(z)
+return y+z},
+p:function(a,b){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-fw:function(a,b){},
+NE:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
-z.fw(a,b)
+z.NE(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,BZ,wQ",
-gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
+"^":"mW;Q,a,b",
+gu:function(a){return new H.Pb(this.Q,this.a,this.b,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,BZ,Ij,Jz",
-gl:function(){return this.Jz},
-G:function(){var z,y,x,w,v
-z=this.BZ
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w,v
+z=this.a
 if(z==null)return!1
-y=this.Ij
-if(y<=z.length){x=this.UW.UZ(z,y)
-if(x!=null){this.Jz=x
-z=x.pX
+y=this.b
+if(y<=z.length){x=this.Q.UZ(z,y)
+if(x!=null){this.c=x
+z=x.a
 y=z.index
 if(0>=z.length)return H.e(z,0)
-w=J.q8(z[0])
-if(typeof w!=="number")return H.s(w)
+w=J.wS(z[0])
+if(typeof w!=="number")return H.o(w)
 v=y+w
-this.Ij=z.index===v?v+1:v
-return!0}}this.Jz=null
-this.BZ=null
+this.b=z.index===v?v+1:v
+return!0}}this.c=null
+this.a=null
 return!1}},
-tQ:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
+Vo:{
+"^":"a;J:Q>,a,b",
+gwQ:function(){return this.Q+this.b.length},
+p:function(a,b){if(!J.mG(b,0))H.vh(P.D(b,null,null))
+return this.b},
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"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},
+"^":"LPc;LD,kX,RZ,ij,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gO9:function(a){return a.LD},
+sO9:function(a,b){a.LD=this.ct(a,C.S4,a.LD,b)},
+gFR:function(a){return a.kX},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-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.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
+sFR:function(a,b){a.kX=this.ct(a,C.U,a.kX,b)},
+gph:function(a){return a.RZ},
+sph:function(a,b){a.RZ=this.ct(a,C.hf,a.RZ,b)},
+gih:function(a){return a.ij},
+sih:function(a,b){a.ij=this.ct(a,C.mJ,a.ij,b)},
+pp:[function(a,b,c,d){var z=a.LD
 if(z===!0)return
-if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
+if(a.kX!=null){a.LD=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.IB(a))}},"$3","gNa",6,0,84,52,55,85],
 static:{zy: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.IF=!1
-a.Qw=null
-a.cw="action"
-a.oX=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX=null
+a.RZ="action"
+a.ij=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Gx.LX(a)
 C.Gx.XI(a)
 return a}}},
 LPc:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true},
-jE:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["","",,G,{
+IB:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+z.LD=J.Q5(z,C.S4,z.LD,!1)},"$0",null,0,0,null,"call"]}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
+z=J.Tf(J.Tf($.Xw(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,12,13],
-DUC:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,14,15],
+WY:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-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)+"%"},
+return C.xr.kV(z)},
+QX:function(a){if(a==null)return P.Xo(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.x4(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)},
-avE:[function(a){var z,y,x
+le:[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)
+if(z.w(a,1000))return z.X(a)
+y=z.V(a,1000)
+a=z.W(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","OA",2,0,14],
+for(;z=J.Wx(a),z.A(a,1000);){x=G.o1(z.V(a,1000),3)+","+x
+a=z.W(a,1000)}return!z.m(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,16],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
-z=C.jn.Y(z,3600000)
+z=C.jn.V(z,3600000)
 x=C.jn.BU(z,60000)
-z=C.jn.Y(z,60000)
+z=C.jn.V(z,60000)
 w=C.jn.BU(z,1000)
-z=C.jn.Y(z,1000)
+z=C.jn.V(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)},
-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","AFV",2,0,14,15],
+O3:[function(a){var z=J.Wx(a)
+if(z.w(a,1024))return H.d(a)+"B"
+else if(z.w(a,1048576))return C.CD.Sy(z.S(a,1024),1)+"KB"
+else if(z.w(a,1073741824))return C.CD.Sy(z.S(a,1048576),1)+"MB"
+else if(z.w(a,1099511627776))return C.CD.Sy(z.S(a,1073741824),1)+"GB"
+else return C.CD.Sy(z.S(a,1099511627776),1)+"TB"},"$1","nQ",2,0,16,17],
 M5:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.Dv(J.vX(a,1000))
+z=J.NQ(J.lX(a,1000))
 y=C.jn.BU(z,3600000)
-z=C.jn.Y(z,3600000)
+z=C.jn.V(z,3600000)
 x=C.jn.BU(z,60000)
-w=C.jn.BU(C.jn.Y(z,60000),1000)
+w=C.jn.BU(C.jn.V(z,60000),1000)
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,n4,cC,Vg,fn",
-gwv:function(a){return this.Nv},
+"^":"Piz;Q,a,b,c,m2:d<,e,f,r,x,cy$,db$",
+gwv:function(a){return this.c},
 swv:function(a,b){var z,y
-if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.U2(this.cC)
-J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gAQ())
+if(J.mG(this.c,b))return
+if(this.c!=null){J.U2(this.x)
+J.tw(this.c)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.ghX().ml(this.gEX())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ln(y),[H.u3(y,0)]).yI(this.gtb())
-J.Sr(z.gRk(b)).yI(this.gR7())
-z=b.gLi()
-H.VM(new P.Ln(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)},
-KO:function(a){var z,y
-$.Kh=this
-z=this.wc
-z.push(new G.t9(this,null,null,null,null))
-z.push(new G.eq(this,null,null,null,null))
+H.J(new P.rk(y),[H.u3(y,0)]).yI(this.glQ())
+J.HL(z.gRk(b)).yI(this.gPF())
+z=b.gXs()
+H.J(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.c=b},
+gvK:function(){return this.x},
+svK:function(a){this.x=F.Wi(this,C.c6,this.x,a)},
+qB:function(a){var z,y
+$.Pi=this
+z=this.Q
+z.push(new G.iJ(this,null,null,null,null))
+z.push(new G.AX(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-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.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.push(new G.lO(this,null,null,null,null))
+z.push(G.xR(this))
+z.push(new G.lS(this,null,null,null,null))
+z=this.b
+z.a=this
+y=H.J(new W.vG(window,"popstate",!1),[null])
+H.J(new W.Ov(0,y.Q,y.a,W.Yt(z.gTk()),y.b),[H.u3(y,0)]).P6()
 z.VA()},
-pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
+pZ:function(a){J.OP(this.x,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
 switch(z.gfG(a)){case"IsolateCreated":break
 case"IsolateShutdown":this.pZ(z.god(a))
@@ -2270,2931 +2261,2339 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.bi(this.cC,a)
+J.dH(this.x,a)
 break
 case"GC":break
-default:N.QM("").hh("Unrecognized event: "+H.d(a))
-break}},"$1","gR7",2,0,86,87],
-kj:[function(a){this.n4=a
-this.aX("error/",null)},"$1","gtb",2,0,88,23],
-m0:[function(a){this.n4=a
-if(J.xC(J.Iz(a),"NetworkException")){this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")}else this.aX("error/",null)},"$1","geO",2,0,89,90],
+default:N.QM("").YX("Unrecognized event: "+H.d(a))
+break}},"$1","gPF",2,0,86,87],
+Iu:[function(a){this.r=a
+this.aX("error/",null)},"$1","glQ",2,0,88,24],
+m0:[function(a){this.r=a
+if(J.mG(J.Iz(a),"NetworkException")){this.swv(0,null)
+this.b.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.Ms(b,C.xM)
+z=b==null?P.A(null,null):P.WX(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($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
-if(y!=null){y.RV.Gv()
-$.ax=null}}}y=$.ax
-if(y!=null){y.NP.CH(0)
-J.U2(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(y.p(z,"trace")!=null){x=y.p(z,"trace")
+y=J.t(x)
+if(y.m(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.m(x,"off")){y=$.hm
+if(y!=null){y.Q.Gv()
+$.hm=null}}}y=$.hm
+if(y!=null){y.a.CH(0)
+J.U2(y.b)}y=this.f
+if(y!=null)J.La(y,$.hm)
+for(y=this.Q,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
-u=v.fz
-if(v.gnz(v)&&!J.xC(u,y)){u=new T.qI(v,C.Zg,u,y)
+u=v.b
+if(v.gnz(v)&&!J.mG(u,y)){u=new T.qI(v,C.Z,u,y)
 u.$builtinTypeInfo=[null]
-v.nq(v,u)}v.fz=y
+v.SZ(v,u)}v.b=y
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-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.ak()}catch(y){x=H.Ru(y)
+if(J.mG(this.a,a))return
+if(this.a!=null){N.QM("").To("Uninstalling page: "+H.d(this.a))
+this.a.oV()
+J.Ul(this.e)}N.QM("").To("Installing page: "+H.d(a))
+try{a.zw()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").hh("Failed to install page: "+H.d(z))}x=this.bn
-x.appendChild(a.gyF())
+N.QM("").YX("Failed to install page: "+H.d(z))}x=this.e
+x.appendChild(a.gaG())
 w=W.r3("trace-view",null)
-this.HJ=w
-J.La(w,$.ax)
-x.appendChild(this.HJ)
+this.f=w
+J.La(w,$.hm)
+x.appendChild(this.f)
 x=a
-w=this.fN
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
+w=this.a
+if(this.gnz(this)&&!J.mG(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-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","gAQ",2,0,91,92],
-H5:[function(a){var z,y
-if(!J.xC(this.Nv,a))return
+this.SZ(this,w)}this.a=x},
+vW:function(){J.OP(this.x,new G.z5())},
+rY:[function(a){if(!!J.t(a).$isKM)this.d.h(0,a.k2)
+this.vW()},"$1","gEX",2,0,91,92],
+T0:[function(a){var z,y
+if(!J.mG(this.c,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.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.nm),P.L5(null,null,null,P.qU,L.nm),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=this.x
+y=new D.Mk(null,null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
+y.x=F.Wi(y,C.qR,null,"VMDisconnected")
+J.dH(z,y)},"$1","gm6",2,0,91,92],
+Ty:function(a){var z=this.d.b
+z=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),z,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-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)
+this.qB(!1)},
+E0:function(a){var z=new U.dS(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),P.L5(null,null,null,P.I,P.A5),0,"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.KO(!0)},
-static:{"^":"Kh<"}},
+this.qB(!0)},
+static:{"^":"Pi<"}},
 cE:{
-"^":"TpZ:93;",
+"^":"r:93;",
 $1:function(a){var z=J.RE(a)
-return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
-$isEH:true},
+return J.mG(z.gfG(a),"IsolateInterrupted")||J.mG(z.gfG(a),"BreakpointReached")||J.mG(z.gfG(a),"ExceptionThrown")}},
 xE:{
-"^":"TpZ:12;a,b",
-$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},
+"^":"r:14;Q,a",
+$1:[function(a){return J.mG(J.wg(a),this.Q)&&this.a.$1(a)===!0},"$1",null,2,0,null,94,"call"]},
 z5:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xC(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mG(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"]},
 Kf:{
-"^":"a;Yb",
-goH:function(a){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")])},
-Id:function(a,b){var z=[]
+"^":"a;Q",
+goH:function(a){return this.Q.nQ("getNumberOfColumns")},
+gzU:function(a){return this.Q.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])},
+QS: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])])}},
-yD:{
-"^":"a;vR,bG",
-Am:function(a,b){var z=P.jT(this.bG)
-this.vR.V7("draw",[b.Yb,z])}},
+this.Q.Z("addRow",[H.J(new P.GD(z),[null])])}},
+qu:{
+"^":"a;Q,a",
+Am:function(a,b){var z=P.jT(this.a)
+this.Q.Z("draw",[b.Q,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(b!==this.wa("/vm-connect/")&&this.By.Nv==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
-b=this.wa("/vm-connect/")}z=this.BE
+if(b!==this.wa("/vm-connect/")&&this.a.c==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
+b=this.wa("/vm-connect/")}z=this.b
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
-this.BE=b}this.UJ(b)},
+this.b=b}this.UJ(b)},
 UJ:function(a){var z,y,x
-if(J.Qe(a).nC(a,"#"))a=C.yo.yn(a,1)
+if(J.NH(a).nC(a,"#"))a=C.yo.yn(a,1)
 if(C.yo.nC(a,"/"))a=C.yo.yn(a,1)
 if(C.yo.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
-if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
+if(y>1&&!J.mG(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
-this.By.aX(a,x)},
+this.a.aX(a,x)},
 Cz:function(a,b,c){var z,y,x
-z=J.Vs(c).dA.getAttribute("href")
+z=J.Vs(c).Q.getAttribute("href")
 y=J.RE(a)
-x=y.gEV(a)
-if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
+x=y.gpL(a)
+if(typeof x!=="number")return x.A()
+if(x>0||y.gNl(a)===!0||y.gAE(a)===!0||y.gqx(a)===!0||y.gw4(a)===!0)return
 this.bo(0,z)
 y.e6(a)}},
-ng:{
-"^":"yVe;Zz,By,BE,ro,XY,cU",
+OR:{
+"^":"yVe;Q,a,b,dx$,dy$,fr$",
 VA:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
+if(window.location.hash===""||window.location.hash==="#")z="#"+this.Q
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
+Sk:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,15],
 wa:function(a){return"#"+H.d(a)}},
-Tj:{
-"^":"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)},
-$isTj:true},
-by:{
-"^":"Tj;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.mo(this)).OA(new G.Go5())},
+MQ:{
+"^":"Piz;iJ:Q>,aG:a<",
+gFL:function(a){return this.a},
+sFL:function(a,b){this.a=F.Wi(this,C.GP,this.a,b)},
+gl6:function(a){return this.b},
+sl6:function(a,b){this.b=F.Wi(this,C.Z,this.b,b)},
+oV:function(){this.a=F.Wi(this,C.GP,this.a,null)},
+$isMQ:true},
+lS:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("service-view",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
+Q0:function(a){if(J.mG(a,""))return
+this.Q.c.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
+GL:{
+"^":"r:14;Q",
+$1:[function(a){J.h9(this.Q.a,a)},"$1",null,2,0,null,96,"call"]},
 mo:{
-"^":"TpZ:12;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-Go5:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-t9:{
-"^":"Tj;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)}},
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+iJ:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("class-tree",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
+this.Q.c.cv(a).ml(new G.Ms(this)).OA(new G.Bl())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Hb:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
-ZaW:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-eq:{
-"^":"Tj;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("debugger-page",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
+Ms:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.a
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,8,"call"]},
+Bl:{
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+AX:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("debugger-page",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){a=J.ZZ(a,9)
-this.i6.Nv.cv(a).ml(new G.B3(this)).OA(new G.lL())},
+this.Q.c.cv(a).ml(new G.Hz(this)).OA(new G.lL())},
 VU:function(a){return J.co(a,"debugger/")},
-static:{"^":"MR"}},
-B3:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
+static:{"^":"MRr"}},
+Hz:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.a
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,8,"call"]},
 lL:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("Unexpected debugger error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-Sy:{
-"^":"Tj;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)}},
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("Unexpected debugger error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+lO:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("service-view",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.i6.n4
-z.Ll=J.NB(z,C.td,z.Ll,y)},
+z=H.Go(this.a,"$isTi")
+y=this.Q.r
+z.RZ=J.Q5(z,C.td,z.RZ,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"Tj;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)}},
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("vm-connect",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"Tj;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
+"^":"MQ;cX:c@,d,Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("metrics-page",null)
+z=F.Wi(this,C.GP,this.a,z)
+this.a=z
 H.Go(z,"$isqn")
-z.GC=J.NB(z,C.EP,z.GC,this)}},
-ZW:function(a,b){var z
+z.RZ=J.Q5(z,C.EP,z.RZ,this)}},
+TG:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-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.gJb().push(b)
+C.Nm.Rz(b.gmw().gfj(),b)
+b.smw(null)}if(J.mG(a,0))return
+z=this.d.p(0,a)
+if(z!=null){z.gfj().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
-z=this.i6.Nv
-y=$.clJ().e5(a)
+z=this.Q.c
+y=$.AG().e5(a)
 x=J.U6(y)
-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)},
+z.cv(x.Nj(y,0,J.D5(x.gv(y),1))).ml(new G.VP(this))},
+VU:function(a){return $.NP().a.test(H.Yx(a))},
 LS:function(a){var z,y,x,w,v
-for(z=this.K3,y=0;x=$.c3(),y<5;++y){x=x[y]
+for(z=this.d,y=0;x=$.yO(),y<5;++y){x=x[y]
 w=[]
 w.$builtinTypeInfo=[D.YX]
 v=new P.a6(x*1000)
-w=new D.W1(w,v,null)
-w.Cb=P.SZ(v,w.gia(w))
-z.u(0,x,w)}},
-static:{"^":"lZ,HH,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+w=new D.xx(w,v,null)
+w.b=P.SZ(v,w.gia(w))
+z.q(0,x,w)}},
+static:{"^":"lZ,M2,Bw",xR:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.xx),a,null,null,null,null)
 z.LS(a)
 return z}}},
-YhF:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
-$isEH:true},
+VP:{
+"^":"r:14;Q",
+$1:[function(a){var z=H.Go(this.Q.a,"$isqn")
+z.ij=J.Q5(z,C.rB,z.ij,a)},"$1",null,2,0,null,97,"call"]},
 V3:{
-"^":"a;IU",
-cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
+"^":"a;Q",
+cv:function(a){return G.WY(this.Q+"."+H.d(a))}},
 KF:{
-"^":"TpZ:3;",
+"^":"r:5;",
 $1:[function(a){var z,y,x,w
-z=C.xr.iQ(a)
+z=C.xr.kV(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(z)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,98,"call"],
-$isEH:true},
+y.q(z,x,L.K9(y.p(z,x)));++x}return z},"$1",null,2,0,null,98,"call"]},
 XN:{
-"^":"TpZ:12;",
-$1:[function(a){},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-nD:{
-"^":"d3;wo,bq>,TY,ro,XY,cU",
+"^":"r:14;",
+$1:[function(a){},"$1",null,2,0,null,4,"call"]},
+uh:{
+"^":"d3;Q,bq:a>,b,dx$,dy$,fr$",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.Xk(a)
+J8:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
-z.oc=a
+z.b=a
 return z},
 Xk:function(a){var z,y
 z={}
 z.a=null
-y=this.bq
+y=this.a
 y.aN(y,new G.pJO(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
-z=this.bq
+z=this.a
 if(z.tg(z,b))return
 z.h(0,b)
 this.TV()
 this.TV()
-y=this.wo.IU+".history"
+y=this.Q.Q+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
-z=this.bq
+z=this.a
 z.Rz(0,b)
 this.TV()
 this.TV()
-y=this.wo.IU+".history"
+y=this.Q.Q+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-TV:function(){var z=this.bq
+TV:function(){var z=this.a
 z.GT(z,new G.jQ())},
 A7:function(){var z,y,x,w,v
-z=this.bq
+z=this.a
 z.V1(z)
-y=G.DUC(this.wo.IU+".history")
+y=G.WY(this.Q.Q+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
-while(!0){v=x.gB(y)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=x.gv(y)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
+x.q(y,w,L.K9(x.p(y,w)));++w}z.FV(0,y)
 this.TV()},
-lK:function(){this.A7()
-var z=this.TP(this.k6())
-this.TY=z
+vs:function(){this.A7()
+var z=this.J8(this.k6())
+this.b=z
 this.h(0,z)},
 static:{"^":"lGN"}},
 pJO:{
-"^":"TpZ:12;a,b",
-$1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
-$isEH:true},
+"^":"r:14;Q,a",
+$1:function(a){if(J.mG(a.gw8(),this.a)&&J.mG(a.gA9(),!1))this.Q.a=a}},
 jQ:{
-"^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.geX(),a.geX())},
-$isEH:true},
+"^":"r:99;",
+$2:function(a,b){return J.FW(b.gEH(),a.gEH())}},
 Y2:{
-"^":"Pi;eT>,yt<,ks>,oH>",
-gyX:function(a){return this.PU},
-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.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;")},
+"^":"Piz;eT:Q>,yt:a<,wd:b>,oH:c>",
+gyX:function(a){return this.d},
+gty:function(){return this.e},
+goE:function(a){return this.f},
+soE:function(a,b){var z=J.mG(this.f,b)
+this.f=b
+if(!z){z=this.d
+if(b===!0){this.d=F.Wi(this,C.Ek,z,"\u21b3")
+this.Pz()}else{this.d=F.Wi(this,C.Ek,z,"\u2192")
+this.aY()}}},
+r8:function(){this.soE(0,this.f!==!0)
+return this.f},
+k7:function(a){if(!this.Nh())this.e=F.Wi(this,C.Pn,this.e,"visibility:hidden;")},
 $isY2:true},
-ih:{
-"^":"Pi;vp>,Vg,fn",
-G7:function(a){var z,y
-z=this.vp
+iY:{
+"^":"Piz;zU:Q>,cy$,db$",
+rT:function(a){var z,y
+z=this.Q
 y=J.w1(z)
 y.V1(z)
-a.Pz(0)
-y.FV(z,a.ks)},
+a.Pz()
+y.FV(z,a.b)},
 lo:function(a){var z,y,x
-z=this.vp
+z=this.Q
 y=J.U6(z)
-x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
+x=y.p(z,a)
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.OD(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gks(a))
+y=J.wS(z.gwd(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.IL(J.Tf(z.gwd(a),x))===!0)this.nm(J.Tf(z.gwd(a),x))
 z.soE(a,!1)
-z=this.vp
+z=this.Q
 w=J.U6(z)
 v=w.OY(z,a)+1
 w.oq(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
+Ktd:{
+"^":"a;ph:Q>,xy:a<",
+static:{hg:[function(a){return a!=null?J.Lz(a):"<null>"},"$1","J1",2,0,18]}},
+E8:{
+"^":"a;UQ:Q>",
+$isE8:true},
 Vz:{
-"^":"Pi;oH>,vp>,zz<",
-sxp:function(a){this.pT=a
+"^":"Piz;oH:Q>,zU:a>,GD:b<",
+sxp:function(a){this.c=a
 F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.Rj},
-sT3:function(a){this.Rj=a
+gxp:function(){return this.c},
+gT3:function(){return this.d},
+sT3:function(a){this.d=a
 F.Wi(this,C.JB,0,1)},
-Ey:function(a,b){var z=this.vp
+wA:["k5",function(a,b){var z=this.a
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.hI(z[a]),b)},
-ca:[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],
+return J.Tf(J.U8(z[a]),b)}],
+oa:[function(a,b){var z=this.wA(a,this.c)
+return J.FW(this.wA(b,this.c),z)},"$2","gMG",4,0,100],
+iJ8:[function(a,b){return J.FW(this.wA(a,this.c),this.wA(b,this.c))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.Xe()
+H.w4()
 $.Ji=$.xG
-new P.VV(null,null).D5(0)
-z=this.zz
-if(this.Rj){y=this.gMG()
+new P.VV(null,null).wE(0)
+z=this.b
+if(this.d){y=this.gMG()
+C.Nm.uy(z,"sort")
 H.ig(z,y)}else{y=this.gfL()
+C.Nm.uy(z,"sort")
 H.ig(z,y)}},
-Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
+Ai:function(){C.Nm.sv(this.a,0)
+C.Nm.sv(this.b,0)},
+QS:function(a,b){var z=this.a
+this.b.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
-z=this.vp
+z=this.a
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.hI(z[a]),b)
-z=this.oH
+y=J.Tf(J.U8(z[a]),b)
+z=this.Q
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
-ra:[function(a){var z
-if(!J.xC(a,this.pT)){z=this.oH
+YU:[function(a){var z
+if(!J.mG(a,this.c)){z=this.Q
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.Q
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
-return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
+z=J.ZC(z[a])
+return J.WB(z,this.d?"\u25bc":"\u25b2")},"$1","gCO",2,0,16,101]}}],["","",,E,{
 "^":"",
-Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.NK,new E.Lb(),C.IH,new E.QA(),C.cg,new E.Cv(),C.j2,new E.ed(),C.Zg,new E.wa(),C.Wq,new E.Or(),C.ET,new E.YL(),C.BE,new E.wf(),C.WC,new E.Oa(),C.hR,new E.emv(),C.S4,new E.Lbd(),C.Ro,new E.QAa(),C.hN,new E.CvS(),C.AV,new E.edy(),C.bV,new E.waE(),C.C0,new E.Ore(),C.eZ,new E.YLa(),C.bk,new E.wfa(),C.lH,new E.Oaa(),C.am,new E.e0(),C.oE,new E.e1(),C.kG,new E.e2(),C.OI,new E.e3(),C.Wt,new E.e4(),C.I9,new E.e5(),C.To,new E.e6(),C.mM,new E.e7(),C.aw,new E.e8(),C.XA,new E.e9(),C.i4,new E.e10(),C.mJ,new E.e11(),C.qt,new E.e12(),C.p1,new E.e13(),C.yJ,new E.e14(),C.la,new E.e15(),C.yL,new E.e16(),C.nr,new E.e17(),C.bJ,new E.e18(),C.ox,new E.e19(),C.Je,new E.e20(),C.kI,new E.e21(),C.vY,new E.e22(),C.Rs,new E.e23(),C.hJ,new E.e24(),C.yC,new E.e25(),C.Lw,new E.e26(),C.eR,new E.e27(),C.LS,new E.e28(),C.iE,new E.e29(),C.f4,new E.e30(),C.VK,new E.e31(),C.aH,new E.e32(),C.aK,new E.e33(),C.GP,new E.e34(),C.mw,new E.e35(),C.vs,new E.e36(),C.Gr,new E.e37(),C.TU,new E.e38(),C.Fe,new E.e39(),C.tP,new E.e40(),C.yh,new E.e41(),C.Zb,new E.e42(),C.u7,new E.e43(),C.p8,new E.e44(),C.qR,new E.e45(),C.ld,new E.e46(),C.ne,new E.e47(),C.B0,new E.e48(),C.r1,new E.e49(),C.mr,new E.e50(),C.Ek,new E.e51(),C.Pn,new E.e52(),C.YT,new E.e53(),C.h7,new E.e54(),C.R3,new E.e55(),C.cJ,new E.e56(),C.WQ,new E.e57(),C.fV,new E.e58(),C.jU,new E.e59(),C.OO,new E.e60(),C.Mc,new E.e61(),C.FP,new E.e62(),C.kF,new E.e63(),C.UD,new E.e64(),C.Aq,new E.e65(),C.DS,new E.e66(),C.C9,new E.e67(),C.VF,new E.e68(),C.uU,new E.e69(),C.YJ,new E.e70(),C.eF,new E.e71(),C.oI,new E.e72(),C.ST,new E.e73(),C.QH,new E.e74(),C.qX,new E.e75(),C.rE,new E.e76(),C.nf,new E.e77(),C.EI,new E.e78(),C.JB,new E.e79(),C.RY,new E.e80(),C.d4,new E.e81(),C.cF,new E.e82(),C.ft,new E.e83(),C.dr,new E.e84(),C.SI,new E.e85(),C.zS,new E.e86(),C.YA,new E.e87(),C.Ge,new E.e88(),C.A7,new E.e89(),C.He,new E.e90(),C.im,new E.e91(),C.Ss,new E.e92(),C.k6,new E.e93(),C.oj,new E.e94(),C.PJ,new E.e95(),C.Yb,new E.e96(),C.q2,new E.e97(),C.d2,new E.e98(),C.kN,new E.e99(),C.uO,new E.e100(),C.fn,new E.e101(),C.yB,new E.e102(),C.eJ,new E.e103(),C.iG,new E.e104(),C.Py,new E.e105(),C.pC,new E.e106(),C.uu,new E.e107(),C.qs,new E.e108(),C.XH,new E.e109(),C.XJ,new E.e110(),C.tJ,new E.e111(),C.F8,new E.e112(),C.fy,new E.e113(),C.C1,new E.e114(),C.Nr,new E.e115(),C.nL,new E.e116(),C.a0,new E.e117(),C.Yg,new E.e118(),C.bR,new E.e119(),C.ai,new E.e120(),C.ob,new E.e121(),C.dR,new E.e122(),C.MY,new E.e123(),C.Wg,new E.e124(),C.tD,new E.e125(),C.QS,new E.e126(),C.C7,new E.e127(),C.nZ,new E.e128(),C.Of,new E.e129(),C.Vl,new E.e130(),C.pY,new E.e131(),C.XL,new E.e132(),C.LA,new E.e133(),C.Iw,new E.e134(),C.tz,new E.e135(),C.AT,new E.e136(),C.Lk,new E.e137(),C.GS,new E.e138(),C.rB,new E.e139(),C.bz,new E.e140(),C.Jx,new E.e141(),C.b5,new E.e142(),C.z6,new E.e143(),C.SY,new E.e144(),C.Lc,new E.e145(),C.hf,new E.e146(),C.uk,new E.e147(),C.Zi,new E.e148(),C.TN,new E.e149(),C.GI,new E.e150(),C.Wn,new E.e151(),C.ur,new E.e152(),C.VN,new E.e153(),C.EV,new E.e154(),C.VI,new E.e155(),C.eh,new E.e156(),C.SA,new E.e157(),C.uG,new E.e158(),C.kV,new E.e159(),C.vp,new E.e160(),C.cc,new E.e161(),C.DY,new E.e162(),C.Lx,new E.e163(),C.M3,new E.e164(),C.wT,new E.e165(),C.JK,new E.e166(),C.SR,new E.e167(),C.t6,new E.e168(),C.rP,new E.e169(),C.qi,new E.e170(),C.pX,new E.e171(),C.kB,new E.e172(),C.LH,new E.e173(),C.a2,new E.e174(),C.VD,new E.e175(),C.NN,new E.e176(),C.UX,new E.e177(),C.YS,new E.e178(),C.pu,new E.e179(),C.uw,new E.e180(),C.BJ,new E.e181(),C.c6,new E.e182(),C.td,new E.e183(),C.Gn,new E.e184(),C.zO,new E.e185(),C.vg,new E.e186(),C.Yp,new E.e187(),C.YV,new E.e188(),C.If,new E.e189(),C.Ys,new E.e190(),C.zm,new E.e191(),C.EP,new E.e192(),C.nX,new E.e193(),C.BV,new E.e194(),C.xP,new E.e195(),C.XM,new E.e196(),C.Ic,new E.e197(),C.yG,new E.e198(),C.uI,new E.e199(),C.O9,new E.e200(),C.ba,new E.e201(),C.tW,new E.e202(),C.CG,new E.e203(),C.Jf,new E.e204(),C.Wj,new E.e205(),C.vb,new E.e206(),C.UL,new E.e207(),C.AY,new E.e208(),C.QK,new E.e209(),C.AO,new E.e210(),C.Xd,new E.e211(),C.I7,new E.e212(),C.kY,new E.e213(),C.Wm,new E.e214(),C.vK,new E.e215(),C.Tc,new E.e216(),C.GR,new E.e217(),C.KX,new E.e218(),C.ja,new E.e219(),C.mn,new E.e220(),C.Dj,new E.e221(),C.ir,new E.e222(),C.dx,new E.e223(),C.ni,new E.e224(),C.X2,new E.e225(),C.F3,new E.e226(),C.UY,new E.e227(),C.Aa,new E.e228(),C.nY,new E.e229(),C.tg,new E.e230(),C.HD,new E.e231(),C.iU,new E.e232(),C.eN,new E.e233(),C.ue,new E.e234(),C.nh,new E.e235(),C.L2,new E.e236(),C.vm,new E.e237(),C.Gs,new E.e238(),C.bE,new E.e239(),C.YD,new E.e240(),C.PX,new E.e241(),C.N8,new E.e242(),C.FQ,new E.e243(),C.EA,new E.e244(),C.oW,new E.e245(),C.KC,new E.e246(),C.tf,new E.e247(),C.TI,new E.e248(),C.da,new E.e249(),C.Jd,new E.e250(),C.Y4,new E.e251(),C.Si,new E.e252(),C.pH,new E.e253(),C.Ve,new E.e254(),C.jM,new E.e255(),C.rd,new E.e256(),C.rX,new E.e257(),C.W5,new E.e258(),C.uX,new E.e259(),C.nt,new E.e260(),C.IT,new E.e261(),C.li,new E.e262(),C.PM,new E.e263(),C.ks,new E.e264(),C.Om,new E.e265(),C.iC,new E.e266(),C.Nv,new E.e267(),C.Wo,new E.e268(),C.FZ,new E.e269(),C.TW,new E.e270(),C.xS,new E.e271(),C.pD,new E.e272(),C.QF,new E.e273(),C.mi,new E.e274(),C.zz,new E.e275(),C.eO,new E.e276(),C.hO,new E.e277(),C.ei,new E.e278(),C.HK,new E.e279(),C.je,new E.e280(),C.Ef,new E.e281(),C.QL,new E.e282(),C.RH,new E.e283(),C.SP,new E.e284(),C.Q1,new E.e285(),C.ID,new E.e286(),C.dA,new E.e287(),C.bc,new E.e288(),C.nE,new E.e289(),C.ep,new E.e290(),C.hB,new E.e291(),C.J2,new E.e292(),C.hx,new E.e293(),C.zU,new E.e294(),C.OU,new E.e295(),C.bn,new E.e296(),C.mh,new E.e297(),C.Fh,new E.e298(),C.yv,new E.e299(),C.LP,new E.e300(),C.jh,new E.e301(),C.zd,new E.e302(),C.Db,new E.e303(),C.aF,new E.e304(),C.l4,new E.e305(),C.fj,new E.e306(),C.xw,new E.e307(),C.zn,new E.e308(),C.RJ,new E.e309(),C.Sk,new E.e310(),C.KS,new E.e311(),C.MA,new E.e312(),C.YE,new E.e313(),C.Uy,new E.e314()],null,null)
-y=P.EF([C.aP,new E.e315(),C.NK,new E.e316(),C.cg,new E.e317(),C.Zg,new E.e318(),C.S4,new E.e319(),C.AV,new E.e320(),C.bk,new E.e321(),C.lH,new E.e322(),C.am,new E.e323(),C.oE,new E.e324(),C.kG,new E.e325(),C.Wt,new E.e326(),C.mM,new E.e327(),C.aw,new E.e328(),C.XA,new E.e329(),C.i4,new E.e330(),C.mJ,new E.e331(),C.yL,new E.e332(),C.nr,new E.e333(),C.bJ,new E.e334(),C.kI,new E.e335(),C.vY,new E.e336(),C.yC,new E.e337(),C.VK,new E.e338(),C.aH,new E.e339(),C.GP,new E.e340(),C.vs,new E.e341(),C.Gr,new E.e342(),C.Fe,new E.e343(),C.tP,new E.e344(),C.yh,new E.e345(),C.Zb,new E.e346(),C.p8,new E.e347(),C.ld,new E.e348(),C.ne,new E.e349(),C.B0,new E.e350(),C.mr,new E.e351(),C.YT,new E.e352(),C.cJ,new E.e353(),C.WQ,new E.e354(),C.jU,new E.e355(),C.OO,new E.e356(),C.Mc,new E.e357(),C.QH,new E.e358(),C.rE,new E.e359(),C.nf,new E.e360(),C.ft,new E.e361(),C.Ge,new E.e362(),C.A7,new E.e363(),C.He,new E.e364(),C.oj,new E.e365(),C.d2,new E.e366(),C.uO,new E.e367(),C.fn,new E.e368(),C.yB,new E.e369(),C.Py,new E.e370(),C.uu,new E.e371(),C.qs,new E.e372(),C.rB,new E.e373(),C.z6,new E.e374(),C.hf,new E.e375(),C.uk,new E.e376(),C.Zi,new E.e377(),C.TN,new E.e378(),C.ur,new E.e379(),C.EV,new E.e380(),C.VI,new E.e381(),C.eh,new E.e382(),C.SA,new E.e383(),C.uG,new E.e384(),C.kV,new E.e385(),C.vp,new E.e386(),C.SR,new E.e387(),C.t6,new E.e388(),C.kB,new E.e389(),C.UX,new E.e390(),C.YS,new E.e391(),C.c6,new E.e392(),C.td,new E.e393(),C.zO,new E.e394(),C.Yp,new E.e395(),C.YV,new E.e396(),C.If,new E.e397(),C.Ys,new E.e398(),C.EP,new E.e399(),C.nX,new E.e400(),C.BV,new E.e401(),C.XM,new E.e402(),C.Ic,new E.e403(),C.O9,new E.e404(),C.tW,new E.e405(),C.Wj,new E.e406(),C.vb,new E.e407(),C.QK,new E.e408(),C.Xd,new E.e409(),C.kY,new E.e410(),C.vK,new E.e411(),C.Tc,new E.e412(),C.GR,new E.e413(),C.KX,new E.e414(),C.ja,new E.e415(),C.Dj,new E.e416(),C.X2,new E.e417(),C.UY,new E.e418(),C.Aa,new E.e419(),C.nY,new E.e420(),C.tg,new E.e421(),C.HD,new E.e422(),C.iU,new E.e423(),C.eN,new E.e424(),C.Gs,new E.e425(),C.bE,new E.e426(),C.YD,new E.e427(),C.PX,new E.e428(),C.FQ,new E.e429(),C.tf,new E.e430(),C.TI,new E.e431(),C.Jd,new E.e432(),C.pH,new E.e433(),C.Ve,new E.e434(),C.jM,new E.e435(),C.rd,new E.e436(),C.rX,new E.e437(),C.uX,new E.e438(),C.nt,new E.e439(),C.IT,new E.e440(),C.PM,new E.e441(),C.ks,new E.e442(),C.Om,new E.e443(),C.iC,new E.e444(),C.Nv,new E.e445(),C.FZ,new E.e446(),C.TW,new E.e447(),C.pD,new E.e448(),C.mi,new E.e449(),C.zz,new E.e450(),C.dA,new E.e451(),C.nE,new E.e452(),C.hx,new E.e453(),C.zU,new E.e454(),C.OU,new E.e455(),C.zd,new E.e456(),C.RJ,new E.e457(),C.YE,new E.e458()],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.Wd,C.Mt,C.V7,C.Mt,C.V8,C.Mt,C.hM,C.Mt,C.JX,C.Mt,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.z7,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.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.Wd,P.EF([C.rB,C.RU],null,null),C.V7,P.EF([C.S4,C.aj,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz,C.rE,C.B7,C.FQ,C.OS],null,null),C.V8,P.EF([C.rB,C.RU,C.mi,C.eQ],null,null),C.hM,P.EF([C.rB,C.RU,C.TI,C.NU],null,null),C.JX,P.EF([C.NK,C.ZX,C.rB,C.RU,C.bz,C.Bk,C.rX,C.Wp],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.z7,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.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.NK,"activeFrame",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.FQ,"scriptHeight",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.TI,"showConsole",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.rX,"stack",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.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)
+E24:[function(){var z,y,x
+z=P.B([C.S,new E.L(),C.N,new E.Q(),C.X,new E.O(),C.P,new E.Y(),C.V,new E.em(),C.Z,new E.Lb(),C.W,new E.QA(),C.ET,new E.Cv(),C.T,new E.ed(),C.M,new E.wa(),C.hR,new E.Or(),C.S4,new E.YL(),C.R,new E.wf(),C.hN,new E.Oa(),C.U,new E.emv(),C.bV,new E.Lbd(),C.C0,new E.QAa(),C.eZ,new E.CvS(),C.bk,new E.edy(),C.lH,new E.waE(),C.am,new E.Ore(),C.oE,new E.YLa(),C.kG,new E.wfa(),C.OI,new E.Oaa(),C.Wt,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.mM,new E.e3(),C.aw,new E.e4(),C.XA,new E.e5(),C.i4,new E.e6(),C.mJ,new E.e7(),C.qt,new E.e8(),C.p1,new E.e9(),C.yJ,new E.e10(),C.la,new E.e11(),C.yL,new E.e12(),C.nr,new E.e13(),C.bJ,new E.e14(),C.ox,new E.e15(),C.Je,new E.e16(),C.kI,new E.e17(),C.vY,new E.e18(),C.Rs,new E.e19(),C.hJ,new E.e20(),C.yC,new E.e21(),C.Lw,new E.e22(),C.eR,new E.e23(),C.LS,new E.e24(),C.iE,new E.e25(),C.f4,new E.e26(),C.VK,new E.e27(),C.aH,new E.e28(),C.aK,new E.e29(),C.GP,new E.e30(),C.mw,new E.e31(),C.vs,new E.e32(),C.Gr,new E.e33(),C.TU,new E.e34(),C.Fe,new E.e35(),C.tP,new E.e36(),C.yh,new E.e37(),C.Zb,new E.e38(),C.u7,new E.e39(),C.p8,new E.e40(),C.qR,new E.e41(),C.ld,new E.e42(),C.ne,new E.e43(),C.B0,new E.e44(),C.r1,new E.e45(),C.mr,new E.e46(),C.Ek,new E.e47(),C.Pn,new E.e48(),C.YT,new E.e49(),C.h7,new E.e50(),C.R3,new E.e51(),C.cJ,new E.e52(),C.WQ,new E.e53(),C.fV,new E.e54(),C.jU,new E.e55(),C.OO,new E.e56(),C.Mc,new E.e57(),C.FP,new E.e58(),C.kF,new E.e59(),C.UD,new E.e60(),C.Aq,new E.e61(),C.DS,new E.e62(),C.C9,new E.e63(),C.VF,new E.e64(),C.uU,new E.e65(),C.YJ,new E.e66(),C.EF,new E.e67(),C.oI,new E.e68(),C.ST,new E.e69(),C.QH,new E.e70(),C.qX,new E.e71(),C.rE,new E.e72(),C.nf,new E.e73(),C.EI,new E.e74(),C.JB,new E.e75(),C.RY,new E.e76(),C.d4,new E.e77(),C.cF,new E.e78(),C.ft,new E.e79(),C.dr,new E.e80(),C.SI,new E.e81(),C.zS,new E.e82(),C.YA,new E.e83(),C.Ge,new E.e84(),C.A7,new E.e85(),C.He,new E.e86(),C.im,new E.e87(),C.Ss,new E.e88(),C.k6,new E.e89(),C.oj,new E.e90(),C.PJ,new E.e91(),C.Yb,new E.e92(),C.q2,new E.e93(),C.d2,new E.e94(),C.kN,new E.e95(),C.uO,new E.e96(),C.fn,new E.e97(),C.yB,new E.e98(),C.eJ,new E.e99(),C.iG,new E.e100(),C.Py,new E.e101(),C.pC,new E.e102(),C.uu,new E.e103(),C.qs,new E.e104(),C.XH,new E.e105(),C.XJ,new E.e106(),C.tJ,new E.e107(),C.F8,new E.e108(),C.fy,new E.e109(),C.C1,new E.e110(),C.Nr,new E.e111(),C.nL,new E.e112(),C.a0,new E.e113(),C.Yg,new E.e114(),C.bR,new E.e115(),C.ai,new E.e116(),C.ob,new E.e117(),C.dR,new E.e118(),C.MY,new E.e119(),C.Wg,new E.e120(),C.tD,new E.e121(),C.QS,new E.e122(),C.C7,new E.e123(),C.nZ,new E.e124(),C.Of,new E.e125(),C.Vl,new E.e126(),C.pY,new E.e127(),C.XL,new E.e128(),C.LA,new E.e129(),C.Iw,new E.e130(),C.tz,new E.e131(),C.AT,new E.e132(),C.Lk,new E.e133(),C.GS,new E.e134(),C.rB,new E.e135(),C.bz,new E.e136(),C.Jx,new E.e137(),C.b5,new E.e138(),C.z6,new E.e139(),C.SY,new E.e140(),C.Lc,new E.e141(),C.hf,new E.e142(),C.uk,new E.e143(),C.Zi,new E.e144(),C.TN,new E.e145(),C.GI,new E.e146(),C.Wn,new E.e147(),C.ur,new E.e148(),C.VN,new E.e149(),C.EV,new E.e150(),C.VI,new E.e151(),C.eh,new E.e152(),C.SA,new E.e153(),C.uG,new E.e154(),C.kV,new E.e155(),C.vp,new E.e156(),C.cc,new E.e157(),C.DY,new E.e158(),C.Lx,new E.e159(),C.M3,new E.e160(),C.wT,new E.e161(),C.JK,new E.e162(),C.SR,new E.e163(),C.t6,new E.e164(),C.rP,new E.e165(),C.qi,new E.e166(),C.pX,new E.e167(),C.kB,new E.e168(),C.LH,new E.e169(),C.a2,new E.e170(),C.VD,new E.e171(),C.NN,new E.e172(),C.UX,new E.e173(),C.YS,new E.e174(),C.pu,new E.e175(),C.uw,new E.e176(),C.BJ,new E.e177(),C.c6,new E.e178(),C.td,new E.e179(),C.Gn,new E.e180(),C.zO,new E.e181(),C.vg,new E.e182(),C.Yp,new E.e183(),C.YV,new E.e184(),C.If,new E.e185(),C.Ys,new E.e186(),C.zm,new E.e187(),C.EP,new E.e188(),C.nX,new E.e189(),C.BV,new E.e190(),C.xP,new E.e191(),C.XM,new E.e192(),C.Ic,new E.e193(),C.yG,new E.e194(),C.uI,new E.e195(),C.O9,new E.e196(),C.ba,new E.e197(),C.tW,new E.e198(),C.CG,new E.e199(),C.Jf,new E.e200(),C.Wj,new E.e201(),C.vb,new E.e202(),C.UL,new E.e203(),C.AY,new E.e204(),C.QK,new E.e205(),C.AO,new E.e206(),C.Xd,new E.e207(),C.I7,new E.e208(),C.kY,new E.e209(),C.Wm,new E.e210(),C.vK,new E.e211(),C.Tc,new E.e212(),C.GR,new E.e213(),C.KX,new E.e214(),C.ja,new E.e215(),C.mn,new E.e216(),C.Dj,new E.e217(),C.ir,new E.e218(),C.dx,new E.e219(),C.ni,new E.e220(),C.X2,new E.e221(),C.F3,new E.e222(),C.UY,new E.e223(),C.Aa,new E.e224(),C.nY,new E.e225(),C.tg,new E.e226(),C.HD,new E.e227(),C.iU,new E.e228(),C.eN,new E.e229(),C.ue,new E.e230(),C.nh,new E.e231(),C.L2,new E.e232(),C.vm,new E.e233(),C.Gs,new E.e234(),C.bE,new E.e235(),C.YD,new E.e236(),C.PX,new E.e237(),C.N8,new E.e238(),C.FQ,new E.e239(),C.EA,new E.e240(),C.oW,new E.e241(),C.KC,new E.e242(),C.tf,new E.e243(),C.TI,new E.e244(),C.da,new E.e245(),C.Jd,new E.e246(),C.Y4,new E.e247(),C.Si,new E.e248(),C.pH,new E.e249(),C.Ve,new E.e250(),C.jM,new E.e251(),C.rd,new E.e252(),C.rX,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.nE,new E.e285(),C.ep,new E.e286(),C.hB,new E.e287(),C.J2,new E.e288(),C.hx,new E.e289(),C.zU,new E.e290(),C.OU,new E.e291(),C.bn,new E.e292(),C.mh,new E.e293(),C.Fh,new E.e294(),C.yv,new E.e295(),C.LP,new E.e296(),C.jh,new E.e297(),C.zd,new E.e298(),C.Db,new E.e299(),C.aF,new E.e300(),C.l4,new E.e301(),C.fj,new E.e302(),C.xw,new E.e303(),C.zn,new E.e304(),C.RJ,new E.e305(),C.Sk,new E.e306(),C.KS,new E.e307(),C.MA,new E.e308(),C.YE,new E.e309(),C.Uy,new E.e310()],null,null)
+y=P.B([C.S,new E.e311(),C.N,new E.e312(),C.P,new E.e313(),C.Z,new E.e314(),C.S4,new E.e315(),C.U,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.FQ,new E.e425(),C.tf,new E.e426(),C.TI,new E.e427(),C.Jd,new E.e428(),C.pH,new E.e429(),C.Ve,new E.e430(),C.jM,new E.e431(),C.rd,new E.e432(),C.rX,new E.e433(),C.uX,new E.e434(),C.nt,new E.e435(),C.IT,new E.e436(),C.PM,new E.e437(),C.ks,new E.e438(),C.Om,new E.e439(),C.iC,new E.e440(),C.Nv,new E.e441(),C.FZ,new E.e442(),C.TW,new E.e443(),C.pD,new E.e444(),C.mi,new E.e445(),C.zz,new E.e446(),C.dA,new E.e447(),C.nE,new E.e448(),C.hx,new E.e449(),C.zU,new E.e450(),C.OU,new E.e451(),C.zd,new E.e452(),C.RJ,new E.e453(),C.YE,new E.e454()],null,null)
+x=P.B([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.Wd,C.Mt,C.V7,C.Mt,C.V8,C.Mt,C.hM,C.Mt,C.JX,C.Mt,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.It,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.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.B([C.K4,P.B([C.S4,C.aj,C.U,C.Qp,C.mJ,C.Dx,C.hf,C.BT],null,null),C.yS,P.B([C.UX,C.Pt],null,null),C.OG,P.A(null,null),C.nw,P.B([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.B([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.B([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.B([C.i4,C.aJ],null,null),C.XW,P.A(null,null),C.kH,P.B([C.nr,C.BO],null,null),C.Lg,P.B([C.S4,C.aj,C.U,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Wd,P.B([C.rB,C.RU],null,null),C.V7,P.B([C.S4,C.aj,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz,C.rE,C.B7,C.FQ,C.Ow],null,null),C.V8,P.B([C.rB,C.RU,C.mi,C.VB],null,null),C.hM,P.B([C.rB,C.RU,C.TI,C.NU],null,null),C.JX,P.B([C.N,C.ZX,C.rB,C.RU,C.bz,C.Bk,C.rX,C.Wp],null,null),C.Bi,P.A(null,null),C.KO,P.B([C.yh,C.tO],null,null),C.wk,P.B([C.U,C.k1,C.eh,C.IP,C.Aa,C.k5,C.mi,C.nH],null,null),C.jA,P.B([C.S4,C.aj,C.U,C.Qp,C.YT,C.LC,C.hf,C.BT,C.UY,C.n6],null,null),C.Jo,P.A(null,null),C.Az,P.B([C.WQ,C.on],null,null),C.Vx,P.B([C.OO,C.Cf],null,null),C.Qb,P.B([C.Mc,C.f0],null,null),C.lE,P.B([C.QK,C.P9],null,null),C.te,P.B([C.nf,C.wR],null,null),C.iD,P.B([C.QH,C.C4,C.qX,C.dO,C.PM,C.Jr],null,null),C.Ju,P.B([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.vC,C.TN,C.K1,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.B([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.A(null,null),C.Ke,P.B([C.fn,C.Kk],null,null),C.pF,P.A(null,null),C.Wh,P.B([C.yL,C.j5],null,null),C.It,P.B([C.vp,C.o0],null,null),C.qZ,P.A(null,null),C.Zj,P.B([C.oj,C.GT],null,null),C.he,P.B([C.vp,C.o0],null,null),C.dD,P.B([C.pH,C.xV],null,null),C.hP,P.B([C.Wj,C.Ah],null,null),C.tc,P.B([C.vp,C.o0],null,null),C.rR,P.A(null,null),C.oG,P.B([C.jU,C.bw],null,null),C.mK,P.A(null,null),C.IZ,P.B([C.vp,C.o0],null,null),C.FG,P.A(null,null),C.pJ,P.B([C.Ve,C.X4],null,null),C.tU,P.B([C.qs,C.MN],null,null),C.DD,P.B([C.vp,C.o0],null,null),C.Yy,P.A(null,null),C.Xv,P.B([C.YE,C.Wl],null,null),C.ce,P.B([C.aH,C.Ei,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.kA,C.Gs,C.Wq,C.bE,C.Dh,C.YD,C.bl,C.TW,C.B3,C.xS,C.hd,C.zz,C.mb],null,null),C.UJ,P.A(null,null),C.ca,P.B([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.B([C.rB,C.RU],null,null),C.j4,P.B([C.rB,C.RU],null,null),C.EG,P.B([C.rB,C.RU],null,null),C.CT,P.B([C.rB,C.RU],null,null),C.mq,P.B([C.rB,C.RU],null,null),C.Tq,P.B([C.SR,C.S9,C.t6,C.Hk,C.rP,C.Nt],null,null),C.lp,P.A(null,null),C.PT,P.B([C.EV,C.V0],null,null),C.fU,P.B([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.B([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.B([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.B([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.B([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.B([C.uk,C.rY,C.EV,C.V0],null,null),C.LT,P.B([C.Ys,C.Cg],null,null),C.NW,P.A(null,null),C.ms,P.B([C.P,C.TE,C.uk,C.rY,C.kV,C.RZ],null,null),C.FA,P.B([C.P,C.TE,C.kV,C.RZ],null,null),C.Qt,P.B([C.ld,C.Gw],null,null),C.a8,P.B([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.B([C.S,C.oh,C.U,C.Qp,C.hf,C.BT],null,null),C.Mf,P.B([C.uk,C.rY],null,null),C.rC,P.B([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.B([C.td,C.Zk],null,null),C.Dl,P.B([C.VK,C.lW],null,null),C.Mz,P.B([C.O9,C.q9,C.ba,C.yV],null,null),C.Nw,P.B([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.B([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.cD,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.B([C.tW,C.Qc,C.CG,C.Ml],null,null),C.Th,P.B([C.PX,C.jz],null,null),C.wH,P.B([C.yh,C.lJ],null,null),C.pK,P.B([C.ne,C.bp],null,null),C.R9,P.B([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.A(null,null),C.il,P.B([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.B([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.B([C.B0,C.iH,C.SR,C.hS],null,null),C.X8,P.B([C.Z,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.B([C.nE,C.FM],null,null),C.Y3,P.B([C.bk,C.NS,C.lH,C.M6,C.zU,C.OS],null,null),C.bC,P.B([C.am,C.JD,C.oE,C.py,C.uX,C.VM],null,null),C.ws,P.B([C.pD,C.Gz],null,null),C.cK,P.A(null,null),C.jK,P.B([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.B([C.S,"active",C.N,"activeFrame",C.X,"address",C.P,"anchor",C.V,"app",C.Z,"args",C.W,"asStringLiteral",C.ET,"assertsEnabled",C.T,"averageCollectionPeriodInMillis",C.M,"bpt",C.hR,"breakpoint",C.S4,"busy",C.R,"buttonClick",C.hN,"bytes",C.U,"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.FQ,"scriptHeight",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.TI,"showConsole",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.rX,"stack",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.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)
+$.Yv=new O.mO(y)
 $.qe=new O.ut(y)
-$.M6=[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(),new E.e546(),new E.e547(),new E.e548(),new E.e549(),new E.e550(),new E.e551(),new E.e552(),new E.e553(),new E.e554()]
+$.MU=[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(),new E.e546(),new E.e547(),new E.e548(),new E.e549(),new E.e550()]
 $.UG=!0
-F.E2()},"$0","jk",0,0,17],
+F.E2()},"$0","VQk",0,0,1],
+L:{
+"^":"r:14;",
+$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,65,"call"]},
+Q:{
+"^":"r:14;",
+$1:[function(a){return J.Em(a)},"$1",null,2,0,null,65,"call"]},
+O:{
+"^":"r:14;",
+$1:[function(a){return a.gYu()},"$1",null,2,0,null,65,"call"]},
+Y:{
+"^":"r:14;",
+$1:[function(a){return J.FS(a)},"$1",null,2,0,null,65,"call"]},
 em:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,65,"call"]},
 Lb:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Em(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.BI(a)},"$1",null,2,0,null,65,"call"]},
 QA:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gYu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ot(a)},"$1",null,2,0,null,65,"call"]},
 Cv:{
-"^":"TpZ:12;",
-$1:[function(a){return J.FS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gA3()},"$1",null,2,0,null,65,"call"]},
 ed:{
-"^":"TpZ:12;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.goX()},"$1",null,2,0,null,65,"call"]},
 wa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gqr()},"$1",null,2,0,null,65,"call"]},
 Or:{
-"^":"TpZ:12;",
-$1:[function(a){return J.mN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gYZ()},"$1",null,2,0,null,65,"call"]},
 YL:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gA3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zL(a)},"$1",null,2,0,null,65,"call"]},
 wf:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aAQ(a)},"$1",null,2,0,null,65,"call"]},
 Oa:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqr()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gET()},"$1",null,2,0,null,65,"call"]},
 emv:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WT(a)},"$1",null,2,0,null,65,"call"]},
 Lbd:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCs()},"$1",null,2,0,null,65,"call"]},
 QAa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.XB(a)},"$1",null,2,0,null,65,"call"]},
 CvS:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.n9(a)},"$1",null,2,0,null,65,"call"]},
 edy:{
-"^":"TpZ:12;",
-$1:[function(a){return J.WT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.rp(a)},"$1",null,2,0,null,65,"call"]},
 waE:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.BS2(a)},"$1",null,2,0,null,65,"call"]},
 Ore:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LL(a)},"$1",null,2,0,null,65,"call"]},
 YLa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.n9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.h3(a)},"$1",null,2,0,null,65,"call"]},
 wfa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.AJ(a)},"$1",null,2,0,null,65,"call"]},
 Oaa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pP(a)},"$1",null,2,0,null,65,"call"]},
 e0:{
-"^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUP()},"$1",null,2,0,null,65,"call"]},
 e1:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,65,"call"]},
 e2:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSf()},"$1",null,2,0,null,65,"call"]},
 e3:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu5()},"$1",null,2,0,null,65,"call"]},
 e4:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gwz()},"$1",null,2,0,null,65,"call"]},
 e5:{
-"^":"TpZ:12;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,65,"call"]},
 e6:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tX(a)},"$1",null,2,0,null,65,"call"]},
 e7:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu5()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,65,"call"]},
 e8:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gwz()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.lK(a)},"$1",null,2,0,null,65,"call"]},
 e9:{
-"^":"TpZ:12;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Al(a)},"$1",null,2,0,null,65,"call"]},
 e10:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Nk(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Mh(a)},"$1",null,2,0,null,65,"call"]},
 e11:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nC(a)},"$1",null,2,0,null,65,"call"]},
 e12:{
-"^":"TpZ:12;",
-$1:[function(a){return J.SM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xe(a)},"$1",null,2,0,null,65,"call"]},
 e13:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ux(a)},"$1",null,2,0,null,65,"call"]},
 e14:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,65,"call"]},
 e15:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ev(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,65,"call"]},
 e16:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xe(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gk()},"$1",null,2,0,null,65,"call"]},
 e17:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ux(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.h6(a)},"$1",null,2,0,null,65,"call"]},
 e18:{
-"^":"TpZ:12;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.kc(a)},"$1",null,2,0,null,65,"call"]},
 e19:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.P3(a)},"$1",null,2,0,null,65,"call"]},
 e20:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gpG()},"$1",null,2,0,null,65,"call"]},
 e21:{
-"^":"TpZ:12;",
-$1:[function(a){return J.h6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOF()},"$1",null,2,0,null,65,"call"]},
 e22:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,65,"call"]},
 e23:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOs()},"$1",null,2,0,null,65,"call"]},
 e24:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gpG()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gN0()},"$1",null,2,0,null,65,"call"]},
 e25:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gOF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,65,"call"]},
 e26:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.guH()},"$1",null,2,0,null,65,"call"]},
 e27:{
-"^":"TpZ:12;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mP(a)},"$1",null,2,0,null,65,"call"]},
 e28:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fe(a)},"$1",null,2,0,null,65,"call"]},
 e29:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dn(a)},"$1",null,2,0,null,65,"call"]},
 e30:{
-"^":"TpZ:12;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,65,"call"]},
 e31:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,65,"call"]},
 e32:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.k0(a)},"$1",null,2,0,null,65,"call"]},
 e33:{
-"^":"TpZ:12;",
-$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yr(a)},"$1",null,2,0,null,65,"call"]},
 e34:{
-"^":"TpZ:12;",
-$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.lk(a)},"$1",null,2,0,null,65,"call"]},
 e35:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gLK()},"$1",null,2,0,null,65,"call"]},
 e36:{
-"^":"TpZ:12;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,65,"call"]},
 e37:{
-"^":"TpZ:12;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,65,"call"]},
 e38:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,65,"call"]},
 e39:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pp(a)},"$1",null,2,0,null,65,"call"]},
 e40:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qf(a)},"$1",null,2,0,null,65,"call"]},
 e41:{
-"^":"TpZ:12;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,65,"call"]},
 e42:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.um(a)},"$1",null,2,0,null,65,"call"]},
 e43:{
-"^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,65,"call"]},
 e44:{
-"^":"TpZ:12;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,65,"call"]},
 e45:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,65,"call"]},
 e46:{
-"^":"TpZ:12;",
-$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IL(a)},"$1",null,2,0,null,65,"call"]},
 e47:{
-"^":"TpZ:12;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,65,"call"]},
 e48:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gty()},"$1",null,2,0,null,65,"call"]},
 e49:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,65,"call"]},
 e50:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,65,"call"]},
 e51:{
-"^":"TpZ:12;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkE()},"$1",null,2,0,null,65,"call"]},
 e52:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.E1(a)},"$1",null,2,0,null,65,"call"]},
 e53:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,65,"call"]},
 e54:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,65,"call"]},
 e55:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.vE(a)},"$1",null,2,0,null,65,"call"]},
 e56:{
-"^":"TpZ:12;",
-$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,65,"call"]},
 e57:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QZ(a)},"$1",null,2,0,null,65,"call"]},
 e58:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,65,"call"]},
 e59:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QvL(a)},"$1",null,2,0,null,65,"call"]},
 e60:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,65,"call"]},
 e61:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,65,"call"]},
 e62:{
-"^":"TpZ:12;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,65,"call"]},
 e63:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,65,"call"]},
 e64:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gAX()},"$1",null,2,0,null,65,"call"]},
 e65:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.ga3()},"$1",null,2,0,null,65,"call"]},
 e66:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,65,"call"]},
 e67:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,65,"call"]},
 e68:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gP3()},"$1",null,2,0,null,65,"call"]},
 e69:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wm(a)},"$1",null,2,0,null,65,"call"]},
 e70:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,65,"call"]},
 e71:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.iq(a)},"$1",null,2,0,null,65,"call"]},
 e72:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,65,"call"]},
 e73:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,65,"call"]},
 e74:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjV()},"$1",null,2,0,null,65,"call"]},
 e75:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,65,"call"]},
 e76:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yf(a)},"$1",null,2,0,null,65,"call"]},
 e77:{
-"^":"TpZ:12;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,65,"call"]},
 e78:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ay(a)},"$1",null,2,0,null,65,"call"]},
 e79:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZD()},"$1",null,2,0,null,65,"call"]},
 e80:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gRl()},"$1",null,2,0,null,65,"call"]},
 e81:{
-"^":"TpZ:12;",
-$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvN()},"$1",null,2,0,null,65,"call"]},
 e82:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,65,"call"]},
 e83:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,65,"call"]},
 e84:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gRl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,65,"call"]},
 e85:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,65,"call"]},
 e86:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.z8(a)},"$1",null,2,0,null,65,"call"]},
 e87:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,65,"call"]},
 e88:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,65,"call"]},
 e89:{
-"^":"TpZ:12;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aW(a)},"$1",null,2,0,null,65,"call"]},
 e90:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.hW(a)},"$1",null,2,0,null,65,"call"]},
 e91:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,65,"call"]},
 e92:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.eS(a)},"$1",null,2,0,null,65,"call"]},
 e93:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,65,"call"]},
 e94:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.giq()},"$1",null,2,0,null,65,"call"]},
 e95:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gPb()},"$1",null,2,0,null,65,"call"]},
 e96:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tl(a)},"$1",null,2,0,null,65,"call"]},
 e97:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,65,"call"]},
 e98:{
-"^":"TpZ:12;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.US(a)},"$1",null,2,0,null,65,"call"]},
 e99:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,65,"call"]},
 e100:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGA()},"$1",null,2,0,null,65,"call"]},
 e101:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,65,"call"]},
 e102:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,65,"call"]},
 e103:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.oH(a)},"$1",null,2,0,null,65,"call"]},
 e104:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,65,"call"]},
 e105:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvo()},"$1",null,2,0,null,65,"call"]},
 e106:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.glO()},"$1",null,2,0,null,65,"call"]},
 e107:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjS()},"$1",null,2,0,null,65,"call"]},
 e108:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.v9(a)},"$1",null,2,0,null,65,"call"]},
 e109:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gBF()},"$1",null,2,0,null,65,"call"]},
 e110:{
-"^":"TpZ:12;",
-$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,65,"call"]},
 e111:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gRh()},"$1",null,2,0,null,65,"call"]},
 e112:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,65,"call"]},
 e113:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gni()},"$1",null,2,0,null,65,"call"]},
 e114:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkU()},"$1",null,2,0,null,65,"call"]},
 e115:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzx()},"$1",null,2,0,null,65,"call"]},
 e116:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,65,"call"]},
 e117:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gt3()},"$1",null,2,0,null,65,"call"]},
 e118:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gcE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.or(a)},"$1",null,2,0,null,65,"call"]},
 e119:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxL()},"$1",null,2,0,null,65,"call"]},
 e120:{
-"^":"TpZ:12;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSO()},"$1",null,2,0,null,65,"call"]},
 e121:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,65,"call"]},
 e122:{
-"^":"TpZ:12;",
-$1:[function(a){return J.or(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.GGs(a)},"$1",null,2,0,null,65,"call"]},
 e123:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOC()},"$1",null,2,0,null,65,"call"]},
 e124:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,65,"call"]},
 e125:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHh()},"$1",null,2,0,null,65,"call"]},
 e126:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,65,"call"]},
 e127:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.goF()},"$1",null,2,0,null,65,"call"]},
 e128:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.geh()},"$1",null,2,0,null,65,"call"]},
 e129:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,65,"call"]},
 e130:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXM()},"$1",null,2,0,null,65,"call"]},
 e131:{
-"^":"TpZ:12;",
-$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gfo()},"$1",null,2,0,null,65,"call"]},
 e132:{
-"^":"TpZ:12;",
-$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,65,"call"]},
 e133:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu7()},"$1",null,2,0,null,65,"call"]},
 e134:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gl2()},"$1",null,2,0,null,65,"call"]},
 e135:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wg(a)},"$1",null,2,0,null,65,"call"]},
 e136:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.q0(a)},"$1",null,2,0,null,65,"call"]},
 e137:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,65,"call"]},
 e138:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSS()},"$1",null,2,0,null,65,"call"]},
 e139:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kt(a)},"$1",null,2,0,null,65,"call"]},
 e140:{
-"^":"TpZ:12;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,65,"call"]},
 e141:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,65,"call"]},
 e142:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,65,"call"]},
 e143:{
-"^":"TpZ:12;",
-$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.rn(a)},"$1",null,2,0,null,65,"call"]},
 e144:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,65,"call"]},
 e145:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,65,"call"]},
 e146:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,65,"call"]},
 e147:{
-"^":"TpZ:12;",
-$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wS(a)},"$1",null,2,0,null,65,"call"]},
 e148:{
-"^":"TpZ:12;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcI()},"$1",null,2,0,null,65,"call"]},
 e149:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,65,"call"]},
 e150:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ik(a)},"$1",null,2,0,null,65,"call"]},
 e151:{
-"^":"TpZ:12;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,65,"call"]},
 e152:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,65,"call"]},
 e153:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,65,"call"]},
 e154:{
-"^":"TpZ:12;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.t0(a)},"$1",null,2,0,null,65,"call"]},
 e155:{
-"^":"TpZ:12;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,65,"call"]},
 e156:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,65,"call"]},
 e157:{
-"^":"TpZ:12;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,65,"call"]},
 e158:{
-"^":"TpZ:12;",
-$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,65,"call"]},
 e159:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.giP()},"$1",null,2,0,null,65,"call"]},
 e160:{
-"^":"TpZ:12;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gmd()},"$1",null,2,0,null,65,"call"]},
 e161:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,65,"call"]},
 e162:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pr(a)},"$1",null,2,0,null,65,"call"]},
 e163:{
-"^":"TpZ:12;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,65,"call"]},
 e164:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,65,"call"]},
 e165:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QD(a)},"$1",null,2,0,null,65,"call"]},
 e166:{
-"^":"TpZ:12;",
-$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jE(a)},"$1",null,2,0,null,65,"call"]},
 e167:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,65,"call"]},
 e168:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qx(a)},"$1",null,2,0,null,65,"call"]},
 e169:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,65,"call"]},
 e170:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,65,"call"]},
 e171:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,65,"call"]},
 e172:{
-"^":"TpZ:12;",
-$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,65,"call"]},
 e173:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,65,"call"]},
 e174:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,65,"call"]},
 e175:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,65,"call"]},
 e176:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gDm()},"$1",null,2,0,null,65,"call"]},
 e177:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,65,"call"]},
 e178:{
-"^":"TpZ:12;",
-$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,65,"call"]},
 e179:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mk(a)},"$1",null,2,0,null,65,"call"]},
 e180:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,65,"call"]},
 e181:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,65,"call"]},
 e182:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,65,"call"]},
 e183:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXP()},"$1",null,2,0,null,65,"call"]},
 e184:{
-"^":"TpZ:12;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gP2()},"$1",null,2,0,null,65,"call"]},
 e185:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,65,"call"]},
 e186:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qN(a)},"$1",null,2,0,null,65,"call"]},
 e187:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,65,"call"]},
 e188:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.MT(a)},"$1",null,2,0,null,65,"call"]},
 e189:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,65,"call"]},
 e190:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gqH()},"$1",null,2,0,null,65,"call"]},
 e191:{
-"^":"TpZ:12;",
-$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UZ(a)},"$1",null,2,0,null,65,"call"]},
 e192:{
-"^":"TpZ:12;",
-$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WN(a)},"$1",null,2,0,null,65,"call"]},
 e193:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,65,"call"]},
 e194:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,65,"call"]},
 e195:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,65,"call"]},
 e196:{
-"^":"TpZ:12;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,65,"call"]},
 e197:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tC(a)},"$1",null,2,0,null,65,"call"]},
 e198:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,65,"call"]},
 e199:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.S5(a)},"$1",null,2,0,null,65,"call"]},
 e200:{
-"^":"TpZ:12;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,65,"call"]},
 e201:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.x5(a)},"$1",null,2,0,null,65,"call"]},
 e202:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ksQ(a)},"$1",null,2,0,null,65,"call"]},
 e203:{
-"^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,65,"call"]},
 e204:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.u5(a)},"$1",null,2,0,null,65,"call"]},
 e205:{
-"^":"TpZ:12;",
-$1:[function(a){return J.x5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,65,"call"]},
 e206:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,65,"call"]},
 e207:{
-"^":"TpZ:12;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WV(a)},"$1",null,2,0,null,65,"call"]},
 e208:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,65,"call"]},
 e209:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IS(a)},"$1",null,2,0,null,65,"call"]},
 e210:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pg(a)},"$1",null,2,0,null,65,"call"]},
 e211:{
-"^":"TpZ:12;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,65,"call"]},
 e212:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCM()},"$1",null,2,0,null,65,"call"]},
 e213:{
-"^":"TpZ:12;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,65,"call"]},
 e214:{
-"^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ou(a)},"$1",null,2,0,null,65,"call"]},
 e215:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,65,"call"]},
 e216:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.up(a)},"$1",null,2,0,null,65,"call"]},
 e217:{
-"^":"TpZ:12;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.n8(a)},"$1",null,2,0,null,65,"call"]},
 e218:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hfy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gua()},"$1",null,2,0,null,65,"call"]},
 e219:{
-"^":"TpZ:12;",
-$1:[function(a){return J.er(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,65,"call"]},
 e220:{
-"^":"TpZ:12;",
-$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.guh()},"$1",null,2,0,null,65,"call"]},
 e221:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,65,"call"]},
 e222:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.G2(a)},"$1",null,2,0,null,65,"call"]},
 e223:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,65,"call"]},
 e224:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,65,"call"]},
 e225:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uN(a)},"$1",null,2,0,null,65,"call"]},
 e226:{
-"^":"TpZ:12;",
-$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.I1(a)},"$1",null,2,0,null,65,"call"]},
 e227:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jH(a)},"$1",null,2,0,null,65,"call"]},
 e228:{
-"^":"TpZ:12;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jo(a)},"$1",null,2,0,null,65,"call"]},
 e229:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,65,"call"]},
 e230:{
-"^":"TpZ:12;",
-$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.geH()},"$1",null,2,0,null,65,"call"]},
 e231:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.i8(a)},"$1",null,2,0,null,65,"call"]},
 e232:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,65,"call"]},
 e233:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,65,"call"]},
 e234:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,65,"call"]},
 e235:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,65,"call"]},
 e236:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zD(a)},"$1",null,2,0,null,65,"call"]},
 e237:{
-"^":"TpZ:12;",
-$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fx(a)},"$1",null,2,0,null,65,"call"]},
 e238:{
-"^":"TpZ:12;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,65,"call"]},
 e239:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.j8v(a)},"$1",null,2,0,null,65,"call"]},
 e240:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,65,"call"]},
 e241:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.P5(a)},"$1",null,2,0,null,65,"call"]},
 e242:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ll(a)},"$1",null,2,0,null,65,"call"]},
 e243:{
-"^":"TpZ:12;",
-$1:[function(a){return J.p5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xi(a)},"$1",null,2,0,null,65,"call"]},
 e244:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ip(a)},"$1",null,2,0,null,65,"call"]},
 e245:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fY(a)},"$1",null,2,0,null,65,"call"]},
 e246:{
-"^":"TpZ:12;",
-$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aX(a)},"$1",null,2,0,null,65,"call"]},
 e247:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,65,"call"]},
 e248:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ip(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Yj(a)},"$1",null,2,0,null,65,"call"]},
 e249:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,65,"call"]},
 e250:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,65,"call"]},
 e251:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gV8()},"$1",null,2,0,null,65,"call"]},
 e252:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,65,"call"]},
 e253:{
-"^":"TpZ:12;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TH(a)},"$1",null,2,0,null,65,"call"]},
 e254:{
-"^":"TpZ:12;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,65,"call"]},
 e255:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,65,"call"]},
 e256:{
-"^":"TpZ:12;",
-$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,65,"call"]},
 e257:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,65,"call"]},
 e258:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,65,"call"]},
 e259:{
-"^":"TpZ:12;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LF(a)},"$1",null,2,0,null,65,"call"]},
 e260:{
-"^":"TpZ:12;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,65,"call"]},
 e261:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.vI(a)},"$1",null,2,0,null,65,"call"]},
 e262:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,65,"call"]},
 e263:{
-"^":"TpZ:12;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,65,"call"]},
 e264:{
-"^":"TpZ:12;",
-$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,65,"call"]},
 e265:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,65,"call"]},
 e266:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,65,"call"]},
 e267:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,65,"call"]},
 e268:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zu(a)},"$1",null,2,0,null,65,"call"]},
 e269:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,65,"call"]},
 e270:{
-"^":"TpZ:12;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,65,"call"]},
 e271:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.OL(a)},"$1",null,2,0,null,65,"call"]},
 e272:{
-"^":"TpZ:12;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zB(a)},"$1",null,2,0,null,65,"call"]},
 e273:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gki()},"$1",null,2,0,null,65,"call"]},
 e274:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,65,"call"]},
 e275:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGc()},"$1",null,2,0,null,65,"call"]},
 e276:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,65,"call"]},
 e277:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,65,"call"]},
 e278:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,65,"call"]},
 e279:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QI(a)},"$1",null,2,0,null,65,"call"]},
 e280:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SS(a)},"$1",null,2,0,null,65,"call"]},
 e281:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,65,"call"]},
 e282:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,65,"call"]},
 e283:{
-"^":"TpZ:12;",
-$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,65,"call"]},
 e284:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,65,"call"]},
 e285:{
-"^":"TpZ:12;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,65,"call"]},
 e286:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,65,"call"]},
 e287:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zH(a)},"$1",null,2,0,null,65,"call"]},
 e288:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,65,"call"]},
 e289:{
-"^":"TpZ:12;",
-$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gQR()},"$1",null,2,0,null,65,"call"]},
 e290:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,65,"call"]},
 e291:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,65,"call"]},
 e292:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,65,"call"]},
 e293:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gJk()},"$1",null,2,0,null,65,"call"]},
 e294:{
-"^":"TpZ:12;",
-$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,65,"call"]},
 e295:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,65,"call"]},
 e296:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcs()},"$1",null,2,0,null,65,"call"]},
 e297:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gFc()},"$1",null,2,0,null,65,"call"]},
 e298:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SW(a)},"$1",null,2,0,null,65,"call"]},
 e299:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHD()},"$1",null,2,0,null,65,"call"]},
 e300:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gae()},"$1",null,2,0,null,65,"call"]},
 e301:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,65,"call"]},
 e302:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,65,"call"]},
 e303:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,65,"call"]},
 e304:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,65,"call"]},
 e305:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wp(a)},"$1",null,2,0,null,65,"call"]},
 e306:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSn()},"$1",null,2,0,null,65,"call"]},
 e307:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzz()},"$1",null,2,0,null,65,"call"]},
 e308:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gv5()},"$1",null,2,0,null,65,"call"]},
 e309:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,65,"call"]},
 e310:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,65,"call"]},
 e311:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e312:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gdr()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.zv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e313:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e314:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e315:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e316:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.zv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e317:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e318:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e319:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e320:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e321:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e322:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,65,68,"call"]},
 e323:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,65,68,"call"]},
 e324:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,65,68,"call"]},
 e325:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e326:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e327:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e328:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e329:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e330:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.aP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e331:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e332:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e333:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,65,68,"call"]},
 e334:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.LM(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e335:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qt(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e336:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e337:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e338:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e339:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sLK(b)},"$2",null,4,0,null,65,68,"call"]},
 e340:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,65,68,"call"]},
 e341:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e342:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e343:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e344:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e345:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e346:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e347:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e348:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.vA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e349:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e350:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e351:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e352:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e353:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e354:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e355:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e356:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e357:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sZD(b)},"$2",null,4,0,null,65,68,"call"]},
 e358:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e359:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e360:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.f6(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e361:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sSE(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e362:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,65,68,"call"]},
 e363:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e364:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e365:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e366:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,65,68,"call"]},
 e367:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e368:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e369:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uM(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e370:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Vr(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e371:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e372:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cm(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e373:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e374:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e375:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,65,68,"call"]},
 e376:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e377:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e378:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e379:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e380:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e381:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e382:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e383:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e384:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e385:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e386:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e387:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e388:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,65,68,"call"]},
 e389:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e390:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,65,68,"call"]},
 e391:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,65,68,"call"]},
 e392:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,65,68,"call"]},
 e393:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,65,68,"call"]},
 e394:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e395:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e396:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e397:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,65,68,"call"]},
 e398:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e399:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e400:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e401:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e402:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e403:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e404:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e405:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e406:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e407:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,65,68,"call"]},
 e408:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,65,68,"call"]},
 e409:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e410:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.TR(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e411:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e412:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e413:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e414:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.k4(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e415:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e416:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.bU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e417:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e418:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e419:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e420:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,65,68,"call"]},
 e421:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e422:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e423:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e424:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e425:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Rd(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e426:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e427:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ez(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e428:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qd(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e429:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Rd(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e430:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e431:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ez(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,65,68,"call"]},
 e432:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e433:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.hw(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e434:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e435:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e436:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e437:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.hw(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e438:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e439:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.FH(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e440:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e441:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,65,68,"call"]},
 e442:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,65,68,"call"]},
 e443:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e444:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.WU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e445:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e446:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e447:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,65,68,"call"]},
 e448:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e449:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,65,68,"call"]},
 e450:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e451:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,65,68,"call"]},
 e452:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ja(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e453:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e454:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e455:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"]},
 e456:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"]},
 e457:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"]},
 e458:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"]},
 e459:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"]},
 e460:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"]},
 e461:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"]},
 e462:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"]},
 e463:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"]},
 e464:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"]},
 e465:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"]},
 e466:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"]},
 e467:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"]},
 e468:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"]},
 e469:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"]},
 e470:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"]},
 e471:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"]},
 e472:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"]},
 e473:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"]},
 e474:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"]},
 e475:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify",C.z7)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"]},
 e476:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"]},
 e477:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"]},
 e478:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"]},
 e479:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"]},
 e480:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"]},
 e481:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"]},
 e482:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"]},
 e483:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"]},
 e484:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"]},
 e485:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"]},
 e486:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"]},
 e487:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"]},
 e488:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-page",C.hM)},"$0",null,0,0,null,"call"]},
 e489:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-stack",C.JX)},"$0",null,0,0,null,"call"]},
 e490:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-frame",C.V7)},"$0",null,0,0,null,"call"]},
 e491:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-console",C.Wd)},"$0",null,0,0,null,"call"]},
 e492:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-page",C.hM)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-input",C.V8)},"$0",null,0,0,null,"call"]},
 e493:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-stack",C.JX)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"]},
 e494:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-frame",C.V7)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"]},
 e495:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-console",C.Wd)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"]},
 e496:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-input",C.V8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"]},
 e497:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"]},
 e498:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"]},
 e499:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"]},
 e500:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"]},
 e501:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.It)},"$0",null,0,0,null,"call"]},
 e502:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"]},
 e503:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"]},
 e504:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"]},
 e505:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"]},
 e506:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"]},
 e507:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"]},
 e508:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"]},
 e509:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"]},
 e510:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"]},
 e511:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"]},
 e512:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"]},
 e513:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"]},
 e514:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"]},
 e515:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"]},
 e516:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"]},
 e517:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"]},
 e518:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"]},
 e519:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"]},
 e520:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"]},
 e521:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"]},
 e522:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"]},
 e523:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"]},
 e524:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"]},
 e525:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"]},
 e526:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"]},
 e527:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"]},
 e528:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"]},
 e529:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"]},
 e530:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"]},
 e531:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"]},
 e532:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"]},
 e533:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"]},
 e534:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"]},
 e535:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"]},
 e536:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"]},
 e537:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"]},
 e538:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"]},
 e539:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"]},
 e540:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"]},
 e541:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"]},
 e542:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"]},
 e543:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"]},
 e544:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"]},
 e545:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"]},
 e546:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"]},
 e547:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"]},
 e548:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"]},
 e549:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"]},
 e550:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e551:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e552:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e553:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e554:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["","",,B,{
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"]}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,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)},
-pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
-static:{VHR: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.QD.LX(a)
-C.QD.XI(a)
+"^":"Vfx;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grs:function(a){return a.RZ},
+srs:function(a,b){a.RZ=this.ct(a,C.UX,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{t4:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.C8.LX(a)
+C.C8.XI(a)
 return a}}},
 Vfx:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"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:{vle: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.i3.LX(a)
-C.i3.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{rt:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YZz.LX(a)
+C.YZz.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-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.ks
+TY:{
+"^":"Y2;od:r>,Ru:x>,Q,a,b,c,d,e,f,cy$,db$",
+Pz:function(){var z,y,x,w,v,u,t
+z=this.b
 if(z.length>0)return
-for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+for(y=this.x.gLT(),y=y.gu(y),x=this.r,w=this.a+1;y.D();){v=y.c
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-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;")
+t=new O.TY(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+if(!t.Nh()){u=t.e
+if(t.gnz(t)&&!J.mG(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)}},
-cO:function(){},
-Nh:function(){return this.Ru.gLT().XG.length>0}},
+t.SZ(t,u)}t.e="visibility:hidden;"}z.push(t)}},
+aY:function(){},
+Nh:function(){return this.x.gLT().b.length>0}},
 eo:{
-"^":"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)},
+"^":"tuj;RZ,Hm:ij=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=R.tB([])
-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","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.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+a.ij=new G.iY(z,null,null)
+z=a.RZ
+if(z!=null)this.zc(a,z.gDZ())},
+GU:[function(a,b){a.RZ.WR().ml(new O.nc(a))},"$1","guz",2,0,14,61],
+zc:function(a,b){var z,y,x,w,v,u,t,s,r,q
+try{w=a.RZ
+v=H.J([],[G.Y2])
+u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.Mx(z)
-v=a.CA
+w=J.OD(z)
+v=a.RZ
 t=z
-s=H.VM([],[G.Y2])
+s=H.J([],[G.Y2])
 r=t!=null?t.gyt()+1:0
-s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
+s=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.G7(z)}catch(q){w=H.Ru(q)
+a.ij.rT(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.oP(q,null)
-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.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+x=new H.XO(q,null)
+N.QM("").r0("_update",y,x)}if(J.mG(J.wS(a.ij.Q),1))a.ij.lo(0)
+this.ct(a,C.ep,null,a.ij)},
+ka:[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.V(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
+if(!J.mG(J.eS(w.gK(b)),"expand")&&!J.mG(w.gK(b),d))return
 z=J.Lp(d)
-if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
+if(!!J.t(z).$isIv)try{w=a.ij
+v=J.JC(z)
+if(typeof v!=="number")return v.T()
 w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+x=new H.XO(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,4,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.fe.LX(a)
-C.fe.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.RD.LX(a)
+C.RD.XI(a)
 return a}}},
 tuj:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 nc:{
-"^":"TpZ:12;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,108,"call"],
-$isEH:true}}],["","",,Z,{
+"^":"r:14;Q",
+$1:[function(a){J.FU(this.Q,a)},"$1",null,2,0,null,108,"call"]}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"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="+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],
-m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+"^":"Vct;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRu:function(a){return a.RZ},
+sRu:function(a,b){a.RZ=this.ct(a,C.XA,a.RZ,b)},
+gWt:function(a){return a.ij},
+sWt:function(a,b){a.ij=this.ct(a,C.yB,a.ij,b)},
+gCF:function(a){return a.TQ},
+sCF:function(a,b){a.TQ=this.ct(a,C.tg,a.TQ,b)},
+vV:[function(a,b){return a.RZ.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+jK:[function(a,b){return a.RZ.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
+Cq:[function(a,b){return a.RZ.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
+SK:[function(a,b){a.ij=this.ct(a,C.yB,a.ij,null)
+a.TQ=this.ct(a,C.tg,a.TQ,null)
+J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
 static:{zga: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ka.LX(a)
 C.ka.XI(a)
 return a}}},
 Vct:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 Ob:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-SS:{
-"^":"TpZ:115;a",
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.yB,z.ij,a)},"$1",null,2,0,null,96,"call"]},
+Rc:{
+"^":"r:115;Q",
 $1:[function(a){var z,y
-z=this.a
-y=H.BU(a.gPE(),null,null)
-z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,O,{
+z=this.Q
+y=H.BU(a.gHD(),null,null)
+z.TQ=J.Q5(z,C.tg,z.TQ,y)},"$1",null,2,0,null,96,"call"]}}],["","",,O,{
 "^":"",
 VY:{
-"^":"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","gLe",2,0,12,59],
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtT:function(a){return a.RZ},
+Qj:[function(a,b){this.rb(a,b)
+this.ct(a,C.i4,0,1)},"$1","gBj",2,0,14,61],
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.tWO.LX(a)
 C.tWO.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"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)},
+"^":"D13;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtT:function(a){return a.RZ},
+stT:function(a,b){a.RZ=this.ct(a,C.i4,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
+this.VM(a)
+z=a.RZ
 if(z==null)return
-J.SK(z).ml(new F.fS())},
-pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
+J.SK(z).ml(new F.Bc())},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 lE:function(a,b){var z,y,x
-z=J.Vs(b).dA.getAttribute("data-jump-target")
+z=J.Vs(b).Q.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
@@ -5202,164 +4601,161 @@
 return x},
 YI:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gVb",6,0,116,2,106,107],
+J.pP(z).h(0,"highlight")},"$3","gVb",6,0,116,4,106,107],
 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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,4,106,107],
+static:{FeK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ux.LX(a)
 C.ux.XI(a)
 return a}}},
 D13:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-fS:{
-"^":"TpZ:117;",
-$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
-$isEH:true}}],["","",,T,{
+Bc:{
+"^":"r:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"]}}],["","",,T,{
 "^":"",
 uV:{
-"^":"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],
-Po:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){var z=a.RZ
+if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
 else{z.sZ3(null)
-c.$0()}},"$2","gus",4,0,118,119,120],
+c.$0()}},"$2","gNe",4,0,118,119,120],
 static:{CvM: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-zG:{
-"^":"TpZ:12;a",
+WW:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.a
+z=this.Q
 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}}],["","",,U,{
+z.RZ=y.ct(z,C.kY,z.RZ,a)
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,U,{
 "^":"",
 NY:{
-"^":"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],
+"^":"WZq;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+geo:function(a){return a.RZ},
+seo:function(a,b){a.RZ=this.ct(a,C.nr,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,122,120],
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.dZE.LX(a)
-C.dZE.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.oS.LX(a)
+C.oS.XI(a)
 return a}}},
 WZq:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,Ot,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.Ot},
-sO9:function(a,b){a.Ot=this.ct(a,C.S4,a.Ot,b)},
-gFR:function(a){return a.nx},
+"^":"SaM;LD,kX,RZ,ij,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+goE:function(a){return a.LD},
+soE:function(a,b){a.LD=this.ct(a,C.mr,a.LD,b)},
+gO9:function(a){return a.kX},
+sO9:function(a,b){a.kX=this.ct(a,C.S4,a.kX,b)},
+gFR:function(a){return a.RZ},
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},
-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.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.Ot=this.ct(a,C.S4,a.Ot,!1)},"$0","goJ",0,0,17],
-AZ:[function(a,b,c,d){var z=a.Ot
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+tn:[function(a,b){var z=a.ij
+a.LD=this.ct(a,C.mr,a.LD,z)},"$1","ghy",2,0,20,61],
+Db:[function(a){var z=a.LD
+a.LD=this.ct(a,C.mr,z,z!==!0)
+a.kX=this.ct(a,C.S4,a.kX,!1)},"$0","gN2",0,0,1],
+AZ:[function(a,b,c,d){var z=a.kX
 if(z===!0)return
-if(a.nx!=null){a.Ot=this.ct(a,C.S4,z,!0)
-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.tH=!1
-a.Ot=!1
-a.nx=null
-a.oM=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+if(a.RZ!=null){a.kX=this.ct(a,C.S4,z,!0)
+this.AV(a,a.LD!==!0,this.gN2(a))}else{z=a.LD
+a.LD=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,52,55,85],
+static:{fRK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX=!1
+a.RZ=null
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.O0.LX(a)
 C.O0.XI(a)
 return a}}},
 SaM:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,H,{
 "^":"",
 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)
-if(z.C(b,d))for(y=J.bI(z.g(b,e),1),x=J.bI(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.bI(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+if(z.w(b,d))for(y=J.D5(z.g(b,e),1),x=J.D5(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.C(y,b);y=w.T(y,1),x=J.D5(x,1))C.Nm.q(c,x,z.p(a,y))
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.w(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.q(c,x,w.p(a,y))},
 TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.xC(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
-if(typeof c!=="number")return c.C()
+if(J.mG(a[z],b))return z}return-1},
+EHn:function(a,b,c){var z,y
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.xC(a[y],b))return y}return-1},
+if(J.mG(a[y],b))return y}return-1},
 ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
 else H.ZD(a,b,c,d)},
 w9:function(a,b,c,d){var z,y,x,w,v
-for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
+for(z=b+1,y=J.U6(a);z<=c;++z){x=y.p(a,z)
 w=z
-while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.vU(d.$2(y.p(a,w-1),x),0)))break
 v=w-1
-y.u(a,w,y.t(a,v))
-w=v}y.u(a,w,x)}},
+y.q(a,w,y.p(a,v))
+w=v}y.q(a,w,x)}},
 ZD:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
 z=C.jn.BU(c-b+1,6)
 y=b+z
@@ -5368,355 +4764,379 @@
 v=w-z
 u=w+z
 t=J.U6(a)
-s=t.t(a,y)
-r=t.t(a,v)
-q=t.t(a,w)
-p=t.t(a,u)
-o=t.t(a,x)
-if(J.xZ(d.$2(s,r),0)){n=r
+s=t.p(a,y)
+r=t.p(a,v)
+q=t.p(a,w)
+p=t.p(a,u)
+o=t.p(a,x)
+if(J.vU(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.xZ(d.$2(p,o),0)){n=o
+s=n}if(J.vU(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.xZ(d.$2(s,q),0)){n=q
+p=n}if(J.vU(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.xZ(d.$2(r,q),0)){n=q
+s=n}if(J.vU(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(s,p),0)){n=p
+r=n}if(J.vU(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.xZ(d.$2(q,p),0)){n=p
+s=n}if(J.vU(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.xZ(d.$2(r,o),0)){n=o
+q=n}if(J.vU(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.xZ(d.$2(r,q),0)){n=q
+r=n}if(J.vU(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(p,o),0)){n=o
+r=n}if(J.vU(d.$2(p,o),0)){n=o
 o=p
-p=n}t.u(a,y,s)
-t.u(a,w,q)
-t.u(a,x,o)
-t.u(a,v,t.t(a,b))
-t.u(a,u,t.t(a,c))
+p=n}t.q(a,y,s)
+t.q(a,w,q)
+t.q(a,x,o)
+t.q(a,v,t.p(a,b))
+t.q(a,u,t.p(a,c))
 m=b+1
 l=c-1
-if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
+if(J.mG(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.p(a,k)
 i=d.$2(j,r)
-h=J.x(i)
-if(h.n(i,0))continue
-if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
+h=J.t(i)
+if(h.m(i,0))continue
+if(h.w(i,0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else for(;!0;){i=d.$2(t.p(a,l),r)
 h=J.Wx(i)
-if(h.D(i,0)){--l
+if(h.A(i,0)){--l
 continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
+if(h.w(i,0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
 m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+break}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g
-break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
+break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.p(a,k)
+if(J.UN(d.$2(j,r),0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else if(J.vU(d.$2(j,p),0))for(;!0;)if(J.vU(d.$2(t.p(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
-if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
+if(J.UN(d.$2(t.p(a,l),r),0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+m=f}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
+t.q(a,b,t.p(a,h))
+t.q(a,h,r)
 h=l+1
-t.u(a,c,t.t(a,h))
-t.u(a,h,p)
+t.q(a,c,t.p(a,h))
+t.q(a,h,p)
 H.ZE(a,b,m-2,d)
 H.ZE(a,l+2,c,d)
 if(e)return
-if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
-for(;J.xC(d.$2(t.t(a,l),p),0);)--l
-for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.xC(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.xC(d.$2(j,p),0))for(;!0;)if(J.xC(d.$2(t.t(a,l),p),0)){--l
+if(m<y&&l>x){for(;J.mG(d.$2(t.p(a,m),r),0);)++m
+for(;J.mG(d.$2(t.p(a,l),p),0);)--l
+for(k=m;k<=l;++k){j=t.p(a,k)
+if(J.mG(d.$2(j,r),0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else if(J.mG(d.$2(j,p),0))for(;!0;)if(J.mG(d.$2(t.p(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
-if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
+if(J.UN(d.$2(t.p(a,l),r),0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+m=f}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
 aL:{
 "^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.W8(this,"aL",0)])},
+gu:function(a){return H.J(new H.a7(this,this.gv(this),0,null),[H.W8(this,"aL",0)])},
 aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
 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)},
-gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+if(z!==this.gv(this))throw H.b(P.a4(this))}},
+gl0:function(a){return J.mG(this.gv(this),0)},
+gtH:function(a){if(J.mG(this.gv(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.DU())
-return this.Zv(0,J.bI(this.gB(this),1))},
+grZ:function(a){if(J.mG(this.gv(this),0))throw H.b(H.DU())
+return this.Zv(0,J.D5(this.gv(this),1))},
 tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
-for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+for(;y<z;++y){if(J.mG(this.Zv(0,y),b))return!0
+if(z!==this.gv(this))throw H.b(P.a4(this))}return!1},
 Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
 for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+if(z!==this.gv(this))throw H.b(P.a4(this))}return!1},
 zV:function(a,b){var z,y,x,w,v,u
-z=this.gB(this)
-if(b.length!==0){y=J.x(z)
-if(y.n(z,0))return""
+z=this.gv(this)
+if(b.length!==0){y=J.t(z)
+if(y.m(z,0))return""
 x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
+if(!y.m(z,this.gv(this)))throw H.b(P.a4(this))
 w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
+if(typeof z!=="number")return H.o(z)
 v=1
-for(;v<z;++v){w.IN+=b
+for(;v<z;++v){w.Q+=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))}return w.IN}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
+w.Q+=typeof u==="string"?u:H.d(u)
+if(z!==this.gv(this))throw H.b(P.a4(this))}y=w.Q
+return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
+if(typeof z!=="number")return H.o(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))}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:"kY",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+w.Q+=typeof u==="string"?u:H.d(u)
+if(z!==this.gv(this))throw H.b(P.a4(this))}y=w.Q
+return y.charCodeAt(0)==0?y:y}},
+ev:function(a,b){return this.FX(this,b)},
+ez:[function(a,b){return H.J(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xP",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},31],
 es:function(a,b,c){var z,y,x
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=b
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+if(z!==this.gv(this))throw H.b(P.a4(this))}return y},
 eR:function(a,b){return H.c1(this,b,null,H.W8(this,"aL",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.W8(this,"aL",0)])
-C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
+if(b){z=H.J([],[H.W8(this,"aL",0)])
+C.Nm.sv(z,this.gv(this))}else{y=this.gv(this)
+if(typeof y!=="number")return H.o(y)
 y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.W8(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
+y.fixed$length=Array
+z=H.J(y,[H.W8(this,"aL",0)])}x=0
+while(!0){y=this.gv(this)
+if(typeof y!=="number")return H.o(y)
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.W8(this,"aL",0))
+Oe:function(a){var z,y,x
+z=P.fM(null,null,null,H.W8(this,"aL",0))
 y=0
-while(!0){x=this.gB(this)
-if(typeof x!=="number")return H.s(x)
+while(!0){x=this.gv(this)
+if(typeof x!=="number")return H.o(x)
 if(!(y<x))break
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,ay,Hx",
+"^":"aL;Q,a,b",
 gUD:function(){var z,y
-z=J.q8(this.Hb)
-y=this.Hx
-if(y==null||J.xZ(y,z))return z
+z=J.wS(this.Q)
+y=this.b
+if(y==null||J.vU(y,z))return z
 return y},
-gdM:function(){var z,y
-z=J.q8(this.Hb)
-y=this.ay
-if(J.xZ(y,z))return z
+gAs:function(){var z,y
+z=J.wS(this.Q)
+y=this.a
+if(J.vU(y,z))return z
 return y},
-gB:function(a){var z,y,x
-z=J.q8(this.Hb)
-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.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)},
+gv:function(a){var z,y,x
+z=J.wS(this.Q)
+y=this.a
+if(J.u6(y,z))return 0
+x=this.b
+if(x==null||J.u6(x,z))return J.D5(z,y)
+return J.D5(x,y)},
+Zv:function(a,b){var z=J.WB(this.gAs(),b)
+if(J.UN(b,0)||J.u6(z,this.gUD()))throw H.b(P.Hj(b,this,"index",null,null))
+return J.i9(this.Q,z)},
 eR:function(a,b){var z,y
-if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.ay,b)
-y=this.Hx
-if(y!=null&&J.J5(z,y)){y=new H.MB()
+if(J.UN(b,0))H.vh(P.ve(b,0,null,"count",null))
+z=J.WB(this.a,b)
+y=this.b
+if(y!=null&&J.u6(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-rh:function(a,b){var z,y,x
-if(b<0)throw H.b(P.N(b))
-z=this.Hx
-y=this.ay
-if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
+return y}return H.c1(this.Q,z,y,H.u3(this,0))},
+qZ:function(a,b){var z,y,x
+if(b<0)H.vh(P.ve(b,0,null,"count",null))
+z=this.b
+y=this.a
+if(z==null)return H.c1(this.Q,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))}},
+if(J.UN(z,x))return this
+return H.c1(this.Q,y,x,H.u3(this,0))}},
+tt:function(a,b){var z,y,x,w,v,u,t,s,r,q
+z=this.a
+y=this.Q
+x=J.U6(y)
+w=x.gv(y)
+v=this.b
+if(v!=null&&J.UN(v,w))w=v
+u=J.D5(w,z)
+if(J.UN(u,0))u=0
+if(b){t=H.J([],[H.u3(this,0)])
+C.Nm.sv(t,u)}else{if(typeof u!=="number")return H.o(u)
+s=Array(u)
+s.fixed$length=Array
+t=H.J(s,[H.u3(this,0)])}if(typeof u!=="number")return H.o(u)
+s=J.rv(z)
+r=0
+for(;r<u;++r){q=x.Zv(y,s.g(z,r))
+if(r>=t.length)return H.e(t,r)
+t[r]=q
+if(J.UN(x.gv(y),w))throw H.b(P.a4(this))}return t},
+br:function(a){return this.tt(a,!0)},
 Hd:function(a,b,c,d){var z,y,x
-z=this.ay
+z=this.a
 y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.Hx
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
-if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{c1:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
+if(y.w(z,0))H.vh(P.ve(z,0,null,"start",null))
+x=this.b
+if(x!=null){if(J.UN(x,0))H.vh(P.ve(x,0,null,"end",null))
+if(y.A(z,x))throw H.b(P.ve(z,0,x,"start",null))}},
+static:{c1:function(a,b,c,d){var z=H.J(new H.bX(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,bd,QX,Ff",
-gl:function(){return this.Ff},
-G:function(){var z,y,x,w
-z=this.Hb
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w
+z=this.Q
 y=J.U6(z)
-x=y.gB(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.Ff=null
-return!1}this.Ff=y.Zv(z,w);++this.QX
+x=y.gv(z)
+if(!J.mG(this.a,x))throw H.b(P.a4(z))
+w=this.b
+if(typeof x!=="number")return H.o(x)
+if(w>=x){this.c=null
+return!1}this.c=y.Zv(z,w);++this.b
 return!0}},
 i1:{
-"^":"mW;Hb,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.Hb),this.Oh)
+"^":"mW;Q,a",
+Mi:function(a){return this.a.$1(a)},
+gu:function(a){var z=new H.MH(null,J.Nx(this.Q),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.Hb)},
-gl0:function(a){return J.FN(this.Hb)},
-gqG:function(a){return this.Mi(J.bT(this.Hb))},
-grZ:function(a){return this.Mi(J.MQ(this.Hb))},
+gv:function(a){return J.wS(this.Q)},
+gl0:function(a){return J.FN(this.Q)},
+gtH:function(a){return this.Mi(J.bP(this.Q))},
+grZ:function(a){return this.Mi(J.rn(this.Q))},
 $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])
-return H.VM(new H.i1(a,b),[c,d])}}},
+static:{fR:function(a,b,c,d){if(!!J.t(a).$isyN)return H.J(new H.xy(a,b),[c,d])
+return H.J(new H.i1(a,b),[c,d])}}},
 xy:{
-"^":"i1;Hb,Oh",
+"^":"i1;Q,a",
 $isyN:true},
 MH:{
-"^":"Anv;Ff,CL,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-G:function(){var z=this.CL
-if(z.G()){this.Ff=this.Mi(z.gl())
-return!0}this.Ff=null
+"^":"Anv;Q,a,b",
+Mi:function(a){return this.b.$1(a)},
+D:function(){var z=this.a
+if(z.D()){this.Q=this.Mi(z.gk())
+return!0}this.Q=null
 return!1},
-gl:function(){return this.Ff},
+gk:function(){return this.Q},
 $asAnv:function(a,b){return[b]}},
 A8:{
-"^":"aL;ON,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-gB:function(a){return J.q8(this.ON)},
-Zv:function(a,b){return this.Mi(J.i9(this.ON,b))},
+"^":"aL;Q,a",
+Mi:function(a){return this.a.$1(a)},
+gv:function(a){return J.wS(this.Q)},
+Zv:function(a,b){return this.Mi(J.i9(this.Q,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
-"^":"mW;Hb,Oh",
-gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
+"^":"mW;Q,a",
+gu:function(a){var z=new H.Mo(J.Nx(this.Q),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-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
+Mo:{
+"^":"Anv;Q,a",
+Mi:function(a){return this.a.$1(a)},
+D:function(){for(var z=this.Q;z.D();)if(this.Mi(z.gk())===!0)return!0
 return!1},
-gl:function(){return this.CL.gl()}},
-oA:{
-"^":"mW;Hb,Oh",
-gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
+gk:function(){return this.Q.gk()}},
+Fm:{
+"^":"mW;Q,a",
+gu:function(a){var z=new H.P8(J.Nx(this.Q),this.a,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-yY:{
-"^":"a;CL,Oh,WL,Ff",
-Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.Ff},
-G:function(){var z,y
-z=this.WL
+P8:{
+"^":"a;Q,a,b,c",
+Mi:function(a){return this.a.$1(a)},
+gk:function(){return this.c},
+D:function(){var z,y
+z=this.b
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.Ff=null
-if(y.G()){this.WL=null
-z=J.mY(this.Mi(y.gl()))
-this.WL=z}else return!1}this.Ff=this.WL.gl()
+for(y=this.Q;!z.D();){this.c=null
+if(y.D()){this.b=null
+z=J.Nx(this.Mi(y.gk()))
+this.b=z}else return!1}this.c=this.b.gk()
 return!0}},
 AM:{
-"^":"mW;Hb,u3",
-eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
-gA:function(a){var z=this.Hb
-z=new H.b2(z.gA(z),this.u3)
+"^":"mW;Q,a",
+eR:function(a,b){var z=this.a
+if(z<0)H.vh(P.ve(z,0,null,"count",null))
+return H.J5(this.Q,z+b,H.u3(this,0))},
+gu:function(a){var z=this.Q
+z=new H.Lh(z.gu(z),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
+jb:function(a,b,c){var z=this.a
+if(z<0)H.vh(P.ve(z,0,null,"count",null))},
 static:{ke:function(a,b,c){var z
-if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
+if(!!a.$isyN){z=H.J(new H.wB(a,b),[c])
 z.jb(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])
+return z}return H.J5(a,b,c)},J5:function(a,b,c){var z=H.J(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
-"^":"AM;Hb,u3",
-gB:function(a){var z,y
-z=this.Hb
-y=J.bI(z.gB(z),this.u3)
-if(J.J5(y,0))return y
+"^":"AM;Q,a",
+gv:function(a){var z,y
+z=this.Q
+y=J.D5(z.gv(z),this.a)
+if(J.u6(y,0))return y
 return 0},
 $isyN:true},
-b2:{
-"^":"Anv;CL,u3",
-G:function(){var z,y
-for(z=this.CL,y=0;y<this.u3;++y)z.G()
-this.u3=0
-return z.G()},
-gl:function(){return this.CL.gl()}},
+Lh:{
+"^":"Anv;Q,a",
+D:function(){var z,y
+for(z=this.Q,y=0;y<this.a;++y)z.D()
+this.a=0
+return z.D()},
+gk:function(){return this.Q.gk()}},
 MB:{
 "^":"mW;",
-gA:function(a){return C.MS},
+gu:function(a){return C.MS},
 aN:function(a,b){},
 gl0:function(a){return!0},
-gB:function(a){return 0},
-gqG:function(a){throw H.b(H.DU())},
+gv:function(a){return 0},
+gtH: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:"Uy",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))
+ev:function(a,b){return this},
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"MB")},31],
+eR:function(a,b){if(b<0)H.vh(P.ve(b,0,null,"count",null))
 return this},
 tt:function(a,b){var z
-if(b)z=H.VM([],[H.u3(this,0)])
+if(b)z=H.J([],[H.u3(this,0)])
 else{z=Array(0)
-z.fixed$length=init
-z=H.VM(z,[H.u3(this,0)])}return z},
+z.fixed$length=Array
+z=H.J(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-wb:{
+D:function(){return!1},
+gk:function(){return}},
+ii:{
 "^":"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.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
+static:{Ck:function(a,b){var z
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)if(b.$1(z.c)===!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.Ff)
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)b=c.$2(b,z.c)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5726,57 +5146,54 @@
 x=a.length
 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])},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
+C.Nm.sv(a,x)
+for(w=0;w<z.length;++w)C.Nm.q(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
 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.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))
-y=J.x(d)
+H.ZE(a,0,a.length-1,b)},qG:function(a,b,c,d,e){var z,y,x,w
+P.iZ(b,c,a.length,null,null,null)
+z=J.D5(c,b)
+if(J.mG(z,0))return
+if(J.UN(e,0))throw H.b(P.p(e))
+y=J.t(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
-H.tb(w,x,a,b,z)},IC:function(a,b,c){var z,y,x,w
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
+x=0}if(J.vU(J.WB(x,z),J.wS(w)))throw H.b(H.ar())
+H.tb(w,x,a,b,z)},FR:function(a,b,c){var z,y,x,w
+P.wA(b,0,a.length,"index",null)
+z=J.t(c)
 if(!z.$isyN)c=z.tt(c,!1)
 z=J.U6(c)
-y=z.gB(c)
+y=z.gv(c)
 x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
+if(typeof y!=="number")return H.o(y)
+C.Nm.sv(a,x+y)
 x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
+C.Nm.uy(a,"set range")
 H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},h8:function(a,b,c){var z,y
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-for(z=J.mY(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}}}},
+for(z=z.gu(c);z.D();b=w){w=b+1
+C.Nm.q(a,b,z.gk())}},h8:function(a,b,c){var z,y
+P.wA(b,0,a.length,"index",null)
+for(z=J.Nx(c);z.D();b=y){y=b+1
+C.Nm.q(a,b,z.gk())}}}},
 SU7:{
 "^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
+sv: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"))},
-xe:function(a,b,c){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"))},
 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"))}},
-JJ:{
+ReL:{
 "^":"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"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+sv: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"))},
-xe:function(a,b,c){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"))},
 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"))},
@@ -5785,7 +5202,7 @@
 Jd:function(a){return this.GT(a,null)},
 V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isWO:true,
 $asWO:null,
@@ -5793,74 +5210,88 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 iK:{
-"^":"aL;ON",
-gB:function(a){return J.q8(this.ON)},
+"^":"aL;Q",
+gv:function(a){return J.wS(this.Q)},
 Zv:function(a,b){var z,y,x
-z=this.ON
+z=this.Q
 y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
+x=y.gv(z)
+if(typeof b!=="number")return H.o(b)
 return y.Zv(z,x-1-b)}},
 tx:{
-"^":"a;OB>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$istx&&J.xC(this.OB,b.OB)},
-giO:function(a){var z=J.v1(this.OB)
-if(typeof z!=="number")return H.s(z)
+"^":"a;OB:Q>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$istx&&J.mG(this.Q,b.Q)},
+giO:function(a){var z=J.v1(this.Q)
+if(typeof z!=="number")return H.o(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.OB)+"\")"},"$0","gCR",0,0,76],
+X:[function(a){return"Symbol(\""+H.d(this.Q)+"\")"},"$0","gCR",0,0,77],
 $istx:true,
 $isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["","",,H,{
 "^":"",
-kU:function(a){var z=H.VM(function(b,c){var y=[]
+kU:function(a){var z=H.J(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
-z.fixed$length=init
+z.fixed$length=Array
 return z}}],["","",,P,{
 "^":"",
 xg:function(){var z,y,x
 z={}
-if(self.scheduleImmediate!=null)return P.vd()
+if(self.scheduleImmediate!=null)return P.Sx()
 if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
 x=self.document.createElement("span")
 z.a=null
 new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
-return new P.ha(z,y,x)}return P.K7()},
-ZV:[function(a){++init.globalState.Xz.kv
-self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
-Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
+return new P.ha(z,y,x)}else if(self.setImmediate!=null)return P.U9()
+return P.K7()},
+ZV:[function(a){++init.globalState.e.a
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,19],
+oA:[function(a){++init.globalState.e.a
+self.setImmediate(H.tR(new P.Ft(a),0))},"$1","U9",2,0,19],
+Bz:[function(a){P.YF(C.RT,a)},"$1","K7",2,0,19],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-DJ:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.w4(a,z))
+e4Q:function(a,b){var z=H.J(new P.Gc(0,$.X3,null),[b])
+P.cH(C.RT,new P.Sv(a,z))
 return z},
-Ne:function(a,b){var z,y,x,w,v
+Xo:function(a,b,c){var z,y
+a=a!=null?a:new P.LK()
+z=$.X3
+if(z!==C.fQ){y=z.WF(a,b)
+if(y!=null){a=J.w8(y)
+a=a!=null?a:new P.LK()
+b=y.gI4()}}z=H.J(new P.Gc(0,$.X3,null),[c])
+z.Nk(a,b)
+return z},
+hz:function(a,b){var z,y,x,w,v
 z={}
+y=H.J(new P.Gc(0,$.X3,null),[P.WO])
 z.a=null
-z.b=null
-z.c=0
+z.b=0
+z.c=null
 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.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)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
+x=new P.j7(z,b,y)
+for(w=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);w.D();)w.c.Rx(new P.oV(z,b,y,z.b++),x)
+x=z.b
+if(x===0){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(C.xD)
+return z}v=Array(x)
+v.fixed$length=Array
 z.a=v
-return v.MM},
+return y},
+nD:function(a,b,c){var z=$.X3.WF(b,c)
+if(z!=null){b=J.w8(z)
+b=b!=null?b:new P.LK()
+c=z.gI4()}a.ZL(b,c)},
 Cx:function(){var z,y
 for(;z=$.S6,z!=null;){$.mg=null
 y=z.gaw()
@@ -5870,175 +5301,184 @@
 BG:[function(){$.v5=!0
 try{P.Cx()}finally{$.mg=null
 $.v5=!1
-if($.S6!=null)$.zp().$1(P.yK())}},"$0","yK",0,0,17],
+if($.S6!=null)$.zp().$1(P.yK())}},"$0","yK",0,0,1],
+IA:function(a){var z,y
+if($.S6==null){z=new P.OM(a,null)
+$.k8=z
+$.S6=z
+if(!$.v5)$.zp().$1(P.yK())}else{y=new P.OM(a,null)
+$.k8.a=y
+$.k8=y}},
 rb:function(a){var z=$.X3
 if(C.fQ===z){P.ZK(null,null,C.fQ,a)
 return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
-if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}return z},
+if(c){z=H.J(new P.zW(b,a,0,null,null,null,null),[d])
+z.d=z
+z.c=z}else{z=H.J(new P.DL(b,a,0,null,null,null,null),[d])
+z.d=z
+z.c=z}return z},
 ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
-if(!!J.x(z).$isb8)return z
+if(!!J.t(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
+x=new H.XO(w,null)
 $.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],
-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
-y=new H.oP(x,null)
-c.$2(z,y)}},
+QEz:[function(a){},"$1","yy",2,0,20,21],
+Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,22,23,24,25],
+ax:[function(){},"$0","No",0,0,1],
+FE:function(a,b,c){var z,y,x,w,v,u,t,s
+try{b.$1(a.$0())}catch(u){t=H.Ru(u)
+z=t
+y=new H.XO(u,null)
+x=$.X3.WF(z,y)
+if(x==null)c.$2(z,y)
+else{s=J.w8(x)
+w=s!=null?s:new P.LK()
+v=x.gI4()
+c.$2(w,v)}}},
 NX:function(a,b,c,d){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.ap(b,c,d))
+if(!!J.t(z).$isb8)z.wM(new P.ap(b,c,d))
 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.QX(b,c))
-else b.In(c)},
+if(!!J.t(z).$isb8)z.wM(new P.Ry(b,c))
+else b.HH(c)},
+iw:function(a,b,c){var z=$.X3.WF(b,c)
+if(z!=null){b=J.w8(z)
+b=b!=null?b:new P.LK()
+c=z.gI4()}a.UI(b,c)},
 cH:function(a,b){var z
-if(J.xC($.X3,C.fQ))return $.X3.uN(a,b)
+if(J.mG($.X3,C.fQ))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.fQ))return $.X3.Ud(a,b)
+if(J.mG($.X3,C.fQ))return $.X3.lB(a,b)
 z=$.X3
-return z.Ud(a,z.rO(b,!0))},
+return z.lB(a,z.oj(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.zw(z<0?0:z,b)},
+return H.jW(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-Cw:function(a){if(a.geT(a)==null)return
+HM:function(a){if(a.geT(a)==null)return
 return a.geT(a).gyL()},
 CK:[function(a,b,c,d,e){var z,y,x
-z=new P.OM(new P.FO(d,e),null)
-y=$.S6
-if(y==null){$.mg=z
-$.k8=z
-$.S6=z
-if(!$.v5)$.zp().$1(P.yK())}else{x=$.mg
-if(x==null){z.aw=y
-$.mg=z
-$.S6=z}else{z.aw=x.aw
-x.aw=z
-$.mg=z
-if(z.aw==null)$.k8=z}}},"$5","wLZ",10,0,25,26,27,28,23,24],
-Ki:[function(a,b,c,d){var z,y
-if(J.xC($.X3,c))return d.$0()
+z=new P.FO(d,e)
+y=new P.OM(z,null)
+x=$.S6
+if(x==null){P.IA(z)
+$.mg=$.k8}else{z=$.mg
+if(z==null){y.a=x
+$.mg=y
+$.S6=y}else{y.a=z.a
+z.a=y
+$.mg=y
+if(y.a==null)$.k8=y}}},"$5","wLZ",10,0,26,27,28,29,24,25],
+T8:[function(a,b,c,d){var z,y
+if(J.mG($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","qKH",8,0,29,26,27,28,30],
+return y}finally{$.X3=z}},"$4","AIG",8,0,30,27,28,29,31],
 vf:[function(a,b,c,d,e){var z,y
-if(J.xC($.X3,c))return d.$1(e)
+if(J.mG($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","pl",10,0,31,26,27,28,30,32],
+return y}finally{$.X3=z}},"$5","O5z",10,0,32,27,28,29,31,33],
 Mu:[function(a,b,c,d,e,f){var z,y
-if(J.xC($.X3,c))return d.$2(e,f)
+if(J.mG($.X3,c))return d.$2(e,f)
 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],
-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","VbA",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.fQ!==c)d=c.ce(d)
-if($.S6==null){z=new P.OM(d,null)
-$.k8=z
-$.S6=z
-if(!$.v5)$.zp().$1(P.yK())}else{y=new P.OM(d,null)
-$.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.fQ!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-HwS:[function(a,b,c,d,e){return P.dp(d,C.fQ!==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],
-E1:[function(a,b,c,d,e){var z,y
+return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,10,11],
+EeK:[function(a,b,c,d){return d},"$4","eF",8,0,35,27,28,29,31],
+Rt:[function(a,b,c,d){return d},"$4","tLD",8,0,36,27,28,29,31],
+bD:[function(a,b,c,d){return d},"$4","Dkr",8,0,37,27,28,29,31],
+WNs:[function(a,b,c,d,e){return},"$5","vxv",10,0,38,27,28,29,24,25],
+ZK:[function(a,b,c,d){var z=C.fQ!==c
+if(z)d=c.xi(d,!(!z||C.fQ.gF7()===c.gF7()))
+P.IA(d)},"$4","yA",8,0,39,27,28,29,31],
+h8X:[function(a,b,c,d,e){return P.YF(d,C.fQ!==c?c.ce(e):e)},"$5","zci",10,0,40,27,28,29,41,42],
+HwS:[function(a,b,c,d,e){return P.dp(d,C.fQ!==c?c.mS(e):e)},"$5","CDt",10,0,43,27,28,29,41,42],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,44,27,28,29,45],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,46],
+qc:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-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)
+if(d==null)d=C.z3
+else if(!J.t(d).$isyQ)throw H.b(P.p("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.t(c).$ism0?c.goe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-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],
+z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.Ij(c,d,z)
+return y},"$5","Wk",10,0,47,27,28,29,48,49],
 th:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
 H.cv()
-z=this.a
+z=this.Q
 y=z.a
 z.a=null
-y.$0()},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+y.$0()},"$1",null,2,0,null,15,"call"]},
 ha:{
-"^":"TpZ:123;a,b,c",
-$1:function(a){var z,y;++init.globalState.Xz.kv
-this.a.a=a
-z=this.b
-y=this.c
-z.firstChild?z.removeChild(y):z.appendChild(y)},
-$isEH:true},
+"^":"r:123;Q,a,b",
+$1:function(a){var z,y;++init.globalState.e.a
+this.Q.a=a
+z=this.a
+y=this.b
+z.firstChild?z.removeChild(y):z.appendChild(y)}},
 C6:{
-"^":"TpZ:76;a",
+"^":"r:77;Q",
 $0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
+this.Q.$0()},"$0",null,0,0,null,"call"]},
+Ft:{
+"^":"r:77;Q",
+$0:[function(){H.cv()
+this.Q.$0()},"$0",null,0,0,null,"call"]},
 O6:{
-"^":"Ca;kc,I4",
-bu:[function(a){var z,y
-z="Uncaught Error: "+H.d(this.kc)
-y=this.I4
-return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,73],
+"^":"OH;Q,a",
+X:[function(a){var z,y
+z="Uncaught Error: "+H.d(this.Q)
+y=this.a
+return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,0],
 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()
+if(!!J.t(a).$isXS)return a.gI4()
 return}}},
-Ln:{
-"^":"u2;BT"},
-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
+rk:{
+"^":"u2;Q"},
+JIw:{
+"^":"yU4;ru:x@,iE:y@,SJ:z@,r,Q,a,b,c,d,e,f",
+gz3:function(){return this.r},
+uO:function(a){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&1)===a},
-fc:function(){var z=this.ru
-if(typeof z!=="number")return z.w()
-this.ru=z^1},
-gh0:function(){var z=this.ru
+fc:function(){var z=this.x
+if(typeof z!=="number")return z.s()
+this.x=z^1},
+gbn:function(){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-Pa:function(){var z=this.ru
-if(typeof z!=="number")return z.k()
-this.ru=z|4},
-gYS:function(){var z=this.ru
+Pa:function(){var z=this.x
+if(typeof z!=="number")return z.j()
+this.x=z|4},
+gKH:function(){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-jy:[function(){},"$0","gb9",0,0,17],
-ie:[function(){},"$0","gxl",0,0,17],
+lT:[function(){},"$0","gb9",0,0,1],
+ie:[function(){},"$0","gxl",0,0,1],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
-"^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.Ln(this)
+"^":"a;iE:c@,SJ:d@",
+gvq:function(a){var z=new P.rk(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gUF:function(){return!1},
-WH:function(){var z=this.Kj
+gRW:function(){return!1},
+WH:function(){var z=this.f
 if(z!=null)return z
-z=P.Dt(null)
-this.Kj=z
+z=H.J(new P.Gc(0,$.X3,null),[null])
+this.f=z
 return z},
 pW:function(a){var z,y
 z=a.gSJ()
@@ -6048,209 +5488,223 @@
 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.v3()
+if((this.b&4)!==0){if(c==null)c=P.No()
 z=new P.to($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.JIw(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
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
+x.z=x
+x.y=x
+y=this.d
+x.z=y
+x.y=this
 y.siE(x)
-this.SJ=x
-x.ru=this.YM&1
-if(this.iE===x)P.ot(this.Ld)
+this.d=x
+x.x=this.b&1
+if(this.c===x)P.ot(this.Q)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.gh0())a.Pa()
+if(a.gbn())a.Pa()
 else{this.pW(a)
-if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-Pm:function(a){},
-Pl:function(a){},
-Pq:function(){if((this.YM&4)!==0)return new P.lj("Cannot add new events after calling close")
+if((this.b&2)===0&&this.c===this)this.hg()}return},
+EB:function(a){},
+ho:function(a){},
+Pq:function(){if((this.b&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())
+h:[function(a,b){if(this.b>=4)throw H.b(this.Pq())
 this.MW(b)},"$1","ght",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},124],
-fDe:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
-this.y7(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,125,22,23,24],
+fD:[function(a,b){var z
+a=a!=null?a:new P.LK()
+if(this.b>=4)throw H.b(this.Pq())
+z=$.X3.WF(a,b)
+if(z!=null){a=J.w8(z)
+a=a!=null?a:new P.LK()
+b=z.gI4()}this.y7(a,b)},function(a){return this.fD(a,null)},"JT","$2","$1","gXB",2,2,125,23,24,25],
 xO:function(a){var z,y
-z=this.YM
-if((z&4)!==0)return this.Kj
+z=this.b
+if((z&4)!==0)return this.f
 if(z>=4)throw H.b(this.Pq())
-this.YM=z|4
+this.b=z|4
 y=this.WH()
-this.PS()
+this.Dd()
 return y},
 Rg:function(a,b){this.MW(b)},
-MR:function(a,b){this.y7(a,b)},
-AN:function(){var z=this.Hz
-this.Hz=null
-this.YM&=4294967287
+UI:function(a,b){this.y7(a,b)},
+EC:function(){var z=this.e
+this.e=null
+this.b&=4294967287
 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"))
-y=this.iE
+C4:function(a){var z,y,x,w
+z=this.b
+if((z&2)!==0)throw H.b(P.s("Cannot fire new event. Controller is already firing an event"))
+y=this.c
 if(y===this)return
 x=z&1
-this.YM=z^3
+this.b=z^3
 for(;y!==this;)if(y.uO(x)){z=y.gru()
-if(typeof z!=="number")return z.k()
+if(typeof z!=="number")return z.j()
 y.sru(z|2)
 a.$1(y)
 y.fc()
 w=y.giE()
-if(y.gYS())this.pW(y)
+if(y.gKH())this.pW(y)
 z=y.gru()
 if(typeof z!=="number")return z.i()
 y.sru(z&4294967293)
 y=w}else y=y.giE()
-this.YM&=4294967293
-if(this.iE===this)this.hg()},
-hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
-P.ot(this.Ro)}},
+this.b&=4294967293
+if(this.c===this)this.hg()},
+hg:function(){if((this.b&4)!==0&&this.f.Q===0)this.f.Xf(null)
+P.ot(this.a)}},
 zW:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
-MW:function(a){var z=this.iE
+"^":"WVu;Q,a,b,c,d,e,f",
+MW:function(a){var z=this.c
 if(z===this)return
-if(z.giE()===this){this.YM|=2
-this.iE.Rg(0,a)
-this.YM&=4294967293
-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.OR(this,a,b))},
-PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
-else this.Kj.Xf(null)}},
+if(z.giE()===this){this.b|=2
+this.c.Rg(0,a)
+this.b&=4294967293
+if(this.c===this)this.hg()
+return}this.C4(new P.tK(this,a))},
+y7:function(a,b){if(this.c===this)return
+this.C4(new P.hi(this,a,b))},
+Dd:function(){if(this.c!==this)this.C4(new P.Bg(this))
+else this.f.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")}},
-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")}},
+"^":"r;Q,a",
+$1:function(a){a.Rg(0,this.a)},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.Q,"zW")}},
+hi:{
+"^":"r;Q,a,b",
+$1:function(a){a.UI(this.a,this.b)},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.Q,"zW")}},
 Bg:{
-"^":"TpZ;a",
-$1:function(a){a.AN()},
-$isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
+"^":"r;Q",
+$1:function(a){a.EC()},
+$signature:function(){return H.oZ(function(a){return{func:"Zj",args:[[P.JIw,a]]}},this.Q,"zW")}},
 DL:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Q,a,b,c,d,e,f",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
+for(z=this.c;z!==this;z=z.giE()){y=new P.LV(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))},
-PS:function(){var z=this.iE
+for(z=this.c;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
+Dd:function(){var z=this.c
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
-else this.Kj.Xf(null)}},
+else this.f.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
-"^":"TpZ:76;a,b",
+Sv:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y,x,w
-try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
+try{this.a.HH(this.Q.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-this.b.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(x,null)
+P.nD(this.a,z,y)}},"$0",null,0,0,null,"call"]},
 j7:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a,b",
 $2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=--z.c
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,126,127,"call"],
-$isEH:true},
-Tw:{
-"^":"TpZ:128;a,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=--z.c
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.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},
-A0:{
+z=this.Q
+y=z.a
+z.a=null
+x=--z.b
+if(y!=null)if(x===0||this.a)this.b.ZL(a,b)
+else{z.c=a
+z.d=b}else if(x===0&&!this.a)this.b.ZL(z.c,z.d)},"$2",null,4,0,null,126,127,"call"]},
+oV:{
+"^":"r:128;Q,a,b,c",
+$1:[function(a){var z,y,x
+z=this.Q
+y=--z.b
+x=z.a
+if(x!=null){z=this.c
+if(z<0||z>=x.length)return H.e(x,z)
+x[z]=a
+if(y===0)this.b.X2(x)}else if(y===0&&!this.a)this.b.ZL(z.c,z.d)},"$1",null,2,0,null,21,"call"]},
+A5:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Pf0:{
 "^":"a;",
-$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)},"dS","$1","$0","gv6",0,2,129,22,20],
 w0:[function(a,b){var z
-if(a==null)throw H.b(P.u("Error must not be null"))
-z=this.MM
-if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Nk(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,125,22,23,24]},
+a=a!=null?a:new P.LK()
+if(this.Q.Q!==0)throw H.b(P.s("Future already completed"))
+z=$.X3.WF(a,b)
+if(z!=null){a=J.w8(z)
+a=a!=null?a:new P.LK()
+b=z.gI4()}this.ZL(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,125,23,24,25],
+$isA5:true},
+Zf:{
+"^":"Pf0;Q",
+aM:[function(a,b){var z=this.Q
+if(z.Q!==0)throw H.b(P.s("Future already completed"))
+z.Xf(b)},function(a){return this.aM(a,null)},"dS","$1","$0","gv6",0,2,129,23,21],
+ZL:function(a,b){this.Q.Nk(a,b)}},
+Ia:{
+"^":"a;nV:Q@,yG:a>,b,FR:c>,d",
+Ki:function(a){return this.c.$0()},
+WF:function(a,b){return this.d.$2(a,b)},
+gt9:function(){return this.a.gt9()},
+gUF:function(){return(this.b&1)!==0},
+gLi:function(){return this.b===6},
+gyq:function(){return this.b===8},
+gdU:function(){return this.c},
+gTv:function(){return this.d},
+gp6:function(){return this.c},
+gco:function(){return this.c},
+static:{"^":"zX0,QZl,RVB,BGN,xB6,bXe,nG3,INV,vjM,bOD"}},
 Gc:{
-"^":"a;YM,t9<,O1,nV@,bH?,kO?,bv?,Nw?",
-gnr:function(){return this.YM>=4},
-ga5:function(){return this.YM===4},
-gAT:function(){return this.YM===8},
-sKl:function(a){if(a)this.YM=2
-else this.YM=0},
-gdU:function(){return this.YM===2?null:this.bH},
-gp6:function(){return this.YM===2?null:this.kO},
-gTv:function(){return this.YM===2?null:this.bv},
-gco:function(){return this.YM===2?null:this.Nw},
+"^":"a;Q,t9:a<,b",
+gAT:function(){return this.Q===8},
+sKl:function(a){if(a)this.Q=2
+else this.Q=0},
 Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
-this.xf(y)
-return y},
+z=H.J(new P.Gc(0,$.X3,null),[null])
+y=z.a
+if(y!==C.fQ){a=y.cR(a)
+if(b!=null)b=P.VH(b,y)}y=b==null?1:3
+this.xf(new P.Ia(null,z,y,a,b))
+return z},
 ml:function(a){return this.Rx(a,null)},
-pU:function(a,b){var z,y,x
-z=$.X3
-y=P.VH(a,z)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.cR(b),y,null),[null])
-this.xf(x)
-return x},
+pU:function(a,b){var z,y
+z=H.J(new P.Gc(0,$.X3,null),[null])
+y=z.a
+if(y!==C.fQ){a=P.VH(a,y)
+if(b!=null)b=y.cR(b)}y=b==null?2:6
+this.xf(new P.Ia(null,z,y,b,a))
+return z},
 OA:function(a){return this.pU(a,null)},
 wM:function(a){var z,y
 z=$.X3
-y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
+y=new P.Gc(0,z,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-this.xf(y)
+if(z!==C.fQ)a=z.Al(a)
+this.xf(new P.Ia(null,y,8,a,null))
 return y},
-gDL:function(){return this.O1},
-gSt:function(){return this.O1},
-vd:function(a){this.YM=4
-this.O1=a},
-Is:function(a,b){this.YM=8
-this.O1=new P.Ca(a,b)},
-xf:function(a){if(this.YM>=4)this.t9.wr(new P.pS(this,a))
-else{a.snV(this.O1)
-this.O1=a}},
+eY:function(){if(this.Q!==0)throw H.b(P.s("Future already completed"))
+this.Q=1},
+gDL:function(){return this.b},
+gSt:function(){return this.b},
+vd:function(a){this.Q=4
+this.b=a},
+P9:function(a){this.Q=8
+this.b=a},
+Is:function(a,b){this.P9(new P.OH(a,b))},
+xf:function(a){if(this.Q>=4)this.a.wr(new P.pS(this,a))
+else{a.Q=this.b
+this.b=a}},
 ah:function(){var z,y,x
-z=this.O1
-this.O1=null
+z=this.b
+this.b=null
 for(y=null;z!=null;y=z,z=x){x=z.gnV()
 z.snV(y)}return y},
-In:function(a){var z,y
-z=J.x(a)
+HH:function(a){var z,y
+z=J.t(a)
 if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.ah()
@@ -6260,960 +5714,917 @@
 this.vd(a)
 P.HZ(this,z)},
 ZL:[function(a,b){var z=this.ah()
-this.Is(a,b)
-P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,21,22,23,24],
+this.P9(new P.OH(a,b))
+P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,22,23,24,25],
 Xf:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.YM
-if(z>=4&&z===8){if(this.YM!==0)H.vh(P.w("Future already completed"))
-this.YM=1
-this.t9.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.YM!==0)H.vh(P.w("Future already completed"))
-this.YM=1
-this.t9.wr(new P.eX(this,a))},
-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))},
-X8:function(a,b,c){this.Nk(a,b)},
-J9:function(a,b){this.Xf(a)},
+if(a==null);else{z=J.t(a)
+if(!!z.$isb8){if(!!z.$isGc){z=a.Q
+if(z>=4&&z===8){this.eY()
+this.a.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}this.eY()
+this.a.wr(new P.eX(this,a))},
+Nk:function(a,b){this.eY()
+this.a.wr(new P.ZL(this,a,b))},
 $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},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)
-if(a.YM>=4)P.HZ(a,b)
-else a.xf(b)},yE:function(a,b){var z
-do{z=b.gnV()
-b.snV(null)
-P.HZ(a,b)
-if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
+static:{"^":"ewM,RyO,C3n,oN1,NKU",k3:function(a,b){b.sKl(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){var z
+b.sKl(!0)
+z=new P.Ia(null,b,0,null,null)
+if(a.Q>=4)P.HZ(a,z)
+else a.xf(z)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
-if(!y.gnr())return
-w=z.e.gAT()
-if(w&&b==null){v=z.e.gSt()
-z.e.gt9().hk(J.w8(v),v.gI4())
-return}if(b==null)return
-if(b.gnV()!=null){P.yE(z.e,b)
-return}x.b=!0
-u=z.e.ga5()?z.e.gDL():null
-x.c=u
+w=y.gAT()
+if(b==null){if(w){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())}return}for(;b.gnV()!=null;b=u){u=b.gnV()
+b.snV(null)
+P.HZ(z.e,b)}x.b=!0
+t=w?null:z.e.gDL()
+x.c=t
 x.d=!1
 y=!w
-if(!y||b.gdU()!=null||b.gco()!=null){t=b.gt9()
-if(w&&!z.e.gt9().fC(t)){v=z.e.gSt()
+if(!y||b.gUF()||b.gyq()){s=b.gt9()
+if(w&&!z.e.gt9().fC(s)){v=z.e.gSt()
 z.e.gt9().hk(J.w8(v),v.gI4())
-return}s=$.X3
-if(s==null?t!=null:s!==t)$.X3=t
-else s=null
-if(y){if(b.gdU()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gco()!=null)new P.RT(z,x,w,b,t).$0()
-if(s!=null)$.X3=s
-b.sbH(null)
-b.skO(null)
-b.sbv(null)
-b.sNw(null)
+return}r=$.X3
+if(r==null?s!=null:r!==s)$.X3=s
+else r=null
+if(y){if(b.gUF())x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
+if(b.gyq())new P.YP(z,x,w,b,s).$0()
+if(r!=null)$.X3=r
 if(x.d)return
 if(x.b===!0){y=x.c
-y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){r=x.c
-if(!!J.x(r).$isGc)if(r.YM>=4){b.sKl(!0)
-z.e=r
-y=r
-continue}else P.A9(r,b)
-else P.k3(r,b)
-return}}if(x.b===!0){q=b.ah()
-b.vd(x.c)}else{q=b.ah()
-v=x.c
-b.Is(J.w8(v),v.gI4())}z.e=b
-y=b
-b=q}}}},
+y=(t==null?y!=null:t!==y)&&!!J.t(y).$isb8}else y=!1
+if(y){q=x.c
+p=J.uW(b)
+if(!!J.t(q).$isGc)if(q.Q>=4){p.sKl(!0)
+z.e=q
+b=new P.Ia(null,p,0,null,null)
+y=q
+continue}else P.A9(q,p)
+else P.k3(q,p)
+return}}p=J.uW(b)
+b=p.ah()
+y=x.b
+x=x.c
+if(y===!0)p.vd(x)
+else p.P9(x)
+z.e=p
+y=p}}}},
 pS:{
-"^":"TpZ:76;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){P.HZ(this.Q,this.a)},"$0",null,0,0,null,"call"]},
 U7:{
-"^":"TpZ:12;a",
-$1:[function(a){this.a.X2(a)},"$1",null,2,0,null,20,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){this.Q.X2(a)},"$1",null,2,0,null,21,"call"]},
 VL:{
-"^":"TpZ:130;b",
-$2:[function(a,b){this.b.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
-$isEH:true},
+"^":"r:130;Q",
+$2:[function(a,b){this.Q.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"]},
 cX:{
-"^":"TpZ:76;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){P.A9(this.a,this.Q)},"$0",null,0,0,null,"call"]},
 eX:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.c.X2(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.Q.X2(this.a)},"$0",null,0,0,null,"call"]},
 ZL:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){this.Q.ZL(this.a,this.b)},"$0",null,0,0,null,"call"]},
 rq:{
-"^":"TpZ:131;b,d,e,f",
+"^":"r:131;Q,a,b,c",
 $0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gdU(),this.e)
+try{this.Q.c=this.c.FI(this.a.gdU(),this.b)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-this.b.c=new P.Ca(z,y)
-return!1}},
-$isEH:true},
+y=new H.XO(x,null)
+this.Q.c=new P.OH(z,y)
+return!1}}},
 RW:{
-"^":"TpZ:17;c,b,UI,bK",
+"^":"r:1;Q,a,b,c",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.c.e.gSt()
-r=this.UI
-y=r.gp6()
-x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+z=this.Q.e.gSt()
+y=!0
+r=this.b
+if(r.gLi()){x=r.gp6()
+try{y=this.c.FI(x,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.oP(q,null)
+v=new H.XO(q,null)
 r=J.w8(z)
 p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
+o=(r==null?p==null:r===p)?z:new P.OH(w,v)
+r=this.a
 r.c=o
 r.b=!1
-return}u=r.gTv()
-if(x===!0&&u!=null){try{r=u
+return}}u=r.gTv()
+if(y===!0&&u!=null){try{r=u
 p=H.G3()
 p=H.KT(p,[p,p]).Zg(r)
-n=this.bK
-m=this.b
+n=this.c
+m=this.a
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.oP(q,null)
+s=new H.XO(q,null)
 r=J.w8(z)
 p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
-r=this.b
+o=(r==null?p==null:r===p)?z:new P.OH(t,s)
+r=this.a
 r.c=o
 r.b=!1
-return}this.b.b=!0}else{r=this.b
+return}this.a.b=!0}else{r=this.a
 r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"TpZ:17;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
+r.b=!1}}},
+YP:{
+"^":"r:1;Q,a,b,c,d",
+$0:function(){var z,y,x,w,v,u,t
 z={}
 z.a=null
-try{z.a=this.w3.Gr(this.Rm.gco())}catch(w){v=H.Ru(w)
-y=v
-x=new H.oP(w,null)
-if(this.Gq){v=J.w8(this.c.e.gSt())
-u=y
-u=v==null?u==null:v===u
-v=u}else v=!1
-u=this.b
-if(v)u.c=this.c.e.gSt()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.sKl(!0)
-this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.ez(z,v))}},
-$isEH:true},
+try{w=this.d.Gr(this.c.gco())
+z.a=w
+v=w}catch(u){z=H.Ru(u)
+y=z
+x=new H.XO(u,null)
+if(this.b){z=J.w8(this.Q.e.gSt())
+v=y
+v=z==null?v==null:z===v
+z=v}else z=!1
+v=this.a
+if(z)v.c=this.Q.e.gSt()
+else v.c=new P.OH(y,x)
+v.b=!1
+return}if(!!J.t(v).$isb8){t=J.uW(this.c)
+t.sKl(!0)
+this.a.d=!0
+z.a.Rx(new P.jZ(this.Q,t),new P.ez(z,t))}}},
 jZ:{
-"^":"TpZ:12;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,132,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){P.HZ(this.Q.e,new P.Ia(null,this.a,0,null,null))},"$1",null,2,0,null,132,"call"]},
 ez:{
-"^":"TpZ:130;a,mG",
+"^":"r:130;Q,a",
 $2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){y=P.Dt(null)
+z=this.Q
+if(!J.t(z.a).$isGc){y=H.J(new P.Gc(0,$.X3,null),[null])
 z.a=y
-y.Is(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
-$isEH:true},
+y.Is(a,b)}P.HZ(z.a,new P.Ia(null,this.a,0,null,null))},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"]},
 OM:{
-"^":"a;FR>,aw@",
-Ki:function(a){return this.FR.$0()}},
-wS:{
+"^":"a;FR:Q>,aw:a@",
+Ki:function(a){return this.Q.$0()}},
+cb:{
 "^":"a;",
-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],
+ev:function(a,b){return H.J(new P.fk(b,this),[H.W8(this,"cb",0)])},
+ez:[function(a,b){return H.J(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],
+Ft:[function(a,b){return H.J(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
 zV:function(a,b){var z,y,x
 z={}
-y=P.Dt(P.qU)
+y=H.J(new P.Gc(0,$.X3,null),[P.I])
 x=P.p9("")
 z.a=null
 z.b=!0
-z.a=this.KR(new P.dW3(z,this,b,y,x),!0,new P.Lp0(y,x),new P.QCh(y))
+z.a=this.X5(new P.QC(z,this,b,y,x),!0,new P.Rv(y,x),new P.Xr(y))
 return y},
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
+z.a=this.X5(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
-y=P.Dt(null)
+y=H.J(new P.Gc(0,$.X3,null),[null])
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
+z.a=this.X5(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
+z.a=this.X5(new P.BSd(z,this,b,y),!0,new P.dyj(y),y.gFa())
 return y},
-gB:function(a){var z,y
+gv:function(a){var z,y
 z={}
-y=P.Dt(P.KN)
+y=H.J(new P.Gc(0,$.X3,null),[P.KN])
 z.a=0
-this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
+this.X5(new P.B5(z),!0,new P.PI(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Da(y),y.gFa())
+z.a=this.X5(new P.qg(z,y),!0,new P.Da(y),y.gFa())
 return y},
 br:function(a){var z,y
-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())
+z=H.J([],[H.W8(this,"cb",0)])
+y=H.J(new P.Gc(0,$.X3,null),[[P.WO,H.W8(this,"cb",0)]])
+this.X5(new P.lv(this,z),!0,new P.VVy(z,y),y.gFa())
 return y},
-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())
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(this,"cb",0))
+y=H.J(new P.Gc(0,$.X3,null),[[P.Ol,H.W8(this,"cb",0)]])
+this.X5(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.mh(this,b,null)
+eR:function(a,b){var z=H.J(new P.pt(b,this),[null])
+z.qI(this,b,null)
 return z},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=H.J(new P.Gc(0,$.X3,null),[H.W8(this,"cb",0)])
 z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
+z.a=this.X5(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,"wS",0))
+y=H.J(new P.Gc(0,$.X3,null),[H.W8(this,"cb",0)])
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
+this.X5(new P.UH(z,this),!0,new P.V9(z,y),y.gFa())
 return y},
-$iswS:true},
-dW3:{
-"^":"TpZ;a,b,c,d,e",
-$1:[function(a){var z,y,x,w,v
-x=this.a
-if(!x.b)this.e.KF(this.c)
+$iscb:true},
+QC:{
+"^":"r;Q,a,b,c,d",
+$1:[function(a){var z,y,x,w,v,u,t,s
+x=this.Q
+if(!x.b)this.d.KF(this.b)
 x.b=!1
-try{this.e.KF(a)}catch(w){v=H.Ru(w)
+try{this.d.KF(a)}catch(w){v=H.Ru(w)
 z=v
-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,"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(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(w,null)
+x=x.a
+u=z
+t=y
+s=$.X3.WF(u,t)
+if(s!=null){u=J.w8(s)
+u=u!=null?u:new P.LK()
+t=s.gI4()}P.NX(x,this.c,u,t)}},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Xr:{
+"^":"r:14;Q",
+$1:[function(a){this.Q.yk(a)},"$1",null,2,0,null,4,"call"]},
+Rv:{
+"^":"r:77;Q,a",
+$0:[function(){var z=this.a.Q
+this.Q.HH(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"]},
 Sd:{
-"^":"TpZ;a,b,c,d",
+"^":"r;Q,a,b,c",
 $1:[function(a){var z,y
-z=this.a
-y=this.d
-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,"wS")}},
-LB:{
-"^":"TpZ:76;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-z2:{
-"^":"TpZ:135;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-DO:{
-"^":"TpZ:76;bK",
-$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
+z=this.Q
+y=this.c
+P.FE(new P.jv(this.b,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+jv:{
+"^":"r:77;Q,a",
+$0:function(){return J.mG(this.a,this.Q)}},
+bi:{
+"^":"r:135;Q,a",
+$1:function(a){if(a===!0)P.Bb(this.Q.a,this.a,!0)}},
+tG:{
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!1)},"$0",null,0,0,null,"call"]},
 lz:{
-"^":"TpZ;a,b,c,d",
-$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,"wS")}},
-Rl:{
-"^":"TpZ:76;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
+"^":"r;Q,a,b,c",
+$1:[function(a){P.FE(new P.Jb(this.b,a),new P.at(),P.TB(this.Q.a,this.c))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Jb:{
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
 at:{
-"^":"TpZ:12;",
-$1:function(a){},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){}},
 M4:{
-"^":"TpZ:76;UI",
-$0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ee:{
-"^":"TpZ;a,b,c,d",
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(null)},"$0",null,0,0,null,"call"]},
+BSd:{
+"^":"r;Q,a,b,c",
 $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,"wS")}},
-WN:{
-"^":"TpZ:76;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
+z=this.Q
+y=this.c
+P.FE(new P.XPB(this.b,a),new P.h7d(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 XPB:{
-"^":"TpZ:135;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-Ia:{
-"^":"TpZ:76;bK",
-$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
+h7d:{
+"^":"r:135;Q,a",
+$1:function(a){if(a===!0)P.Bb(this.Q.a,this.a,!0)}},
+dyj:{
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!1)},"$0",null,0,0,null,"call"]},
+B5:{
+"^":"r:14;Q",
+$1:[function(a){++this.Q.a},"$1",null,2,0,null,15,"call"]},
 PI:{
-"^":"TpZ:12;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-hh:{
-"^":"TpZ:76;a,b",
-$0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q.a)},"$0",null,0,0,null,"call"]},
 qg:{
-"^":"TpZ:12;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){P.Bb(this.Q.a,this.a,!1)},"$1",null,2,0,null,15,"call"]},
 Da:{
-"^":"TpZ:76;c",
-$0:[function(){this.c.In(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!0)},"$0",null,0,0,null,"call"]},
 lv:{
-"^":"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,"wS")}},
-Ul:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r;Q,a",
+$1:[function(a){this.a.push(a)},"$1",null,2,0,null,124,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.Q,"cb")}},
+VVy:{
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q)},"$0",null,0,0,null,"call"]},
 oY:{
-"^":"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,"wS")}},
+"^":"r;Q,a",
+$1:[function(a){this.a.h(0,a)},"$1",null,2,0,null,124,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.Q,"cb")}},
 yZ:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q)},"$0",null,0,0,null,"call"]},
 lU:{
-"^":"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,"wS")}},
+"^":"r;Q,a,b",
+$1:[function(a){P.Bb(this.Q.a,this.b,a)},"$1",null,2,0,null,21,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 xp:{
-"^":"TpZ:76;d",
+"^":"r:77;Q",
 $0:[function(){var z,y,x,w
 try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-this.d.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(w,null)
+P.nD(this.Q,z,y)}},"$0",null,0,0,null,"call"]},
 UH:{
-"^":"TpZ;a,b",
-$1:[function(a){var z=this.a
+"^":"r;Q,a",
+$1:[function(a){var z=this.Q
 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,"wS")}},
-eI:{
-"^":"TpZ:76;a,c",
+z.a=a},"$1",null,2,0,null,21,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+V9:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y,x,w
-x=this.a
-if(x.b){this.c.In(x.a)
+x=this.Q
+if(x.b){this.a.HH(x.a)
 return}try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-this.c.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-MO:{
+y=new H.XO(w,null)
+P.nD(this.a,z,y)}},"$0",null,0,0,null,"call"]},
+yX:{
 "^":"a;",
-$isMO:true},
+$isyX:true},
 u2:{
 "^":"ezY;",
-k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
-giO:function(a){return(H.wP(this.BT)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
+w3:function(a,b,c,d){return this.Q.MI(a,b,c,d)},
+giO:function(a){return(H.eQ(this.Q)^892482866)>>>0},
+m:function(a,b){if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isu2)return!1
-return b.BT===this.BT},
+if(!J.t(b).$isu2)return!1
+return b.Q===this.Q},
 $isu2:true},
-Bx:{
-"^":"KA;BT<",
-cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Pl(this)},"$0","gxl",0,0,17]},
+yU4:{
+"^":"KA;z3:r<",
+cZ:function(){return this.gz3().rR(this)},
+lT:[function(){this.gz3().EB(this)},"$0","gb9",0,0,1],
+ie:[function(){this.gz3().ho(this)},"$0","gxl",0,0,1]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
+"^":"a;Q,Tv:a<,b,t9:c<,d,e,f",
 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
+this.a=P.VH(b,this.c)},
+Fv:[function(a,b){var z=this.d
 if((z&8)!==0)return
-this.YM=(z+128|4)>>>0
-if(b!=null)b.wM(this.gDQ(this))
-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
+this.d=(z+128|4)>>>0
+if(b!=null)b.wM(this.gbY(this))
+if(z<128&&this.f!=null)this.f.IO()
+if((z&4)===0&&(this.d&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+QE:[function(a){var z=this.d
 if((z&8)!==0)return
 if(z>=128){z-=128
-this.YM=z
-if(z<128){if((z&64)!==0){z=this.fk
+this.d=z
+if(z<128){if((z&64)!==0){z=this.f
 z=!z.gl0(z)}else z=!1
-if(z)this.fk.t2(this)
-else{z=(this.YM&4294967291)>>>0
-this.YM=z
-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
+if(z)this.f.t2(this)
+else{z=(this.d&4294967291)>>>0
+this.d=z
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gbY",0,0,1],
+Gv:function(){var z=(this.d&4294967279)>>>0
+this.d=z
+if((z&8)!==0)return this.e
 this.WN()
-return this.Qe},
-gUF:function(){return this.YM>=128},
-WN:function(){var z=(this.YM|8)>>>0
-this.YM=z
-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
+return this.e},
+gRW:function(){return this.d>=128},
+WN:function(){var z=(this.d|8)>>>0
+this.d=z
+if((z&64)!==0)this.f.IO()
+if((this.d&32)===0)this.f=null
+this.e=this.cZ()},
+Rg:["l5",function(a,b){var z=this.d
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.fZ(b,null),[null]))},
-MR:function(a,b){var z=this.YM
+else this.C2(H.J(new P.LV(b,null),[null]))}],
+UI:["VG",function(a,b){var z=this.d
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
-else this.C2(new P.Dn(a,b,null))},
-AN:function(){var z=this.YM
+else this.C2(new P.Dn(a,b,null))}],
+EC:function(){var z=this.d
 if((z&8)!==0)return
 z=(z|2)>>>0
-this.YM=z
-if(z<32)this.PS()
+this.d=z
+if(z<32)this.Dd()
 else this.C2(C.ZB)},
-jy:[function(){},"$0","gb9",0,0,17],
-ie:[function(){},"$0","gxl",0,0,17],
+lT:[function(){},"$0","gb9",0,0,1],
+ie:[function(){},"$0","gxl",0,0,1],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.fk
+z=this.f
 if(z==null){z=new P.Qk(null,null,0)
-this.fk=z}z.h(0,a)
-y=this.YM
+this.f=z}z.h(0,a)
+y=this.d
 if((y&64)===0){y=(y|64)>>>0
-this.YM=y
-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.d=y
+if(y<128)this.f.t2(this)}},
+MW:function(a){var z=this.d
+this.d=(z|32)>>>0
+this.c.m1(this.Q,a)
+this.d=(this.d&4294967263)>>>0
 this.Iy((z&4)!==0)},
 y7:function(a,b){var z,y
-z=this.YM
-y=new P.Vo(this,a,b)
-if((z&1)!==0){this.YM=(z|16)>>>0
+z=this.d
+y=new P.x1(this,a,b)
+if((z&1)!==0){this.d=(z|16)>>>0
 this.WN()
-z=this.Qe
-if(!!J.x(z).$isb8)z.wM(y)
+z=this.e
+if(!!J.t(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
 this.Iy((z&4)!==0)}},
-PS:function(){var z,y
+Dd: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)
+this.d=(this.d|16)>>>0
+y=this.e
+if(!!J.t(y).$isb8)y.wM(z)
 else z.$0()},
-Ge:function(a){var z=this.YM
-this.YM=(z|32)>>>0
+Ge:function(a){var z=this.d
+this.d=(z|32)>>>0
 a.$0()
-this.YM=(this.YM&4294967263)>>>0
+this.d=(this.d&4294967263)>>>0
 this.Iy((z&4)!==0)},
 Iy:function(a){var z,y
-if((this.YM&64)!==0){z=this.fk
+if((this.d&64)!==0){z=this.f
 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.fk
+if(z){z=(this.d&4294967231)>>>0
+this.d=z
+if((z&4)!==0)if(z<128){z=this.f
 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.fk=null
+if(z)this.d=(this.d&4294967291)>>>0}for(;!0;a=y){z=this.d
+if((z&8)!==0){this.f=null
 return}y=(z&4)!==0
 if(a===y)break
-this.YM=(z^32)>>>0
-if(y)this.jy()
+this.d=(z^32)>>>0
+if(y)this.lT()
 else this.ie()
-this.YM=(this.YM&4294967263)>>>0}z=this.YM
-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.d=(this.d&4294967263)>>>0}z=this.d
+if((z&64)!==0&&z<128)this.f.t2(this)},
+Cy:function(a,b,c,d,e){var z=this.c
+this.Q=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.v3():c)},
-$isMO:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
+this.b=z.Al(c==null?P.No():c)},
+$isyX:true,
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6: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])
+y=H.J(new P.KA(null,null,null,z,y,null,null),[e])
 y.Cy(a,b,c,d,e)
 return y}}},
-Vo:{
-"^":"TpZ:17;a,b,c",
+x1:{
+"^":"r:1;Q,a,b",
 $0:[function(){var z,y,x,w,v,u
-z=this.a
-y=z.YM
+z=this.Q
+y=z.d
 if((y&8)!==0&&(y&16)===0)return
-z.YM=(y|32)>>>0
-y=z.Tv
+z.d=(y|32)>>>0
+y=z.a
 x=H.G3()
 x=H.KT(x,[x,x]).Zg(y)
-w=z.t9
-v=this.b
-u=z.Tv
-if(x)w.z8(u,v,this.c)
+w=z.c
+v=this.a
+u=z.a
+if(x)w.z8(u,v,this.b)
 else w.m1(u,v)
-z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.d=(z.d&4294967263)>>>0},"$0",null,0,0,null,"call"]},
 qB:{
-"^":"TpZ:17;a",
+"^":"r:1;Q",
 $0:[function(){var z,y
-z=this.a
-y=z.YM
+z=this.Q
+y=z.d
 if((y&16)===0)return
-z.YM=(y|42)>>>0
-z.t9.ww(z.EU)
-z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.d=(y|42)>>>0
+z.c.bH(z.b)
+z.d=(z.d&4294967263)>>>0},"$0",null,0,0,null,"call"]},
 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.MG(a,b,c,d,H.u3(this,0))}},
+"^":"cb;",
+X5:function(a,b,c,d){return this.w3(a,d,c,!0===b)},
+yI:function(a){return this.X5(a,null,null,null)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+w3:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 fIm:{
-"^":"a;aw@"},
-fZ:{
-"^":"fIm;P>,aw",
-dP:function(a){a.MW(this.P)}},
+"^":"a;aw:Q@"},
+LV:{
+"^":"fIm;M:a>,Q",
+dP:function(a){a.MW(this.a)}},
 Dn:{
-"^":"fIm;kc>,I4<,aw",
-dP:function(a){a.y7(this.kc,this.I4)}},
+"^":"fIm;kc:a>,I4:b<,Q",
+dP:function(a){a.y7(this.a,this.b)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.PS()},
+dP:function(a){a.Dd()},
 gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
+saw:function(a){throw H.b(P.s("No events after a done."))}},
 B3P:{
 "^":"a;",
-t2:function(a){var z=this.YM
+t2:function(a){var z=this.Q
 if(z===1)return
-if(z>=1){this.YM=1
-return}P.rb(new P.CR(this,a))
-this.YM=1},
-IO:function(){if(this.YM===1)this.YM=3}},
-CR:{
-"^":"TpZ:76;a,b",
+if(z>=1){this.Q=1
+return}P.rb(new P.lg(this,a))
+this.Q=1},
+IO:function(){if(this.Q===1)this.Q=3}},
+lg:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y
-z=this.a
-y=z.YM
-z.YM=0
+z=this.Q
+y=z.Q
+z.Q=0
 if(y===3)return
-z.vG(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.vG(this.a)},"$0",null,0,0,null,"call"]},
 Qk:{
-"^":"B3P;zR,N6,YM",
-gl0:function(a){return this.N6==null},
-h:function(a,b){var z=this.N6
-if(z==null){this.N6=b
-this.zR=b}else{z.saw(b)
-this.N6=b}},
+"^":"B3P;a,b,Q",
+gl0:function(a){return this.b==null},
+h:function(a,b){var z=this.b
+if(z==null){this.b=b
+this.a=b}else{z.saw(b)
+this.b=b}},
 vG:function(a){var z,y
-z=this.zR
+z=this.a
 y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
+this.a=y
+if(y==null)this.b=null
 z.dP(a)},
-V1:function(a){if(this.YM===1)this.YM=3
-this.N6=null
-this.zR=null}},
+V1:function(a){if(this.Q===1)this.Q=3
+this.b=null
+this.a=null}},
 to:{
-"^":"a;t9<,YM,EU",
-gUF:function(){return this.YM>=4},
-q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gKS())
-this.YM=(this.YM|2)>>>0},
+"^":"a;t9:Q<,a,b",
+gRW:function(){return this.a>=4},
+q1:function(){if((this.a&2)!==0)return
+this.Q.wr(this.gLu())
+this.a=(this.a|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)},"WJ","$1","$0","gX0",0,2,136,22,137],
-QE:[function(a){var z=this.YM
+Fv:[function(a,b){this.a+=4
+if(b!=null)b.wM(this.gbY(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+QE:[function(a){var z=this.a
 if(z>=4){z-=4
-this.YM=z
-if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
+this.a=z
+if(z<4&&(z&1)===0)this.q1()}},"$0","gbY",0,0,1],
 Gv:function(){return},
-PS:[function(){var z=(this.YM&4294967293)>>>0
-this.YM=z
+Dd:[function(){var z=(this.a&4294967293)>>>0
+this.a=z
 if(z>=4)return
-this.YM=(z|1)>>>0
-z=this.EU
-if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
-$isMO:true,
+this.a=(z|1)>>>0
+this.Q.bH(this.b)},"$0","gLu",0,0,1],
+$isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 ap:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return this.Q.ZL(this.a,this.b)},"$0",null,0,0,null,"call"]},
 uR:{
-"^":"TpZ:138;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-QX:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w
+"^":"r:138;Q,a",
+$2:function(a,b){return P.NX(this.Q,this.a,a,b)}},
+Ry:{
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.HH(this.a)},"$0",null,0,0,null,"call"]},
+YR:{
+"^":"cb;",
+X5:function(a,b,c,d){var z,y,x,w
 b=!0===b
-z=H.W8(this,"og",0)
-y=H.W8(this,"og",1)
+z=H.W8(this,"YR",0)
+y=H.W8(this,"YR",1)
 x=$.X3
 w=b?1:0
-w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w=H.J(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
 w.Cy(a,d,c,b,y)
 w.JC(this,a,d,c,b,z,y)
 return w},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$aswS:function(a,b){return[b]}},
+$ascb:function(a,b){return[b]}},
 fB:{
-"^":"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
+"^":"KA;r,x,Q,a,b,c,d,e,f",
+Rg:function(a,b){if((this.d&2)!==0)return
+this.l5(this,b)},
+UI:function(a,b){if((this.d&2)!==0)return
+this.VG(a,b)},
+lT:[function(){var z=this.x
 if(z==null)return
-z.WJ(0)},"$0","gb9",0,0,17],
-ie:[function(){var z=this.lI
+z.yy(0)},"$0","gb9",0,0,1],
+ie:[function(){var z=this.x
 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.QE(0)},"$0","gxl",0,0,1],
+cZ:function(){var z=this.x
+if(z!=null){this.x=null
 z.Gv()}return},
-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],
+yi:[function(a){this.r.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},124],
+SW:[function(a,b){this.UI(a,b)},"$2","gPr",4,0,139,24,25],
+oZ:[function(){this.EC()},"$0","gos",0,0,1],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.m7.Sb.zC(z,this.gos(),y)},
+this.x=this.r.Q.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
-$asMO:function(a,b){return[b]}},
+$asyX:function(a,b){return[b]}},
 fk:{
-"^":"og;VL,Sb",
-Ub:function(a){return this.VL.$1(a)},
+"^":"YR;a,Q",
+Ub:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Ub(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.MR(y,x)
-return}if(z===!0)J.wx(b,a)},
-$asog:function(a){return[a,a]},
-$aswS:null},
+x=new H.XO(w,null)
+P.iw(b,y,x)
+return}if(z===!0)J.aO(b,a)},
+$asYR:function(a){return[a,a]},
+$ascb:null},
 c9:{
-"^":"og;xj,Sb",
-Eh:function(a){return this.xj.$1(a)},
+"^":"YR;a,Q",
+Eh:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Eh(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.MR(y,x)
-return}J.wx(b,z)}},
-AE:{
-"^":"og;yj,Sb",
-bZ:function(a){return this.yj.$1(a)},
+x=new H.XO(w,null)
+P.iw(b,y,x)
+return}J.aO(b,z)}},
+Bgk:{
+"^":"YR;a,Q",
+bZ:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
-J.wx(b,z)}}catch(v){w=H.Ru(v)
+try{for(w=J.Nx(this.bZ(a));w.D();){z=w.gk()
+J.aO(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-b.MR(y,x)}}},
+x=new H.XO(v,null)
+P.iw(b,y,x)}}},
 pt:{
-"^":"og;Km,Sb",
-FC:function(a,b){var z=this.Km
-if(z>0){this.Km=z-1
+"^":"YR;a,Q",
+FC:function(a,b){var z=this.a
+if(z>0){this.a=z-1
 return}b.Rg(0,a)},
-mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
-$asog:function(a){return[a,a]},
-$aswS:null},
-dX:{
+qI:function(a,b,c){if(b<0)throw H.b(P.p(b))},
+$asYR:function(a){return[a,a]},
+$ascb:null},
+kWp:{
 "^":"a;"},
-Uf:{
-"^":"a;M5,ig>"},
+OH:{
+"^":"a;kc:Q>,I4:a<",
+X:[function(a){return J.Lz(this.Q)},"$0","gCR",0,0,0],
+$isXS:true},
+Ls:{
+"^":"a;Q,ig:a>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,Jl,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)},
-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.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)},
-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)},
+"^":"a;Q,a,b,c,d,e,f,r,x,y,z,ch,cx",
+hk:function(a,b){return this.Q.$2(a,b)},
+Gr:function(a){return this.a.$1(a)},
+FI:function(a,b){return this.b.$2(a,b)},
+mg:function(a,b,c){return this.c.$3(a,b,c)},
+Al:function(a){return this.d.$1(a)},
+cR:function(a){return this.e.$1(a)},
+O8:function(a){return this.f.$1(a)},
+WF:function(a,b){return this.r.$2(a,b)},
+wr:function(a){return this.x.$1(a)},
+RK:function(a,b){return this.x.$2(a,b)},
+uN:function(a,b){return this.y.$2(a,b)},
+lB:function(a,b){return this.z.$2(a,b)},
+Ch:function(a,b){return this.ch.$1(b)},
+iT:function(a){return this.cx.$1$specification(a)},
 $isyQ:true},
 e4y:{
 "^":"a;"},
 JBS:{
 "^":"a;"},
 Id:{
-"^":"a;bk",
+"^":"a;Q",
 RK:function(a,b){var z,y
-z=this.bk.gOf()
-y=z.M5
-z.ig.$4(y,P.Cw(y),a,b)}},
+z=this.Q.gOf()
+y=z.Q
+z.a.$4(y,P.HM(y),a,b)}},
 m0:{
 "^":"a;",
-fC:function(a){return this.gF7()===a.gF7()},
+fC:function(a){return this===a||this.gF7()===a.gF7()},
 $ism0:true},
 l7:{
-"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
-gyL:function(){var z=this.ye
+"^":"m0;OS:Q<,W7:a<,HG:b<,O5:c<,FH:d<,c5:e<,a0:f<,Of:r<,jL:x<,Jy:y<,kP:z<,Gt:ch<,pB:cx<,cy,eT:db>,oe:dx<",
+gyL:function(){var z=this.cy
 if(z!=null)return z
 z=new P.Id(this)
-this.ye=z
+this.cy=z
 return z},
-gF7:function(){return this.pB.M5},
-ww:function(a){var z,y,x,w
+gF7:function(){return this.cx.Q},
+bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
 if(b)return new P.OJ(this,z)
 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.eP(this,z)
-else return new P.aQ(this,z)},
-mS:function(a){return this.rO(a,!0)},
+oj:function(a,b){var z=this.cR(a)
+if(b)return new P.CN(this,z)
+else return new P.eP(this,z)},
+mS:function(a){return this.oj(a,!0)},
 PT:function(a,b){var z=this.O8(a)
-if(b)return new P.N9(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)
+if(b)return new P.bY(this,z)
+else return new P.N9(this,z)},
+p:function(a,b){var z,y,x,w
+z=this.dx
+y=z.p(0,b)
 if(y!=null||z.NZ(0,b))return y
-x=this.eT
-if(x!=null){w=J.UQ(x,b)
-if(w!=null)z.u(0,b,w)
+x=this.db
+if(x!=null){w=J.Tf(x,b)
+if(w!=null)z.q(0,b,w)
 return w}return},
 hk:function(a,b){var z,y,x
-z=this.pB
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
-c6:function(a,b){var z,y,x
-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)},
+z=this.cx
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+M2:function(a,b){var z,y,x
+z=this.ch
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+iT:function(a){return this.M2(a,null)},
 Gr:function(a){var z,y,x
-z=this.vr
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.a
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 FI:function(a,b){var z,y,x
-z=this.JY
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
+z=this.Q
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 mg:function(a,b,c){var z,y,x
-z=this.HG
-y=z.M5
-x=P.Cw(y)
-return z.ig.$6(y,x,this,a,b,c)},
+z=this.b
+y=z.Q
+x=P.HM(y)
+return z.a.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.Tr
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.c
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 cR:function(a){var z,y,x
-z=this.kX
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.d
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 O8:function(a){var z,y,x
-z=this.c5
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.e
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
+WF:function(a,b){var z,y,x
+z=this.f
+y=z.Q
+if(y===C.fQ)return
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 wr:function(a){var z,y,x
-z=this.Of
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.r
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 uN:function(a,b){var z,y,x
-z=this.x6
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
-Ud:function(a,b){var z,y,x
-z=this.Jy
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
+z=this.x
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+lB:function(a,b){var z,y,x
+z=this.y
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 Ch:function(a,b){var z,y,x
-z=this.kP
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,b)},
-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.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
-z=b.Xp
-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.uI=this.eT.guI()
-this.pB=this.eT.gpB()}},
+z=this.z
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,b)},
+Ij:function(a,b,c){var z
+this.a=this.db.gW7()
+this.Q=this.db.gOS()
+this.b=this.db.gHG()
+z=b.d
+this.c=z!=null?new P.Ls(this,z):this.db.gO5()
+z=b.e
+this.d=z!=null?new P.Ls(this,z):this.db.gFH()
+this.e=this.db.gc5()
+this.f=this.db.ga0()
+this.r=this.db.gOf()
+this.x=this.db.gjL()
+this.y=this.db.gJy()
+this.z=this.db.gkP()
+this.ch=this.db.gGt()
+this.cx=this.db.gpB()}},
 OJ:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.bH(this.a)},"$0",null,0,0,null,"call"]},
 Yn:{
-"^":"TpZ:76;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Gr(this.a)},"$0",null,0,0,null,"call"]},
+CN:{
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.m1(this.a,a)},"$1",null,2,0,null,33,"call"]},
 eP:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
-aQ:{
-"^":"TpZ:12;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.FI(this.a,a)},"$1",null,2,0,null,33,"call"]},
+bY:{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.z8(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 N9:{
-"^":"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},
-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},
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.mg(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 FO:{
-"^":"TpZ:76;a,b",
-$0:[function(){throw H.b(P.Uz(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){throw H.b(P.Uz(this.Q,this.a))},"$0",null,0,0,null,"call"]},
 R81:{
 "^":"m0;",
-gvr:function(){return C.lk},
-gJY:function(){return C.Yl},
-gHG:function(){return C.zf},
-gTr:function(){return C.pj},
-gkX:function(){return C.F6},
+gW7:function(){return C.Fj},
+gOS:function(){return C.Yl},
+gHG:function(){return C.Gu},
+gO5:function(){return C.pj},
+gFH:function(){return C.pm},
 gc5:function(){return C.Xk},
+ga0:function(){return C.QE},
 gOf:function(){return C.Zc},
-gx6:function(){return C.Sq},
-gJy:function(){return C.NA},
+gjL:function(){return C.Sq},
+gJy:function(){return C.rj},
 gkP:function(){return C.uo},
-guI:function(){return C.mc},
-gpB:function(){return C.Rt},
+gGt:function(){return C.mc},
+gpB:function(){return C.TP},
 geT:function(a){return},
-gSe:function(){return $.OL()},
+goe:function(){return $.wb()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
 $.Cb=z
 return z},
 gF7:function(){return this},
-ww:function(a){var z,y,x,w
+bH:function(a){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$0()
-return x}x=P.Ki(null,null,this,a)
+return x}x=P.T8(null,null,this,a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 m1:function(a,b){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$1(b)
 return x}x=P.vf(null,null,this,a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$2(b,c)
 return x}x=P.Mu(null,null,this,a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 xi:function(a,b){if(b)return new P.hj(this,a)
 else return new P.MK(this,a)},
 ce:function(a){return this.xi(a,!0)},
-rO:function(a,b){if(b)return new P.pQ(this,a)
+oj: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.Ze(this,a)
-else return new P.dM(this,a)},
-t:function(a,b){return},
+mS:function(a){return this.oj(a,!0)},
+PT:function(a,b){if(b)return new P.SJ(this,a)
+else return new P.Ze(this,a)},
+p:function(a,b){return},
 hk:function(a,b){return P.CK(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)},
+M2:function(a,b){return P.qc(null,null,this,a,b)},
+iT:function(a){return this.M2(a,null)},
 Gr:function(a){if($.X3===C.fQ)return a.$0()
-return P.Ki(null,null,this,a)},
+return P.T8(null,null,this,a)},
 FI:function(a,b){if($.X3===C.fQ)return a.$1(b)
 return P.vf(null,null,this,a,b)},
 mg:function(a,b,c){if($.X3===C.fQ)return a.$2(b,c)
@@ -7221,48 +6632,43 @@
 Al:function(a){return a},
 cR:function(a){return a},
 O8:function(a){return a},
+WF:function(a,b){return},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-Ud:function(a,b){return P.dp(a,b)},
+lB:function(a,b){return P.dp(a,b)},
 Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.bH(this.a)},"$0",null,0,0,null,"call"]},
 MK:{
-"^":"TpZ:76;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Gr(this.a)},"$0",null,0,0,null,"call"]},
 pQ:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.m1(this.a,a)},"$1",null,2,0,null,33,"call"]},
 Ky:{
-"^":"TpZ:12;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.FI(this.a,a)},"$1",null,2,0,null,33,"call"]},
+SJ:{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.z8(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 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},
-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,{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.mg(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]}}],["","",,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])},
-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],
+B:function(a,b,c){return H.dJ(a,H.J(new P.YB(0,null,null,null,null,null,0),[b,c]))},
+A:function(a,b){return H.J(new P.YB(0,null,null,null,null,null,0),[a,b])},
+Ou4:[function(a,b){return J.mG(a,b)},"$2","bUo",4,0,50],
+T9:[function(a){return J.v1(a)},"$1","rm",2,0,51,52],
 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.jg(0,null,null,null,null),[d])},
+return z}b=P.rm()
+return P.c7(a,b,c,d,e)},
+Ca:function(a,b,c,d){return H.J(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"(...)"
+if(P.jO(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
 y=$.Ex()
 y.push(a)
@@ -7270,37 +6676,39 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.IN},
+y=y.Q
+return y.charCodeAt(0)==0?y:y},
 WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
+if(P.jO(a))return b+"..."+c
 z=P.p9(b)
 y=$.Ex()
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-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},
+y=z.gIN()
+return y.charCodeAt(0)==0?y:y},
+jO:function(a){var z,y
+for(z=0;y=$.Ex(),z<y.length;++z){y=y[z]
+if(a==null?y==null:a===y)return!0}return!1},
 T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
+z=a.gu(a)
 y=0
 x=0
 while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
+if(!z.D())return
+w=H.d(z.gk())
 b.push(w)
-y+=w.length+2;++x}if(!z.G()){if(x<=5)return
+y+=w.length+2;++x}if(!z.D()){if(x<=5)return
 if(0>=b.length)return H.e(b,0)
 v=b.pop()
 if(0>=b.length)return H.e(b,0)
-u=b.pop()}else{t=z.gl();++x
-if(!z.G()){if(x<=4){b.push(H.d(t))
+u=b.pop()}else{t=z.gk();++x
+if(!z.D()){if(x<=4){b.push(H.d(t))
 return}v=H.d(t)
 if(0>=b.length)return H.e(b,0)
 u=b.pop()
-y+=v.length+2}else{s=z.gl();++x
-for(;z.G();t=s,s=r){r=z.gl();++x
+y+=v.length+2}else{s=z.gk();++x
+for(;z.D();t=s,s=r){r=z.gk();++x
 if(x>100){while(!0){if(!(y>75&&x>3))break
 if(0>=b.length)return H.e(b,0)
 y-=b.pop().length+2;--x}b.push("...")
@@ -7315,19 +6723,23 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(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
+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.b6(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d]
+return z},
+fd:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
-x=y.gB(a)
-for(w=0;w<x;++w){v=y.t(a,w)
-if(J.xC(b.$1(v),c))z.push(v)
-if(x!==y.gB(a))throw H.b(P.a4(a))}if(z.length!==y.gB(a)){y.zB(a,0,z.length,z)
-y.sB(a,z.length)}},
+x=y.gv(a)
+for(w=0;w<x;++w){v=y.p(a,w)
+if(J.mG(b.$1(v),c))z.push(v)
+if(x!==y.gv(a))throw H.b(P.a4(a))}if(z.length!==y.gv(a)){y.vg(a,0,z.length,z)
+y.sv(a,z.length)}},
 vW:function(a){var z,y
 z={}
-if(P.nH(a))return"{...}"
+if(P.jO(a))return"{...}"
 y=P.p9("")
 try{$.Ex().push(a)
 y.KF("{")
@@ -7335,107 +6747,108 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gIN()},
+z.pop()}z=y.gIN()
+return z.charCodeAt(0)==0?z:z},
 bA:{
-"^":"a;X5,Mb,cG,Cs,MV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
+"^":"a;Q,a,b,c,d",
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
+gvc:function(a){return H.J(new P.fG(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.J(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
 NZ:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 return y==null?!1:y[b]!=null}else return this.KY(b)},
-KY:function(a){var z=this.Cs
+KY:["an",function(a){var z=this.c
 if(z==null)return!1
-return this.DF(z[this.rk(a)],a)>=0},
-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
+return this.DF(z[this.rk(a)],a)>=0}],
+FV:function(a,b){J.Me(b,new P.DJ(this))},
+p:function(a,b){var z,y,x,w
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)y=null
 else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.cG
+y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.b
 if(w==null)y=null
 else{x=w[b]
 y=x===w?null:x}return y}else return this.c8(b)},
-c8:function(a){var z,y,x
-z=this.Cs
+c8:["d2",function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
-return x<0?null:y[x+1]},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return x<0?null:y[x+1]}],
+q:function(a,b,c){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){z=P.r8()
-this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+this.a=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null){y=P.r8()
-this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
-Gk:function(a,b){var z,y,x,w
-z=this.Cs
+this.b=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:["eE",function(a,b){var z,y,x,w
+z=this.c
 if(z==null){z=P.r8()
-this.Cs=z}y=this.rk(a)
+this.c=z}y=this.rk(a)
 x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.MV=null}else{w=this.DF(x,a)
+if(x==null){P.cW(z,y,[a,b]);++this.Q
+this.d=null}else{w=this.DF(x,a)
 if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.MV=null}}},
-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{x.push(a,b);++this.Q
+this.d=null}}}],
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
-qg:function(a){var z,y,x
-z=this.Cs
+qg:["cS",function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
-if(x<0)return;--this.X5
-this.MV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.MV=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0}},
+if(x<0)return;--this.Q
+this.d=null
+return y.splice(x,2)[1]}],
+V1:function(a){if(this.Q>0){this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0}},
 aN:function(a,b){var z,y,x,w
 z=this.Nm()
 for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.MV)throw H.b(P.a4(this))}},
+b.$2(w,this.p(0,w))
+if(z!==this.d)throw H.b(P.a4(this))}},
 Nm:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.MV
+z=this.d
 if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.Mb
+y=Array(this.Q)
+y.fixed$length=Array
+x=this.a
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.cG
+s=this.b
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.c
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.MV=y
+for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.d=y
 return y},
-u9:function(a,b,c){if(a[b]==null){++this.X5
-this.MV=null}P.cW(a,b,c)},
+u9:function(a,b,c){if(a[b]==null){++this.Q
+this.d=null}P.cW(a,b,c)},
 H4:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.MV=null
+delete a[b];--this.Q
+this.d=null
 return z}else return},
 rk:function(a){return J.v1(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
+for(y=0;y<z;y+=2)if(J.mG(a[y],b))return y
 return-1},
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{vL:function(a,b){var z=a[b]
 return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
 else a[b]=c},r8:function(){var z=Object.create(null)
@@ -7443,16 +6856,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
-ef:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.a,"bA")}},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
+DJ:{
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.Q,"bA")}},
 PL:{
-"^":"bA;X5,Mb,cG,Cs,MV",
+"^":"bA;Q,a,b,c,d",
 rk:function(a){return H.CU(a)&0x3ffffff},
 DF:function(a,b){var z,y,x
 if(a==null)return-1
@@ -7460,115 +6871,114 @@
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"bA;AH,dI,z4,X5,Mb,cG,Cs,MV",
-Xm:function(a,b){return this.AH.$2(a,b)},
-jP:function(a){return this.dI.$1(a)},
-Bc:function(a){return this.z4.$1(a)},
-t:function(a,b){if(this.Bc(b)!==!0)return
-return P.bA.prototype.c8.call(this,b)},
-u:function(a,b,c){P.bA.prototype.Gk.call(this,b,c)},
+"^":"bA;e,f,r,Q,a,b,c,d",
+Xm:function(a,b){return this.e.$2(a,b)},
+jP:function(a){return this.f.$1(a)},
+Bc:function(a){return this.r.$1(a)},
+p:function(a,b){if(this.Bc(b)!==!0)return
+return this.d2(b)},
+q:function(a,b,c){this.eE(b,c)},
 NZ:function(a,b){if(this.Bc(b)!==!0)return!1
-return P.bA.prototype.KY.call(this,b)},
+return this.an(b)},
 Rz:function(a,b){if(this.Bc(b)!==!0)return
-return P.bA.prototype.qg.call(this,b)},
+return this.cS(b)},
 rk:function(a){return this.jP(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.Xm(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-static:{uP:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
+return H.J(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"TpZ:12;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}},
 fG:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.X5},
-gl0:function(a){return this.ZD.X5===0},
-gA:function(a){var z=this.ZD
+"^":"mW;Q",
+gv:function(a){return this.Q.Q},
+gl0:function(a){return this.Q.Q===0},
+gu:function(a){var z=this.Q
 z=new P.EQ(z,z.Nm(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:function(a,b){return this.ZD.NZ(0,b)},
+tg:function(a,b){return this.Q.NZ(0,b)},
 aN:function(a,b){var z,y,x,w
-z=this.ZD
+z=this.Q
 y=z.Nm()
 for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.MV)throw H.b(P.a4(z))}},
+if(y!==z.d)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
-"^":"a;ZD,MV,iY,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.MV
-y=this.iY
-x=this.ZD
-if(z!==x.MV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.iY=y+1
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x
+z=this.a
+y=this.b
+x=this.Q
+if(z!==x.d)throw H.b(P.a4(x))
+else if(y>=z.length){this.c=null
+return!1}else{this.c=z[y]
+this.b=y+1
 return!0}}},
 YB:{
-"^":"a;X5,Mb,cG,Cs,HH,Nz,HU",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
+"^":"a;Q,a,b,c,d,e,f",
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
+gvc:function(a){return H.J(new P.i5(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.J(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
 NZ:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null)return!1
 return y[b]!=null}else return this.KY(b)},
-KY:function(a){var z=this.Cs
+KY:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
 FV:function(a,b){J.Me(b,new P.pk(this))},
-t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+p:function(a,b){var z,y,x
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return
 y=z[b]
-return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null)return
 y=x[b]
 return y==null?null:y.gcF()}else return this.c8(b)},
 c8:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
 return y[x].gcF()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+q:function(a,b,c){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){z=P.Jc()
-this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+this.a=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null){y=P.Jc()
-this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+this.b=y}this.u9(y,b,c)}else this.Gk(b,c)},
 Gk:function(a,b){var z,y,x,w
-z=this.Cs
+z=this.c
 if(z==null){z=P.Jc()
-this.Cs=z}y=this.rk(a)
+this.c=z}y=this.rk(a)
 x=z[y]
 if(x==null)z[y]=[this.x4(a,b)]
 else{w=this.DF(x,a)
 if(w>=0)x[w].scF(b)
 else x.push(this.x4(a,b))}},
 to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.p(0,b)
 z=c.$0()
-this.u(0,b,z)
+this.q(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)
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x,w
-z=this.Cs
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
@@ -7576,18 +6986,18 @@
 w=y.splice(x,1)[0]
 this.GS(w)
 return w.gcF()},
-V1:function(a){if(this.X5>0){this.Nz=null
-this.HH=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0
-this.HU=this.HU+1&67108863}},
+V1:function(a){if(this.Q>0){this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0
+this.f=this.f+1&67108863}},
 aN:function(a,b){var z,y
-z=this.HH
-y=this.HU
+z=this.d
+y=this.f
 for(;z!=null;){b.$2(z.gv8(z),z.gcF())
-if(y!==this.HU)throw H.b(P.a4(this))
+if(y!==this.f)throw H.b(P.a4(this))
 z=z.gtL()}},
 u9:function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.x4(b,c)
@@ -7601,289 +7011,287 @@
 return z.gcF()},
 x4:function(a,b){var z,y
 z=new P.dN(a,b,null,null)
-if(this.HH==null){this.Nz=z
-this.HH=z}else{y=this.Nz
-z.n8=y
+if(this.d==null){this.e=z
+this.d=z}else{y=this.e
+z.c=y
 y.stL(z)
-this.Nz=z}++this.X5
-this.HU=this.HU+1&67108863
+this.e=z}++this.Q
+this.f=this.f+1&67108863
 return z},
 GS:function(a){var z,y
 z=a.gn8()
 y=a.gtL()
-if(z==null)this.HH=y
+if(z==null)this.d=y
 else z.stL(y)
-if(y==null)this.Nz=z
-else y.sn8(z);--this.X5
-this.HU=this.HU+1&67108863},
+if(y==null)this.e=z
+else y.sn8(z);--this.Q
+this.f=this.f+1&67108863},
 rk:function(a){return J.v1(a)&0x3ffffff},
 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.nG(a[y]),b))return y
+for(y=0;y<z;++y)if(J.mG(J.nG(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 $isFo:true,
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{Jc:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
 pk:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"YB")}},
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.Q,"YB")}},
 dN:{
-"^":"a;v8>,cF@,tL@,n8@"},
+"^":"a;v8:Q>,cF:a@,tL:b@,n8:c@"},
 i5:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.X5},
-gl0:function(a){return this.ZD.X5===0},
-gA:function(a){var z,y
-z=this.ZD
-y=new P.N6(z,z.HU,null,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.Q},
+gl0:function(a){return this.Q.Q===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.N6(z,z.f,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qx=z.HH
+y.b=z.d
 return y},
-tg:function(a,b){return this.ZD.NZ(0,b)},
+tg:function(a,b){return this.Q.NZ(0,b)},
 aN:function(a,b){var z,y,x
-z=this.ZD
-y=z.HH
-x=z.HU
+z=this.Q
+y=z.d
+x=z.f
 for(;y!=null;){b.$1(y.gv8(y))
-if(x!==z.HU)throw H.b(P.a4(z))
+if(x!==z.f)throw H.b(P.a4(z))
 y=y.gtL()}},
 $isyN:true},
 N6:{
-"^":"a;ZD,HU,Qx,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.ZD
-if(this.HU!==z.HU)throw H.b(P.a4(z))
-else{z=this.Qx
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gv8(z)
-this.Qx=this.Qx.gtL()
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z=this.Q
+if(this.a!==z.f)throw H.b(P.a4(z))
+else{z=this.b
+if(z==null){this.c=null
+return!1}else{this.c=z.gv8(z)
+this.b=this.b.gtL()
 return!0}}}},
 jg:{
-"^":"u3T;X5,Mb,cG,Cs,vw",
+"^":"u3T;Q,a,b,c,d",
 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.ij(),0,null)
+gu:function(a){var z=new P.cN(this,this.d0(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
 tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 return y==null?!1:y[b]!=null}else return this.PR(b)},
-PR:function(a){var z=this.Cs
+PR:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-Ie:function(a){var z
+iQ:function(a){var z
 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.GP(a)},
-GP:function(a){var z,y,x
-z=this.Cs
+return this.vR(a)},
+vR:function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.UQ(y,x)},
+return J.Tf(y,x)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.Mb=y
-z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+this.a=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.cG=y
+this.b=y
 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.yT()
-this.Cs=z}y=this.rk(b)
+z=this.c
+if(z==null){z=P.NC()
+this.c=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
 else{if(this.DF(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.vw=null
+x.push(b)}++this.Q
+this.d=null
 return!0},
 FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-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)
+for(z=J.Nx(b);z.D();)this.h(0,z.gk())},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return!1
 y=z[this.rk(a)]
 x=this.DF(y,a)
-if(x<0)return!1;--this.X5
-this.vw=null
+if(x<0)return!1;--this.Q
+this.d=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.vw=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0}},
-ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.vw
+V1:function(a){if(this.Q>0){this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0}},
+d0:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.d
 if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.Mb
+y=Array(this.Q)
+y.fixed$length=Array
+x=this.a
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.cG
+s=this.b
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.c
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.vw=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.d=y
 return y},
 bQ:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.vw=null
+a[b]=0;++this.Q
+this.d=null
 return!0},
-H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.vw=null
+H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.Q
+this.d=null
 return!0}else return!1},
 rk:function(a){return J.v1(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y],b))return y
+for(y=0;y<z;++y)if(J.mG(a[y],b))return y
 return-1},
 $isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{yT:function(){var z=Object.create(null)
+static:{NC:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;vY,vw,iY,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.vw
-y=this.iY
-x=this.vY
-if(z!==x.vw)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.iY=y+1
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x
+z=this.a
+y=this.b
+x=this.Q
+if(z!==x.d)throw H.b(P.a4(x))
+else if(y>=z.length){this.c=null
+return!1}else{this.c=z[y]
+this.b=y+1
 return!0}}},
-D0:{
-"^":"u3T;X5,Mb,cG,Cs,HH,Nz,HU",
-iL:function(){var z=new P.D0(0,null,null,null,null,null,0)
+b6:{
+"^":"u3T;Q,a,b,c,d,e,f",
+iL:function(){var z=new P.b6(0,null,null,null,null,null,0)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=H.VM(new P.zQ(this,this.HU,null,null),[null])
-z.Qx=z.vY.HH
+gu:function(a){var z=H.J(new P.zQ(this,this.f,null,null),[null])
+z.b=z.Q.d
 return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
 tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null)return!1
 return y[b]!=null}else return this.PR(b)},
-PR:function(a){var z=this.Cs
+PR:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-Ie:function(a){var z
+iQ:function(a){var z
 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.GP(a)},
-GP:function(a){var z,y,x
-z=this.Cs
+else return this.vR(a)},
+vR:function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.Nq(J.UQ(y,x))},
+return J.PK(J.Tf(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=this.d
+y=this.f
+for(;z!=null;){b.$1(z.gdA(z))
+if(y!==this.f)throw H.b(P.a4(this))
 z=z.gtL()}},
-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
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
+gtH:function(a){var z=this.d
+if(z==null)throw H.b(P.s("No elements"))
+return z.gdA(z)},
+grZ:function(a){var z=this.e
+if(z==null)throw H.b(P.s("No elements"))
+return z.gdA(z)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.Mb=y
-z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+this.a=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.cG=y
+this.b=y
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null){z=P.T2()
-this.Cs=z}y=this.rk(b)
+this.c=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[this.yo(b)]
 else{if(this.DF(x,b)>=0)return!1
 x.push(this.yo(b))}return!0},
-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)
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return!1
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return!1
 this.GS(y.splice(x,1)[0])
 return!0},
-uk:function(a,b){this.eJ(b,!0)},
-eJ:function(a,b){var z,y,x,w,v
-z=this.HH
-for(;z!=null;z=x){y=z.gGc(z)
+uk:function(a,b){this.YS(b,!0)},
+YS:function(a,b){var z,y,x,w,v
+z=this.d
+for(;z!=null;z=x){y=z.gdA(z)
 x=z.gtL()
-w=this.HU
+w=this.f
 v=a.$1(y)
-if(w!==this.HU)throw H.b(P.a4(this))
+if(w!==this.f)throw H.b(P.a4(this))
 if(b===v)this.Rz(0,y)}},
-V1:function(a){if(this.X5>0){this.Nz=null
-this.HH=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0
-this.HU=this.HU+1&67108863}},
+V1:function(a){if(this.Q>0){this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0
+this.f=this.f+1&67108863}},
 bQ:function(a,b){if(a[b]!=null)return!1
 a[b]=this.yo(b)
 return!0},
@@ -7896,26 +7304,26 @@
 return!0},
 yo:function(a){var z,y
 z=new P.tj(a,null,null)
-if(this.HH==null){this.Nz=z
-this.HH=z}else{y=this.Nz
-z.n8=y
+if(this.d==null){this.e=z
+this.d=z}else{y=this.e
+z.b=y
 y.stL(z)
-this.Nz=z}++this.X5
-this.HU=this.HU+1&67108863
+this.e=z}++this.Q
+this.f=this.f+1&67108863
 return z},
 GS:function(a){var z,y
 z=a.gn8()
 y=a.gtL()
-if(z==null)this.HH=y
+if(z==null)this.d=y
 else z.stL(y)
-if(y==null)this.Nz=z
-else y.sn8(z);--this.X5
-this.HU=this.HU+1&67108863},
+if(y==null)this.e=z
+else y.sn8(z);--this.Q
+this.f=this.f+1&67108863},
 rk:function(a){return J.v1(a)&0x3ffffff},
 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.Nq(a[y]),b))return y
+for(y=0;y<z;++y)if(J.mG(J.PK(a[y]),b))return y
 return-1},
 $isOl:true,
 $isyN:true,
@@ -7926,83 +7334,130 @@
 delete z["<non-identifier-key>"]
 return z}}},
 tj:{
-"^":"a;Gc>,tL@,n8@"},
+"^":"a;dA:Q>,tL:a@,n8:b@"},
 zQ:{
-"^":"a;vY,HU,Qx,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.vY
-if(this.HU!==z.HU)throw H.b(P.a4(z))
-else{z=this.Qx
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.Qx=this.Qx.gtL()
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z=this.Q
+if(this.a!==z.f)throw H.b(P.a4(z))
+else{z=this.b
+if(z==null){this.c=null
+return!1}else{this.c=z.gdA(z)
+this.b=this.b.gtL()
 return!0}}}},
-Ui:{
-"^":"w2Y;G4",
-gB:function(a){return this.G4.length},
-t:function(a,b){var z=this.G4
+Eb:{
+"^":"w2Y;Q",
+gv:function(a){return this.Q.length},
+p:function(a,b){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.iL()
+Oe:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
-mW:{
+Et:{
 "^":"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:"MQ",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)])},
-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],
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"Et",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"Et")},31],
+ev:function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"Et",0)])},
+Ft:[function(a,b){return H.J(new H.Fm(this,b),[H.W8(this,"Et",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"PA",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"Et")},31],
 tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
+for(z=this.gu(this);z.D();)if(J.mG(z.gk(),b))return!0
 return!1},
 aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
 zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
+z=this.gu(this)
+if(!z.D())return""
 y=P.p9("")
-if(b===""){do{x=H.d(z.gl())
-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}}return y.IN},
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
 return!1},
-tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
+tt:function(a,b){return P.z(this,b,H.W8(this,"Et",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
+Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"Et",0))
 z.FV(0,this)
 return z},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
+gv:function(a){var z,y
+z=this.gu(this)
+for(y=0;z.D();)++y
 return y},
-gl0:function(a){return!this.gA(this).G()},
+gl0:function(a){return!this.gu(this).D()},
+gor:function(a){return!this.gl0(this)},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"Et",0))},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
+grZ:function(a){var z,y
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
+return y},
+X:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,0],
+$isQV:true,
+$asQV:null},
+mW:{
+"^":"a;",
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"mW")},31],
+ev:["FX",function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"mW",0)])}],
+Ft:[function(a,b){return H.J(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:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+tg:function(a,b){var z
+for(z=this.gu(this);z.D();)if(J.mG(z.gk(),b))return!0
+return!1},
+aN:function(a,b){var z
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
+zV:function(a,b){var z,y,x
+z=this.gu(this)
+if(!z.D())return""
+y=P.p9("")
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
+Vr:function(a,b){var z
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
+return!1},
+tt:function(a,b){return P.z(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))
+z.FV(0,this)
+return z},
+gv:function(a){var z,y
+z=this.gu(this)
+for(y=0;z.D();)++y
+return y},
+gl0:function(a){return!this.gu(this).D()},
 gor:function(a){return this.gl0(this)!==!0},
 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()},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
 grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
 return y},
-Zv:function(a,b){var z,y,x,w
-if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-for(z=this.gA(this),y=b;z.G();){x=z.gl()
-w=J.x(y)
-if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,73],
+Zv:function(a,b){var z,y,x
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.hG("index"))
+if(b<0)H.vh(P.ve(b,0,null,"index",null))
+for(z=this.gu(this),y=0;z.D();){x=z.gk()
+if(b===y)return x;++y}throw H.b(P.Hj(b,this,"index",null,y))},
+X:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,0],
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"eD;"},
-eD:{
+"^":"E9h;"},
+E9h:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -8011,126 +7466,114 @@
 $asQV:null},
 lD:{
 "^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.W8(a,"lD",0)])},
-Zv:function(a,b){return this.t(a,b)},
+gu:function(a){return H.J(new H.a7(a,this.gv(a),0,null),[H.W8(a,"lD",0)])},
+Zv:function(a,b){return this.p(a,b)},
 aN:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){b.$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return this.gB(a)===0},
+z=this.gv(a)
+for(y=0;y<z;++y){b.$1(this.p(a,y))
+if(z!==this.gv(a))throw H.b(P.a4(a))}},
+gl0:function(a){return this.gv(a)===0},
 gor:function(a){return!this.gl0(a)},
-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)},
+gtH:function(a){if(this.gv(a)===0)throw H.b(H.DU())
+return this.p(a,0)},
+grZ:function(a){if(this.gv(a)===0)throw H.b(H.DU())
+return this.p(a,this.gv(a)-1)},
 tg:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
+z=this.gv(a)
+for(y=0;y<this.gv(a);++y){if(J.mG(this.p(a,y),b))return!0
+if(z!==this.gv(a))throw H.b(P.a4(a))}return!1},
 Vr:function(a,b){var z,y
-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
-if(this.gB(a)===0)return""
+z=this.gv(a)
+for(y=0;y<z;++y){if(b.$1(this.p(a,y))===!0)return!0
+if(z!==this.gv(a))throw H.b(P.a4(a))}return!1},
+zV:function(a,b){var z,y
+if(this.gv(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-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:"fQO",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)},
+y=z.Q
+return y.charCodeAt(0)==0?y:y},
+ev:function(a,b){return H.J(new H.U5(a,b),[H.W8(a,"lD",0)])},
+ez:[function(a,b){return H.J(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:"JmR",args:[a]}]}},this.$receiver,"lD")},31],
+Ft:[function(a,b){return H.J(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:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+eR:function(a,b){return H.c1(a,b,null,H.W8(a,"lD",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.W8(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
+if(b){z=H.J([],[H.W8(a,"lD",0)])
+C.Nm.sv(z,this.gv(a))}else{y=Array(this.gv(a))
+y.fixed$length=Array
+z=H.J(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gv(a);++x){y=this.p(a,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!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))
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(a,"lD",0))
+for(y=0;y<this.gv(a);++y)z.h(0,this.p(a,y))
 return z},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
+h:function(a,b){var z=this.gv(a)
+this.sv(a,z+1)
+this.q(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.Ff
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.D();){y=z.c
+x=this.gv(a)
+this.sv(a,x+1)
+this.q(a,x,y)}},
 Rz:function(a,b){var z
-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)
+for(z=0;z<this.gv(a);++z)if(J.mG(this.p(a,z),b)){this.YW(a,z,this.gv(a)-1,a,z+1)
+this.sv(a,this.gv(a)-1)
 return!0}return!1},
-uk:function(a,b){P.Vi(a,b,!1)},
-V1:function(a){this.sB(a,0)},
+uk:function(a,b){P.fd(a,b,!1)},
+V1:function(a){this.sv(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
+H.ZE(a,0,this.gv(a)-1,b)},
 Jd:function(a){return this.GT(a,null)},
-fV:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-aM:function(a,b,c){var z,y,x,w
-this.fV(a,b,c)
-z=c-b
-y=H.VM([],[H.W8(a,"lD",0)])
-C.Nm.sB(y,z)
-for(x=0;x<z;++x){w=this.t(a,b+x)
-if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},
-Yc:function(a,b,c){this.fV(a,b,c)
-return H.c1(a,b,c,null)},
+Mu:function(a,b,c){P.iZ(b,c,this.gv(a),null,null,null)
+return H.c1(a,b,c,H.W8(a,"lD",0))},
 oq:function(a,b,c){var z
-this.fV(a,b,c)
+P.iZ(b,c,this.gv(a),null,null,null)
 z=c-b
-this.YW(a,b,this.gB(a)-z,a,c)
-this.sB(a,this.gB(a)-z)},
-YW:function(a,b,c,d,e){var z,y,x,w,v
-if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
-if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
+this.YW(a,b,this.gv(a)-z,a,c)
+this.sv(a,this.gv(a)-z)},
+YW:["as",function(a,b,c,d,e){var z,y,x,w,v
+P.iZ(b,c,this.gv(a),null,null,null)
 z=c-b
 if(z===0)return
-if(e<0)throw H.b(P.u(e))
-y=J.x(d)
+if(e<0)H.vh(P.ve(e,0,null,"skipCount",null))
+y=J.t(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}y=J.U6(w)
-if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
-if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
-else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+if(x+z>y.gv(w))throw H.b(H.ar())
+if(x<b)for(v=z-1;v>=0;--v)this.q(a,b+v,y.p(w,x+v))
+else for(v=0;v<z;++v)this.q(a,b+v,y.p(w,x+v))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"vg","$4",null,"gam",6,2,null,141],
 XU:function(a,b,c){var z
-if(c>=this.gB(a))return-1
-for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
+if(c>=this.gv(a))return-1
+for(z=c;z<this.gv(a);++z)if(J.mG(this.p(a,z),b))return z
 return-1},
 OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
-c=this.gB(a)-1
-for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
+if(c==null)c=this.gv(a)-1
+else{if(c<0)return-1
+if(c>=this.gv(a))c=this.gv(a)-1}for(z=c;z>=0;--z)if(J.mG(this.p(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-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)
-this.u(a,b,c)},
+aP:function(a,b,c){P.wA(b,0,this.gv(a),"index",null)
+if(b===this.gv(a)){this.h(a,c)
+return}this.sv(a,this.gv(a)+1)
+this.YW(a,b+1,this.gv(a),a,b)
+this.q(a,b,c)},
 UG:function(a,b,c){var z,y
-if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.x(c)
+P.wA(b,0,this.gv(a),"index",null)
+z=J.t(c)
 if(!!z.$isyN)c=z.br(c)
-y=J.q8(c)
-this.sB(a,this.gB(a)+y)
-this.YW(a,b+y,this.gB(a),a,b)
+y=J.wS(c)
+this.sv(a,this.gv(a)+y)
+this.YW(a,b+y,this.gv(a),a,b)
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
-z=J.x(c)
-if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
-else for(z=z.gA(c);z.G();b=y){y=b+1
-this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
+z=J.t(c)
+if(!!z.$isWO)this.vg(a,b,b+z.gv(c),c)
+else for(z=z.gu(c);z.D();b=y){y=b+1
+this.q(a,b,z.gk())}},
+X:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,0],
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -8138,205 +7581,208 @@
 $asQV:null},
 ilb:{
 "^":"a+Yk;",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 Yk:{
 "^":"a;",
 aN:function(a,b){var z,y
-for(z=J.mY(this.gvc(this));z.G();){y=z.gl()
-b.$2(y,this.t(0,y))}},
+for(z=J.Nx(this.gvc(this));z.D();){y=z.gk()
+b.$2(y,this.p(0,y))}},
 FV:function(a,b){var z,y,x
-for(z=J.RE(b),y=z.gvc(b),y=y.gA(y);y.G();){x=y.gl()
-this.u(0,x,z.t(b,x))}},
+for(z=J.RE(b),y=z.gvc(b),y=y.gu(y);y.D();){x=y.gk()
+this.q(0,x,z.p(b,x))}},
 NZ:function(a,b){return J.kE(this.gvc(this),b)},
-gB:function(a){return J.q8(this.gvc(this))},
+gv:function(a){return J.wS(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.wU(this),[H.W8(this,"Yk",1)])},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-$isT8:true,
-$asT8:null},
+gUQ:function(a){return H.J(new P.wU(this),[H.W8(this,"Yk",1)])},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+$isw:true,
+$asw:null},
 wU:{
-"^":"mW;ZD",
-gB:function(a){var z=this.ZD
-return J.q8(z.gvc(z))},
-gl0:function(a){var z=this.ZD
+"^":"mW;Q",
+gv:function(a){var z=this.Q
+return J.wS(z.gvc(z))},
+gl0:function(a){var z=this.Q
 return J.FN(z.gvc(z))},
-gor:function(a){var z=this.ZD
+gor:function(a){var z=this.Q
 return J.pO(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.MQ(z.gvc(z)))},
-gA:function(a){var z=this.ZD
-z=new P.Uq(J.mY(z.gvc(z)),z,null)
+gtH:function(a){var z=this.Q
+return z.p(0,J.bP(z.gvc(z)))},
+grZ:function(a){var z=this.Q
+return z.p(0,J.rn(z.gvc(z)))},
+gu:function(a){var z=this.Q
+z=new P.Uq(J.Nx(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $isyN:true},
 Uq:{
-"^":"a;MV,ZD,fD",
-G:function(){var z=this.MV
-if(z.G()){this.fD=this.ZD.t(0,z.gl())
-return!0}this.fD=null
+"^":"a;Q,a,b",
+D:function(){var z=this.Q
+if(z.D()){this.b=this.a.p(0,z.gk())
+return!0}this.b=null
 return!1},
-gl:function(){return this.fD}},
+gk:function(){return this.b}},
 KPM:{
 "^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
 FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
 V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
 Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 Pnf:{
 "^":"a;",
-t:function(a,b){return this.ZD.t(0,b)},
-u:function(a,b,c){this.ZD.u(0,b,c)},
-FV:function(a,b){this.ZD.FV(0,b)},
-V1:function(a){this.ZD.V1(0)},
-NZ:function(a,b){return this.ZD.NZ(0,b)},
-aN:function(a,b){this.ZD.aN(0,b)},
-gl0:function(a){return this.ZD.X5===0},
-gor:function(a){return this.ZD.X5!==0},
-gB:function(a){return this.ZD.X5},
-gvc:function(a){var z=this.ZD
-return H.VM(new P.i5(z),[H.u3(z,0)])},
-Rz:function(a,b){return this.ZD.Rz(0,b)},
-bu:[function(a){return P.vW(this.ZD)},"$0","gCR",0,0,73],
-gUQ:function(a){var z=this.ZD
+p:function(a,b){return this.Q.p(0,b)},
+q:function(a,b,c){this.Q.q(0,b,c)},
+FV:function(a,b){this.Q.FV(0,b)},
+V1:function(a){this.Q.V1(0)},
+NZ:function(a,b){return this.Q.NZ(0,b)},
+aN:function(a,b){this.Q.aN(0,b)},
+gl0:function(a){return this.Q.Q===0},
+gor:function(a){return this.Q.Q!==0},
+gv:function(a){return this.Q.Q},
+gvc:function(a){var z=this.Q
+return H.J(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.Q.Rz(0,b)},
+X:[function(a){return P.vW(this.Q)},"$0","gCR",0,0,0],
+gUQ:function(a){var z=this.Q
 return z.gUQ(z)},
-$isT8:true,
-$asT8:null},
-A2:{
-"^":"Pnf+KPM;ZD",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
+Gj:{
+"^":"Pnf+KPM;Q",
+$isw:true,
+$asw:null},
 LG:{
-"^":"TpZ:81;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.Q
+if(!z.a)this.a.KF(", ")
 z.a=!1
-z=this.b
+z=this.a
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,141,66,"call"],
-$isEH:true},
-nd:{
-"^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
+z.KF(b)}},
+Fw:{
+"^":"mW;Q,a,b,c",
+gu:function(a){var z=new P.KG(this,this.b,this.c,this.a,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
-z=this.Z1
-for(y=this.QN;y!==this.Bq;y=(y+1&this.E3.length-1)>>>0){x=this.E3
+z=this.c
+for(y=this.a;y!==this.b;y=(y+1&this.Q.length-1)>>>0){x=this.Q
 if(y<0||y>=x.length)return H.e(x,y)
 b.$1(x[y])
-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},
-gqG:function(a){var z,y
-z=this.QN
-if(z===this.Bq)throw H.b(H.DU())
-y=this.E3
+if(z!==this.c)H.vh(P.a4(this))}},
+gl0:function(a){return this.a===this.b},
+gv:function(a){return(this.b-this.a&this.Q.length-1)>>>0},
+gtH:function(a){var z,y
+z=this.a
+if(z===this.b)throw H.b(H.DU())
+y=this.Q
 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
+z=this.a
+y=this.b
 if(z===y)throw H.b(H.DU())
-z=this.E3
+z=this.Q
 x=z.length
 y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.u3(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}this.BR(z)
+if(b){z=H.J([],[H.u3(this,0)])
+C.Nm.sv(z,this.gv(this))}else{y=Array(this.gv(this))
+y.fixed$length=Array
+z=H.J(y,[H.u3(this,0)])}this.XX(z)
 return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){this.B7(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=b.length
-y=this.gB(this)
+y=this.gv(this)
 x=y+z
-w=this.E3
+w=this.Q
 v=w.length
-if(x>=v){u=P.uay(x)
-if(typeof u!=="number")return H.s(u)
+if(x>=v){u=P.uay(x+(x>>>1))
+if(typeof u!=="number")return H.o(u)
 w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.u3(this,0)])
-this.Bq=this.BR(t)
-this.E3=t
-this.QN=0
+w.fixed$length=Array
+t=H.J(w,[H.u3(this,0)])
+this.b=this.XX(t)
+this.Q=t
+this.a=0
+C.Nm.uy(t,"set range")
 H.qG(t,y,x,b,0)
-this.Bq+=z}else{x=this.Bq
+this.b+=z}else{x=this.b
 s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.Bq+=z}else{r=z-s
+if(z<s){C.Nm.uy(w,"set range")
+H.qG(w,x,x+z,b,0)
+this.b+=z}else{r=z-s
+C.Nm.uy(w,"set range")
 H.qG(w,x,x+s,b,0)
-x=this.E3
+x=this.Q
+C.Nm.uy(x,"set range")
 H.qG(x,0,r,b,s)
-this.Bq=r}}++this.Z1},
+this.b=r}}++this.c},
 Rz:function(a,b){var z,y
-for(z=this.QN;z!==this.Bq;z=(z+1&this.E3.length-1)>>>0){y=this.E3
+for(z=this.a;z!==this.b;z=(z+1&this.Q.length-1)>>>0){y=this.Q
 if(z<0||z>=y.length)return H.e(y,z)
-if(J.xC(y[z],b)){this.qg(z);++this.Z1
+if(J.mG(y[z],b)){this.qg(z);++this.c
 return!0}}return!1},
-eJ:function(a,b){var z,y,x,w
-z=this.Z1
-y=this.QN
-for(;y!==this.Bq;){x=this.E3
+YS:function(a,b){var z,y,x,w
+z=this.c
+y=this.a
+for(;y!==this.b;){x=this.Q
 if(y<0||y>=x.length)return H.e(x,y)
 x=a.$1(x[y])
-w=this.Z1
+w=this.c
 if(z!==w)H.vh(P.a4(this))
 if(b===x){y=this.qg(y)
-z=++this.Z1}else y=(y+1&this.E3.length-1)>>>0}},
-uk:function(a,b){this.eJ(b,!0)},
+z=++this.c}else y=(y+1&this.Q.length-1)>>>0}},
+uk:function(a,b){this.YS(b,!0)},
 V1:function(a){var z,y,x,w,v
-z=this.QN
-y=this.Bq
-if(z!==y){for(x=this.E3,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.Bq=0
-this.QN=0;++this.Z1}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
+z=this.a
+y=this.b
+if(z!==y){for(x=this.Q,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
+x[z]=null}this.b=0
+this.a=0;++this.c}},
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
 AR:function(){var z,y,x,w
-z=this.QN
-if(z===this.Bq)throw H.b(H.DU());++this.Z1
-y=this.E3
+z=this.a
+if(z===this.b)throw H.b(H.DU());++this.c
+y=this.Q
 x=y.length
 if(z>=x)return H.e(y,z)
 w=y[z]
 y[z]=null
-this.QN=(z+1&x-1)>>>0
+this.a=(z+1&x-1)>>>0
 return w},
 B7:function(a,b){var z,y,x
-z=this.E3
-y=this.Bq
+z=this.Q
+y=this.b
 x=z.length
 if(y<0||y>=x)return H.e(z,y)
 z[y]=b
 x=(y+1&x-1)>>>0
-this.Bq=x
-if(this.QN===x)this.OO();++this.Z1},
+this.b=x
+if(this.a===x)this.OO();++this.c},
 qg:function(a){var z,y,x,w,v,u,t,s
-z=this.E3
+z=this.Q
 y=z.length
 x=y-1
-w=this.QN
-v=this.Bq
+w=this.a
+v=this.b
 if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
 if(t<0||t>=y)return H.e(z,t)
 v=z[t]
 if(u<0||u>=y)return H.e(z,u)
 z[u]=v}if(w>=y)return H.e(z,w)
 z[w]=null
-this.QN=(w+1&x)>>>0
+this.a=(w+1&x)>>>0
 return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.Bq=w
+this.b=w
 for(u=a;u!==w;u=s){s=(u+1&x)>>>0
 if(s<0||s>=y)return H.e(z,s)
 v=z[s]
@@ -8345,293 +7791,384 @@
 z[w]=null
 return a}},
 OO:function(){var z,y,x,w
-z=Array(this.E3.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.u3(this,0)])
-z=this.E3
-x=this.QN
+z=Array(this.Q.length*2)
+z.fixed$length=Array
+y=H.J(z,[H.u3(this,0)])
+z=this.Q
+x=this.a
 w=z.length-x
+C.Nm.uy(y,"set range")
 H.qG(y,0,w,z,x)
-z=this.QN
-x=this.E3
-H.qG(y,w,w+z,x,0)
-this.QN=0
-this.Bq=this.E3.length
-this.E3=y},
-BR:function(a){var z,y,x,w,v
-z=this.QN
-y=this.Bq
-x=this.E3
+x=this.a
+z=this.Q
+C.Nm.uy(y,"set range")
+H.qG(y,w,w+x,z,0)
+this.a=0
+this.b=this.Q.length
+this.Q=y},
+XX:function(a){var z,y,x,w,v
+z=this.a
+y=this.b
+x=this.Q
 if(z<=y){w=y-z
+C.Nm.uy(a,"set range")
 H.qG(a,0,w,x,z)
 return w}else{v=x.length-z
+C.Nm.uy(a,"set range")
 H.qG(a,0,v,x,z)
-z=this.Bq
-y=this.E3
+z=this.b
+y=this.Q
+C.Nm.uy(a,"set range")
 H.qG(a,v,v+z,y,0)
-return this.Bq+v}},
+return this.b+v}},
 Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.E3=H.VM(z,[b])},
+z.fixed$length=Array
+this.Q=H.J(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",uay:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
+static:{"^":"TNe",NZ2:function(a,b){var z=H.J(new P.Fw(null,0,0,0),[b])
+z.Eo(a,b)
+return z},uay:function(a){var z
+if(typeof a!=="number")return a.L()
+a=(a<<1>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
 if(z===0)return a}}}},
-fO:{
-"^":"a;dk,pP,Z1,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.dk
-if(this.Z1!==z.Z1)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.E3
+KG:{
+"^":"a;Q,a,b,c,d",
+gk:function(){return this.d},
+D:function(){var z,y,x
+z=this.Q
+if(this.b!==z.c)H.vh(P.a4(z))
+y=this.c
+if(y===this.a){this.d=null
+return!1}z=z.Q
 x=z.length
 if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
+this.d=z[y]
+this.c=(y+1&x-1)>>>0
 return!0}},
-lfu:{
+lf:{
 "^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
+gl0:function(a){return this.gv(this)===0},
+gor:function(a){return this.gv(this)!==0},
 V1:function(a){this.Ex(this.br(0))},
 FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
+for(z=J.Nx(b);z.D();)this.h(0,z.gk())},
 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.Ff)},
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)this.Rz(0,z.c)},
 uk:function(a,b){var z,y,x
 z=[]
-for(y=this.gA(this);y.G();){x=y.gl()
+for(y=this.gu(this);y.D();){x=y.gk()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.u3(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+if(b){z=H.J([],[H.W8(this,"lf",0)])
+C.Nm.sv(z,this.gv(this))}else{y=Array(this.gv(this))
+y.fixed$length=Array
+z=H.J(y,[H.W8(this,"lf",0)])}for(y=this.gu(this),x=0;y.D();x=v){w=y.gk()
 v=x+1
 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:"xPo",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},
-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],
+ez:[function(a,b){return H.J(new H.xy(this,b),[H.W8(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"mLP",args:[a]}]}},this.$receiver,"lf")},31],
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
+ev:function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"lf",0)])},
+Ft:[function(a,b){return H.J(new H.Fm(this,b),[H.W8(this,"lf",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7T",ret:P.QV,args:[a]}]}},this.$receiver,"lf")},31],
 aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
 zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
+z=this.gu(this)
+if(!z.D())return""
 y=P.p9("")
-if(b===""){do{x=H.d(z.gl())
-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}}return y.IN},
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
 return!1},
-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()},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"lf",0))},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
 grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
 return y},
 $isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 Vj5:{
-"^":"lfu;"},
+"^":"lf;"},
 oz:{
-"^":"a;nl>,Bb>,T8>",
+"^":"a;G3:Q>,Bb:a>,T8:b>",
 $isoz:true},
 jp:{
-"^":"oz;P*,nl,Bb,T8",
+"^":"oz;M:c*,Q,a,b",
 $asoz:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
-z=this.VR
+z=this.Q
 if(z==null)return-1
-y=this.fu
-for(x=y,w=x,v=null;!0;){v=this.R2(z.nl,a)
+y=this.a
+for(x=y,w=x,v=null;!0;){v=this.R2(z.Q,a)
 u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
+if(u.A(v,0)){u=z.a
 if(u==null)break
-v=this.R2(u.nl,a)
-if(J.xZ(v,0)){t=z.Bb
-z.Bb=t.T8
-t.T8=z
-if(t.Bb==null){z=t
-break}z=t}x.Bb=z
-s=z.Bb
+v=this.R2(u.Q,a)
+if(J.vU(v,0)){t=z.a
+z.a=t.b
+t.b=z
+if(t.a==null){z=t
+break}z=t}x.a=z
+s=z.a
 x=z
-z=s}else{if(u.C(v,0)){u=z.T8
+z=s}else{if(u.w(v,0)){u=z.b
 if(u==null)break
-v=this.R2(u.nl,a)
-if(J.u6(v,0)){t=z.T8
-z.T8=t.Bb
-t.Bb=z
-if(t.T8==null){z=t
-break}z=t}w.T8=z
-s=z.T8}else break
+v=this.R2(u.Q,a)
+if(J.UN(v,0)){t=z.b
+z.b=t.a
+t.a=z
+if(t.b==null){z=t
+break}z=t}w.b=z
+s=z.b}else break
 w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.VR=z
-y.T8=null
-y.Bb=null;++this.wq
+z=s}}w.b=z.a
+x.a=z.b
+z.a=y.b
+z.b=y.a
+this.Q=z
+y.b=null
+y.a=null;++this.d
 return v},
+Gj:function(a){var z,y
+for(z=a;y=z.a,y!=null;z=y){z.a=y.b
+y.b=z}return z},
 R8:function(a){var z,y
-for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},
+for(z=a;y=z.b,y!=null;z=y){z.b=y.a
+y.a=z}return z},
 qg:function(a){var z,y,x
-if(this.VR==null)return
-if(!J.xC(this.oB(a),0))return
-z=this.VR;--this.hm
-y=z.Bb
-if(y==null)this.VR=z.T8
-else{x=z.T8
+if(this.Q==null)return
+if(!J.mG(this.oB(a),0))return
+z=this.Q;--this.b
+y=z.a
+if(y==null)this.Q=z.b
+else{x=z.b
 y=this.R8(y)
-this.VR=y
-y.T8=x}++this.Z1
+this.Q=y
+y.b=x}++this.c
 return z},
-Oa:function(a,b){var z,y;++this.hm;++this.Z1
-if(this.VR==null){this.VR=a
-return}z=J.u6(b,0)
-y=this.VR
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.VR=a}},
+Oa:function(a,b){var z,y;++this.b;++this.c
+if(this.Q==null){this.Q=a
+return}z=J.UN(b,0)
+y=this.Q
+if(z){a.a=y
+a.b=y.b
+y.b=null}else{a.b=y
+a.a=y.a
+y.a=null}this.Q=a},
+gIn:function(){var z=this.Q
+if(z==null)return
+z=this.Gj(z)
+this.Q=z
+return z},
+gNz:function(){var z=this.Q
+if(z==null)return
+z=this.R8(z)
+this.Q=z
+return z}},
 Ba:{
-"^":"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)},
+"^":"vX1;e,f,Q,a,b,c,d",
+L4:function(a,b){return this.e.$2(a,b)},
+Bc:function(a){return this.f.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
+p:function(a,b){var z
+if(b==null)throw H.b(P.p(b))
 if(this.Bc(b)!==!0)return
-if(this.VR!=null)if(J.xC(this.oB(b),0))return this.VR.P
-return},
+if(this.Q!=null)if(J.mG(this.oB(b),0)){z=this.Q
+return z.gM(z)}return},
 Rz:function(a,b){var z
 if(this.Bc(b)!==!0)return
 z=this.qg(b)
-if(z!=null)return z.P
+if(z!=null)return z.gM(z)
 return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
+q:function(a,b,c){var z
+if(b==null)throw H.b(P.p(b))
 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.QG(this))},
-gl0:function(a){return this.VR==null},
-gor:function(a){return this.VR!=null},
+if(J.mG(z,0)){this.Q.sM(0,c)
+return}this.Oa(H.J(new P.jp(c,b,null,null),[null,null]),z)},
+FV:function(a,b){C.Nm.aN(b,new P.pn(this))},
+gl0:function(a){return this.Q==null},
+gor:function(a){return this.Q!=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.Dd(this,[P.oz,z])
-for(;y.G();){x=y.gl()
+y=H.J(new P.HW(this,H.J([],[P.oz]),this.c,this.d,null),[z])
+y.ls(this,[P.oz,z])
+for(;y.D();){x=y.gk()
 z=J.RE(x)
-b.$2(z.gnl(x),z.gP(x))}},
-gB:function(a){return this.hm},
-V1:function(a){this.VR=null
-this.hm=0;++this.Z1},
-NZ:function(a,b){return this.Bc(b)===!0&&J.xC(this.oB(b),0)},
-gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
+b.$2(z.gG3(x),z.gM(x))}},
+gv:function(a){return this.b},
+V1:function(a){this.Q=null
+this.b=0;++this.c},
+NZ:function(a,b){return this.Bc(b)===!0&&J.mG(this.oB(b),0)},
+gvc:function(a){return H.J(new P.nF(this),[H.u3(this,0)])},
 gUQ:function(a){var z=new P.JO(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
-$asT8:null,
-$isT8:true,
+$asw:null,
+$isw:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.J(new P.Ba(z,y,null,H.J(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"TpZ:12;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"TpZ;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"Ba")}},
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}},
+pn:{
+"^":"r;Q",
+$2:function(a,b){this.Q.q(0,a,b)},
+$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.Q,"Ba")}},
 S6B:{
 "^":"a;",
-gl:function(){var z=this.Ju
+gk:function(){var z=this.d
 if(z==null)return
 return this.Gf(z)},
-Zq:function(a){var z
-for(z=this.x5;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.OC
-if(this.Z1!==z.Z1)throw H.b(P.a4(z))
-y=this.x5
-if(y.length===0){this.Ju=null
-return!1}if(z.wq!==this.wq&&this.Ju!=null){x=this.Ju
-C.Nm.sB(y,0)
-if(x==null)this.Zq(z.VR)
-else{z.oB(x.nl)
-this.Zq(z.VR.T8)}}if(0>=y.length)return H.e(y,0)
+V4:function(a){var z
+for(z=this.a;a!=null;){z.push(a)
+a=a.a}},
+D:function(){var z,y,x
+z=this.Q
+if(this.b!==z.c)throw H.b(P.a4(z))
+y=this.a
+if(y.length===0){this.d=null
+return!1}if(z.d!==this.c&&this.d!=null){x=this.d
+C.Nm.sv(y,0)
+if(x==null)this.V4(z.Q)
+else{z.oB(x.Q)
+this.V4(z.Q.b)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
-this.Ju=z
-this.Zq(z.T8)
+this.d=z
+this.V4(z.b)
 return!0},
-Dd:function(a,b){this.Zq(a.VR)}},
+ls:function(a,b){this.V4(a.Q)}},
 nF:{
-"^":"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.OC
-y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.b},
+gl0:function(a){return this.Q.b===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.DN(z,H.J([],[P.oz]),z.c,z.d,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,0))
+y.ls(z,H.u3(this,0))
+return y},
+Oe:function(a){var z,y
+z=this.Q
+y=P.CH(z.e,z.f,H.u3(this,0))
+y.b=z.b
+y.Q=y.Gy(z.Q)
 return y},
 $isyN:true},
 JO:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.hm},
-gl0:function(a){return this.ZD.hm===0},
-gA:function(a){var z,y
-z=this.ZD
-y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.b},
+gl0:function(a){return this.Q.b===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.ZM(z,H.J([],[P.oz]),z.c,z.d,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,1))
+y.ls(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
-Gf:function(a){return a.nl}},
+"^":"S6B;Q,a,b,c,d",
+Gf:function(a){return a.Q}},
 ZM:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
-Gf:function(a){return a.P},
+"^":"S6B;Q,a,b,c,d",
+Gf:function(a){return a.gM(a)},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;Q,a,b,c,d",
 Gf:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
+$asS6B:function(a){return[[P.oz,a]]}},
+zE:{
+"^":"UFN;e,f,Q,a,b,c,d",
+L4:function(a,b){return this.e.$2(a,b)},
+Bc:function(a){return this.f.$1(a)},
+R2:function(a,b){return this.L4(a,b)},
+gu:function(a){var z=new P.DN(this,H.J([],[P.oz]),this.c,this.d,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+z.ls(this,H.u3(this,0))
+return z},
+gv:function(a){return this.b},
+gl0:function(a){return this.Q==null},
+gor:function(a){return this.Q!=null},
+gtH:function(a){if(this.b===0)throw H.b(H.DU())
+return this.gIn().Q},
+grZ:function(a){if(this.b===0)throw H.b(H.DU())
+return this.gNz().Q},
+tg:function(a,b){return this.Bc(b)===!0&&J.mG(this.oB(b),0)},
+h:function(a,b){var z,y
+z=this.oB(b)
+if(J.mG(z,0))return!1
+y=new P.oz(b,null,null)
+y.$builtinTypeInfo=[null]
+this.Oa(y,z)
+return!0},
+Rz:function(a,b){if(this.Bc(b)!==!0)return!1
+return this.qg(b)!=null},
+FV:function(a,b){var z,y,x,w
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.D();){y=z.c
+x=this.oB(y)
+if(!J.mG(x,0)){w=new P.oz(y,null,null)
+w.$builtinTypeInfo=[null]
+this.Oa(w,x)}}},
+Ex:function(a){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
+if(this.Bc(y)===!0)this.qg(y)}},
+iQ:function(a){if(this.Bc(a)!==!0)return
+if(!J.mG(this.oB(a),0))return
+return this.Q.Q},
+Gy:function(a){var z
+if(a==null)return
+z=new P.oz(a.Q,null,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+z.a=this.Gy(a.a)
+z.b=this.Gy(a.b)
+return z},
+V1:function(a){this.Q=null
+this.b=0;++this.c},
+Oe:function(a){var z=P.CH(this.e,this.f,H.u3(this,0))
+z.b=this.b
+z.Q=this.Gy(this.Q)
+return z},
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
+static:{CH:function(a,b,c){return H.J(new P.zE(a,b,null,H.J(new P.oz(null,null,null),[c]),0,0,0),[c])}}},
+W8N:{
+"^":"vX1+Et;",
+$isQV:true,
+$asQV:null},
+UFN:{
+"^":"W8N+lf;",
+$isOl:true,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+y8V:{
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}}}],["","",,P,{
 "^":"",
 VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
 KH:function(a){var z
@@ -8642,478 +8179,475 @@
 return a},
 jc:function(a,b){var z,y,x,w
 x=a
-if(typeof x!=="string")throw H.b(P.u(a))
+if(typeof x!=="string")throw H.b(P.p(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.rr(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],
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,53,2],
 f1:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:function(a){var z,y,x,w,v,u
 if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.Q,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
 return a}z=Object.create(null)
 x=new P.r4(a,z,null)
 w=x.oD()
-for(v=this.a,y=0;y<w.length;++y){u=w[y]
-z[u]=v.$2(u,this.$1(a[u]))}x.PF=z
-return x},
-$isEH:true},
+for(v=this.Q,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.Q=z
+return x}},
 r4:{
-"^":"a;PF,LK,Mq",
-t:function(a,b){var z,y
-z=this.LK
-if(z==null)return this.Mq.t(0,b)
+"^":"a;Q,a,b",
+p:function(a,b){var z,y
+z=this.a
+if(z==null)return this.b.p(0,b)
 else if(typeof b!=="string")return
 else{y=z[b]
 return typeof y=="undefined"?this.fb(b):y}},
-gB:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+gv:function(a){var z
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z},
 gl0:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z===0},
 gor:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z>0},
 gvc:function(a){var z
-if(this.LK==null){z=this.Mq
+if(this.a==null){z=this.b
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.J(new H.ii(),[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.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
+if(this.a==null){z=this.b
+return z.gUQ(z)}return H.fR(this.oD(),new P.Ni(this),null,null)},
+q:function(a,b,c){var z,y
+if(this.a==null)this.b.q(0,b,c)
+else if(this.NZ(0,b)){z=this.a
 z[b]=c
-y=this.PF
-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)
+y=this.Q
+if(y==null?z!=null:y!==z)y[b]=null}else this.XK().q(0,b,c)},
+FV:function(a,b){C.Nm.aN(b,new P.E5(this))},
+NZ:function(a,b){if(this.a==null)return this.b.NZ(0,b)
 if(typeof b!=="string")return!1
-return Object.prototype.hasOwnProperty.call(this.PF,b)},
+return Object.prototype.hasOwnProperty.call(this.Q,b)},
 to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.p(0,b)
 z=c.$0()
-this.u(0,b,z)
+this.q(0,b,z)
 return z},
-Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.tZ().Rz(0,b)},
+Rz:function(a,b){if(this.a!=null&&!this.NZ(0,b))return
+return this.XK().Rz(0,b)},
 V1:function(a){var z
-if(this.LK==null)this.Mq.V1(0)
-else{z=this.Mq
+if(this.a==null)this.b.V1(0)
+else{z=this.b
 if(z!=null)J.U2(z)
-this.LK=null
-this.PF=null
-this.Mq=P.Fl(null,null)}},
+this.a=null
+this.Q=null
+this.b=P.A(null,null)}},
 aN:function(a,b){var z,y,x,w
-if(this.LK==null)return this.Mq.aN(0,b)
+if(this.a==null)return this.b.aN(0,b)
 z=this.oD()
 for(y=0;y<z.length;++y){x=z[y]
-w=this.LK[x]
-if(typeof w=="undefined"){w=P.KH(this.PF[x])
-this.LK[x]=w}b.$2(x,w)
-if(z!==this.Mq)throw H.b(P.a4(this))}},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-oD:function(){var z=this.Mq
-if(z==null){z=Object.keys(this.PF)
-this.Mq=z}return z},
-tZ:function(){var z,y,x,w,v
-if(this.LK==null)return this.Mq
-z=P.Fl(null,null)
+w=this.a[x]
+if(typeof w=="undefined"){w=P.KH(this.Q[x])
+this.a[x]=w}b.$2(x,w)
+if(z!==this.b)throw H.b(P.a4(this))}},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+oD:function(){var z=this.b
+if(z==null){z=Object.keys(this.Q)
+this.b=z}return z},
+XK:function(){var z,y,x,w,v
+if(this.a==null)return this.b
+z=P.A(null,null)
 y=this.oD()
 for(x=0;w=y.length,x<w;++x){v=y[x]
-z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
-else C.Nm.sB(y,0)
-this.LK=null
-this.PF=null
-this.Mq=z
+z.q(0,v,this.p(0,v))}if(w===0)y.push(null)
+else C.Nm.sv(y,0)
+this.a=null
+this.Q=null
+this.b=z
 return z},
 fb:function(a){var z
-if(!Object.prototype.hasOwnProperty.call(this.PF,a))return
-z=P.KH(this.PF[a])
-return this.LK[a]=z},
+if(!Object.prototype.hasOwnProperty.call(this.Q,a))return
+z=P.KH(this.Q[a])
+return this.a[a]=z},
 $isFo:true,
 $asFo:function(){return[null,null]},
-$isT8:true,
-$asT8:function(){return[null,null]}},
-A5:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
+$isw:true,
+$asw:function(){return[null,null]}},
+Ni:{
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
 E5:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-Uk:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,b)}},
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.I,[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:{NM:function(a,b){return new P.Ud(a,b)}}},
+"^":"XS;Q,a",
+X:[function(a){if(this.a!=null)return"Converting object to an encodable object failed."
+else return"Converting object did not return an encodable object."},"$0","gCR",0,0,0],
+static:{Gy: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],
+"^":"Ud;Q,a",
+X:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,0],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;Fs<,xq",
-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.N7(a,null)},
-gZE:function(){return C.cb},
-gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+"^":"Ukr;Fs:Q<,a",
+cW:function(a,b){return P.jc(a,this.gHe().Q)},
+kV:function(a){return this.cW(a,null)},
+Co:function(a,b){var z=this.gZE()
+return P.EB(a,z.a,z.Q)},
+KP:function(a){return this.Co(a,null)},
+gZE:function(){return C.Sr},
+gHe:function(){return C.A3},
+$asUkr:function(){return[P.a,P.I]}},
 ojF:{
-"^":"wIe;UM,Wl",
-$aswIe:function(){return[P.a,P.qU]}},
-c5:{
-"^":"wIe;Fs<",
-$aswIe:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"a;xq,qR,SK",
-HT:function(a){return this.xq.$1(a)},
-Ip:function(a){var z,y,x,w,v,u,t
+"^":"wIe;Q,a",
+$aswIe:function(){return[P.a,P.I]}},
+Mx:{
+"^":"wIe;Fs:Q<",
+$aswIe:function(){return[P.I,P.a]}},
+Shx:{
+"^":"a;",
+HT:function(a){return this.a.$1(a)},
+vp:function(a){var z,y,x,w,v,u
 z=J.U6(a)
-y=z.gB(a)
-if(typeof y!=="number")return H.s(y)
-x=this.qR
+y=z.gv(a)
+if(typeof y!=="number")return H.o(y)
+x=0
 w=0
-v=0
-for(;v<y;++v){u=z.j(a,v)
-if(u>92)continue
-if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.IN+=t}w=v+1
-t=H.mx(92)
-x.IN+=t
-switch(u){case 8:t=H.mx(98)
-x.IN+=t
+for(;w<y;++w){v=z.O2(a,w)
+if(v>92)continue
+if(v<32){if(w>x)this.pN(a,x,w)
+x=w+1
+this.NY(92)
+switch(v){case 8:this.NY(98)
 break
-case 9:t=H.mx(116)
-x.IN+=t
+case 9:this.NY(116)
 break
-case 10:t=H.mx(110)
-x.IN+=t
+case 10:this.NY(110)
 break
-case 12:t=H.mx(102)
-x.IN+=t
+case 12:this.NY(102)
 break
-case 13:t=H.mx(114)
-x.IN+=t
+case 13:this.NY(114)
 break
-default:t=H.mx(117)
-x.IN+=t
-t=H.mx(48)
-x.IN+=t
-t=H.mx(48)
-x.IN+=t
-t=u>>>4&15
-t=H.mx(t<10?48+t:87+t)
-x.IN+=t
-t=u&15
-t=H.mx(t<10?48+t:87+t)
-x.IN+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.IN+=t}w=v+1
-t=H.mx(92)
-x.IN+=t
-t=H.mx(u)
-x.IN+=t}}if(w===0)x.KF(a)
-else if(w<y)x.KF(z.Nj(a,w,y))},
-WD:function(a){var z,y,x,w
-for(z=this.SK,y=z.length,x=0;x<y;++x){w=z[x]
+default:this.NY(117)
+this.NY(48)
+this.NY(48)
+u=v>>>4&15
+this.NY(u<10?48+u:87+u)
+u=v&15
+this.NY(u<10?48+u:87+u)
+break}}else if(v===34||v===92){if(w>x)this.pN(a,x,w)
+x=w+1
+this.NY(92)
+this.NY(v)}}if(x===0)this.K6(a)
+else if(x<y)this.pN(a,x,y)},
+Jn:function(a){var z,y,x,w
+for(z=this.Q,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
-rl:function(a){var z,y,x,w
-if(!this.Jc(a)){this.WD(a)
+E5:function(a){var z=this.Q
+if(0>=z.length)return H.e(z,0)
+z.pop()},
+QD:function(a){var z,y,x,w
+if(this.tM(a))return
+this.Jn(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.NM(a,null)
-throw H.b(x)}x=this.SK
+if(!this.tM(z)){x=P.Gy(a,null)
+throw H.b(x)}x=this.Q
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
-Jc:function(a){var z,y,x,w
-z={}
-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")
-return!0}else if(a==null){this.qR.KF("null")
-return!0}else if(typeof a==="string"){z=this.qR
-z.KF("\"")
-this.Ip(a)
-z.KF("\"")
-return!0}else{y=J.x(a)
-if(!!y.$isWO){this.WD(a)
-z=this.qR
-z.KF("[")
-if(y.gB(a)>0){this.rl(y.t(a,0))
-for(x=1;x<y.gB(a);++x){z.IN+=","
-this.rl(y.t(a,x))}}z.KF("]")
+throw H.b(P.Gy(a,y))}},
+tM:function(a){var z
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+this.ID(a)
+return!0}else if(a===!0){this.K6("true")
+return!0}else if(a===!1){this.K6("false")
+return!0}else if(a==null){this.K6("null")
+return!0}else if(typeof a==="string"){this.K6("\"")
+this.vp(a)
+this.K6("\"")
+return!0}else{z=J.t(a)
+if(!!z.$isWO){this.Jn(a)
+this.lK(a)
 this.E5(a)
-return!0}else if(!!y.$isT8){this.WD(a)
-w=this.qR
-w.KF("{")
-z.a="\""
-y.aN(a,new P.tF(z,this))
-w.KF("}")
+return!0}else if(!!z.$isw){this.Jn(a)
+this.jw(a)
 this.E5(a)
 return!0}else return!1}},
-E5:function(a){var z=this.SK
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,KQz,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)
-return z.IN}}},
-tF:{
-"^":"TpZ:82;a,b",
-$2:[function(a,b){var z,y,x
-z=this.b
-y=z.qR
-x=this.a
-y.KF(x.a)
-x.a=",\""
-z.Ip(a)
-y.KF("\":")
-z.rl(b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true},
-u5F:{
-"^":"Ziv;QA",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"wIe;",
-Sw:function(a){var z,y,x
+lK:function(a){var z,y
+this.K6("[")
 z=J.U6(a)
-y=J.vX(z.gB(a),3)
-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.Nm.aM(y,0,x.o9)},
-$aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
+if(z.gv(a)>0){this.QD(z.p(a,0))
+for(y=1;y<z.gv(a);++y){this.K6(",")
+this.QD(z.p(a,y))}}this.K6("]")},
+jw:function(a){var z={}
+this.K6("{")
+z.a="\""
+J.Me(a,new P.ti(z,this))
+this.K6("}")}},
+ti:{
+"^":"r:82;Q,a",
+$2:function(a,b){var z,y
+z=this.a
+y=this.Q
+z.K6(y.a)
+y.a=",\""
+z.vp(a)
+z.K6("\":")
+z.QD(b)}},
+tu:{
+"^":"Shx;b,Q,a",
+ID:function(a){this.b.KF(C.CD.X(a))},
+K6:function(a){var z=typeof a==="string"?a:H.d(a)
+this.b.Q+=z},
+pN:function(a,b,c){var z=J.Nj(a,b,c)
+this.b.Q+=z},
+NY:function(a){var z=H.mx(a)
+this.b.Q+=z},
+static:{EB:function(a,b,c){var z,y,x
+z=P.p9("")
+y=P.Jn()
+x=new P.tu(z,[],y)
+x.QD(a)
+y=z.Q
+return y.charCodeAt(0)==0?y:y}}},
+u5F:{
+"^":"Ziv;Q",
+goc:function(a){return"utf-8"},
+gZE:function(){return new P.E3()}},
+E3:{
+"^":"wIe;",
+ME:function(a,b,c){var z,y,x,w,v,u
+z=J.U6(a)
+y=z.gv(a)
+P.iZ(b,c,y,null,null,null)
+x=J.Wx(y)
+w=x.T(y,b)
+v=J.t(w)
+if(v.m(w,0))return new Uint8Array(0)
+v=v.R(w,3)
+if(typeof v!=="number"||Math.floor(v)!==v)H.vh(P.p("Invalid length "+H.d(v)))
+v=new Uint8Array(v)
+u=new P.Rw(0,0,v)
+if(u.Gx(a,b,y)!==y)u.O6(z.O2(a,x.T(y,1)),0)
+return new Uint8Array(v.subarray(0,C.Jm.i4(v,0,u.a,v.length)))},
+WJ:function(a){return this.ME(a,0,null)},
+$aswIe:function(){return[P.I,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;UfS,o9,Zj",
+"^":"a;Q,a,b",
 O6:function(a,b){var z,y,x,w,v
-z=this.Zj
-y=this.o9
+z=this.b
+y=this.a
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.o9=w
+this.a=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.o9=y
+this.a=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.o9=w
+this.a=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.o9=w+1
+this.a=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.o9=w
+this.a=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.o9=y
+this.a=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.o9=y+1
+this.a=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
 Gx:function(a,b,c){var z,y,x,w,v,u,t,s
-if(b!==c&&(J.Pp(a,J.bI(c,1))&64512)===55296)c=J.bI(c,1)
-if(typeof c!=="number")return H.s(c)
-z=this.Zj
+if(b!==c&&(J.IC(a,J.D5(c,1))&64512)===55296)c=J.D5(c,1)
+if(typeof c!=="number")return H.o(c)
+z=this.b
 y=z.length
-x=J.Qe(a)
+x=J.NH(a)
 w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.o9
+for(;w<c;++w){v=x.O2(a,w)
+if(v<=127){u=this.a
 if(u>=y)break
-this.o9=u+1
-z[u]=v}else if((v&64512)===55296){if(this.o9+3>=y)break
+this.a=u+1
+z[u]=v}else if((v&64512)===55296){if(this.a+3>=y)break
 t=w+1
-if(this.O6(v,x.j(a,t)))w=t}else if(v<=2047){u=this.o9
+if(this.O6(v,x.O2(a,t)))w=t}else if(v<=2047){u=this.a
 s=u+1
 if(s>=y)break
-this.o9=s
+this.a=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.o9=s+1
-z[s]=128|v&63}else{u=this.o9
+this.a=s+1
+z[s]=128|v&63}else{u=this.a
 if(u+2>=y)break
 s=u+1
-this.o9=s
+this.a=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.o9=u
+this.a=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.o9=u+1
+this.a=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;QA",
-Sw:function(a){var z,y
-z=P.p9("")
-y=new P.Dd(this.QA,z,!0,0,0,0)
-y.ME(a,0,J.q8(a))
-y.fZ()
-return z.IN},
-$aswIe:function(){return[[P.WO,P.KN],P.qU]}},
+"^":"wIe;Q",
+ME:function(a,b,c){var z,y,x,w
+z=J.wS(a)
+P.iZ(b,c,z,null,null,null)
+y=P.p9("")
+x=new P.Dd(this.Q,y,!0,0,0,0)
+x.ME(a,b,z)
+x.fZ()
+w=y.Q
+return w.charCodeAt(0)==0?w:w},
+WJ:function(a){return this.ME(a,0,null)},
+$aswIe:function(){return[[P.WO,P.KN],P.I]}},
 Dd:{
-"^":"a;QA,C4,YN,Dp,rw,pt",
+"^":"a;Q,a,b,c,d,e",
 xO:function(a){this.fZ()},
-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
-this.pt=0}},
+fZ:function(){if(this.d>0){if(!this.Q)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
+this.a.KF(H.mx(65533))
+this.c=0
+this.d=0
+this.e=0}},
 ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.Dp
-y=this.rw
-x=this.pt
-this.Dp=0
-this.rw=0
-this.pt=0
-w=new P.wh(c)
+z=this.c
+y=this.d
+x=this.e
+this.c=0
+this.d=0
+this.e=0
+w=new P.b2(c)
 v=new P.yn(this,a,b,c)
-$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)
+$loop$0:for(u=this.a,t=!this.Q,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+q=s.p(a,r)
 p=J.Wx(q)
-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
+if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.b=!1
 p=H.mx(65533)
-u.IN+=p
+u.Q+=p
 y=0
 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.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.rr("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.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
-if(typeof o!=="number")return H.s(o)
+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))
+z=65533}if(!this.b||z!==65279){p=H.mx(z)
+u.Q+=p}this.b=!1}}for(;r<c;r=n){o=w.$2(a,r)
+if(J.vU(o,0)){this.b=!1
+if(typeof o!=="number")return H.o(o)
 n=r+o
 v.$2(r,n)
 if(n===c)break
 r=n}n=r+1
-q=s.t(a,r)
+q=s.p(a,r)
 p=J.Wx(q)
-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))
+if(p.w(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.G(q),16),null,null))
 p=H.mx(65533)
-u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
+u.Q+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
 x=1
 continue $loop$0}if(p.i(q,240)===224){z=p.i(q,15)
 y=2
 x=2
-continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
+continue $loop$0}if(p.i(q,248)===240&&p.w(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
-this.YN=!1
+continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.b=!1
 p=H.mx(65533)
-u.IN+=p
+u.Q+=p
 z=65533
 y=0
-x=0}}break $loop$0}if(y>0){this.Dp=z
-this.rw=y
-this.pt=x}},
+x=0}}break $loop$0}if(y>0){this.c=z
+this.d=y
+this.e=x}},
 static:{"^":"ADi"}},
-wh:{
-"^":"TpZ:142;a",
+b2:{
+"^":"r:142;Q",
 $2:function(a,b){var z,y,x,w
-z=this.a
-for(y=J.U6(a),x=b;x<z;++x){w=y.t(a,x)
-if(J.mQ(w,127)!==w)return x-b}return z-b},
-$isEH:true},
+z=this.Q
+for(y=J.U6(a),x=b;x<z;++x){w=y.p(a,x)
+if(J.mQ(w,127)!==w)return x-b}return z-b}},
 yn:{
-"^":"TpZ:143;b,c,d,e",
-$2:function(a,b){var z,y,x
-z=a===0&&b===J.q8(this.c)
-y=this.b
-x=this.c
-if(z)y.C4.KF(P.HM(x))
-else y.C4.KF(P.HM(J.Fd(x,a,b)))},
-$isEH:true}}],["","",,P,{
+"^":"r:143;Q,a,b,c",
+$2:function(a,b){this.Q.a.KF(P.Qe(this.a,a,b))}}}],["","",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
-hl:function(a){var z,y,x,w,v
-if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
-if(typeof a==="string"){z=new P.Rn("")
-z.IN="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.yo.j(a,x)
-if(v<=31)if(v===10)w=z.IN+="\\n"
-else if(v===13)w=z.IN+="\\r"
-else if(v===9)w=z.IN+="\\t"
-else{w=z.IN+="\\x"
-if(v<16)z.IN=w+"0"
-else{z.IN=w+"1"
-v-=16}w=H.mx(v<10?48+v:87+v)
-w=z.IN+=w}else if(v===92)w=z.IN+="\\\\"
-else if(v===34)w=z.IN+="\\\""
-else{w=H.mx(v)
-w=z.IN+=w}}y=w+"\""
-z.IN=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+DM:function(a,b,c){var z,y,x,w
+if(b<0)throw H.b(P.ve(b,0,J.wS(a),null,null))
+z=c==null
+if(!z&&c<b)throw H.b(P.ve(c,b,J.wS(a),null,null))
+y=J.Nx(a)
+for(x=0;x<b;++x)if(!y.D())throw H.b(P.ve(b,0,x,null,null))
+w=[]
+if(z)for(;y.D();)w.push(y.c)
+else for(x=b;x<c;++x){if(!y.D())throw H.b(P.ve(c,b,x,null,null))
+w.push(y.c)}return H.LY(w)},
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,54,52,55],
+hl:function(a){if(typeof a==="number"||typeof a==="boolean"||null==a)return J.Lz(a)
+if(typeof a==="string")return JSON.stringify(a)
+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],
-F:function(a,b,c){var z,y
-z=H.VM([],[c])
-for(y=J.mY(a);y.G();)z.push(y.gl())
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,56],
+xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,57],
+z:function(a,b,c){var z,y
+z=H.J([],[c])
+for(y=J.Nx(a);y.D();)z.push(y.gk())
 if(b)return z
-z.fixed$length=init
+z.fixed$length=Array
 return z},
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
+Qe:function(a,b,c){var z,y
+if(a.constructor!==Array)return P.DM(a,b,c)
+z=a.length
+if(b<0||b>z)throw H.b(P.ve(b,0,z,null,null))
+if(c==null)c=z
+else if(c<b||c>z)throw H.b(P.ve(c,b,z,null,null))
+if(b<=0){if(typeof c!=="number")return c.w()
+y=c<z}else y=!0
+return H.LY(y?C.Nm.D6(a,b,c):a)},
 Y25:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a.gOB(a),b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a.gOB(a),b)}},
 CL:{
-"^":"TpZ:144;a",
-$2:function(a,b){var z=this.a
+"^":"r:144;Q",
+$2:function(a,b){var z=this.Q
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.ro(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
+z.a.KF(P.hl(b));++z.b}},
 SQ:{
 "^":"a;",
 $isSQ:true},
@@ -9121,14 +8655,14 @@
 fRn:{
 "^":"a;"},
 iP:{
-"^":"a;rq<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.rq,b.rq)&&this.aL===b.aL},
-iM:function(a,b){return J.FW(this.rq,b.grq())},
-giO:function(a){return this.rq},
-bu:[function(a){var z,y,x,w,v,u,t,s
-z=this.aL
+"^":"a;rq:Q<,a",
+m:function(a,b){if(b==null)return!1
+if(!J.t(b).$isiP)return!1
+return J.mG(this.Q,b.Q)&&this.a===b.a},
+iM:function(a,b){return J.FW(this.Q,b.grq())},
+giO:function(a){return this.Q},
+X:[function(a){var z,y,x,w,v,u,t,s
+z=this.a
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
 x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
 w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
@@ -9137,18 +8671,17 @@
 t=P.h0(H.Sw(this))
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
-h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-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))},
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,0],
+h:function(a,b){return P.Wu(J.WB(this.Q,b.gVs()),this.a)},
+gX3:function(){return H.KL(this)},
+gcO:function(){return H.ch(this)},
+gIv:function(){return H.Sw(this)},
+RM:function(a,b){if(J.vU(J.yH(a),8640000000000000))throw H.b(P.p(a))},
 $isiP:true,
-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)
+static:{"^":"Oj2,Vp,dfk,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)
 if(z!=null){y=new P.ci()
-x=z.pX
+x=z.a
 if(1>=x.length)return H.e(x,1)
 w=H.BU(x[1],null,null)
 if(2>=x.length)return H.e(x,2)
@@ -9162,25 +8695,25 @@
 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.Dv(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.NQ(J.lX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
 if(8>=o)return H.e(x,8)
 if(x[8]!=null){if(9>=o)return H.e(x,9)
 o=x[9]
-if(o!=null){n=J.xC(o,"-")?-1:1
+if(o!=null){n=J.mG(o,"-")?-1:1
 if(10>=x.length)return H.e(x,10)
 m=H.BU(x[10],null,null)
 if(11>=x.length)return H.e(x,11)
 l=y.$1(x[11])
-if(typeof m!=="number")return H.s(m)
+if(typeof m!=="number")return H.o(m)
 l=J.WB(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(s,n*l)}k=!0}else k=!1
+if(typeof l!=="number")return H.o(l)
+s=J.D5(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.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)
+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)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9193,170 +8726,194 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 ci:{
-"^":"TpZ:145;",
+"^":"r:145;",
 $1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
+return H.BU(a,null,null)}},
 Rq:{
-"^":"TpZ:146;",
+"^":"r:146;",
 $1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-Vf:{
-"^":"lf;",
-$isVf:true},
+return H.RR(a,null)}},
+CP:{
+"^":"FK;",
+$isCP:true},
 "+double":0,
 a6:{
-"^":"a;m5<",
-g:function(a,b){return P.ii(0,0,this.m5+b.gm5(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.m5-b.gm5(),0,0,0)},
-U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.RE(this.m5*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.zl())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.m5,b),0,0,0)},
-C:function(a,b){return this.m5<b.gm5()},
-D:function(a,b){return this.m5>b.gm5()},
-E:function(a,b){return this.m5<=b.gm5()},
-F:function(a,b){return this.m5>=b.gm5()},
-gVs:function(){return C.CD.BU(this.m5,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.m5===b.m5},
-giO:function(a){return this.m5&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.m5,b.gm5())},
-bu:[function(a){var z,y,x,w,v
+"^":"a;m5:Q<",
+g:function(a,b){return new P.a6(this.Q+b.gm5())},
+T:function(a,b){return new P.a6(this.Q-b.gm5())},
+R:function(a,b){if(typeof b!=="number")return H.o(b)
+return new P.a6(C.CD.yu(C.CD.RE(this.Q*b)))},
+W:function(a,b){if(J.mG(b,0))throw H.b(P.zl())
+if(typeof b!=="number")return H.o(b)
+return new P.a6(C.jn.W(this.Q,b))},
+w:function(a,b){return this.Q<b.gm5()},
+A:function(a,b){return this.Q>b.gm5()},
+B:function(a,b){return this.Q<=b.gm5()},
+C:function(a,b){return this.Q>=b.gm5()},
+gVs:function(){return C.jn.BU(this.Q,1000)},
+m:function(a,b){if(b==null)return!1
+if(!J.t(b).$isa6)return!1
+return this.Q===b.Q},
+giO:function(a){return this.Q&0x1FFFFFFF},
+iM:function(a,b){return C.jn.iM(this.Q,b.gm5())},
+X:[function(a){var z,y,x,w,v
 z=new P.DW()
-y=this.m5
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.BU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.BU(y,1000000),60))
-v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.BU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,73],
-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)},
+y=this.Q
+if(y<0)return"-"+new P.a6(-y).X(0)
+x=z.$1(C.jn.JV(C.jn.BU(y,60000000),60))
+w=z.$1(C.jn.JV(C.jn.BU(y,1000000),60))
+v=new P.P7().$1(C.jn.JV(y,1000000))
+return""+C.jn.BU(y,3600000000)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,0],
+Vy:function(a){return new P.a6(Math.abs(this.Q))},
+G:function(a){return new P.a6(-this.Q)},
 $isa6:true,
-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)}}},
+static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,jS,IGB,DoM,CvD,MV,IJZ,xF,Wr,S84,rGr",xC: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)
-if(a>=10000)return"0"+H.d(a)
-if(a>=1000)return"00"+H.d(a)
-if(a>=100)return"000"+H.d(a)
-if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
-$isEH:true},
+"^":"r:16;",
+$1:function(a){if(a>=100000)return""+a
+if(a>=10000)return"0"+a
+if(a>=1000)return"00"+a
+if(a>=100)return"000"+a
+if(a>=10)return"0000"+a
+return"00000"+a}},
 DW:{
-"^":"TpZ:14;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
+"^":"r:16;",
+$1:function(a){if(a>=10)return""+a
+return"0"+a}},
 XS:{
 "^":"a;",
-gI4:function(){return new H.oP(this.$thrownJsError,null)},
+gI4:function(){return new H.XO(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gCR",0,0,73]},
+X:[function(a){return"Throw of null."},"$0","gCR",0,0,0]},
 OY:{
-"^":"XS;G1>",
-bu:[function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gCR",0,0,73],
-static:{u:function(a){return new P.OY(a)}}},
+"^":"XS;Q,a,oc:b>,G1:c>",
+X:[function(a){var z,y
+if(!this.Q){z=this.c
+return z!=null?"Invalid arguments(s): "+H.d(z):"Invalid arguments(s)"}z=this.b
+y=z!=null?" ("+H.d(z)+")":""
+return H.d(this.c)+y+": "+H.d(P.hl(this.a))},"$0","gCR",0,0,0],
+static:{p:function(a){return new P.OY(!1,null,null,a)},hG:function(a){return new P.OY(!0,null,a,"Must not be null")}}},
 Sn:{
-"^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
+"^":"OY;J:d>,wQ:e<,Q,a,b,c",
+X:[function(a){var z,y,x,w,v
+if(!this.Q)return"RangeError: "+H.d(this.c)
+z=P.hl(this.a)
+y=this.d
+if(y==null){y=this.e
+x=y!=null?": Not less than or equal to "+H.d(y):""}else{w=this.e
+if(w==null)x=": Not greater than or equal to "+H.d(y)
+else{v=J.Wx(w)
+if(v.A(w,y))x=": Not in range "+H.d(y)+".."+H.d(w)+", inclusive."
+else x=v.w(w,y)?": Valid value range is empty":": Only valid value is "+H.d(y)}}return"RangeError: "+H.d(this.c)+" ("+H.d(z)+")"+x},"$0","gCR",0,0,0],
+static:{KP:function(a){return new P.Sn(null,null,!1,null,null,a)},D:function(a,b,c){return new P.Sn(null,null,!0,a,b,"Value not in range")},ve:function(a,b,c,d,e){return new P.Sn(b,c,!0,a,d,"Invalid value")},wA:function(a,b,c,d,e){if(a<b||a>c)throw H.b(P.ve(a,b,c,d,e))},iZ:function(a,b,c,d,e,f){var z=J.Wx(a)
+if(z.w(a,0)||z.A(a,c))throw H.b(P.ve(a,0,c,"start",f))
+if(b!=null){z=J.Wx(b)
+z=z.w(b,a)||z.A(b,c)}else z=!1
+if(z)throw H.b(P.ve(b,a,c,"end",f))}}},
+eY:{
+"^":"OY;d,v:e>,Q,a,b,c",
+gJ:function(a){return 0},
+gwQ:function(){return J.D5(this.e,1)},
+X:[function(a){var z,y,x
+z=P.hl(this.d)
+y="index should be less than "+H.d(this.e)
+x=this.a
+if(J.UN(x,0))y="index must not be negative"
+return"RangeError: "+H.d(this.c)+" ("+H.d(z)+"["+H.d(x)+"]): "+y},"$0","gCR",0,0,0],
+$isXS:true,
+static:{Hj:function(a,b,c,d,e){var z=e!=null?e:J.wS(b)
+return new P.eY(b,z,!0,a,c,"Index out of range")}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
 JS:{
-"^":"XS;uF,vI,mP,ae,wI",
-bu:[function(a){var z,y,x,w,v,u
+"^":"XS;Q,a,b,c,d",
+X:[function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
-for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.IN+=", "}v=z.a
+for(y=this.b,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
+v.Q+=", "}v=z.a
 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: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
+v.Q+=typeof u==="string"?u:H.d(u)}this.c.aN(0,new P.CL(z))
+return"NoSuchMethodError : method not found: '"+this.a.X(0)+"'\nReceiver: "+H.d(P.hl(this.Q))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,0],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
-"^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){return"Unsupported operation: "+this.Q},"$0","gCR",0,0,0],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
-"^":"XS;G1>",
-bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){var z=this.Q
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,0],
 $isXS:true,
 static:{nO:function(a){return new P.rM(a)}}},
 lj:{
-"^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gCR",0,0,73],
-static:{w:function(a){return new P.lj(a)}}},
+"^":"XS;G1:Q>",
+X:[function(a){return"Bad state: "+this.Q},"$0","gCR",0,0,0],
+static:{s:function(a){return new P.lj(a)}}},
 UV:{
-"^":"XS;YA",
-bu:[function(a){var z=this.YA
+"^":"XS;Q",
+X:[function(a){var z=this.Q
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,73],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,0],
 static:{a4:function(a){return new P.UV(a)}}},
 k5C:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gCR",0,0,73],
+X:[function(a){return"Out of Memory"},"$0","gCR",0,0,0],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gCR",0,0,73],
+X:[function(a){return"Stack Overflow"},"$0","gCR",0,0,0],
 gI4:function(){return},
 $isXS:true},
 t7:{
-"^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gCR",0,0,73],
+"^":"XS;Q",
+X:[function(a){return"Reading static variable '"+this.Q+"' during its initialization"},"$0","gCR",0,0,0],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
-"^":"a;G1>",
-bu:[function(a){var z=this.G1
+"^":"a;G1:Q>",
+X:[function(a){var z=this.Q
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gCR",0,0,73]},
+return"Exception: "+H.d(z)},"$0","gCR",0,0,0]},
 oe:{
-"^":"a;G1>,FF>,D7>",
-bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=this.G1
+"^":"a;G1:Q>,FF:a>,D7:b>",
+X:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.Q
 y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
-x=this.D7
-w=this.FF
+x=this.b
+w=this.a
 if(typeof w!=="string")return x!=null?y+(" (at offset "+H.d(x)+")"):y
-if(x!=null)if(!(x<0)){z=J.q8(w)
-if(typeof z!=="number")return H.s(z)
+if(x!=null)if(!(x<0)){z=J.wS(w)
+if(typeof z!=="number")return H.o(z)
 z=x>z}else z=!0
 else z=!1
 if(z)x=null
 if(x==null){z=J.U6(w)
-if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
-return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(J.vU(z.gv(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.O2(w,s)
 if(r===10){if(u!==s||t!==!0)++v
 u=s+1
 t=!1}else if(r===13){++v
 u=s+1
 t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
-q=z.gB(w)
+q=z.gv(w)
 s=x
-while(!0){p=z.gB(w)
-if(typeof p!=="number")return H.s(p)
+while(!0){p=z.gv(w)
+if(typeof p!=="number")return H.o(p)
 if(!(s<p))break
-r=z.j(w,s)
+r=z.O2(w,s)
 if(r===10||r===13){q=s
 break}++s}p=J.Wx(q)
-if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+if(J.vU(p.T(q,u),78))if(x-u<75){o=u+75
 n=u
 m=""
-l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+l="..."}else{if(J.UN(p.T(q,x),75)){n=p.T(q,75)
 o=q
 l=""}else{n=x-36
 o=x+36
@@ -9364,33 +8921,33 @@
 n=u
 m=""
 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:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
-Ep:{
+if(typeof n!=="number")return H.o(n)
+return y+m+k+l+"\n"+C.yo.R(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,0],
+static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
+eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
-static:{zl:function(){return new P.Ep()}}},
-qo:{
-"^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.VKg(b,"expando$values")
-return z==null?null:H.VKg(z,this.V2())},
-u:function(a,b,c){var z=H.VKg(b,"expando$values")
+X:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,0],
+static:{zl:function(){return new P.eV()}}},
+nj:{
+"^":"a;oc:Q>",
+X:[function(a){return"Expando:"+H.d(this.Q)},"$0","gCR",0,0,0],
+p:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.By())},
+q:function(a,b,c){var z=H.of(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.VKg(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
+H.wV(b,"expando$values",z)}H.wV(z,this.By(),c)},
+By:function(){var z,y
+z=H.of(this,"expando$key")
+if(z==null){y=$.Kc
+$.Kc=y+1
 z="expando$key$"+y
 H.wV(this,"expando$key",z)}return z},
-static:{"^":"bZT,rly,Km"}},
+static:{"^":"bZT,rly,Kc"}},
 EH:{
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"lf;",
+"^":"FK;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9407,24 +8964,24 @@
 $isQV:true,
 $asQV:null},
 "+List":0,
-T8:{
+w:{
 "^":"a;",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gCR",0,0,73]},
+X:[function(a){return"null"},"$0","gCR",0,0,0]},
 "+Null":0,
-lf:{
+FK:{
 "^":"a;",
-$islf:true},
+$isFK:true},
 "+num":0,
 a:{
 "^":";",
-n:function(a,b){return this===b},
-giO:function(a){return H.wP(this)},
-bu:[function(a){return H.a5(this)},"$0","gCR",0,0,73],
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
+m:function(a,b){return this===b},
+giO:function(a){return H.eQ(this)},
+X:["L7",function(a){return H.a5(this)},"$0","gCR",0,0,0],
+P:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.wO(this),null)},
 $isa:true},
 Od:{
@@ -9437,63 +8994,64 @@
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;n2,Mw",
-D5:function(a){var z,y
-z=this.n2==null
-if(!z&&this.Mw==null)return
-y=$.hG
-if(z)this.n2=y.$0()
-else{this.n2=J.bI(y.$0(),J.bI(this.Mw,this.n2))
-this.Mw=null}},
+"^":"a;Q,a",
+wE:[function(a){var z,y
+z=this.Q==null
+if(!z&&this.a==null)return
+y=$.Zg
+if(z)this.Q=y.$0()
+else{this.Q=J.D5(y.$0(),J.D5(this.a,this.Q))
+this.a=null}},"$0","gJ",0,0,1],
 CH:function(a){var z
-if(this.n2==null)return
-z=$.hG.$0()
-this.n2=z
-if(this.Mw!=null)this.Mw=z},
-giU:function(){var z,y
-z=this.n2
+if(this.Q==null)return
+z=$.Zg.$0()
+this.Q=z
+if(this.a!=null)this.a=z},
+gTY:function(){var z,y
+z=this.Q
 if(z==null)return 0
-y=this.Mw
-return y==null?J.bI($.hG.$0(),this.n2):J.bI(y,z)},
+y=this.a
+return y==null?J.D5($.Zg.$0(),this.Q):J.D5(y,z)},
 static:{"^":"Ji"}},
-qU:{
+I:{
 "^":"a;",
-$isqU:true},
+$isI:true},
 "+String":0,
-ysG:{
-"^":"a;Y4,R0,So,ft",
-gl:function(){return this.ft},
-G:function(){var z,y,x,w,v,u
-z=this.So
-this.R0=z
-y=this.Y4
+Kg:{
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w,v,u
+z=this.b
+this.a=z
+y=this.Q
 x=J.U6(y)
-if(z===x.gB(y)){this.ft=null
-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)
-return!0}}this.So=v
-this.ft=w
+if(z===x.gv(y)){this.c=null
+return!1}w=x.O2(y,this.a)
+v=this.a+1
+if((w&64512)===55296&&v<x.gv(y)){u=x.O2(y,v)
+if((u&64512)===56320){this.b=v+1
+this.c=65536+((w&1023)<<10>>>0)+(u&1023)
+return!0}}this.b=v
+this.c=w
 return!0}},
 Rn:{
-"^":"a;IN<",
-gB:function(a){return this.IN.length},
-gl0:function(a){return this.IN.length===0},
-gor:function(a){return this.IN.length!==0},
-KF:function(a){this.IN+=typeof a==="string"?a:H.d(a)},
+"^":"a;IN:Q<",
+gv:function(a){return this.Q.length},
+gl0:function(a){return this.Q.length===0},
+gor:function(a){return this.Q.length!==0},
+KF:function(a){this.Q+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
-z=J.mY(a)
-if(!z.G())return
-if(b.length===0){do{y=z.gl()
-this.IN+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
-for(;z.G();){this.IN+=b
-y=z.gl()
-this.IN+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.IN=""},
-bu:[function(a){return this.IN},"$0","gCR",0,0,73],
-PD:function(a){if(typeof a==="string")this.IN=a
+z=J.Nx(a)
+if(!z.D())return
+if(b.length===0){do{y=z.gk()
+this.Q+=typeof y==="string"?y:H.d(y)}while(z.D())}else{this.KF(z.gk())
+for(;z.D();){this.Q+=b
+y=z.gk()
+this.Q+=typeof y==="string"?y:H.d(y)}}},
+V1:function(a){this.Q=""},
+X:[function(a){var z=this.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0],
+PD:function(a){if(typeof a==="string")this.Q=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
@@ -9501,74 +9059,89 @@
 IN:{
 "^":"a;",
 $isIN:true},
-Lz:{
+UU:{
 "^":"a;",
-$isLz:true},
+$isUU:true},
 q5:{
-"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z=this.Kk
+"^":"a;Q,a,b,c,d,e,f,r,x",
+gJf:function(a){var z,y
+z=this.Q
 if(z==null)return""
-if(J.Qe(z).nC(z,"["))return C.yo.Nj(z,1,z.length-1)
+y=J.NH(z)
+if(y.nC(z,"["))return y.Nj(z,1,J.D5(y.gv(z),1))
 return z},
-gtp:function(a){var z=this.QB
-if(z==null)return P.l3(this.Fi)
+gtp:function(a){var z=this.a
+if(z==null)return P.SN(this.c)
 return z},
-gIi:function(a){return this.Ee},
-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
+gIi:function(a){return this.b},
+Kf:function(a,b){var z,y,x,w,v,u,t,s
+z=J.U6(a)
+if(z.gl0(a)===!0)return"/"+H.d(b)
+for(y=J.NH(b),x=0,w=0;y.Qi(b,"../",w);){w+=3;++x}v=z.cn(a,"/")
+while(!0){if(!(v>0&&x>0))break
+u=z.Pk(a,"/",v-1)
+if(u<0)break
+t=v-u
+s=t!==2
+if(!s||t===3)if(z.O2(a,u+1)===46)s=!s||z.O2(a,u+2)===46
+else s=!1
+else s=!1
+if(s)break;--x
+v=u}return z.Nj(a,0,v+1)+y.yn(b,w-3*x)},
+jI:function(a){var z=J.U6(a)
+if(J.vU(z.gv(a),0)&&z.O2(a,0)===46)return!0
+return z.OY(a,"/.")!==-1},
+mE:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-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
+for(y=J.BQ(a,"/"),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.D();){w=y.c
+if(J.mG(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
+v=!J.mG(z[0],"")}else v=!0
 else v=!1
 if(v){if(0>=z.length)return H.e(z,0)
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y,x,w
+X:[function(a){var z,y,x,w
 z=P.p9("")
-y=this.Fi
+y=this.c
 if(""!==y){z.KF(y)
-z.KF(":")}x=this.Kk
+z.KF(":")}x=this.Q
 w=x==null
-if(!w||C.yo.nC(this.Ee,"//")||y==="file"){z.KF("//")
-y=this.ku
-if(C.yo.gor(y)){z.KF(y)
+if(!w||J.co(this.b,"//")||y==="file"){z.KF("//")
+y=this.d
+if(J.pO(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.QB
+y=this.a
 if(y!=null){z.KF(":")
-z.KF(y)}}z.KF(this.Ee)
-y=this.xu
+z.KF(y)}}z.KF(this.b)
+y=this.e
 if(y!=null){z.KF("?")
-z.KF(y)}y=this.ys
+z.KF(y)}y=this.f
 if(y!=null){z.KF("#")
-z.KF(y)}return z.IN},"$0","gCR",0,0,73],
-n:function(a,b){var z,y,x,w
+z.KF(y)}y=z.Q
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x,w
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$isq5)return!1
-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)
+if(this.c===b.c)if(this.Q!=null===(b.Q!=null))if(J.mG(this.d,b.d))if(J.mG(this.gJf(this),z.gJf(b))){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+if(y==null?z==null:y===z)if(J.mG(this.b,b.b)){z=this.e
 y=z==null
-x=b.xu
+x=b.e
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+if(J.mG(z,w?"":x)){z=this.f
 y=z==null
-x=b.ys
+x=b.f
 w=x==null
 if(!y===!w){if(y)z=""
-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
+z=J.mG(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},
@@ -9576,12 +9149,12 @@
 z=new P.XZ()
 y=this.gJf(this)
 x=this.gtp(this)
-w=this.xu
+w=this.e
 if(w==null)w=""
-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)))))))},
+v=this.f
+return z.$2(this.c,z.$2(this.d,z.$2(y,z.$2(x,z.$2(this.b,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,Tet,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo0,yw1,SQU,rvM,fbQ",l3:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,UId,Imi,GpR,Bd,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,Tet,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo0,yw1,SQU,rvM,fbQ",SN: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={}
@@ -9595,18 +9168,16 @@
 v=0
 while(!0){if(!(v<w)){y=0
 x=0
-break}if(v>=w)H.vh(P.N(v))
-u=a.charCodeAt(v)
+break}u=C.yo.O2(a,v)
 z.f=u
 if(u===63||u===35){y=0
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
-z.a=P.iy(a,v);++v
+break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
+z.a=P.Wf(a,v);++v
 if(v===w){z.f=-1
-x=0}else{if(v>=w)H.vh(P.N(v))
-u=a.charCodeAt(v)
+x=0}else{u=C.yo.O2(a,v)
 z.f=u
 if(u===63||u===35)x=0
 else x=u===47?2:1}y=v
@@ -9615,109 +9186,93 @@
 if(x===2){t=v+1
 z.e=t
 if(t===w){z.f=-1
-x=0}else{u=C.yo.j(a,t)
+x=0}else{u=C.yo.O2(a,t)
 z.f=u
 if(u===47){++z.e
-new P.BH(z,a,-1).$0()
+new P.tF(z,a,-1).$0()
 y=z.e}s=z.f
-x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
-if(s>=w)H.vh(P.N(s))
-u=a.charCodeAt(s)
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){u=C.yo.O2(a,s)
 z.f=u
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.qd(a,y,z.e,null,r!=null,s==="file")
+q=P.re(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.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
+s=z.e
+if(p<0){o=P.BH(a,s+1,w,null)
+n=null}else{o=P.BH(a,s+1,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(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)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.l3(b))return
+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 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.iV(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.O2(a,b)===91){z=c-1
+if(C.yo.O2(a,z)!==93)P.Xz(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.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
+return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(y=b;y<c;++y)if(C.yo.O2(a,y)===58){P.eg(a,b,c)
+return"["+a+"]"}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+for(z=b,y=z,x=null,w=!0;z<c;){v=C.yo.O2(a,z)
+if(v===37){u=P.Yi(a,z,!0)
+t=u==null
+if(t&&w){z+=3
 continue}if(x==null){x=new P.Rn("")
-x.IN=""}s=C.yo.Nj(a,y,z)
+x.Q=""}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"
+x.Q=x.Q+s
+if(t){u=C.yo.Nj(a,z,z+3)
+r=3}else if(u==="%"){u="%25"
 r=1}else r=3
-x.IN+=t
+x.Q+=u
 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
+w=!0}else{if(v<127){t=v>>>4
+if(t>=8)return H.e(C.aa,t)
+t=(C.aa[t]&C.jn.iK(1,v&15))!==0}else t=!1
+if(t){if(w&&65<=v&&90>=v){if(x==null){x=new P.Rn("")
+x.Q=""}if(y<z){t=C.yo.Nj(a,y,z)
+x.Q=x.Q+t
+y=z}w=!1}++z}else{if(v<=93){t=v>>>4
+if(t>=8)return H.e(C.rz,t)
+t=(C.rz[t]&C.jn.iK(1,v&15))!==0}else t=!1
+if(t)P.Xz(a,z,"Invalid character")
+else{if((v&64512)===55296&&z+1<c){q=C.yo.O2(a,z+1)
+if((q&64512)===56320){v=(65536|(v&1023)<<10|q&1023)>>>0
 r=2}else r=1}else r=1
 if(x==null){x=new P.Rn("")
-x.IN=""}s=C.yo.Nj(a,y,z)
+x.Q=""}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
+x.Q=x.Q+s
+t=P.lN(v)
+x.Q+=t
 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
+y=z}}}}if(x==null)return C.yo.Nj(a,b,c)
+if(y<c){s=C.yo.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}t=x.Q
+return t.charCodeAt(0)==0?t:t},Wf:function(a,b){var z,y,x,w,v
 if(b===0)return""
-a.toString
-z=a.length
-if(0>=z)H.vh(P.N(0))
-y=a.charCodeAt(0)
-x=y>=97
-if(!(x&&y<=122))w=y>=65&&y<=90
-else w=!0
-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.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)},qd:function(a,b,c,d,e,f){var z,y
+z=J.NH(a).O2(a,0)
+y=z>=97
+if(!(y&&z<=122))x=z>=65&&z<=90
+else x=!0
+if(!x)P.Xz(a,0,"Scheme not starting with alphabetic character")
+for(w=0;w<b;++w){v=C.yo.O2(a,w)
+if(v<128){x=v>>>4
+if(x>=8)return H.e(C.mKy,x)
+x=(C.mKy[x]&C.jn.iK(1,v&15))!==0}else x=!1
+if(!x)P.Xz(a,w,"Illegal scheme character")
+if(v<97||v>122)y=!1}a=C.yo.Nj(a,0,b)
+return!y?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
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-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
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.Kd()).zV(0,"/")
+z=J.U6(y)
+if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.O2(y,0)!==47)return"/"+H.d(y)
+return y},BH:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return
@@ -9725,215 +9280,187 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(d,new P.Sz(z,x))
-return x.IN},jr:function(a,b,c){if(a==null)return
+C.jN.aN(d,new P.Ue(z,x))
+z=x.Q
+return z.charCodeAt(0)==0?z:z},o6: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
-return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+return 97<=a&&102>=a},Qw:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w
 z=b+2
-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)
-if(z<0)H.vh(P.N(z))
-v=a.charCodeAt(z)
-if(!P.qr(w)||!P.qr(v))return"%"
-u=P.RD(w)*16+P.RD(v)
-if(u<127){z=C.jn.wG(u,4)
-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 J.Nj(a,b,b+3).toUpperCase()
-return},mC:function(a){var z,y,x,w,v,u,t,s
+if(z>=a.length)return"%"
+y=C.yo.O2(a,b+1)
+x=C.yo.O2(a,z)
+if(!P.qr(y)||!P.qr(x))return"%"
+w=P.Qw(y)*16+P.Qw(x)
+if(w<127){z=C.jn.wG(w,4)
+if(z>=8)return H.e(C.kg,z)
+z=(C.kg[z]&C.jn.iK(1,w&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=w&&90>=w?(w|32)>>>0:w)
+if(y>=97||x>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
+return},lN:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
-z.fixed$length=init
+z.fixed$length=Array
 z[0]=37
-y=a>>>4
-if(y>=16)H.vh(P.N(y))
-z[1]="0123456789ABCDEF".charCodeAt(y)
-z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
-w=4}else{x=224
-w=3}else{x=192
-w=2}y=3*w
-z=Array(y)
-z.fixed$length=init
-for(v=0;--w,w>=0;x=128){u=C.jn.PK(a,6*w)&63|x
-if(v>=y)return H.e(z,v)
+z[1]=C.yo.O2("0123456789ABCDEF",a>>>4)
+z[2]=C.yo.O2("0123456789ABCDEF",a&15)}else{if(a>2047)if(a>65535){y=240
+x=4}else{y=224
+x=3}else{y=192
+x=2}w=3*x
+z=Array(w)
+z.fixed$length=Array
+for(v=0;--x,x>=0;y=128){u=C.jn.bf(a,6*x)&63|y
+if(v>=w)return H.e(z,v)
 z[v]=37
 t=v+1
-s=u>>>4
-if(s>=16)H.vh(P.N(s))
-s="0123456789ABCDEF".charCodeAt(s)
-if(t>=y)return H.e(z,t)
+s=C.yo.O2("0123456789ABCDEF",u>>>4)
+if(t>=w)return H.e(z,t)
 z[t]=s
 s=v+2
-t="0123456789ABCDEF".charCodeAt(u&15)
-if(s>=y)return H.e(z,s)
+t=C.yo.O2("0123456789ABCDEF",u&15)
+if(s>=w)return H.e(z,s)
 z[s]=t
-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)++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.iV(a,z,"Invalid character")
-t=null
-s=null}else{if((v&64512)===55296){u=z+1
-if(u<c){if(u<0)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.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)
-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
+v+=3}}return P.Qe(z,0,null)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s
+for(z=b,y=z,x=null;z<c;){w=C.yo.O2(a,z)
+if(w<127){v=w>>>4
+if(v>=8)return H.e(d,v)
+v=(d[v]&C.jn.iK(1,w&15))!==0}else v=!1
+if(v)++z
+else{if(w===37){u=P.Yi(a,z,!1)
+if(u==null){z+=3
+continue}if("%"===u){u="%25"
+t=1}else t=3}else{if(w<=93){v=w>>>4
+if(v>=8)return H.e(C.rz,v)
+v=(C.rz[v]&C.jn.iK(1,w&15))!==0}else v=!1
+if(v){P.Xz(a,z,"Invalid character")
+u=null
+t=null}else{if((w&64512)===55296){v=z+1
+if(v<c){s=C.yo.O2(a,v)
+if((s&64512)===56320){w=(65536|(w&1023)<<10|s&1023)>>>0
+t=2}else t=1}else t=1}else t=1
+u=P.lN(w)}}if(x==null){x=new P.Rn("")
+x.Q=""}v=C.yo.Nj(a,y,z)
+x.Q=x.Q+v
+x.Q+=typeof u==="string"?u:H.d(u)
+if(typeof t!=="number")return H.o(t)
+z+=t
+y=z}}if(x==null)return C.yo.Nj(a,b,c)
+if(y<c)x.KF(C.yo.Nj(a,y,c))
+v=x.Q
+return v.charCodeAt(0)==0?v:v},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.A(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.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.x8(a)
+return H.J(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.wS(a)
+z=new P.kZ(a)
 y=new P.ZN(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
+if(J.wS(a)<2)z.$1("address is too short")
 x=[]
 w=b
 u=b
 t=!1
 while(!0){s=c
-if(typeof s!=="number")return H.s(s)
+if(typeof s!=="number")return H.o(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)
+if(J.IC(a,u)===58){if(u===b){++u
+if(J.IC(a,u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",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.MQ(x),-1)
-if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+J.dH(x,-1)
+t=!0}else J.dH(x,y.$2(w,u))
+w=u+1}++u}if(J.wS(x)===0)z.$1("too few parts")
+r=J.mG(w,c)
+q=J.mG(J.rn(x),-1)
+if(r&&!q)z.$2("expected a part after last `:`",c)
+if(!r)try{J.dH(x,y.$2(w,c))}catch(p){H.Ru(p)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.Eh(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-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.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")
+s=J.o3(J.Tf(v,0),8)
+o=J.Tf(v,1)
+if(typeof o!=="number")return H.o(o)
+J.dH(x,(s|o)>>>0)
+o=J.o3(J.Tf(v,2),8)
+s=J.Tf(v,3)
+if(typeof s!=="number")return H.o(s)
+J.dH(x,(o|s)>>>0)}catch(p){H.Ru(p)
+z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.wS(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.wS(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
 u=0
 m=0
-while(!0){s=J.q8(x)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=J.wS(x)
+if(typeof s!=="number")return H.o(s)
 if(!(u<s))break
-l=J.UQ(x,u)
-s=J.x(l)
-if(s.n(l,-1)){k=9-J.q8(x)
+l=J.Tf(x,u)
+s=J.t(l)
+if(s.m(l,-1)){k=9-J.wS(x)
 for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
 n[m]=0
 s=m+1
 if(s>=16)return H.e(n,s)
 n[s]=0
-m+=2}}else{r=s.m(l,8)
+m+=2}}else{o=s.l(l,8)
 if(m<0||m>=16)return H.e(n,m)
-n[m]=r
-r=m+1
+n[m]=o
+o=m+1
 s=s.i(l,255)
-if(r>=16)return H.e(n,r)
-n[r]=s
-m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+if(o>=16)return H.e(n,o)
+n[o]=s
+m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-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)
+x=c.gZE().WJ(b)
+for(w=x.length,v=0;v<w;++v){u=x[v]
+if(u<128){t=u>>>4
 if(t>=8)return H.e(a,t)
-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)
+t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
+if(t){t=H.mx(u)
+y.Q+=t}else if(d&&u===32){t=H.mx(43)
+y.Q+=t}else{t=H.mx(37)
+y.Q+=t
+z.$2(u,y)}}z=y.Q
+return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
+for(z=J.NH(a),y=0,x=0;x<2;++x){w=z.O2(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-87
-else throw H.b(P.u("Invalid URL encoding"))}}return y},pE:function(a,b,c){var z,y,x,w,v,u,t
+else throw H.b(P.p("Invalid URL encoding"))}}return y},pE:function(a,b,c){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=!0
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w&&y))break
-v=z.j(a,x)
+v=z.O2(a,x)
 y=v!==37&&v!==43;++x}if(y)if(b===C.xM||!1)return a
 else u=z.gNq(a)
 else{u=[]
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=z.j(a,x)
-if(v>127)throw H.b(P.u("Illegal percent encoding in URI"))
-if(v===37){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(x+3>w)throw H.b(P.u("Truncated URI"))
+v=z.O2(a,x)
+if(v>127)throw H.b(P.p("Illegal percent encoding in URI"))
+if(v===37){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
+if(x+3>w)throw H.b(P.p("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.QA
-return new P.GY(t).Sw(u)}}},
-hP2:{
-"^":"TpZ:147;",
-$1:function(a){a.C(0,128)
-return!1},
-$isEH:true},
-BH:{
-"^":"TpZ:17;a,b,c",
+else u.push(v);++x}}t=b.Q
+return new P.GY(t).WJ(u)}}},
+jY:{
+"^":"r:147;",
+$1:function(a){a.w(0,128)
+return!1}},
+tF:{
+"^":"r:1;Q,a,b",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.a
+z=this.Q
 y=z.e
-x=this.b
+x=this.a
 w=x.length
-if(y===w){z.f=this.c
-return}z.f=J.Pp(x,y)
-for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
-if(s>=w)H.vh(P.N(s))
-r=x.charCodeAt(s)
+if(y===w){z.f=this.b
+return}z.f=J.NH(x).O2(x,y)
+for(v=this.b,u=-1,t=-1;s=z.e,s<w;){r=C.yo.O2(x,s)
 z.f=r
 if(r===47||r===63||r===35)break
 if(r===64){t=z.e
@@ -9947,231 +9474,143 @@
 z.f=v}p=z.e
 if(t>=0){z.b=P.ua(x,y,t)
 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.iV(x,o,"Invalid port number")
+if(o<z.e)for(n=0;o<z.e;++o){m=C.yo.O2(x,o)
+if(48>m||57<m)P.Xz(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.JF(n,z.a)
+z.d=P.Ec(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},
-UU:{
-"^":"TpZ:12;",
-$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
-$isEH:true},
-Sz:{
-"^":"TpZ:81;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
+if(s<w)z.f=C.yo.O2(x,s)}},
+Kd:{
+"^":"r:14;",
+$1:function(a){return P.Mp(C.jr,a,C.xM,!1)}},
+Ue:{
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.Q
+if(!z.a)this.a.KF("&")
 z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
+z=this.a
+z.KF(P.Mp(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
+z.KF(P.Mp(C.kg,b,C.xM,!0))}},
 XZ:{
-"^":"TpZ:148;",
-$2:function(a,b){return b*31+J.v1(a)&1073741823},
-$isEH:true},
+"^":"r:148;",
+$2:function(a,b){var z=J.v1(a)
+if(typeof z!=="number")return H.o(z)
+return b*31+z&1073741823}},
 qz:{
-"^":"TpZ:81;a",
+"^":"r:80;Q",
 $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.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.m(b,""))J.H9(a,P.pE(b,this.Q,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
-z=this.a
-J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
-$isEH:true},
+z=this.Q
+J.H9(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a}},
 JV:{
-"^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
-$isEH:true},
+"^":"r:46;",
+$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))}},
 C9P:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,149,"call"],
-$isEH:true},
-x8:{
-"^":"TpZ:150;a",
-$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},
+if(y.w(z,0)||y.A(z,255))this.Q.$1("each part must be in the range of `0..255`")
+return z},"$1",null,2,0,null,149,"call"]},
+kZ:{
+"^":"r:150;Q",
+$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.Q,b))},
+$1:function(a){return this.$2(a,null)}},
 ZN:{
-"^":"TpZ:100;b,c",
+"^":"r:100;Q,a",
 $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(J.Nj(this.b,a,b),16,null)
+if(b-a>4)this.a.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(C.yo.Nj(this.Q,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},
-$isEH:true},
+if(y.w(z,0)||y.A(z,65535))this.a.$2("each part must be in the range of `0x0..0xFFFF`",a)
+return z}},
 rI:{
-"^":"TpZ:81;",
+"^":"r:80;",
 $2:function(a,b){var z=J.Wx(a)
-b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["","",,W,{
+b.KF(H.mx(C.yo.O2("0123456789ABCDEF",z.l(a,4))))
+b.KF(H.mx(C.yo.O2("0123456789ABCDEF",z.i(a,15))))}}}],["","",,W,{
 "^":"",
-SE:function(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/ig,C.Vu)},
-Q8:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.We(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isT8){y=d
-if(typeof y!=="string"){y=d
-y=typeof y==="number"}else y=!0}else y=!0
-else y=!0
-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)},
-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.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.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.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))},
-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")
-if(!y);y=!z||a==null
-if(y)return new WebSocket(a,b)
-z=!z||a==null
-if(z)return new WebSocket(a,b)
-throw H.b(P.u("Incorrect number or type of arguments"))},
-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)},
-qc:function(a){var z
-if(a==null)return
-if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},
-v8:function(a,b){return new W.uY(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-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.KE(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-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.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.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})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},
-Yt:function(a){if(J.xC($.X3,C.fQ))return a
-if(a==null)return
-return $.X3.rO(a,!0)},
-K2:function(a){if(J.xC($.X3,C.fQ))return a
-return $.X3.PT(a,!0)},
 Bo:{
-"^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|pva|AK|cda|ys|waa|NF|V10|Hi|V11|ts|Tk|V12|ZP|V13|nJ|KAf|Eg|i7|V14|Gk|V15|J3|V16|MJ|T53|DK|V17|BS|V18|Vb|V19|Ly|V20|Im|pR|V21|EZ|V22|L4|Mb|V23|mO|DE|V24|U1|V25|H8|WS|qh|V26|oF|V27|Q6|uE|V28|Zn|V29|n5|V30|Ma|wN|V31|ds|V32|qM|ZzR|av|V33|uz|V34|kK|oa|V35|St|V36|IW|V37|Qh|V38|Oz|V39|Z4|V40|qk|V41|vj|LU|V42|CX|V43|qn|V44|I2|V45|FB|V46|md|V47|Bm|V48|Ya|V49|Ww|ye|V50|G1|V51|fl|V52|UK|V53|wM|V54|Co|V55|Zx|V56|qV|V57|NT|V58|F1|V59|ov|V60|vr|oEY|kn|V61|fI|V62|zM|V63|Rk|V64|Ti|V65|Um|V66|VZ|V67|WG|V68|f7|Ce|ImK|CY|V69|Pa|V70|D2|I5|V71|el"},
-Yyn:{
+"^":"z2;",
+"%":"HTMLAppletElement|HTMLBRElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLModElement|HTMLParagraphElement|HTMLPictureElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|pva|AK|cda|ys|waa|NF|V4|Hi|V10|ts|Tk|V11|ZP|V12|nJ|KAf|Eg|i7|V13|Gk|V14|J3|V15|MJ|T53|DK|V16|BS|V17|Vb|V18|Ly|V19|Im|pR|V20|EZ|V21|L4|Mb|V22|IH|DE|V23|U1|V24|H8|WS|qh|V25|oF|V26|Q6|uE|V27|Zn|V28|n5|V29|Ma|wN|V30|ds|V31|qM|ZzR|av|V32|uz|V33|kK|oa|V34|St|V35|IW|V36|Qh|V37|Oz|V38|Z4|V39|qk|V40|vj|LU|V41|CX|V42|qn|V43|I2|V44|FB|V45|md|V46|Bm|V47|Ya|V48|Ww|ye|V49|G1|V50|fl|V51|UK|V52|wM|V53|NK|V54|Zx|V55|qV|V56|NT|V57|F1|V58|ov|V59|vr|oEY|kn|V60|fI|V61|zM|V62|Rk|V63|Ti|V64|Um|V65|VZ|V66|WG|V67|f7|Ce|ImK|CY|V68|Pa|V69|D2|I5|V70|el"},
+SV:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.QI]},
+$asWO:function(){return[W.M5K]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.QI]},
+$asQV:function(){return[W.M5K]},
 "%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+mj:{
+"^":"Bo;K:target%,t5:type=,LU:href%,A8:protocol=",
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+fc:{
+"^":"ea;G1:message=,pf:status=,O3:url=",
+"%":"ApplicationCacheErrorEvent"},
+Zz:{
+"^":"Bo;K:target%,LU:href%,A8:protocol=",
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"Bo;LU:href%,K:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;yT:size=,t5:type=",
+"^":"Gv;ky:size=,t5:type=",
+xO:function(a){return a.close()},
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isPZ:true,
+$isD0:true,
 "%":"HTMLBodyElement"},
 IFv:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"Bo;oc:name%,t5:type=,M:value%",
 "%":"HTMLButtonElement"},
-Ny9:{
-"^":"Bo;fg:height%,R:width}",
-gVE:function(a){return a.getContext("2d")},
+Ny:{
+"^":"Bo;fg:height%,N:width}",
+gwe:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
-Y5K:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
 Gcw:{
-"^":"Y5K;",
-A8:function(a,b,c,d,e,f,g,h){var z
+"^":"Gv;",
+kN: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)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
+return}throw H.b(P.p("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,ke:nextElementSibling=",
+JJ:{
+"^":"KV;Rn:data=,v:length=,Wq:nextElementSibling=",
 "%":"Comment;CharacterData"},
-BI:{
+Yr:{
 "^":"ea;tT:code=",
-$isBI:true,
 "%":"CloseEvent"},
-y4f:{
+di:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-d7T:{
+d7:{
 "^":"Bo;",
 q3:function(a){return a.select.$0()},
 "%":"HTMLContentElement"},
 oJo:{
-"^":"BVt;B:length=",
-T2:function(a,b){var z=this.RT(a,b)
+"^":"AN;v:length=",
+T2:function(a,b){var z=this.YP(a,b)
 return z!=null?z:""},
-RT:function(a,b){var z
+YP:function(a,b){var z
 if(W.SE(b) in a)return a.getPropertyValue(b)
 else{z=P.O2()
-if(typeof z!=="string")return z.g()
+if(z==null)return z.g()
 return a.getPropertyValue(z+b)}},
 hV:function(a,b,c,d){var z
 if(W.SE(b) in a)return this.Dg(a,b,c,d)
 else{z=P.O2()
-if(typeof z!=="string")return z.g()
+if(z==null)return z.g()
 return this.Dg(a,z+b,c,d)}},
 f8:function(a,b,c){return this.hV(a,b,c,null)},
 Dg:function(a,b,c,d){var z
@@ -10184,142 +9623,175 @@
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
-return P.o7(a.detail,!0)},
+return P.UQ(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
 $isDG4:true,
 "%":"CustomEvent"},
-vHT:{
+On:{
 "^":"Bo;bG:options=",
 "%":"HTMLDataListElement"},
 Q3:{
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDetailsElement"},
-rV7:{
+KB:{
+"^":"ea;M:value=",
+"%":"DeviceLightEvent"},
+rV:{
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-YN:{
+Sy:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-d2:function(a,b,c){return a.importNode(b,c)},
-XT:function(a,b){return a.querySelector(b)},
-geg:function(a){return H.VM(new W.RO(a,C.rt.fA,!1),[null])},
+ek:function(a,b,c){return a.importNode(b,c)},
+Wk:function(a,b){return a.querySelector(b)},
+gHQ:function(a){return H.J(new W.vG(a,"keydown",!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+$isSy:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
+gwd:function(a){if(a._docChildren==null)a._docChildren=H.J(new P.P0(a,new W.OB(a)),[null])
 return a._docChildren},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-XT:function(a,b){return a.querySelector(b)},
+Kb:function(a,b){return a.getElementById(b)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-cmJ:{
+Nu:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-BK:{
+Nh:{
 "^":"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],
-$isBK:true,
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
+$isNh:true,
 "%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,S:style=,ns:tagName=,ke:nextElementSibling=",
+nV:{
+"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,N:width=,x=,y=",
+X:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(this.gN(a))+" x "+H.d(this.gfg(a))},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x
+if(b==null)return!1
+z=J.t(b)
+if(!z.$istn)return!1
+y=a.left
+x=z.gBb(b)
+if(y==null?x==null:y===x){y=a.top
+x=z.gG6(b)
+if(y==null?x==null:y===x){y=this.gN(a)
+x=z.gN(b)
+if(y==null?x==null:y===x){y=this.gfg(a)
+z=z.gfg(b)
+z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
+return z},
+giO:function(a){var z,y,x,w
+z=J.v1(a.left)
+y=J.v1(a.top)
+x=J.v1(this.gN(a))
+w=J.v1(this.gfg(a))
+return W.Up(W.VC(W.VC(W.VC(W.VC(0,z),y),x),w))},
+gSR:function(a){return H.J(new P.hL(a.left,a.top),[null])},
+$istn:true,
+$astn:function(){return[null]},
+"%":";DOMRectReadOnly"},
+z2:{
+"^":"KV;mk:title},xr:className%,jO:id=,O:style=,ns:tagName=,Wq:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
+gwd:function(a){return new W.VG(a,a.children)},
 Md: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){},
-Lx:function(a){},
-wN:function(a,b,c,d){},
+dQ:function(a){},
+aC: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],
-xZ:function(a,b){if(!!a.matches)return a.matches(b)
+X:[function(a){return a.localName},"$0","gCR",0,0,0],
+WO: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"))},
-Ft:function(a,b){var z=a
-do{if(J.wK(z,b))return!0
+bA:function(a,b){var z=a
+do{if(J.YN(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-PN:function(a,b){return a.getAttribute(b)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-XT:function(a,b){return a.querySelector(b)},
-geg:function(a){return H.VM(new W.Cqa(a,C.rt.fA,!1),[null])},
-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])},
+Wk:function(a,b){return a.querySelector(b)},
+gHQ:function(a){return H.J(new W.eu(a,"keydown",!1),[null])},
+gVY:function(a){return H.J(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.J(new W.eu(a,"mousemove",!1),[null])},
 LX:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
+$isz2:true,
+$isD0:true,
+"%":";Element",
+static:{"^":"Mm7<"}},
 fC:{
-"^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
+"^":"Bo;fg:height%,oc:name%,t5:type=,N:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gF0:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
+"^":"Gv;dl:_selector},Ii:path=,ee:timeStamp=,t5:type=",
+gAJ:function(a){return W.xj(a.currentTarget)},
+gK:function(a){return W.xj(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"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:{
+"%":"AnimationPlayerEvent|AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|DeviceMotionEvent|DeviceOrientationEvent|FetchEvent|FontFaceSetLoadEvent|GamepadEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|RelatedEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+D0:{
 "^":"Gv;",
-On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Ph:function(a,b){return a.dispatchEvent(b)},
-Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
+On:function(a,b,c,d){if(c!=null)this.v0(a,b,c,d)},
+Y9:function(a,b,c,d){if(c!=null)this.Ci(a,b,c,d)},
+v0:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+H2:function(a,b){return a.dispatchEvent(b)},
+Ci:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
+$isD0:true,
 "%":";EventTarget"},
 Ao:{
-"^":"Bo;P9:elements=,oc:name%,t5:type=",
+"^":"Bo;nS:elements=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
-hH:{
+jq:{
 "^":"O4;oc:name=",
-$ishH:true,
+$isjq:true,
 "%":"File"},
 QU:{
-"^":"cmJ;tT:code=",
+"^":"Nu;tT:code=",
 "%":"FileError"},
-H05:{
-"^":"PZ;kc:error=",
+H0:{
+"^":"D0;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.z4(z,0,null)
+if(!!J.t(z).$isaI)return H.GG(z,0,null)
 return z},
 "%":"FileReader"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target%",
+YuD:{
+"^":"Bo;v:length=,oc:name%,K:target%",
 "%":"HTMLFormElement"},
 iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-us:{
-"^":"Gv;B:length=",
+UT:{
+"^":"Gv;v:length=",
 "%":"History"},
 xnd:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+"^":"ec;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10329,134 +9801,132 @@
 $asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"YN;",
-gQr:function(a){return a.head},
+Lv:{
+"^":"Sy;",
+gKa:function(a){return a.head},
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-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)},
+O7:{
+"^":"ny;il:responseText=,pf:status=",
+gS4:function(a){return W.Pd(a.response)},
+R3: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)},
-$isfJ:true,
+$isO7:true,
 "%":"XMLHttpRequest"},
-waV:{
-"^":"PZ;",
+ny:{
+"^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
-"^":"Bo;fg:height%,oc:name%,R:width}",
+"^":"Bo;fg:height%,oc:name%,N:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
+"^":"Gv;Rn:data=,fg:height=,N:width=",
 $isSg:true,
 "%":"ImageData"},
 pAv:{
-"^":"Bo;fg:height%,EE:isMap=,R:width}",
-j3:function(a,b){return a.complete.$1(b)},
+"^":"Bo;fg:height%,EE:isMap=,N:width}",
+aM:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Sc:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,RP:selectionStart=,yT:size=,t5:type=,P:value%,R:width}",
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,RP:selectionStart=,ky:size=,t5:type=,M:value%,N:width}",
 RR:function(a,b){return a.accept.$1(b)},
 q3:function(a){return a.select()},
 ul:function(a,b,c,d,e){return a.setRangeText(b,e,c,d)},
-mT:function(a,b){return a.setRangeText(b)},
+jy:function(a,b){return a.setRangeText(b)},
 Zl:function(a,b,c,d){return a.setSelectionRange(b,c,d)},
 np:function(a,b,c){return a.setSelectionRange(b,c)},
 $isSc:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-AD:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+vn:{
+"^":"w6O;w4:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gIG:function(a){return a.keyCode},
-$isAD:true,
 "%":"KeyboardEvent"},
 ttH:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wPF:{
-"^":"Bo;P:value%",
+pL:{
+"^":"Bo;M:value%",
 "%":"HTMLLIElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+Qj:{
+"^":"Bo;LU:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;mH:href=,aB:protocol=",
+"^":"Gv;LU:href=,A8:protocol=",
 VD:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"Location"},
-jJ:{
+M6O:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-ftg:{
+TF:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"dZ5<"}},
-mCi:{
+yy:[function(a){return a.pause()},"$0","gX0",0,0,1],
+"%":"HTMLAudioElement;HTMLMediaElement"},
+mC:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
 wq:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
-fJn:{
+W7:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 CM:{
-"^":"PZ;jO:id=,ph:label=",
+"^":"D0;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
 "%":"MediaStreamEvent"},
+ZY:{
+"^":"Bo;ph:label%,t5:type=",
+"%":"HTMLMenuElement"},
+k7:{
+"^":"Bo;d4:checked%,ph:label%,t5:type=",
+"%":"HTMLMenuItemElement"},
 cxu:{
 "^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.qc(a.source)},
-$iscxu:true,
+gRn:function(a){return P.UQ(a.data,!0)},
+gFF:function(a){return W.xj(a.source)},
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
-"^":"Bo;A5:max=,Bp:min=,P:value%",
+"^":"Bo;A5:max=,Bp:min=,M:value%",
 "%":"HTMLMeterElement"},
-PGY:{
-"^":"ea;",
-$isPGY:true,
-"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
-"^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+"^":"tH;",
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
-Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
+tH:{
+"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.J(new W.vG(a,"disconnect",!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-N2:{
-"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+v3:{
+"^":"w6O;w4:altKey=,pL:button=,AE: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.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,
+if(!!a.offsetX)return H.J(new P.hL(a.offsetX,a.offsetY),[null])
+else{if(!J.t(W.xj(a.target)).$isz2)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.xj(a.target)
+y=H.J(new P.hL(a.clientX,a.clientY),[null]).T(0,J.Yq(J.HO(z)))
+return H.J(new P.hL(J.Ta(y.Q),J.Ta(y.a)),[null])}},
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
+VP:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
 y=new W.DB(z)
 y.$2("childList",h)
@@ -10467,51 +9937,56 @@
 y.$2("characterDataOldValue",g)
 if(c!=null)y.$2("attributeFilter",c)
 a.observe(b,z)},
-OT:function(a,b,c){return this.jh(a,b,null,null,null,null,null,c,null)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
+OT:function(a,b,c){return this.VP(a,b,null,null,null,null,null,c,null)},
+MS:function(a,b,c,d){return this.VP(a,b,c,null,d,null,null,null,null)},
 "%":"MutationObserver|WebKitMutationObserver"},
 Vv:{
-"^":"Gv;N:target=,t5:type=",
+"^":"Gv;K:target=,t5:type=",
 "%":"MutationRecord"},
+nz:{
+"^":"Gv;PB:connection=",
+"%":"Navigator"},
 qT:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
+PE:{
+"^":"D0;t5:type=",
+"%":"NetworkInformation"},
 KV:{
-"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gUN:function(a){return new W.wi(a)},
+"^":"D0;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
+gdH:function(a){return new W.OB(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
+So:function(a,b){var z,y
 try{z=a.parentNode
-J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
+J.jk(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.$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
+z=J.t(b)
+if(!!z.$isOB){z=b.Q
+if(z===a)throw H.b(P.p(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gu(b);z.D();)a.insertBefore(z.gk(),c)},
+ay:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
-bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
-mx:function(a,b){return a.appendChild(b)},
+X:[function(a){var z=a.nodeValue
+return z==null?this.fN(a):z},"$0","gCR",0,0,0],
+MM:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
-AS:function(a,b,c){return a.replaceChild(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+OP:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+dX:{
+"^":"ecX;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10522,80 +9997,80 @@
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 VSm:{
-"^":"Bo;t5:type=",
+"^":"Bo;J:start=,t5:type=",
 "%":"HTMLOListElement"},
 G77:{
-"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
+"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,N:width}",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-lq:{
-"^":"Bo;vH:index=,ph:label%,P:value%",
-$islq:true,
+Qlt:{
+"^":"Bo;vH:index=,ph:label%,M:value%",
+$isQlt:true,
 "%":"HTMLOptionElement"},
-Xp:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+wL2:{
+"^":"Bo;oc:name%,t5:type=,M:value%",
 "%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
+l1:{
+"^":"Bo;oc:name%,M:value%",
 "%":"HTMLParamElement"},
-niR:{
+f5:{
 "^":"ea;",
-$isniR:true,
 "%":"PopStateEvent"},
-S8:{
+p3:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-Qls:{
-"^":"nx;N:target=",
+nk:{
+"^":"JJ;K:target=",
 "%":"ProcessingInstruction"},
 KR:{
-"^":"Bo;A5:max=,P:value%",
+"^":"Bo;A5:max=,M:value%",
 "%":"HTMLProgressElement"},
-ew7:{
+ew:{
 "^":"ea;ox:loaded=",
-$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-bXi:{
-"^":"ew7;O3:url=",
+JN:{
+"^":"ea;Rn:data=",
+"%":"PushEvent"},
+M9:{
+"^":"ew;O3:url=",
 "%":"ResourceProgressEvent"},
-j24:{
+j2:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-bs:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
+zk:{
+"^":"Bo;v:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,M: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])},
-$isbs:true,
+z=z.ev(z,new W.xv())
+return H.J(new P.Eb(P.z(z,!0,H.W8(z,"mW",0))),[null])},
+$iszk:true,
 "%":"HTMLSelectElement"},
-I0:{
+Bn:{
 "^":"hsw;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
+$isBn:true,
 "%":"ShadowRoot"},
-yNV:{
+QR:{
 "^":"Bo;t5:type=",
 "%":"HTMLSourceElement"},
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
+"^":"Gv;V5:isFinal=,v:length=",
 "%":"SpeechRecognitionResult"},
-KKC:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.AA(a))},
+FV:function(a,b){C.Nm.aN(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)},
+p:function(a,b){return a.getItem(b)},
+q:function(a,b,c){a.setItem(b,c)},
 Rz:function(a,b){var z=a.getItem(b)
 a.removeItem(b)
 return z},
@@ -10608,143 +10083,148 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.rs(z))
+this.aN(a,new W.ru(z))
 return z},
-gB:function(a){return a.length},
+gv:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
 gor:function(a){return a.key(0)!=null},
-$isT8:true,
-$asT8:function(){return[P.qU,P.qU]},
+$isw:true,
+$asw:function(){return[P.I,P.I]},
 "%":"Storage"},
 iiu:{
-"^":"ea;nl:key=,O3:url=",
+"^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
-fqq:{
+EU:{
 "^":"Bo;t5:type=",
 "%":"HTMLStyleElement"},
-v6:{
+kr:{
 "^":"Bo;",
-$isv6:true,
+$iskr:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
 inA:{
 "^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
+gzU:function(a){return H.J(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;RH:rowIndex=",
+"^":"Bo;Cw:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
 BTK:{
 "^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
+gzU:function(a){return H.J(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-OH:{
+yY:{
 "^":"Bo;rz:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|Hq|hg"},
-Un:{
-"^":"nx;",
-$isUn:true,
+$isyY:true,
+"%":";HTMLTemplateElement;RP|Hq|G0"},
+kJ:{
+"^":"JJ;",
+$iskJ:true,
 "%":"CDATASection|Text"},
 FBi:{
-"^":"Bo;oc:name%,vp:rows=,RP:selectionStart=,t5:type=,P:value%",
+"^":"Bo;oc:name%,zU:rows=,RP:selectionStart=,t5:type=,M:value%",
 q3:function(a){return a.select()},
 ul:function(a,b,c,d,e){return a.setRangeText(b,e,c,d)},
-mT:function(a,b){return a.setRangeText(b)},
+jy:function(a,b){return a.setRangeText(b)},
 Zl:function(a,b,c,d){return a.setSelectionRange(b,c,d)},
 np:function(a,b,c){return a.setSelectionRange(b,c)},
 "%":"HTMLTextAreaElement"},
 R0:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
-y6:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+y6s:{
+"^":"w6O;w4:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
-guc:function(a){return H.VM(new P.hL(a.pageX,a.pageY),[null])},
+guc:function(a){return H.J(new P.hL(a.pageX,a.pageY),[null])},
 "%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"ftg;fg:height%,R:width}",
+Rg:{
+"^":"TF;fg:height%,N:width}",
 "%":"HTMLVideoElement"},
-EKW:{
-"^":"PZ;aB:protocol=,O3:url=",
+os:{
+"^":"D0;A8: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:{
-"^":"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']
+"^":"D0;bq:history=,oc:name%,pf:status%",
+ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+y4: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
 b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
 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.pf(b),c)
+kr:function(a,b,c,d){a.postMessage(P.jl(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],
-geg:function(a){return H.VM(new W.RO(a,C.rt.fA,!1),[null])},
+X6:function(a,b,c){return this.kr(a,b,c,null)},
+gHQ:function(a){return H.J(new W.vG(a,"keydown",!1),[null])},
 $isK5:true,
-$isPZ:true,
+$isD0:true,
 "%":"DOMWindow|Window"},
 U3:{
-"^":"KV;oc:name=,P:value%",
+"^":"KV;oc:name=,M:value%",
+ga4:function(a){return a.textContent},
+sa4:function(a,b){a.textContent=b},
 "%":"Attr"},
-YC2:{
-"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,73],
-n:function(a,b){var z,y,x
+MD:{
+"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,N:width=",
+X:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$istn)return!1
 y=a.left
 x=z.gBb(b)
 if(y==null?x==null:y===x){y=a.top
 x=z.gG6(b)
 if(y==null?x==null:y===x){y=a.width
-x=z.gR(b)
+x=z.gN(b)
 if(y==null?x==null:y===x){y=a.height
 z=z.gfg(b)
 z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w,v
+giO:function(a){var z,y,x,w
 z=J.v1(a.left)
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-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)},
-gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+return W.Up(W.VC(W.VC(W.VC(W.VC(0,z),y),x),w))},
+gSR:function(a){return H.J(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
+"%":"ClientRect"},
+dF:{
+"^":"nV;",
+gfg:function(a){return a.height},
+sfg:function(a,b){a.height=b},
+gN:function(a){return a.width},
+gx:function(a){return a.x},
+gy:function(a){return a.y},
+"%":"DOMRect"},
 NfA:{
 "^":"Bo;",
-$isPZ:true,
+$isD0:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+"^":"w1p;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10754,19 +10234,18 @@
 $asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
-LOx:{
-"^":"x5e;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+LO:{
+"^":"kEI;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10776,33 +10255,110 @@
 $asQV:function(){return[W.vKL]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
-BVt:{
+SE:function(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/ig,C.Vu)},
+Q8:function(a,b,c,d){var z,y,x
+z=document.createEvent("CustomEvent")
+J.We(z,d)
+if(!J.t(d).$isWO)if(!J.t(d).$isw){y=d
+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)
+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())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
+z=W.O7
+y=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[z])),[z])
+x=new XMLHttpRequest()
+C.Dt.i3(x,"GET",a,!0)
+z=H.J(new W.vG(x,"load",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new W.hH(y,x)),z.b),[H.u3(z,0)]).P6()
+z=H.J(new W.vG(x,"error",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(y.gYJ()),z.b),[H.u3(z,0)]).P6()
+x.send()
+return y.Q},
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
+D7:function(a,b){var z,y
+z=typeof a!=="string"
+if((!z||a==null)&&!0)return new WebSocket(a)
+y=!z||a==null
+if(y)return new WebSocket(a,b)
+y=H.RB(b,"$isWO",[P.I],"$asWO")
+if(!y);z=!z||a==null
+if(z)return new WebSocket(a,b)
+throw H.b(P.p("Incorrect number or type of arguments"))},
+VC: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)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+xj:function(a){var z
+if(a==null)return
+if("postMessage" in a){z=W.P1(a)
+if(!!J.t(z).$isD0)return z
+return}else return a},
+Pd:function(a){if(!!J.t(a).$isSy)return a
+return P.UQ(a,!0)},
+Rl:function(a,b){return new W.zZ(a,b)},
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,14,58],
+Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,14,58],
+Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","ri",8,0,59,58,60,61,62],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r
+z=J.Fb(d)
+if(z==null)throw H.b(P.p(d))
+y=z.prototype
+x=J.YC(d,"created")
+if(x==null)throw H.b(P.p(H.d(d)+" has no constructor called 'created'"))
+J.MZ(W.r3("article",null))
+w=z.$nativeSuperclassTag
+if(w==null)throw H.b(P.p(d))
+v=e==null
+if(v){if(!J.mG(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.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.Z6(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.ri(),4))}
+s=Object.create(u.prototype,t)
+Object.defineProperty(s,init.dispatchPropertyName,{value:H.Va(y),enumerable:false,writable:true,configurable:true})
+r={prototype:s}
+if(!v)r.extends=e
+b.registerElement(c,r)},
+Yt:function(a){if(J.mG($.X3,C.fQ))return a
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.mG($.X3,C.fQ))return a
+return $.X3.PT(a,!0)},
+AN:{
 "^":"Gv+REn;"},
 Xn:{
-"^":"vY6;RN,Pv",
-T2:function(a,b){var z=this.Pv
-if(J.xC(z.gB(z),0))H.vh(H.DU())
-return J.KU(z.Zv(0,0),b)},
-hV:function(a,b,c,d){this.Pv.aN(0,new W.Fp(b,c,d))},
+"^":"vY6;Q,a",
+T2:function(a,b){var z=this.a
+return J.KU(z.gtH(z),b)},
+hV:function(a,b,c,d){this.a.aN(0,new W.Fp(b,c,d))},
 f8:function(a,b,c){return this.hV(a,b,c,null)},
-F5:function(a){this.Pv=H.VM(new H.A8(P.F(this.RN,!0,null),new W.XX()),[null,null])},
+XG:function(a){this.a=H.J(new H.A8(P.z(this.Q,!0,null),new W.px()),[null,null])},
 static:{BW:function(a){var z=new W.Xn(a,null)
-z.F5(a)
+z.XG(a)
 return z}}},
 vY6:{
 "^":"a+REn;"},
-XX:{
-"^":"TpZ:12;",
-$1:[function(a){return J.rk(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+px:{
+"^":"r:14;",
+$1:[function(a){return J.ma(a)},"$1",null,2,0,null,4,"call"]},
 Fp:{
-"^":"TpZ:12;a,b,c",
-$1:function(a){return J.oS(a,this.a,this.b,this.c)},
-$isEH:true},
+"^":"r:14;Q,a,b",
+$1:function(a){return J.X9(a,this.Q,this.a,this.b)}},
 REn:{
 "^":"a;",
-gi1:function(a){return this.T2(a,"clear")},
-V1:function(a){return this.gi1(a).$0()},
+gyP:function(a){return this.T2(a,"clear")},
+V1:function(a){return this.gyP(a).$0()},
 gih:function(a){return this.T2(a,"color")},
 sih:function(a,b){this.hV(a,"color",b,"")},
 goH:function(a){return this.T2(a,"columns")},
@@ -10814,96 +10370,94 @@
 guc:function(a){return this.T2(a,"page")},
 suc:function(a,b){this.hV(a,"page",b,"")},
 gT8:function(a){return this.T2(a,"right")},
-gyT:function(a){return this.T2(a,"size")}},
+gky:function(a){return this.T2(a,"size")}},
 VG:{
-"^":"ark;dA,jS",
-tg:function(a,b){return J.kE(this.jS,b)},
-gl0:function(a){return this.dA.firstElementChild==null},
-gB:function(a){return this.jS.length},
-t:function(a,b){var z=this.jS
+"^":"ark;Q,a",
+tg:function(a,b){return J.kE(this.a,b)},
+gl0:function(a){return this.Q.firstElementChild==null},
+gv:function(a){return this.a.length},
+p:function(a,b){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.jS
+q:function(a,b,c){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.dA.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.dA.appendChild(b)
+this.Q.replaceChild(c,z[b])},
+sv:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
+h:function(a,b){this.Q.appendChild(b)
 return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
+gu:function(a){var z=this.br(this)
+return H.J(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.Ff)},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.Q;z.D();)y.appendChild(z.c)},
 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.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())},
+z=this.Q
+if(b){z=J.OD(z)
+y=z.ev(z,new W.dz(a))}else{z=J.OD(z)
+y=z.ev(z,a)}for(z=H.J(new H.Mo(J.Nx(y.Q),y.a),[H.u3(y,0)]),x=z.Q;z.D();)J.vX(x.gk())},
 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)},
+vg: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(!!J.t(b).$isz2){z=this.Q
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-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
+aP:function(a,b,c){var z,y,x
+if(b>this.a.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.a
 y=z.length
-x=this.dA
+x=this.Q
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
-V1:function(a){J.Wf(this.dA)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.dA.removeChild(z)
+V1:function(a){J.Ul(this.Q)},
+f4:function(a){var z=this.grZ(this)
+this.Q.removeChild(z)
 return z},
-gqG:function(a){var z=this.dA.firstElementChild
-if(z==null)throw H.b(P.w("No elements"))
+gtH:function(a){var z=this.Q.firstElementChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-grZ:function(a){var z=this.dA.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
+grZ:function(a){var z=this.Q.lastElementChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-$asark:function(){return[W.h4]},
-$aseD:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
+$asark:function(){return[W.z2]},
+$asE9h:function(){return[W.z2]},
+$asWO:function(){return[W.z2]},
+$asQV:function(){return[W.z2]}},
 dz:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.$1(a)!==!0},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q.$1(a)!==!0}},
 wz:{
-"^":"ark;jt,xa",
-gB:function(a){return this.jt.length},
-t:function(a,b){var z=this.jt
+"^":"ark;Q,a",
+gv:function(a){return this.Q.length},
+p:function(a,b){var z=this.Q
 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"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
+sv: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)},
-gqG:function(a){return C.t5.gqG(this.jt)},
-grZ:function(a){return C.t5.grZ(this.jt)},
-gDD:function(a){return W.oo(this.xa)},
-gS:function(a){return W.BW(this.xa)},
-geg:function(a){return H.VM(new W.Uc(this,!1,C.rt.fA),[null])},
-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))},
+gtH:function(a){return C.t5.gtH(this.Q)},
+grZ:function(a){return C.t5.grZ(this.Q)},
+gDD:function(a){return W.Dk(this.a)},
+gO:function(a){return W.BW(this.a)},
+gHQ:function(a){return H.J(new W.Uc(this,!1,"keydown"),[null])},
+nJ:function(a,b){var z=C.t5.ev(this.Q,new W.ty())
+this.a=P.z(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
-z.S8(a,b)
+static:{vD:function(a,b){var z=H.J(new W.wz(a,null),[b])
+z.nJ(a,b)
 return z}}},
 ty:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isz2}},
+M5K:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10912,7 +10466,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-ecX:{
+ec:{
 "^":"RAp+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -10920,85 +10474,86 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"]},
 bU2:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-bU:{
-"^":"TpZ:12;b,c",
+"^":"r:80;Q",
+$2:function(a,b){this.Q.setRequestHeader(a,b)}},
+hH:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-z=this.c
+z=this.a
 y=z.status
-if(typeof y!=="number")return y.F()
+if(typeof y!=="number")return y.C()
 y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.YM!==0)H.vh(P.w("Future already completed"))
-y.Xf(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+x=this.Q
+if(y)x.aM(0,z)
+else x.pm(a)},"$1",null,2,0,null,4,"call"]},
 DB:{
-"^":"TpZ:81;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;uR",
-gqG:function(a){var z=this.uR.firstChild
-if(z==null)throw H.b(P.w("No elements"))
+"^":"r:80;Q",
+$2:function(a,b){if(b!=null)this.Q[a]=b}},
+OB:{
+"^":"ark;Q",
+gtH:function(a){var z=this.Q.firstChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-grZ:function(a){var z=this.uR.lastChild
-if(z==null)throw H.b(P.w("No elements"))
+grZ:function(a){var z=this.Q.lastChild
+if(z==null)throw H.b(P.s("No elements"))
 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.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
+h:function(a,b){this.Q.appendChild(b)},
+FV:function(a,b){var z,y,x,w
+z=J.t(b)
+if(!!z.$isOB){z=b.Q
+y=this.Q
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gu(b),y=this.Q;z.D();)y.appendChild(z.gk())},
+aP:function(a,b,c){var z,y,x
+if(b>this.Q.childNodes.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.Q
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
-z=this.uR
+UG:function(a,b,c){var z,y,x
+z=this.Q
 y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+x=y.length
+if(b===x)this.FV(0,c)
+else{if(b<0||b>=x)return H.e(y,b)
+J.qD(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
-z=this.uR
+if(!J.t(b).$isKV)return!1
+z=this.Q
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
 aO:function(a,b){var z,y,x
-z=this.uR
+z=this.Q
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
-if(J.xC(a.$1(y),b))z.removeChild(y)}},
+if(J.mG(a.$1(y),b))z.removeChild(y)}},
 uk:function(a,b){this.aO(b,!0)},
-V1:function(a){J.Wf(this.uR)},
-u:function(a,b,c){var z,y
-z=this.uR
+V1:function(a){J.Ul(this.Q)},
+q:function(a,b,c){var z,y
+z=this.Q
 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.t5.gA(this.uR.childNodes)},
+gu:function(a){return C.t5.gu(this.Q.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"))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.uR.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.uR.childNodes
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+gv:function(a){return this.Q.childNodes.length},
+sv:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
+p:function(a,b){var z=this.Q.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$iswi:true,
+$isOB:true,
 $asark:function(){return[W.KV]},
-$aseD:function(){return[W.KV]},
+$asE9h:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -11008,7 +10563,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-w1p:{
+ecX:{
 "^":"nNL+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -11016,21 +10571,17 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 xv:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$islq},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isQlt}},
 AA:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.setItem(a,b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.setItem(a,b)}},
 wQ:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.push(a)},
-$isEH:true},
-rs:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.push(b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.push(a)}},
+ru:{
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.push(b)}},
 yoo:{
 "^":"Gv+lD;",
 $isWO:true,
@@ -11038,7 +10589,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-kEI:{
+w1p:{
 "^":"yoo+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -11052,7 +10603,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.vKL]}},
-x5e:{
+kEI:{
 "^":"zLC+Gm;",
 $isWO:true,
 $asWO:function(){return[W.vKL]},
@@ -11061,187 +10612,174 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Za(this))},
+FV:function(a,b){J.Me(b,new W.ZcQ(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.Ff)},
+for(z=this.gvc(this),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)this.Rz(0,z.c)},
 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.Ff
-b.$2(y,this.t(0,y))}},
+for(z=this.gvc(this),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+b.$2(y,this.p(0,y))}},
 gvc:function(a){var z,y,x,w
-z=this.dA.attributes
-y=H.VM([],[P.qU])
+z=this.Q.attributes
+y=H.J([],[P.I])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
+if(this.Bs(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.DA(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
-z=this.dA.attributes
-y=H.VM([],[P.qU])
+z=this.Q.attributes
+y=H.J([],[P.I])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
-y.push(J.Vm(z[w]))}}return y},
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-$isT8:true,
-$asT8:function(){return[P.qU,P.qU]}},
-Za:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
+if(this.Bs(z[w])){if(w>=z.length)return H.e(z,w)
+y.push(J.SW(z[w]))}}return y},
+gl0:function(a){return this.gv(this)===0},
+gor:function(a){return this.gv(this)!==0},
+$isw:true,
+$asw:function(){return[P.I,P.I]}},
+ZcQ:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,b)}},
 E9:{
-"^":"a7B;dA",
-NZ:function(a,b){return this.dA.hasAttribute(b)},
-t:function(a,b){return this.dA.getAttribute(b)},
-u:function(a,b,c){this.dA.setAttribute(b,c)},
+"^":"a7B;Q",
+NZ:function(a,b){return this.Q.hasAttribute(b)},
+p:function(a,b){return this.Q.getAttribute(b)},
+q:function(a,b,c){this.Q.setAttribute(b,c)},
 Rz:function(a,b){var z,y
-z=this.dA
+z=this.Q
 y=z.getAttribute(b)
 z.removeAttribute(b)
 return y},
-gB:function(a){return this.gvc(this).length},
-O2:function(a){return a.namespaceURI==null}},
-nFk:{
-"^":"As3;RN,AL",
-DG:function(){var z=P.Ls(null,null,null,P.qU)
-this.AL.aN(0,new W.jL(z))
+gv:function(a){return this.gvc(this).length},
+Bs:function(a){return a.namespaceURI==null}},
+hZ:{
+"^":"As3;Q,a",
+DG:function(){var z=P.fM(null,null,null,P.I)
+this.a.aN(0,new W.qm(z))
 return z},
 p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-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.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:{oo:function(a){var z=new W.nFk(a,null)
+z=C.Nm.zV(P.z(a,!0,null)," ")
+for(y=this.Q,y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();)J.fm(y.c,z)},
+H9:function(a){this.a.aN(0,new W.uS(a))},
+Rz:function(a,b){return this.jA(new W.Bj(b))},
+jA:function(a){return this.a.es(0,!1,new W.Zl(a))},
+b1:function(a){this.a=H.J(new H.A8(P.z(this.Q,!0,null),new W.Lu()),[null,null])},
+static:{Dk:function(a){var z=new W.hZ(a,null)
 z.b1(a)
 return z}}},
-FK:{
-"^":"TpZ:12;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-jL:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.FV(0,a.DG())},
-$isEH:true},
+Lu:{
+"^":"r:14;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,4,"call"]},
+qm:{
+"^":"r:14;Q",
+$1:function(a){return this.Q.FV(0,a.DG())}},
 uS:{
-"^":"TpZ:12;a",
-$1:function(a){return a.H9(this.a)},
-$isEH:true},
-FcD:{
-"^":"TpZ:12;a",
-$1:function(a){return J.V1(a,this.a)},
-$isEH:true},
-hD:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.$1(b)===!0||a===!0},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return a.H9(this.Q)}},
+Bj:{
+"^":"r:14;Q",
+$1:function(a){return J.V1(a,this.Q)}},
+Zl:{
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.$1(b)===!0||a===!0}},
 I4:{
-"^":"As3;dA",
+"^":"As3;Q",
 DG:function(){var z,y,x
-z=P.Ls(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.rr(y.Ff)
+z=P.fM(null,null,null,P.I)
+for(y=J.ufU(this.Q).split(" "),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=J.Q7(y.c)
 if(x.length!==0)z.h(0,x)}return z},
-p5:function(a){P.F(a,!0,null)
-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)
+p5:function(a){P.z(a,!0,null)
+J.fm(this.Q,a.zV(0," "))}},
+vG:{
+"^":"cb;Q,a,b",
+X5:function(a,b,c,d){var z=new W.Ov(0,this.Q,this.a,W.Yt(a),this.b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.DN()
+z.P6()
 return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-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.W3w(J.l2(a),this.a)},
-$isEH:true},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)}},
+eu:{
+"^":"vG;Q,a,b",
+WO:function(a,b){var z=H.J(new P.fk(new W.tS(b),this),[H.W8(this,"cb",0)])
+return H.J(new P.c9(new W.rg(b),z),[H.W8(z,"cb",0),null])},
+$iscb:true},
 tS:{
-"^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
-return a},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return J.I0(J.Zu(a),this.Q)}},
+rg:{
+"^":"r:14;Q",
+$1:[function(a){J.A6(a,this.Q)
+return a},"$1",null,2,0,null,4,"call"]},
 Uc:{
-"^":"wS;fT,el,fA",
-xZ:function(a,b){var z=H.VM(new P.fk(new W.Al(b),this),[H.W8(this,"wS",0)])
-return H.VM(new P.c9(new W.iND(b),z),[H.W8(z,"wS",0),null])},
-KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.wS,null],[P.MO,null])),[null])
-z.xd(null)
-for(y=this.fT,y=y.gA(y),x=this.fA,w=this.el;y.G();){v=new W.RO(y.Ff,x,w)
+"^":"cb;Q,a,b",
+WO:function(a,b){var z=H.J(new P.fk(new W.Es(b),this),[H.W8(this,"cb",0)])
+return H.J(new P.c9(new W.Hb(b),z),[H.W8(z,"cb",0),null])},
+X5:function(a,b,c,d){var z,y,x,w,v
+z=H.J(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.yX,null])),[null])
+z.KS(null)
+for(y=this.Q,y=y.gu(y),x=this.b,w=this.a;y.D();){v=new W.vG(y.c,x,w)
 v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.Hj
+z.h(0,v)}y=z.Q
 y.toString
-return H.VM(new P.Ln(y),[H.u3(y,0)]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-$iswS:true},
-Al:{
-"^":"TpZ:12;a",
-$1:function(a){return J.W3w(J.l2(a),this.a)},
-$isEH:true},
-iND:{
-"^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
-return a},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+return H.J(new P.rk(y),[H.u3(y,0)]).X5(a,b,c,d)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)},
+$iscb:true},
+Es:{
+"^":"r:14;Q",
+$1:function(a){return J.I0(J.Zu(a),this.Q)}},
+Hb:{
+"^":"r:14;Q",
+$1:[function(a){J.A6(a,this.Q)
+return a},"$1",null,2,0,null,4,"call"]},
 Ov:{
-"^":"MO;UU,bi,fA,H2,el",
-Gv:function(){if(this.bi==null)return
+"^":"yX;Q,a,b,c,d",
+Gv:function(){if(this.a==null)return
 this.EO()
-this.bi=null
-this.H2=null
+this.a=null
+this.c=null
 return},
-Fv:[function(a,b){if(this.bi==null)return;++this.UU
+Fv:[function(a,b){if(this.a==null)return;++this.Q
 this.EO()
-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.we(this.bi,this.fA,z,this.el)}},
+if(b!=null)b.wM(this.gbY(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+gRW:function(){return this.Q>0},
+QE:[function(a){if(this.a==null||this.Q<=0)return;--this.Q
+this.P6()},"$0","gbY",0,0,1],
+P6:function(){var z=this.c
+if(z!=null&&this.Q<=0)J.cZ(this.a,this.b,z,this.d)},
+EO:function(){var z=this.c
+if(z!=null)J.GJ(this.a,this.b,z,this.d)}},
 qO:{
-"^":"a;Hj,u4",
-gvq:function(a){var z=this.Hj
+"^":"a;Q,a",
+gvq:function(a){var z=this.Q
 z.toString
-return H.VM(new P.Ln(z),[H.u3(z,0)])},
+return H.J(new P.rk(z),[H.u3(z,0)])},
 h:function(a,b){var z,y
-z=this.u4
+z=this.a
 if(z.NZ(0,b))return
-y=this.Hj
-z.u(0,b,b.zC(y.ght(y),new W.rW(this,b),this.Hj.gGj()))},
-Rz:function(a,b){var z=this.u4.Rz(0,b)
+y=this.Q
+z.q(0,b,b.zC(y.ght(y),new W.RXm(this,b),this.Q.gXB()))},
+Rz:function(a,b){var z=this.a.Rz(0,b)
 if(z!=null)z.Gv()},
 xO:[function(a){var z,y
-for(z=this.u4,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.Gv()
+for(z=this.a,y=z.gUQ(z),y=H.J(new H.MH(null,J.Nx(y.Q),y.a),[H.u3(y,0),H.u3(y,1)]);y.D();)y.Q.Gv()
 z.V1(0)
-this.Hj.xO(0)},"$0","gQF",0,0,17],
-xd:function(a){this.Hj=P.bK(this.gQF(this),null,!0,a)}},
-rW:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+this.Q.xO(0)},"$0","gJK",0,0,1],
+KS:function(a){this.Q=P.bK(this.gJK(this),null,!0,a)}},
+RXm:{
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Rz(0,this.a)},"$0",null,0,0,null,"call"]},
 Gm:{
 "^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
+gu:function(a){return H.J(new W.W9(a,this.gv(a),-1,null),[H.W8(a,"Gm",0)])},
 h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 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)},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+aP: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."))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
@@ -11249,67 +10787,65 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"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.U2(this.xN)},
-t:function(a,b){var z=this.xN
+"^":"ark;Q",
+gu:function(a){return H.J(new W.Qg(J.Nx(this.Q)),[null])},
+gv:function(a){return this.Q.length},
+h:function(a,b){J.dH(this.Q,b)},
+Rz:function(a,b){return J.V1(this.Q,b)},
+V1:function(a){J.U2(this.Q)},
+p:function(a,b){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xN
+q:function(a,b,c){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xN,b)},
-GT:function(a,b){J.uF(this.xN,b)},
+sv:function(a,b){J.RS(this.Q,b)},
+GT:function(a,b){J.y6(this.Q,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xN,b,c)},
+XU:function(a,b,c){return J.DP(this.Q,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xN,b,c)},
+Pk:function(a,b,c){return J.ff(this.Q,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-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.xN,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
+aP:function(a,b,c){return J.V2(this.Q,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.Q,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+oq:function(a,b,c){J.Hd(this.Q,b,c)}},
+Qg:{
+"^":"a;Q",
+D:function(){return this.Q.D()},
+gk:function(){return this.Q.c}},
 W9:{
-"^":"a;NX,vN,G3,QZ",
-G:function(){var z,y
-z=this.G3+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.NX,z)
-this.G3=z
-return!0}this.QZ=null
-this.G3=y
+"^":"a;Q,a,b,c",
+D:function(){var z,y
+z=this.b+1
+y=this.a
+if(z<y){this.c=J.Tf(this.Q,z)
+this.b=z
+return!0}this.c=null
+this.b=y
 return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"TpZ:12;a,b",
-$1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
+gk:function(){return this.c}},
+zZ:{
+"^":"r:14;Q,a",
+$1:[function(a){Object.defineProperty(a,init.dispatchPropertyName,{value:H.Va(this.a),enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,56,"call"],
-$isEH:true},
+return this.Q(a)},"$1",null,2,0,null,58,"call"]},
 dW:{
-"^":"a;uU",
-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.pf(b),c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+"^":"a;Q",
+gbq:function(a){return W.zK(this.Q.history)},
+geT:function(a){return W.P1(this.Q.parent)},
+xO:function(a){return this.Q.close()},
+kr:function(a,b,c,d){this.Q.postMessage(P.jl(b),c)},
+X6:function(a,b,c){return this.kr(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."))},
-$isPZ:true,
+$isD0:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-VP:{
-"^":"a;nA",
+IV:{
+"^":"a;Q",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["","",,P,{
+else return new W.IV(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11317,105 +10853,105 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,mH:href=",
+"^":"tpr;K:target=,LU:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"Rc;mH:href=",
+"^":"Eo4;LU:href=",
 "%":"SVGAltGlyphElement"},
-jwG:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Lr:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
 lvr:{
-"^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
+"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pfc:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-lF:{
-"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
+pyf:{
+"^":"d5;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-EfE:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Kq:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+tr:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 ihH:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
 tk2:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
+"^":"d5;fg:height=,yG:result=,x=,y=,LU:href=",
 "%":"SVGFEImageElement"},
 oBW:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
 yu:{
-"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
+"^":"d5;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+MI:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
 Ubr:{
-"^":"d5G;x=,y=",
+"^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+xX:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
-"^":"d5G;x=,y=",
+"^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Qya:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
-"^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
+"^":"d5;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5;fg:height=,x=,y=,LU:href=",
 "%":"SVGFilterElement"},
-l6:{
+q8t:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
-"^":"d5G;",
+"^":"d5;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGImageElement"},
 NBZ:{
-"^":"d5G;fg:height=,x=,y=",
+"^":"d5;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5;fg:height=,x=,y=,LU:href=",
 "%":"SVGPatternElement"},
 NJ3:{
-"^":"en;fg:height=,x=,y=",
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
-qIR:{
-"^":"d5G;t5:type=,mH:href=",
+j24:{
+"^":"d5;t5:type=,LU:href=",
 "%":"SVGScriptElement"},
-EUL:{
-"^":"d5G;t5:type=",
+BD:{
+"^":"d5;t5:type=",
 smk:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
-d5G:{
-"^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
+d5:{
+"^":"z2;",
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
 return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-geg:function(a){return H.VM(new W.Cqa(a,C.rt.fA,!1),[null])},
-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,
+gwd:function(a){return H.J(new P.P0(a,new W.OB(a)),[W.z2])},
+gHQ:function(a){return H.J(new W.eu(a,"keydown",!1),[null])},
+gVY:function(a){return H.J(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.J(new W.eu(a,"mousemove",!1),[null])},
+$isD0: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:{
@@ -11423,68 +10959,68 @@
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
-mHq:{
+mH:{
 "^":"tpr;",
 "%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
+xN:{
+"^":"mH;LU:href=",
 "%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
+Eo4:{
+"^":"mH;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;mH:href=",
+"^":"d5;LU:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
+Ci:{
+"^":"As3;Q",
 DG:function(){var z,y,x,w
-z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+z=this.Q.getAttribute("class")
+y=P.fM(null,null,null,P.I)
 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.rr(x.Ff)
+for(x=z.split(" "),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=J.Q7(x.c)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
+p5:function(a){this.Q.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-hq:{
+XY:{
 "^":"a;",
-$ishq:true}}],["","",,P,{
+$isXY: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)},
+xZ: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
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,40,61,26,62],
+d=z}return P.wY(H.eC(a,P.z(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,42,63,27,64],
 Dm:function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
+if(Object.isExtensible(a)&&!Object.prototype.hasOwnProperty.call(a,b))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
 Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-else{z=J.x(a)
+else{z=J.t(a)
 if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
 else if(!!z.$isiP)return H.o2(a)
-else if(!!z.$isE4)return a.S1
+else if(!!z.$isE4)return a.Q
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,14,65],
 hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
-else{if(a instanceof Object){z=J.x(a)
+else{if(a instanceof Object){z=J.t(a)
 z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,52,63],
+else return P.ND(a)}},"$1","Xl",2,0,53,65],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.np())
 else return P.iQ(a,$.LZ(),new P.Ut())},
@@ -11492,94 +11028,91 @@
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
-"^":"a;S1",
-t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.S1[b])},
-u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.S1[b]=P.wY(c)},
+"^":"a;Q",
+p:["lg",function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.p("property is not a String or num"))
+return P.dU(this.Q[b])}],
+q:["kW",function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.p("property is not a String or num"))
+this.Q[b]=P.wY(c)}],
 giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.S1===b.S1},
-Eg:function(a){return a in this.S1},
-Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.u("property is not a String or num"))
-delete this.S1[a]},
-bu:[function(a){var z,y
-try{z=String(this.S1)
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isE4&&this.Q===b.Q},
+Bm:function(a){return a in this.Q},
+Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.p("property is not a String or num"))
+delete this.Q[a]},
+X:[function(a){var z,y
+try{z=String(this.Q)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gCR",0,0,73],
-V7:function(a,b){var z,y
-z=this.S1
-y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
+return this.L7(this)}},"$0","gCR",0,0,0],
+Z:function(a,b){var z,y
+z=this.Q
+y=b==null?null:P.z(H.J(new H.A8(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.V7(a,null)},
+nQ:function(a){return this.Z(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
+C.Nm.FV(y,H.J(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-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)}}},
+return P.ND(new x())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.p("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.J(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.NZ(0,a))return z.t(0,a)
-y=J.x(a)
-if(!!y.$isT8){x={}
-z.u(0,a,x)
-for(z=J.mY(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
-z.u(0,a,v)
+z=this.Q
+if(z.NZ(0,a))return z.p(0,a)
+y=J.t(a)
+if(!!y.$isw){x={}
+z.q(0,a,x)
+for(z=J.Nx(y.gvc(a));z.D();){w=z.gk()
+x[w]=this.$1(y.p(a,w))}return x}else if(!!y.$isQV){v=[]
+z.q(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+return v}else return P.wY(a)},"$1",null,2,0,null,65,"call"]},
 r7:{
-"^":"E4;S1",
+"^":"E4;Q",
 qP:function(a,b){var z,y
 z=P.wY(b)
-y=P.F(H.VM(new H.A8(a,P.En()),[null,null]),!0,null)
-return P.dU(this.S1.apply(z,y))},
+y=P.z(H.J(new H.A8(a,P.En()),[null,null]),!0,null)
+return P.dU(this.Q.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
 GD:{
-"^":"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)
+"^":"WkF;Q",
+p: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.gv(this)
 else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}return P.E4.prototype.t.call(this,this,b)},
-u:function(a,b,c){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)
+if(z)H.vh(P.ve(b,0,this.gv(this),null,null))}return this.lg(this,b)},
+q:function(a,b,c){var z
+if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gv(this)
 else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.S1.length
+if(z)H.vh(P.ve(b,0,this.gv(this),null,null))}this.kW(this,b,c)},
+gv:function(a){var z=this.Q.length
 if(typeof z==="number"&&z>>>0===z)return z
-throw H.b(P.w("Bad JsArray length"))},
-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))},
-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.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)
-if(b<0||b>z)H.vh(P.TE(b,0,z))
-if(c<b||c>z)H.vh(P.TE(c,b,z))
-y=c-b
-if(y===0)return
-if(e<0)throw H.b(P.u(e))
-x=[b,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",[])},
+throw H.b(P.s("Bad JsArray length"))},
+sv:function(a,b){this.kW(this,"length",b)},
+h:function(a,b){this.Z("push",[b])},
+FV:function(a,b){this.Z("push",b instanceof Array?b:P.z(b,!0,null))},
+aP:function(a,b,c){if(b>=this.gv(this)+1)H.vh(P.ve(b,0,this.gv(this),null,null))
+this.Z("splice",[b,0,c])},
+oq:function(a,b,c){P.BE(b,c,this.gv(this))
+this.Z("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y
+P.BE(b,c,this.gv(this))
+z=c-b
+if(z===0)return
+if(e<0)throw H.b(P.p(e))
+y=[b,z]
+C.Nm.FV(y,J.Ld(d,e).qZ(0,z))
+this.Z("splice",y)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+GT:function(a,b){this.Z("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-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))}}},
+static:{BE:function(a,b,c){if(a<0||a>c)throw H.b(P.ve(a,0,c,null,null))
+if(b<a||b>c)throw H.b(P.ve(b,a,c,null,null))}}},
 WkF:{
 "^":"E4+lD;",
 $isWO:true,
@@ -11588,27 +11121,22 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"TpZ:12;",
-$1:function(a){var z=P.z8(a,!1)
+"^":"r:14;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
+return z}},
 Hp:{
-"^":"TpZ:12;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return new this.Q(a)}},
 Nz:{
-"^":"TpZ:12;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return new P.r7(a)}},
 np:{
-"^":"TpZ:12;",
-$1:function(a){return H.VM(new P.GD(a),[null])},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return H.J(new P.GD(a),[null])}},
 Ut:{
-"^":"TpZ:12;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["","",,P,{
+"^":"r:14;",
+$1:function(a){return new P.E4(a)}}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -11616,9 +11144,9 @@
 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
-if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
+C:function(a,b){var z
+if(typeof a!=="number")throw H.b(P.p(a))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
@@ -11626,8 +11154,8 @@
 else z=!1
 if(z||isNaN(b))return b
 return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
+u:function(a,b){if(typeof a!=="number")throw H.b(P.p(a))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
@@ -11639,33 +11167,33 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;xx,vz",
-SR:function(){var z,y,x,w,v,u
-z=this.xx
+"^":"a;Q,a",
+v7:function(){var z,y,x,w,v,u
+z=this.Q
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.vz
+u=v+x+this.a
 z=(u&4294967295)>>>0
-this.xx=z
-this.vz=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Q=z
+this.a=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 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.SR()
-return(this.xx&z)>>>0}do{this.SR()
-y=this.xx
+if((a&z)===0){this.v7()
+return(this.Q&z)>>>0}do{this.v7()
+y=this.Q
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mK:function(a){var z,y,x,w,v,u,t,s
-z=J.u6(a,0)?-1:0
+FO:function(a){var z,y,x,w,v,u,t,s
+z=J.UN(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
-a=J.Cl(y.W(a,x),4294967296)
+a=J.bI(y.T(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Cl(y.W(a,w),4294967296)
+a=J.bI(y.T(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
@@ -11680,141 +11208,130 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.BU(v-u,4294967296)
-v=this.xx*1037
+v=this.Q*1037
 t=(v&4294967295)>>>0
-this.xx=t
-s=(this.vz*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
-this.vz=s
-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.SR()
-this.SR()
-this.SR()
-this.SR()},
-static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.mK(a)
+this.Q=t
+s=(this.a*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
+this.a=s
+this.Q=(t^u)>>>0
+this.a=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.mG(a,z))
+if(this.a===0&&this.Q===0)this.Q=23063
+this.v7()
+this.v7()
+this.v7()
+this.v7()},
+static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.FO(a)
 return z}}},
 hL:{
-"^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gCR",0,0,73],
-n:function(a,b){var z,y
+"^":"a;x:Q>,y:a>",
+X:[function(a){return"Point("+H.d(this.Q)+", "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z,y
 if(b==null)return!1
-if(!J.x(b).$ishL)return!1
-z=this.x
-y=b.x
-if(z==null?y==null:z===y){z=this.y
-y=b.y
+if(!J.t(b).$ishL)return!1
+z=this.Q
+y=b.Q
+if(z==null?y==null:z===y){z=this.a
+y=b.a
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},
 giO:function(a){var z,y
-z=J.v1(this.x)
-y=J.v1(this.y)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return P.xk(P.Zm(P.Zm(0,z),y))},
 g:function(a,b){var z,y,x,w
-z=this.x
+z=this.Q
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
+if(typeof x!=="number")return H.o(x)
+w=this.a
 y=y.gy(b)
 if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(y)
+if(typeof y!=="number")return H.o(y)
 y=new P.hL(z+x,w+y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-W:function(a,b){var z,y,x,w
-z=this.x
+T:function(a,b){var z,y,x,w
+z=this.Q
 y=J.RE(b)
 x=y.gx(b)
-if(typeof z!=="number")return z.W()
-if(typeof x!=="number")return H.s(x)
-w=this.y
+if(typeof z!=="number")return z.T()
+if(typeof x!=="number")return H.o(x)
+w=this.a
 y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(y)
+if(typeof w!=="number")return w.T()
+if(typeof y!=="number")return H.o(y)
 y=new P.hL(z-x,w-y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-U:function(a,b){var z,y
-z=this.x
-if(typeof z!=="number")return z.U()
-if(typeof b!=="number")return H.s(b)
-y=this.y
-if(typeof y!=="number")return y.U()
+R:function(a,b){var z,y
+z=this.Q
+if(typeof z!=="number")return z.R()
+if(typeof b!=="number")return H.o(b)
+y=this.a
+if(typeof y!=="number")return y.R()
 y=new P.hL(z*b,y*b)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){return this.gBb(this)+this.R},
-gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gCR",0,0,73],
-n:function(a,b){var z,y
+gT8:function(a){return this.gBb(this)+this.b},
+gQG:function(a){return this.gG6(this)+this.c},
+X:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.a+") "+this.b+" x "+this.c},"$0","gCR",0,0,0],
+m:function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$istn)return!1
-if(this.gBb(this)===z.gBb(b)){y=this.G6
-z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
+if(this.gBb(this)===z.gBb(b)){y=this.a
+z=y===z.gG6(b)&&this.Q+this.b===z.gT8(b)&&y+this.c===z.gQG(b)}else z=!1
 return z},
-giO:function(a){var z=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)
+giO:function(a){var z=this.a
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Q+this.b&0x1FFFFFFF),z+this.c&0x1FFFFFFF))},
+gSR:function(a){var z=new P.hL(this.gBb(this),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
+"^":"HDe;Bb:Q>,G6:a>,N:b>,fg:c>",
 $istn:true,
 $astn:null,
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
+return H.J(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
 "^":"",
 moY:{
-"^":"a;JH",
+"^":"a;Q",
 static:{"^":"aRn,aLE,Rwl"}},
-V2:{
+Wy:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
-Hj:function(a,b,c){},
-m6:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-z4:function(a,b,c){H.Hj(a,b,c)
-return new Uint8Array(a,b)},
-bf:{
+D8:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.uh},
-kq:function(a,b,c){H.Hj(a,b,c)
-return new DataView(a,b)},
-$isbf:true,
+gbx:function(a){return C.E0},
+$isD8:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
-"^":"Gv;bg:buffer=,H3:byteLength=,Vl:byteOffset=",
+"^":"Gv;bg:buffer=,H3:byteLength=,rv:byteOffset=",
 aq:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-Lu:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
-Mz:function(a,b,c,d){var z=d+1
-this.Lu(a,b,z)
-this.Lu(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
+if(z.w(b,0)||z.C(b,c)){if(!!this.$isWO)if(c===a.length)throw H.b(P.Hj(b,a,null,null,null))
+throw H.b(P.ve(b,0,c-1,null,null))}else throw H.b(P.p("Invalid list index "+H.d(b)))},
+bv:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
+i4:function(a,b,c,d){var z=d+1
+this.bv(a,b,z)
+this.bv(a,c,z)
+if(b>c)throw H.b(P.ve(b,0,c,null,null))
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;b0B|ObS|GVy|Dg|fjp|Ipv|Pg"},
+"%":";ArrayBufferView;vF|Ui|GVy|Dg|ObS|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.nW},
+gbx:function(a){return C.T1},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
@@ -11823,25 +11340,25 @@
 gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.nC},
+gbx:function(a){return C.Ev},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11851,10 +11368,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int16Array"},
-dE5:{
+dE:{
 "^":"Pg;",
-gbx:function(a){return C.QP},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.J0},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11866,8 +11383,8 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.OP},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.QG},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11877,10 +11394,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-pd:{
+us:{
 "^":"Pg;",
-gbx:function(a){return C.u9},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.iN},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11890,10 +11407,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-Pqh:{
+N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11905,9 +11422,9 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.YZ},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.hD},
+gv:function(a){return a.length},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11917,14 +11434,13 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
+V6:{
 "^":"Pg;",
-gbx:function(a){return C.Wr},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.HC},
+gv:function(a){return a.length},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-aM:function(a,b,c){return new Uint8Array(a.subarray(b,this.Mz(a,b,c,a.length)))},
 $isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
@@ -11932,65 +11448,71 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-b0B:{
+QY:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p("Invalid view offsetInBytes "+H.d(b)))
+if(c!=null&&!1)throw H.b(P.p("Invalid view length "+H.d(c)))},
+eb:function(a,b,c){H.QY(a,b,c)
+return new DataView(a,b,c)},
+GG:function(a,b,c){H.QY(a,b,c)
+return new Uint8Array(a,b)},
+vF:{
 "^":"eH;",
-gB:function(a){return a.length},
-SM:function(a,b,c,d,e){var z,y,x
+gv:function(a){return a.length},
+Xx:function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.Lu(a,b,z)
-this.Lu(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
+this.bv(a,b,z)
+this.bv(a,c,z)
+if(b>c)throw H.b(P.ve(b,0,c,null,null))
 y=c-b
-if(e<0)throw H.b(P.u(e))
+if(e<0)throw H.b(P.p(e))
 x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
+if(x-e<y)throw H.b(P.s("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
 a.set(d,b)},
 $isXj:true},
 Dg:{
 "^":"GVy;",
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
+q:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.SM(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+YW:function(a,b,c,d,e){if(!!J.t(d).$isDg){this.Xx(a,b,c,d,e)
+return}this.as(a,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
-ObS:{
-"^":"b0B+lD;",
+Ui:{
+"^":"vF+lD;",
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]}},
+$asQV:function(){return[P.CP]}},
 GVy:{
-"^":"ObS+SU7;"},
+"^":"Ui+SU7;"},
 Pg:{
 "^":"Ipv;",
-u:function(a,b,c){var z=a.length
+q:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.SM(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+YW:function(a,b,c,d,e){if(!!J.t(d).$isPg){this.Xx(a,b,c,d,e)
+return}this.as(a,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-fjp:{
-"^":"b0B+lD;",
+ObS:{
+"^":"vF+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"fjp+SU7;"}}],["","",,H,{
+"^":"ObS+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
@@ -11999,791 +11521,781 @@
 return}throw"Unable to print message: "+String(a)}}],["","",,O,{
 "^":"",
 AK:{
-"^":"pva;HX,Qh,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-gIH:function(a){return a.Qh},
-sIH:function(a,b){a.Qh=this.ct(a,C.TI,a.Qh,b)},
+"^":"pva;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+gIH:function(a){return a.ij},
+sIH:function(a,b){a.ij=this.ct(a,C.TI,a.ij,b)},
 Es:function(a){var z,y,x,w,v
-Z.uL.prototype.Es.call(this,a)
-z=this.gKM(a).LL.t(0,"stack")
+this.VM(a)
+z=this.gKM(a).Q.p(0,"stack")
 y=window.innerHeight
-if(typeof y!=="number")return y.W()
+if(typeof y!=="number")return y.T()
 x=y-56
-w=C.jn.Z(x,1.3)
+w=C.jn.W(x,1.3)
 v=J.RE(z)
-if(a.Qh===!0)J.Yo(v.gS(z),"height",H.d(w)+"px")
-else J.Yo(v.gS(z),"height",""+x+"px")},
-static:{rV: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.Qh=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.BKH.LX(a)
-C.BKH.XI(a)
+if(a.ij===!0)J.IE(v.gO(z),"height",H.d(w)+"px")
+else J.IE(v.gO(z),"height",""+x+"px")},
+static:{Rzb:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.va.LX(a)
+C.va.XI(a)
 return a}}},
 pva:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 ys:{
-"^":"cda;HX,yJ,lJ,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-gGp:function(a){return a.yJ},
-sGp:function(a,b){a.yJ=this.ct(a,C.rX,a.yJ,b)},
-guo:function(a){return a.lJ},
-suo:function(a,b){a.lJ=this.ct(a,C.NK,a.lJ,b)},
-vD:[function(a,b){a.HX.cv("stacktrace").ml(new O.Kd(a))},"$1","guz",2,0,12,59],
-static:{Jt: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.lJ=0
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.uyw.LX(a)
-C.uyw.XI(a)
+"^":"cda;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+gGp:function(a){return a.ij},
+sGp:function(a,b){a.ij=this.ct(a,C.rX,a.ij,b)},
+guo:function(a){return a.TQ},
+suo:function(a,b){a.TQ=this.ct(a,C.N,a.TQ,b)},
+GU:[function(a,b){a.RZ.cv("stacktrace").ml(new O.nl(a))},"$1","guz",2,0,14,61],
+static:{RIs:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=0
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Yw.LX(a)
+C.Yw.XI(a)
 return a}}},
 cda:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-Kd:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-z.yJ=J.NB(z,C.rX,z.yJ,a)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
+nl:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.rX,z.ij,a)},"$1",null,2,0,null,121,"call"]},
 NF:{
-"^":"waa;zh,KH,t4,Zk,Bu,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.zh},
-sM6:function(a,b){a.zh=this.ct(a,C.rE,a.zh,b)},
-git:function(a){return a.KH},
-sit:function(a,b){a.KH=this.ct(a,C.B0,a.KH,b)},
-gO7:function(a){return a.t4},
-sO7:function(a,b){a.t4=this.ct(a,C.FQ,a.t4,b)},
-goE:function(a){return a.Zk},
-soE:function(a,b){a.Zk=this.ct(a,C.mr,a.Zk,b)},
-gO9:function(a){return a.Bu},
-sO9:function(a,b){a.Bu=this.ct(a,C.S4,a.Bu,b)},
+"^":"waa;RZ,ij,TQ,ca,Jc,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gM6:function(a){return a.RZ},
+sM6:function(a,b){a.RZ=this.ct(a,C.rE,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+gO7:function(a){return a.TQ},
+sO7:function(a,b){a.TQ=this.ct(a,C.FQ,a.TQ,b)},
+goE:function(a){return a.ca},
+soE:function(a,b){a.ca=this.ct(a,C.mr,a.ca,b)},
+gO9:function(a){return a.Jc},
+sO9:function(a,b){a.Jc=this.ct(a,C.S4,a.Jc,b)},
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=window.innerHeight
-if(typeof z!=="number")return z.Z()
-y=H.d(C.jn.Z(z,1.6))+"px"
-a.t4=this.ct(a,C.FQ,a.t4,y)},
-tn:[function(a,b){if(!J.xC(a.KH,a.Zk))this.AZ(a,null,null,null)},"$1","ghy",2,0,19,59],
-AZ:[function(a,b,c,d){var z=a.Bu
+if(typeof z!=="number")return z.W()
+y=H.d(C.jn.W(z,1.6))+"px"
+a.TQ=this.ct(a,C.FQ,a.TQ,y)},
+tn:[function(a,b){if(!J.mG(a.ij,a.ca))this.AZ(a,null,null,null)},"$1","ghy",2,0,20,61],
+AZ:[function(a,b,c,d){var z=a.Jc
 if(z===!0)return
-a.Bu=this.ct(a,C.S4,z,!0)
-J.SK(J.UQ(a.zh,"function")).ml(new O.eV(a))},"$3","gDI",6,0,84,49,50,85],
+a.Jc=this.ct(a,C.S4,z,!0)
+J.SK(J.Tf(a.RZ,"function")).ml(new O.lc(a))},"$3","gDI",6,0,84,52,55,85],
 static:{eqi: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.KH=!1
-a.Zk=!1
-a.Bu=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.ca=!1
+a.Jc=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.AuX.LX(a)
 C.AuX.XI(a)
 return a}}},
 waa:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-eV:{
-"^":"TpZ:12;a",
+lc:{
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w
-z=this.a
-y=z.Zk
+z=this.Q
+y=z.ca
 x=J.RE(z)
-z.Zk=x.ct(z,C.mr,y,y!==!0)
-w=x.gKM(z).LL.t(0,"frameOuter")
+z.ca=x.ct(z,C.mr,y,y!==!0)
+w=x.gKM(z).Q.p(0,"frameOuter")
 y=J.RE(w)
-if(z.Zk===!0)y.gDD(w).h(0,"shadow")
+if(z.ca===!0)y.gDD(w).h(0,"shadow")
 else y.gDD(w).Rz(0,"shadow")
-z.Bu=x.ct(z,C.S4,z.Bu,!1)},"$1",null,2,0,null,152,"call"],
-$isEH:true},
+z.Jc=x.ct(z,C.S4,z.Jc,!1)},"$1",null,2,0,null,152,"call"]},
 Hi:{
-"^":"V10;HX,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-static:{Uo: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V4;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+static:{kQ:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Pj.LX(a)
 C.Pj.XI(a)
 return a}}},
-V10:{
-"^":"uL+Pi;",
+V4:{
+"^":"uL+Piz;",
 $isd3:true},
 ts:{
-"^":"V11;HX,x8,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-ga4:function(a){return a.x8},
-sa4:function(a,b){a.x8=this.ct(a,C.mi,a.x8,b)},
+"^":"V10;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+ga4:function(a){return a.ij},
+sa4:function(a,b){a.ij=this.ct(a,C.mi,a.ij,b)},
 I9:function(a){var z,y
-Z.uL.prototype.I9.call(this,a)
-z=this.gKM(a).LL.t(0,"textBox")
+this.Ni(a)
+z=this.gKM(a).Q.p(0,"textBox")
 y=J.RE(z)
 y.q3(z)
-y.geg(z).yI(new O.eU2(a,z))},
+y.gHQ(z).yI(new O.eU2(a,z))},
 static:{wy: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.x8=""
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.mk.LX(a)
-C.mk.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=""
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Y7.LX(a)
+C.Y7.XI(a)
 return a}}},
-V11:{
-"^":"uL+Pi;",
+V10:{
+"^":"uL+Piz;",
 $isd3:true},
 eU2:{
-"^":"TpZ:153;a,b",
+"^":"r:153;Q,a",
 $1:[function(a){var z,y,x,w
 z=J.RE(a)
 switch(z.gIG(a)){case 9:z.e6(a)
-z=this.b
+z=this.a
 y=J.RE(z)
-y.mT(z,"TAB")
+y.jy(z,"TAB")
 x=y.gRP(z)
 if(typeof x!=="number")return x.g()
 w=y.gRP(z)
 if(typeof w!=="number")return w.g()
 y.np(z,x+3,w+3)
 break
-case 13:z=this.a
-P.FL("Debugger command (not implemented): "+H.d(z.x8))
-z.x8=J.NB(z,C.mi,z.x8,"")
-break}},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["","",,G,{
+case 13:z=this.Q
+P.FL("Debugger command (not implemented): "+H.d(z.ij))
+z.ij=J.Q5(z,C.mi,z.ij,"")
+break}},"$1",null,2,0,null,4,"call"]}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"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:{aMd: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{WF:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.BB.LX(a)
 C.BB.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"V12;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)},
+"^":"V11;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkc:function(a){return a.RZ},
+skc:function(a,b){a.RZ=this.ct(a,C.yh,a.RZ,b)},
 static:{hGU: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.On.LX(a)
-C.On.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.a3.LX(a)
+C.a3.XI(a)
 return a}}},
-V12:{
-"^":"uL+Pi;",
+V11:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"V13;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},
+"^":"V12;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+ga4:function(a){return a.RZ},
+sa4:function(a,b){a.RZ=this.ct(a,C.mi,a.RZ,b)},
+gdu:function(a){return a.ij},
+sdu:function(a,b){a.ij=this.ct(a,C.eh,a.ij,b)},
+gFR:function(a){return a.TQ},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
-gCf:function(a){return a.y4},
-sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-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.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)
+sFR:function(a,b){a.TQ=this.ct(a,C.U,a.TQ,b)},
+gCf:function(a){return a.ca},
+sCf:function(a,b){a.ca=this.ct(a,C.Aa,a.ca,b)},
+y6:[function(a,b,c,d){var z=H.Go(J.Zu(b),"$isSc").value
+z=this.ct(a,C.eh,a.ij,z)
+a.ij=z
+if(J.mG(z,"1-line")){z=J.JA(a.RZ,"\n"," ")
+a.RZ=this.ct(a,C.mi,a.RZ,z)}},"$3","gxb",6,0,116,4,106,107],
+tj:[function(a,b,c,d){var z,y,x
+J.Kr(b)
+z=a.RZ
+a.RZ=this.ct(a,C.mi,z,"")
+if(a.TQ!=null){y=P.A(null,null)
 x=R.tB(y)
-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.VU(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,154,2],
+J.H9(x,"expr",z)
+J.V2(a.ca,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,4,106,107],
+Oq:[function(a,b){var z=J.wo(J.Zu(b),"expr")
+a.RZ=this.ct(a,C.mi,a.RZ,z)},"$1","gHo",2,0,154,4],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.Ek="1-line"
-a.y4=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.ij="1-line"
+a.ca=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
 C.Jh.LX(a)
 C.Jh.XI(a)
 return a}}},
-V13:{
-"^":"uL+Pi;",
+V12:{
+"^":"uL+Piz;",
 $isd3:true},
 YW:{
-"^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,R,{
+"^":"r:14;Q",
+$1:[function(a){J.H9(this.Q,"value",a)},"$1",null,2,0,null,121,"call"]}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"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},
-sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
-gFR:function(a){return a.bY},
+"^":"KAf;LD,kX,RZ,ij,TQ,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gO9:function(a){return a.LD},
+sO9:function(a,b){a.LD=this.ct(a,C.S4,a.LD,b)},
+gph:function(a){return a.kX},
+sph:function(a,b){a.kX=this.ct(a,C.hf,a.kX,b)},
+gFR:function(a){return a.RZ},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
-gkZ:function(a){return a.jv},
-skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
-gyG:function(a){return a.oy},
-syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-cg:[function(a,b,c,d){var z=a.fe
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+gkZ:function(a){return a.ij},
+skZ:function(a,b){a.ij=this.ct(a,C.YT,a.ij,b)},
+gyG:function(a){return a.TQ},
+syG:function(a,b){a.TQ=this.ct(a,C.UY,a.TQ,b)},
+cg:[function(a,b,c,d){var z=a.LD
 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.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
+if(a.RZ!=null){a.LD=this.ct(a,C.S4,z,!0)
+a.TQ=this.ct(a,C.UY,a.TQ,null)
+this.LY(a,a.ij).ml(new R.VO(a)).wM(new R.Kzn(a))}},"$3","gDf",6,0,84,52,55,85],
 static:{Ola: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.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX="[evaluate]"
+a.RZ=null
+a.ij=""
+a.TQ=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.qL.LX(a)
 C.qL.XI(a)
 return a}}},
 KAf:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true},
-Kz:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-uv:{
-"^":"TpZ:76;b",
-$0:[function(){var z=this.b
-z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["","",,D,{
+VO:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.TQ=J.Q5(z,C.UY,z.TQ,a)},"$1",null,2,0,null,96,"call"]},
+Kzn:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+z.LD=J.Q5(z,C.S4,z.LD,!1)},"$0",null,0,0,null,"call"]}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.MC.LX(a)
 C.MC.XI(a)
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"V14;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],
+"^":"V13;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gt0:function(a){return a.RZ},
+st0:function(a,b){a.RZ=this.ct(a,C.WQ,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{cYO: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.LTI.LX(a)
-C.LTI.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.by.LX(a)
+C.by.XI(a)
 return a}}},
-V14:{
-"^":"uL+Pi;",
+V13:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V15;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],
+"^":"V14;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpM:function(a){return a.RZ},
+spM:function(a,b){a.RZ=this.ct(a,C.Mc,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{TsF: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.n0.LX(a)
 C.n0.XI(a)
 return a}}},
-V15:{
-"^":"uL+Pi;",
+V14:{
+"^":"uL+Piz;",
 $isd3:true},
 MJ:{
-"^":"V16;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)},
+"^":"V15;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gJ6:function(a){return a.RZ},
+sJ6:function(a,b){a.RZ=this.ct(a,C.OO,a.RZ,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ls6.LX(a)
 C.ls6.XI(a)
 return a}}},
-V16:{
-"^":"uL+Pi;",
+V15:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"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
-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.PQ=!0
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Xo.LX(a)
-C.Xo.XI(a)
+"^":"T53;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gU4:function(a){return a.TQ},
+sU4:function(a,b){a.TQ=this.ct(a,C.QK,a.TQ,b)},
+static:{E5W:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=!0
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.XoJ.LX(a)
+C.XoJ.XI(a)
 return a}}},
 T53:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V17;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],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V16;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gig:function(a){return a.RZ},
+sig:function(a,b){a.RZ=this.ct(a,C.nf,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
+static:{p71:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.PJ8.LX(a)
 C.PJ8.XI(a)
 return a}}},
-V17:{
-"^":"uL+Pi;",
+V16:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,O,{
 "^":"",
-Hz:{
-"^":"a;zE,y5",
-sih:function(a,b){var z=this.y5
-C.yp.zB(J.Qd(this.zE),z,z+4,b)},
-gih:function(a){var z=this.y5
-return C.yp.Yc(J.Qd(this.zE),z,z+4)},
-PY:[function(){return new O.Hz(this.zE,this.y5+4)},"$0","gaw",0,0,156],
-gvH:function(a){return C.CD.BU(this.y5,4)},
+na:{
+"^":"a;Q,a",
+sih:function(a,b){var z=this.a
+C.yp.vg(J.ns(this.Q),z,z+4,b)},
+gih:function(a){var z=this.a
+return C.yp.Mu(J.ns(this.Q),z,z+4)},
+PY:[function(){return new O.na(this.Q,this.a+4)},"$0","gaw",0,0,156],
+gvH:function(a){return C.CD.BU(this.a,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=J.RE(b)
 y=z.gy(b)
-x=J.eY(a)
-if(typeof y!=="number")return y.U()
-if(typeof x!=="number")return H.s(x)
+x=J.l2(a)
+if(typeof y!=="number")return y.R()
+if(typeof x!=="number")return H.o(x)
 z=z.gx(b)
-if(typeof z!=="number")return H.s(z)
-return new O.Hz(a,(y*x+z)*4)}}},
+if(typeof z!=="number")return H.o(z)
+return new O.na(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,yT>"},
+"^":"a;Yu:Q<,ky:a>"},
 Vb:{
-"^":"V18;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},
-syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
+"^":"V17;RZ,ij,TQ,ca,Jc,cw,bN,mT,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpf:function(a){return a.bN},
+spf:function(a,b){a.bN=this.ct(a,C.PM,a.bN,b)},
+gyw:function(a){return a.mT},
+syw:function(a,b){a.mT=this.ct(a,C.QH,a.mT,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.N2=z
+a.RZ=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.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()},
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gel(a)),z.b),[H.u3(z,0)]).P6()
+z=J.PQ(a.RZ)
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gok(a)),z.b),[H.u3(z,0)]).P6()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.Ff
-if(typeof x!=="number")return H.s(x)
+for(z=J.Nx(b),y=0;z.D();){x=z.c
+if(typeof x!=="number")return H.o(x)
 y=y*256+x}return y},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
 if(0>=z.length)return H.e(z,0)
-a.Cv.u(0,b,z[0])
-a.Tl.u(0,b,d)
-a.GE.u(0,this.Zt(a,d),b)},
+a.cw.q(0,b,z[0])
+a.ca.q(0,b,d)
+a.Jc.q(0,this.Zt(a,d),b)},
 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.TU,"/")),null,null)
+for(z=J.Nx(J.Tf(b,"members")),y=a.cw,x=a.ca,w=a.Jc;z.D();){v=z.gk()
+if(!J.t(v).$isdy){N.QM("").To(H.d(v))
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.a,"/")),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,"@")
+r=J.BQ(v.e,"@")
 if(0>=r.length)return H.e(r,0)
-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,"",$.Qg())},
+y.q(0,u,r[0])
+x.q(0,u,s)
+w.q(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.Su())
+this.OU(a,0,"",$.v2())},
 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)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
+z=a.TQ
+y=J.l2(a.ij)
+if(typeof z!=="number")return z.R()
+if(typeof y!=="number")return H.o(y)
 x=z*y
-w=C.CD.BU(O.x6(a.WC,b).y5,4)
-v=C.CD.Z(w,x)
-u=C.CD.Y(w,x)
-t=J.UQ(a.oj,"pages")
-if(!(v<0)){z=J.q8(t)
-if(typeof z!=="number")return H.s(z)
+w=C.CD.BU(O.x6(a.ij,b).a,4)
+v=C.CD.W(w,x)
+u=C.CD.V(w,x)
+t=J.Tf(a.mT,"pages")
+if(!(v<0)){z=J.wS(t)
+if(typeof z!=="number")return H.o(z)
 z=v>=z}else z=!0
 if(z)return
-s=J.UQ(t,v)
+s=J.Tf(t,v)
 z=J.U6(s)
-r=z.t(s,"objects")
+r=z.p(s,"objects")
 y=J.U6(r)
 q=0
 p=0
 o=0
-while(!0){n=y.gB(r)
-if(typeof n!=="number")return H.s(n)
+while(!0){n=y.gv(r)
+if(typeof n!=="number")return H.o(n)
 if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(p)
+p=y.p(r,o)
+if(typeof p!=="number")return H.o(p)
 q+=p
 if(q>u){u=q-p
-break}o+=2}z=H.BU(z.t(s,"object_start"),null,null)
-y=J.UQ(a.oj,"unit_size_bytes")
-if(typeof y!=="number")return H.s(y)
-return new O.x2(J.WB(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
+break}o+=2}z=H.BU(z.p(s,"object_start"),null,null)
+y=J.Tf(a.mT,"unit_size_bytes")
+if(typeof y!=="number")return H.o(y)
+return new O.x2(J.WB(z,u*y),J.lX(p,J.Tf(a.mT,"unit_size_bytes")))},
 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.yT)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.a)+"B @ 0x"+J.u1(y.Q,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,154,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,154,87],
+z=O.x6(a.ij,z)
+w=z.a
+v=a.cw.p(0,a.Jc.p(0,this.Zt(a,C.yp.Mu(J.ns(z.Q),w,w+4))))
+z=J.mG(v,"")?"-":H.d(v)+" "+x
+a.bN=this.ct(a,C.PM,a.bN,z)},"$1","gel",2,0,154,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Q,16)
+$.Pi.b.bo(0,"#"+J.wg(a.mT).Mq("address/"+z))},"$1","gok",2,0,154,87],
 UV:function(a){var z,y,x,w,v
-z=a.oj
-if(z==null||a.N2==null)return
-this.DO(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
-y=J.UQ(a.oj,"pages")
-z=a.N2.parentElement
+z=a.mT
+if(z==null||a.RZ==null)return
+this.DO(a,J.Tf(z,"class_list"),J.Tf(a.mT,"free_class_id"))
+y=J.Tf(a.mT,"pages")
+z=a.RZ.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.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)
+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).b
+z=J.bI(J.bI(J.Tf(a.mT,"page_size_bytes"),J.Tf(a.mT,"unit_size_bytes")),x)
+if(typeof z!=="number")return H.o(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.Ry(a.N2).createImageData(x,v))
-a.WC=w
-J.vP(a.N2,J.eY(w))
-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")
+a.TQ=z
+w=J.wS(y)
+if(typeof w!=="number")return H.o(w)
+v=P.C(z*w,6000)
+w=P.f9(J.pz(a.RZ).createImageData(x,v))
+a.ij=w
+J.TZQ(a.RZ,J.l2(w))
+J.OE(a.RZ,J.Jv(a.ij))
+this.QV(a,0)},
+QV:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+z=J.Tf(a.mT,"pages")
 y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.rn
-if(typeof x!=="number")return H.s(x)
+x="Loaded "+b+" of "+H.d(y.gv(z))+" pages"
+a.bN=this.ct(a,C.PM,a.bN,x)
+x=a.TQ
+if(typeof x!=="number")return H.o(x)
 w=b*x
 v=w+x
-x=y.gB(z)
-if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.WC)
-if(typeof x!=="number")return H.s(x)
+x=y.gv(z)
+if(typeof x!=="number")return H.o(x)
+if(!(b>=x)){x=J.Jv(a.ij)
+if(typeof x!=="number")return H.o(x)
 x=v>x}else x=!0
 if(x)return
-u=O.x6(a.WC,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
+u=O.x6(a.ij,H.J(new P.hL(0,w),[null]))
+t=J.Tf(y.p(z,b),"objects")
 y=J.U6(t)
-x=a.Tl
+x=a.ca
 s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(r)
+while(!0){r=y.gv(t)
+if(typeof r!=="number")return H.o(r)
 if(!(s<r))break
-q=y.t(t,s)
-p=x.t(0,y.t(t,s+1))
-for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.y5
+q=y.p(t,s)
+p=x.p(0,y.p(t,s+1))
+for(;r=J.Wx(q),o=r.T(q,1),r.A(q,0);q=o){r=u.Q
+n=u.a
 m=n+4
-C.yp.zB(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.y5
+C.yp.vg(J.ns(r),n,m,p)
+u=new O.na(r,m)}s+=2}while(!0){y=u.a
 x=C.CD.BU(y,4)
-r=u.zE
+r=u.Q
 n=J.RE(r)
-m=n.gR(r)
-if(typeof m!=="number")return H.s(m)
-m=C.CD.Y(x,m)
-l=n.gR(r)
-if(typeof l!=="number")return H.s(l)
-l=C.CD.Z(x,l)
+m=n.gN(r)
+if(typeof m!=="number")return H.o(m)
+m=C.CD.V(x,m)
+l=n.gN(r)
+if(typeof l!=="number")return H.o(l)
+l=C.CD.W(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.Qg()
+x=$.v2()
 m=y+4
-C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.N2)
-x=a.WC
-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
+C.yp.vg(n.gRn(r),y,m,x)
+u=new O.na(r,m)}y=J.pz(a.RZ)
+x=a.ij
+J.ls(y,x,0,0,0,w,J.l2(x),v)
+P.e4Q(new O.o7(a,b),null)},
+SK:[function(a,b){var z=a.mT
 if(z==null)return
-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)
-w=P.L5(null,null,null,P.qU,W.I0)
-v=P.qU
-v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
-u=P.Fl(null,null)
-t=P.Fl(null,null)
-a.Tl=z
-a.GE=y
-a.Cv=x
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=w
-a.ZQ=v
-a.qJ=u
-a.wy=t
-C.wc.LX(a)
-C.wc.XI(a)
+J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.wx()).wM(b)},"$1","gvC",2,0,20,102],
+nY:[function(a,b){P.e4Q(new O.oc(a),null)},"$1","gRs",2,0,20,61],
+static:{"^":"nK,Uw,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
+z=P.A(null,null)
+y=P.A(null,null)
+x=P.A(null,null)
+w=P.L5(null,null,null,P.I,W.Bn)
+v=P.I
+v=H.J(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
+u=P.A(null,null)
+t=P.A(null,null)
+a.ca=z
+a.Jc=y
+a.cw=x
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=w
+a.z$=v
+a.ch$=u
+a.cx$=t
+C.Cs.LX(a)
+C.Cs.XI(a)
 return a}}},
-V18:{
-"^":"uL+Pi;",
+V17:{
+"^":"uL+Piz;",
 $isd3:true},
-R5:{
-"^":"TpZ:76;a,b",
-$0:function(){J.AC(this.a,this.b+1)},
-$isEH:true},
+o7:{
+"^":"r:77;Q,a",
+$0:function(){J.Ha(this.Q,this.a+1)}},
 aG:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
-pM:{
-"^":"TpZ:81;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,158,"call"],
-$isEH:true},
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.mT=J.Q5(z,C.QH,z.mT,a)},"$1",null,2,0,null,157,"call"]},
+wx:{
+"^":"r:80;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,4,158,"call"]},
 oc:{
-"^":"TpZ:76;a",
-$0:function(){J.oO(this.a)},
-$isEH:true}}],["","",,K,{
+"^":"r:77;Q",
+$0:function(){J.J2g(this.Q)}}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
-Ey:function(a,b){var z
-if(b===0){z=this.vp
+"^":"Vz;Q,a,b,c,d,cy$,db$",
+wA:function(a,b){var z
+if(b===0){z=this.a
 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)}},
+return J.DA(J.Tf(J.U8(z[a]),b))}return this.k5(a,b)}},
 Ly:{
-"^":"V19;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},
-scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.Rp},
-sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
-gB1:function(a){return a.Ol},
-sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
-god:function(a){return a.Sk},
-sod:function(a,b){a.Sk=this.ct(a,C.rB,a.Sk,b)},
+"^":"V18;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gYt:function(a){return a.RZ},
+sYt:function(a,b){a.RZ=this.ct(a,C.TN,a.RZ,b)},
+gcH:function(a){return a.ij},
+scH:function(a,b){a.ij=this.ct(a,C.Zi,a.ij,b)},
+gLF:function(a){return a.bN},
+sLF:function(a,b){a.bN=this.ct(a,C.kG,a.bN,b)},
+gB1:function(a){return a.Jr},
+sB1:function(a,b){a.Jr=this.ct(a,C.vb,a.Jr,b)},
+god:function(a){return a.IL},
+sod:function(a,b){a.IL=this.ct(a,C.rB,a.IL,b)},
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.yD(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
-a.jF=y
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.Q=P.zV(J.Tf($.NR,"PieChart"),[z])
+a.ca=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.yD(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-a.Uv=z
-a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Y1:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.Q=P.zV(J.Tf($.NR,"PieChart"),[y])
+a.cw=z
+a.mT=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
+Qf:function(a){var z,y,x,w
+for(z=J.Nx(J.Tf(a.Jr,"members"));z.D();){y=z.gk()
 x=J.U6(y)
-w=x.t(y,"class")
+w=x.p(y,"class")
 if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
+w.gUY().eC(x.p(y,"new"))
+w.gxQ().eC(x.p(y,"old"))}},
 FS:function(a){var z,y,x,w,v,u,t,s,r,q
-a.Rp.Ai()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
+a.bN.Ai()
+for(z=J.Nx(J.Tf(a.Jr,"members"));z.D();){y=J.Tf(z.gk(),"class")
 if(y==null)continue
 if(y.gMp())continue
-x=y.gUY().gEJ().wY
-w=y.gUY().gEJ().wf
-v=y.gUY().gl().wY
-u=y.gUY().gl().wf
-t=y.gxQ().gEJ().wY
-s=y.gxQ().gEJ().wf
-r=y.gxQ().gl().wY
-q=y.gxQ().gl().wf
-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)
+x=y.gUY().gEJ().a
+w=y.gUY().gEJ().Q
+v=y.gUY().gk().a
+u=y.gUY().gk().Q
+t=y.gxQ().gEJ().a
+s=y.gxQ().gEJ().Q
+r=y.gxQ().gk().a
+q=y.gxQ().gk().Q
+J.vP(a.bN,new G.E8([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.bN)},
+lD:function(a,b,c){var z,y,x,w,v,u
+z=J.Tf(J.i8(a.bN),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.Tf(J.OD(J.Tf(y.gwd(b),0)),0),J.Tf(x.gUQ(z),0))
 w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
+while(!0){v=J.wS(x.gUQ(z))
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-c$0:{if(C.Nm.tg(C.Q5,w))break c$0
-u=J.UQ(y.gks(b),w)
+c$0:{if(C.Nm.tg(C.jb,w))break c$0
+u=J.Tf(y.gwd(b),w)
 v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.Rp.Gu(c,w))}++w}},
+v.smk(u,J.Lz(J.Tf(x.gUQ(z),w)))
+v.sa4(u,a.bN.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-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)
+z=J.OD(a.mT)
+if(z.gv(z)>a.bN.gGD().length){z=J.OD(a.mT)
+y=z.gv(z)-a.bN.gGD().length
+for(x=0;x<y;++x)J.OD(a.mT).f4(0)}else{z=J.OD(a.mT)
+if(z.gv(z)<a.bN.gGD().length){z=a.bN.gGD().length
+w=J.OD(a.mT)
+v=z-w.gv(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
 z.iF(u,-1).appendChild(W.r3("class-ref",null))
@@ -12801,257 +12313,248 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
+J.OD(a.mT).h(0,u)}}}for(x=0;x<a.bN.gGD().length;++x){z=a.bN.gGD()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.As(a,J.Mx(a.Na).t(0,x),s)}},
+this.lD(a,J.OD(a.mT).p(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gxp()
+if(!!J.t(d).$iskr){z=a.bN.gxp()
 y=d.cellIndex
-x=a.Rp
+x=a.bN
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.II(a.Rp)
-this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
-pA:[function(a,b){var z=a.Ol
+a.bN.sT3(!0)}else x.sT3(!x.gT3())
+J.zq(a.bN)
+this.ya(a)}},"$3","gQq",6,0,105,4,106,107],
+SK:[function(a,b){var z=a.Jr
 if(z==null)return
-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
+J.wg(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,20,102],
+zT:[function(a,b){var z=a.Jr
 if(z==null)return
-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
+J.wg(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gzH",2,0,20,102],
+eJ:[function(a,b){var z=a.Jr
 if(z==null)return
-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,159,160],
+J.wg(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,20,102],
+Ed:[function(a,b){a.Jr=this.ct(a,C.vb,a.Jr,b)},"$1","gLv",2,0,159,160],
 n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
+z=a.Jr
 if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-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.aT(a.Ol)
-z=a.Xe
-w=x.gUY().gSU()
-z=z.Yb
+z=J.wg(z)
+z=this.ct(a,C.rB,a.IL,z)
+a.IL=z
+z.WU(J.Tf(a.Jr,"heaps"))
+y=H.BU(J.Tf(a.Jr,"dateLastAccumulatorReset"),null,null)
+if(!J.mG(y,0)){z=P.Wu(y,!1).X(0)
+a.ij=this.ct(a,C.Zi,a.ij,z)}y=H.BU(J.Tf(a.Jr,"dateLastServiceGC"),null,null)
+if(!J.mG(y,0)){z=P.Wu(y,!1).X(0)
+a.RZ=this.ct(a,C.TN,a.RZ,z)}z=a.TQ.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+x=J.wg(a.Jr)
+z=a.TQ
+w=x.gUY().gcs()
+z=z.Q
 v=[]
 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().gkV(),x.gUY().gSU())
-v=v.Yb
+z.Z("addRow",[H.J(new P.GD(v),[null])])
+v=a.TQ
+z=J.D5(x.gUY().gCs(),x.gUY().gcs())
+v=v.Q
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.Xe
+v.Z("addRow",[H.J(new P.GD(w),[null])])
+w=a.TQ
 v=x.gUY().gMX()
-w=w.Yb
+w=w.Q
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.FX.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.FX
-w=x.gxQ().gSU()
-z=z.Yb
+w.Z("addRow",[H.J(new P.GD(z),[null])])
+z=a.Jc.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+z=a.Jc
+w=x.gxQ().gcs()
+z=z.Q
 v=[]
 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().gkV(),x.gxQ().gSU())
-v=v.Yb
+z.Z("addRow",[H.J(new P.GD(v),[null])])
+v=a.Jc
+z=J.D5(x.gxQ().gCs(),x.gxQ().gcs())
+v=v.Q
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.FX
+v.Z("addRow",[H.J(new P.GD(w),[null])])
+w=a.Jc
 v=x.gxQ().gMX()
-w=w.Yb
+w=w.Q
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Y1(a)
+w.Z("addRow",[H.J(new P.GD(z),[null])])
+this.Qf(a)
 this.FS(a)
 this.ya(a)
-a.jF.Am(0,a.Xe)
-a.Uv.Am(0,a.FX)
+a.ca.Am(0,a.TQ)
+a.cw.Am(0,a.Jc)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gwh",2,0,20,61],
 ps:[function(a,b){var z,y,x
-z=a.Ol
+z=a.Jr
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,161,162],
+return C.CD.Sy(J.x4(J.lX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,161,162],
 NC:[function(a,b){var z,y
-z=a.Ol
+z=a.Jr
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,161,162],
+return J.Lz((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,161,162],
 o7:[function(a,b){var z,y
-z=a.Ol
+z=a.Jr
 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,161,162],
-Zy:function(a){var z=P.zV(J.UQ($.NR,"DataTable"),null)
-a.Xe=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.Xe.Yb.V7("addColumn",["number","Size"])
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-a.FX=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.FX.Yb.V7("addColumn",["number","Size"])
-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.AFV()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.AFV()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.AFV()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.AFV()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
-a.Rp=z
+Zy:function(a){var z=P.zV(J.Tf($.NR,"DataTable"),null)
+a.TQ=new G.Kf(z)
+z.Z("addColumn",["string","Type"])
+a.TQ.Q.Z("addColumn",["number","Size"])
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+a.Jc=new G.Kf(z)
+z.Z("addColumn",["string","Type"])
+a.Jc.Q.Z("addColumn",["number","Size"])
+z=H.J([],[G.E8])
+z=this.ct(a,C.kG,a.bN,new K.UC([new G.Ktd("Class",G.J1()),new G.Ktd("",G.J1()),new G.Ktd("Accumulated Size (New)",G.nQ()),new G.Ktd("Accumulated Instances",G.nI()),new G.Ktd("Current Size",G.nQ()),new G.Ktd("Current Instances",G.nI()),new G.Ktd("",G.J1()),new G.Ktd("Accumulator Size (Old)",G.nQ()),new G.Ktd("Accumulator Instances",G.nI()),new G.Ktd("Current Size",G.nQ()),new G.Ktd("Current Instances",G.nI())],z,[],0,!0,null,null))
+a.bN=z
 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
-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.MF="---"
-a.uY="---"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.xut.LX(a)
-C.xut.XI(a)
-C.xut.Zy(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="---"
+a.ij="---"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Vc.LX(a)
+C.Vc.XI(a)
+C.Vc.Zy(a)
 return a}}},
-V19:{
-"^":"uL+Pi;",
+V18:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,P,{
 "^":"",
-pf:function(a){var z,y
+jl:function(a){var z,y
 z=[]
-y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
+y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
 new P.Qa().$0()
 return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
+UQ:function(a,b){var z=[]
+return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
-z=J.x(a)
+z=J.t(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.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}
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
+QO:function(a){if(!!J.t(a).$isqS)return{data:a.Q,height:a.a,width:a.b}
 return a},
 dg:function(){var z=$.Qz
-if(z==null){z=J.QY(window.navigator.userAgent,"Opera",0)
+if(z==null){z=J.Cw(window.navigator.userAgent,"Opera",0)
 $.Qz=z}return z},
 F7:function(){var z=$.R6
-if(z==null){z=P.dg()!==!0&&J.QY(window.navigator.userAgent,"WebKit",0)
+if(z==null){z=P.dg()!==!0&&J.Cw(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 O2:function(){var z=$.SB
 if(z==null){z=$.w5
-if(z==null){z=J.QY(window.navigator.userAgent,"Firefox",0)
+if(z==null){z=J.Cw(window.navigator.userAgent,"Firefox",0)
 $.w5=z}if(z===!0){$.SB="-moz-"
 z="-moz-"}else{z=$.EM
-if(z==null){z=P.dg()!==!0&&J.QY(window.navigator.userAgent,"Trident/",0)
+if(z==null){z=P.dg()!==!0&&J.Cw(window.navigator.userAgent,"Trident/",0)
 $.EM=z}if(z===!0){$.SB="-ms-"
 z="-ms-"}else if(P.dg()===!0){$.SB="-o-"
 z="-o-"}else{$.SB="-webkit-"
 z="-webkit-"}}}return z},
 wF:{
-"^":"TpZ:51;b,c",
+"^":"r:51;Q,a",
 $1:function(a){var z,y,x
-z=this.b
+z=this.Q
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
+this.a.push(null)
+return y}},
 rG:{
-"^":"TpZ:163;d",
-$1:function(a){var z=this.d
+"^":"r:163;Q",
+$1:function(a){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-yhO:{
-"^":"TpZ:164;e",
-$2:function(a,b){var z=this.e
+return z[a]}},
+Os:{
+"^":"r:164;Q",
+$2:function(a,b){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
+z[a]=b}},
 Qa:{
-"^":"TpZ:76;",
-$0:function(){},
-$isEH:true},
-kd:{
-"^":"TpZ:12;f,UI,bK",
+"^":"r:77;",
+$0:function(){}},
+Tm:{
+"^":"r:14;Q,a,b",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
 if(typeof a==="string")return a
-y=J.x(a)
-if(!!y.$isiP)return new Date(a.rq)
+y=J.t(a)
+if(!!y.$isiP)return new Date(a.Q)
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
-if(!!y.$ishH)return a
+if(!!y.$isjq)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
-if(!!y.$isbf)return a
+if(!!y.$isD8)return a
 if(!!y.$iseH)return a
-if(!!y.$isT8){x=this.f.$1(a)
-w=this.UI.$1(x)
+if(!!y.$isw){x=this.Q.$1(a)
+w=this.a.$1(x)
 z.a=w
 if(w!=null)return w
 w={}
 z.a=w
-this.bK.$2(x,w)
+this.b.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$1(x)
+return z.a}if(!!y.$isWO){v=y.gv(a)
+x=this.Q.$1(a)
+w=this.a.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
-this.bK.$2(x,w)}return w}w=new Array(v)
-this.bK.$2(x,w)
-for(u=0;u<v;++u){z=this.$1(y.t(a,u))
+this.b.$2(x,w)}return w}w=new Array(v)
+this.b.$2(x,w)
+for(u=0;u<v;++u){z=this.$1(y.p(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))},
-$isEH:true},
+w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))}},
 ib:{
-"^":"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},
-CA:{
-"^":"TpZ:51;a,b",
+"^":"r:80;Q,a",
+$2:function(a,b){this.Q.a[a]=this.a.$1(b)}},
+GW:{
+"^":"r:51;Q,a",
 $1:function(a){var z,y,x,w
-z=this.a
+z=this.Q
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
+this.a.push(null)
+return y}},
 D6:{
-"^":"TpZ:163;c",
-$1:function(a){var z=this.c
+"^":"r:163;Q",
+$1:function(a){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
+return z[a]}},
 m5:{
-"^":"TpZ:164;d",
-$2:function(a,b){var z=this.d
+"^":"r:164;Q",
+$2:function(a,b){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
+z[a]=b}},
 xL:{
-"^":"TpZ:12;e,f,UI,bK",
+"^":"r:14;Q,a,b,c",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -13059,50 +12562,49 @@
 if(typeof a==="string")return a
 if(a instanceof Date)return P.Wu(a.getTime(),!0)
 if(a instanceof RegExp)throw H.b(P.nO("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$1(z)
+if(Object.getPrototypeOf(a)===Object.prototype){z=this.a.$1(a)
+y=this.b.$1(z)
 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.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)
+y=P.A(null,null)
+this.c.$2(z,y)
+for(x=Object.keys(a),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=x.c
+y.q(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.a.$1(a)
+y=this.b.$1(z)
 if(y!=null)return y
 x=J.U6(a)
-v=x.gB(a)
-y=this.e?new Array(v):a
-this.bK.$2(z,y)
-if(typeof v!=="number")return H.s(v)
+v=x.gv(a)
+y=this.Q?new Array(v):a
+this.c.$2(z,y)
+if(typeof v!=="number")return H.o(v)
 u=J.w1(y)
 t=0
-for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
-$isEH:true},
-nl:{
-"^":"a;Rn>,fg>,R>",
-$isnl:true,
+for(;t<v;++t)u.q(y,t,this.$1(x.p(a,t)))
+return y}return a}},
+qS:{
+"^":"a;Rn:Q>,fg:a>,N:b>",
+$isqS:true,
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,73],
-gA:function(a){var z=this.DG()
-z=H.VM(new P.zQ(z,z.HU,null,null),[null])
-z.Qx=z.vY.HH
+X:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,0],
+gu:function(a){var z=this.DG()
+z=H.J(new P.zQ(z,z.f,null,null),[null])
+z.b=z.Q.d
 return z},
 aN:function(a,b){this.DG().aN(0,b)},
 zV:function(a,b){return this.DG().zV(0,b)},
 ez:[function(a,b){var z=this.DG()
-return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,165,30],
-ad:function(a,b){var z=this.DG()
-return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-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,166,30],
+return H.J(new H.xy(z,b),[H.W8(z,"lf",0),null])},"$1","gIr",2,0,165,31],
+ev:function(a,b){var z=this.DG()
+return H.J(new H.U5(z,b),[H.W8(z,"lf",0)])},
+Ft:[function(a,b){var z=this.DG()
+return H.J(new H.Fm(z,b),[H.W8(z,"lf",0),null])},"$1","git",2,0,166,31],
 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},
-gB:function(a){return this.DG().X5},
+gl0:function(a){return this.DG().Q===0},
+gor:function(a){return this.DG().Q!==0},
+gv:function(a){return this.DG().Q},
 tg:function(a,b){return this.DG().tg(0,b)},
-Ie:function(a){return this.DG().tg(0,a)?a:null},
+iQ:function(a){return this.DG().tg(0,a)?a:null},
 h:function(a,b){return this.H9(new P.GE(b))},
 Rz:function(a,b){var z,y
 if(typeof b!=="string")return!1
@@ -13112,21 +12614,19 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-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
-if(z==null)H.vh(P.w("No elements"))
-return z.gGc(z)},
+gtH:function(a){var z=this.DG()
+return z.gtH(z)},
+grZ:function(a){var z=this.DG()
+return z.grZ(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
+Oe: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.ke(z,b,H.u3(z,0))},
+return H.ke(z,b,H.W8(z,"lf",0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
@@ -13134,2044 +12634,2015 @@
 this.p5(z)
 return y},
 $isOl:true,
-$asOl:function(){return[P.qU]},
+$asOl:function(){return[P.I]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.qU]}},
+$asQV:function(){return[P.I]}},
 GE:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.dH(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 rl:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.bj(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 Jg:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.Ei(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.OP(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 uQ:{
-"^":"TpZ:12;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
-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()
+"^":"r:14;",
+$1:[function(a){return J.U2(a)},"$1",null,2,0,null,167,"call"]},
+P0:{
+"^":"ark;Q,a",
+gd3:function(){var z=this.a
+return P.z(z.ev(z,new P.hT()),!0,W.z2)},
+aN:function(a,b){C.Nm.aN(this.gd3(),b)},
+q:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.DG(z[b],c)},
-sB:function(a,b){var z=this.gd3().length
+J.vu(z[b],c)},
+sv:function(a,b){var z=this.gd3().length
 if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
+else if(b<0)throw H.b(P.p("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.kG.uR.appendChild(b)},
+h:function(a,b){this.a.Q.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.kG.uR;z.G();)y.appendChild(z.Ff)},
-tg:function(a,b){if(!J.x(b).$ish4)return!1
-return b.parentNode===this.im},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.a.Q;z.D();)y.appendChild(z.c)},
+tg:function(a,b){if(!J.t(b).$isz2)return!1
+return b.parentNode===this.Q},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
 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.kG.uR)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+oq:function(a,b,c){C.Nm.aN(C.Nm.D6(this.gd3(),b,c),new P.rK())},
+V1:function(a){J.Ul(this.a.Q)},
+f4:function(a){var z=this.grZ(this)
+if(z!=null)J.vX(z)
 return z},
-xe:function(a,b,c){this.kG.xe(0,b,c)},
-UG:function(a,b,c){var z,y
-z=this.kG.uR
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+aP:function(a,b,c){this.a.aP(0,b,c)},
+UG:function(a,b,c){this.a.UG(0,b,c)},
 Rz:function(a,b){var z,y,x
-if(!J.x(b).$ish4)return!1
+if(!J.t(b).$isz2)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.Mp(x)
+if(x===b){J.vX(x)
 return!0}}return!1},
-gB:function(a){return this.gd3().length},
-t:function(a,b){var z=this.gd3()
+gv:function(a){return this.gd3().length},
+p:function(a,b){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gd3()
-return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
+gu:function(a){var z=this.gd3()
+return H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isz2}},
 rK:{
-"^":"TpZ:12;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["","",,O,{
+"^":"r:14;",
+$1:function(a){return J.vX(a)}}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V20;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)},
-gV8:function(a){return J.UQ(a.ee,"slot")},
-gyg:function(a){var z=J.UQ(a.ee,"slot")
+"^":"V19;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
+gR9:function(a){return J.Tf(a.RZ,"slot")},
+gnx:function(a){var z=J.Tf(a.RZ,"slot")
 return typeof z==="number"},
-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)},
-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],
-Po:[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],
+gIq:function(a){return!!J.t(J.Tf(a.RZ,"slot")).$isvO&&J.mG(J.Tf(J.Tf(a.RZ,"slot"),"type"),"@Field")},
+gFF:function(a){return J.Tf(a.RZ,"source")},
+gyK:function(a){return a.ij},
+syK:function(a,b){a.ij=this.ct(a,C.uO,a.ij,b)},
+yg:[function(a,b){return J.wg(J.Tf(a.RZ,"source")).cv(J.WB(J.eS(J.Tf(a.RZ,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,33],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.ng(a)).wM(c)
+else{a.ij=this.ct(a,C.uO,a.ij,null)
+c.$0()}},"$2","gNe",4,0,118,119,120],
 static:{eka: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.QFk.LX(a)
 C.QFk.XI(a)
 return a}}},
-V20:{
-"^":"uL+Pi;",
+V19:{
+"^":"uL+Piz;",
 $isd3:true},
-cC:{
-"^":"TpZ:114;a",
+cCu:{
+"^":"r:114;Q",
 $1:[function(a){var z,y,x
-z=this.a
-y=J.UQ(a,"references")
+z=this.Q
+y=J.Tf(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
-qm:{
-"^":"TpZ:12;a",
-$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,B,{
+z.ij=J.Q5(z,C.uO,z.ij,x)},"$1",null,2,0,null,157,"call"]},
+ng:{
+"^":"r:14;Q",
+$1:[function(a){J.Q5(this.Q,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,B,{
 "^":"",
 pR:{
-"^":"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."
-else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gJp:function(a){var z=a.RZ
+if(z!=null)if(J.mG(J.zH(z),"Sentinel"))if(J.mG(J.eS(a.RZ),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.mG(J.eS(a.RZ),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.mG(J.eS(a.RZ),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.mG(J.eS(a.RZ),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.mG(J.eS(a.RZ),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){var z=a.tY
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){var z=a.RZ
 if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
 else{z.stJ(null)
-J.Z6(z,null)
-c.$0()}},"$2","gus",4,0,118,119,120],
+J.lF(z,null)
+c.$0()}},"$2","gNe",4,0,118,119,120],
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.uRw.LX(a)
 C.uRw.XI(a)
 return a}}},
 Js:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.DF(a,a.gPE())
-a.sTE(a.gPE())}z=this.a
+if(a.gHD()!=null){J.WI(a,a.gHD())
+a.szz(a.gHD())}z=this.Q
 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,{
+z.RZ=y.ct(z,C.kY,z.RZ,a)
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V21;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.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],
+"^":"V20;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+ghf:function(a){return a.RZ},
+shf:function(a,b){a.RZ=this.ct(a,C.fn,a.RZ,b)},
+vV:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+SK:[function(a,b){J.LE(a.RZ).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)
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.yKx.LX(a)
 C.yKx.XI(a)
 return a}}},
-V21:{
-"^":"uL+Pi;",
+V20:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V22;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],
+"^":"V21;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkm:function(a){return a.RZ},
+skm:function(a,b){a.RZ=this.ct(a,C.qs,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{p4: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.j1o.LX(a)
-C.j1o.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.za.LX(a)
+C.za.XI(a)
 return a}}},
-V22:{
-"^":"uL+Pi;",
+V21:{
+"^":"uL+Piz;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ag.LX(a)
 C.Ag.XI(a)
 return a}}},
-mO:{
-"^":"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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+IH:{
+"^":"V22;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{O0h:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ie.LX(a)
 C.Ie.XI(a)
 return a}}},
-V23:{
-"^":"uL+Pi;",
+V22:{
+"^":"uL+Piz;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ig.LX(a)
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V24;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],
-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.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
+"^":"V23;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gql:function(a){return a.RZ},
+sql:function(a,b){a.RZ=this.ct(a,C.oj,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+i9:[function(a){J.LE(a.RZ).wM(new E.Jj(a))},"$0","gqw",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.VLs.LX(a)
 C.VLs.XI(a)
 return a}}},
-V24:{
-"^":"uL+Pi;",
+V23:{
+"^":"uL+Piz;",
 $isd3:true},
-XB:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+Jj:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"]},
 H8:{
-"^":"V25;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],
-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.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
+"^":"V24;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPB:function(a){return a.RZ},
+sPB:function(a,b){a.RZ=this.ct(a,C.yL,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+i9:[function(a){J.LE(a.RZ).wM(new E.LB(a))},"$0","gqw",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.GII.LX(a)
 C.GII.XI(a)
 return a}}},
-V25:{
-"^":"uL+Pi;",
+V24:{
+"^":"uL+Piz;",
 $isd3:true},
-cP:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+LB:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"]},
 WS:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.bP.LX(a)
-C.bP.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{l5:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ug.LX(a)
+C.Ug.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.IXz.LX(a)
-C.IXz.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.wK.LX(a)
+C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V26;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],
+"^":"V25;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{J3z: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ozm.LX(a)
 C.ozm.XI(a)
 return a}}},
-V26:{
-"^":"uL+Pi;",
+V25:{
+"^":"uL+Piz;",
 $isd3:true},
 Q6:{
-"^":"V27;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],
+"^":"V26;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gj4:function(a){return a.RZ},
+sj4:function(a,b){a.RZ=this.ct(a,C.Ve,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{chF: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.rU.LX(a)
 C.rU.XI(a)
 return a}}},
-V27:{
-"^":"uL+Pi;",
+V26:{
+"^":"uL+Piz;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Fw.LX(a)
-C.Fw.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.RrX.LX(a)
+C.RrX.XI(a)
 return a}}},
 Zn:{
-"^":"V28;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:{O3: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.ijR.LX(a)
-C.ijR.XI(a)
+"^":"V27;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{kf:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.ag.LX(a)
+C.ag.XI(a)
 return a}}},
-V28:{
-"^":"uL+Pi;",
+V27:{
+"^":"uL+Piz;",
 $isd3:true},
 n5:{
-"^":"V29;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)
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.aVr.LX(a)
-C.aVr.XI(a)
+"^":"V28;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gyW:function(a){return a.RZ},
+syW:function(a,b){a.RZ=this.ct(a,C.YE,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{iO:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Dw.LX(a)
+C.Dw.XI(a)
 return a}}},
-V29:{
-"^":"uL+Pi;",
+V28:{
+"^":"uL+Piz;",
 $isd3:true},
 Ma:{
-"^":"V30;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],
+"^":"V29;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{Ii: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.iR.LX(a)
 C.iR.XI(a)
 return a}}},
-V30:{
-"^":"uL+Pi;",
+V29:{
+"^":"uL+Piz;",
 $isd3:true},
 wN:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{wZ7:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.RVQ.LX(a)
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V31;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],
-ur:[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.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
+"^":"V30;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gMZ:function(a){return a.RZ},
+sMZ:function(a,b){a.RZ=this.ct(a,C.jU,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+ur:[function(a){J.LE(a.RZ).wM(new E.As(a))},"$0","gyT",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.yr.LX(a)
-C.yr.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.wP.LX(a)
+C.wP.XI(a)
 return a}}},
-V31:{
-"^":"uL+Pi;",
+V30:{
+"^":"uL+Piz;",
 $isd3:true},
-mj:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+As:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"]},
 qM:{
-"^":"V32;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V31;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{TEI:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ej.LX(a)
 C.ej.XI(a)
 return a}}},
-V32:{
-"^":"uL+Pi;",
+V31:{
+"^":"uL+Piz;",
 $isd3:true},
 av:{
-"^":"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)},
+"^":"ZzR;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gEQ:function(a){return a.TQ},
+sEQ:function(a,b){a.TQ=this.ct(a,C.pH,a.TQ,b)},
 static:{R7: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.CB=!1
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=!1
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.OkI.LX(a)
 C.OkI.XI(a)
 return a}}},
 ZzR:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true},
 uz:{
-"^":"V33;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},
+"^":"V32;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpE:function(a){return a.RZ},
 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],
-ur:[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.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
+spE:function(a,b){a.RZ=this.ct(a,C.Wj,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+ur:[function(a){J.LE(a.RZ).wM(new E.Cc(a))},"$0","gyT",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.bZ.LX(a)
 C.bZ.XI(a)
 return a}}},
-V33:{
-"^":"uL+Pi;",
+V32:{
+"^":"uL+Piz;",
 $isd3:true},
 Cc:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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,{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"]}}],["","",,X,{
 "^":"",
 Se:{
-"^":"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.ks
+"^":"Y2;B1:r>,x,y,Zn:z<,Gc:ch<,ki:cx<,Vh:cy<,ZX:db<,Q,a,b,c,d,e,f,cy$,db$",
+gtT:function(a){return J.tX(this.y)},
+Pz:function(){var z,y,x,w,v,u,t,s,r
+z=this.r
+y=J.Tf(z,"threshold")
+x=this.b
 if(x.length>0)return
-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(!(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},
+for(w=this.y,v=J.Nx(J.OD(w)),u=this.x,t=u.a;v.D();){s=v.gk()
+r=J.x4(s.gAv(),w.gAv())
+if(typeof y!=="number")return H.o(y)
+if(!(r>y||J.x4(J.tX(s).gbu(),t)>y))continue
+x.push(X.i3(z,u,s,this))}},
+aY:function(){},
+Nh:function(){return J.wS(J.OD(this.y))>0},
 mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+z=this.y
+this.cy=H.d(z.gAv())
+this.db=G.J8(J.x4(J.lX(J.Tf(this.r,"period"),z.gAv()),1000000))
 y=J.RE(z)
-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.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
+if(J.mG(J.Iz(y.gtT(z)),C.Ea)){this.z="Tag (category)"
+if(d==null)this.ch=G.dj(z.gAv(),this.x.a)
+else this.ch=G.dj(z.gAv(),d.y.gAv())
+this.cx=G.dj(z.gAv(),this.x.a)}else{if(J.mG(J.Iz(y.gtT(z)),C.WA)||J.mG(J.Iz(y.gtT(z)),C.yP))this.z="Garbage Collected Code"
+else this.z=H.d(J.Iz(y.gtT(z)))+" (Function)"
+if(d==null)this.ch=G.dj(z.gAv(),this.x.a)
+else this.ch=G.dj(z.gAv(),d.y.gAv())
+this.cx=G.dj(y.gtT(z).gbu(),this.x.a)}z=this.c
+z.push(this.ch)
+z.push(this.cx)},
+static:{i3:function(a,b,c,d){var z,y
+z=H.J([],[G.Y2])
+y=d!=null?d.a+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
 z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V34;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},
-sPL:function(a,b){a.TH=this.ct(a,C.He,a.TH,b)},
-gLW:function(a){return a.WT},
-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)},
-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)},
-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
+"^":"V33;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,TO,Hm:S8=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gB1:function(a){return a.RZ},
+sB1:function(a,b){a.RZ=this.ct(a,C.vb,a.RZ,b)},
+gGq:function(a){return a.ij},
+sGq:function(a,b){a.ij=this.ct(a,C.He,a.ij,b)},
+gLW:function(a){return a.TQ},
+sLW:function(a,b){a.TQ=this.ct(a,C.Gs,a.TQ,b)},
+gUo:function(a){return a.ca},
+sUo:function(a,b){a.ca=this.ct(a,C.Dj,a.ca,b)},
+gEl:function(a){return a.Jc},
+sEl:function(a,b){a.Jc=this.ct(a,C.YD,a.Jc,b)},
+gnZ:function(a){return a.cw},
+snZ:function(a,b){a.cw=this.ct(a,C.bE,a.cw,b)},
+gNG:function(a){return a.bN},
+sNG:function(a,b){a.bN=this.ct(a,C.aH,a.bN,b)},
+gQl:function(a){return a.mT},
+sQl:function(a,b){a.mT=this.ct(a,C.zz,a.mT,b)},
+gXc:function(a){return a.IL},
+sXc:function(a,b){a.IL=this.ct(a,C.TW,a.IL,b)},
+n1:[function(a,b){var z,y,x,w
+z=a.RZ
 if(z==null)return
-y=J.UQ(z,"samples")
-x=new P.iP(Date.now(),!1)
-x.EK()
-z=J.AG(y)
-a.WT=this.ct(a,C.Gs,a.WT,z)
-z=x.bu(0)
-a.Uw=this.ct(a,C.Dj,a.Uw,z)
-z=J.AG(J.UQ(a.oi,"depth"))
-a.oo=this.ct(a,C.bE,a.oo,z)
-w=J.UQ(a.oi,"period")
-if(typeof w!=="number")return H.s(w)
+y=J.Tf(z,"samples")
+z=Date.now()
+x=J.Lz(y)
+a.TQ=this.ct(a,C.Gs,a.TQ,x)
+z=new P.iP(z,!1).X(0)
+a.ca=this.ct(a,C.Dj,a.ca,z)
+z=J.Lz(J.Tf(a.RZ,"depth"))
+a.cw=this.ct(a,C.bE,a.cw,z)
+w=J.Tf(a.RZ,"period")
+if(typeof w!=="number")return H.o(w)
 z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-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.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,19,59],
+a.Jc=this.ct(a,C.YD,a.Jc,z)
+z=G.M5(J.Tf(a.RZ,"timeSpan"))
+a.mT=this.ct(a,C.zz,a.mT,z)
+z=a.Jr
+x=C.YI.X(z*100)+"%"
+a.bN=this.ct(a,C.aH,a.bN,x)
+J.wg(a.RZ).N3(a.RZ)
+J.H9(a.RZ,"threshold",z)
+this.Dq(a)},"$1","gwh",2,0,20,61],
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=R.tB([])
-a.Hm=new G.ih(z,null,null)
-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.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
+a.S8=new G.iY(z,null,null)
+this.Dq(a)},
+Wy:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,61],
+SK:[function(a,b){var z="profile?tags="+H.d(a.IL)
+J.wg(a.RZ).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,20,102],
+Dq:function(a){if(a.RZ==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gqo()
+z=J.wg(a.RZ).gNp()
 if(z==null)return
-try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.S8.rT(X.i3(a.RZ,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-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.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+x=new H.XO(w,null)
+N.QM("").r0("_buildStackTree",y,x)}if(J.mG(J.wS(a.S8.Q),1))a.S8.lo(0)
+this.ct(a,C.ep,null,a.S8)},
+ka:[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.V(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
+if(!J.mG(J.eS(w.gK(b)),"expand")&&!J.mG(w.gK(b),d))return
 z=J.Lp(d)
-if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
+if(!!J.t(z).$isIv)try{w=a.S8
+v=J.JC(z)
+if(typeof v!=="number")return v.T()
 w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(u,null)
-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])
-x=P.Fl(null,null)
-w=P.Fl(null,null)
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.Xg="#tableTree"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+x=new H.XO(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,4,106,107],
+static:{"^":"B6",osd:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=""
+a.ca=""
+a.Jc=""
+a.cw=""
+a.bN=""
+a.mT=""
+a.Jr=0.0002
+a.IL="uv"
+a.TO="#tableTree"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.kS.LX(a)
 C.kS.XI(a)
 return a}}},
-V34:{
-"^":"uL+Pi;",
+V33:{
+"^":"uL+Piz;",
 $isd3:true},
 Xy:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,168,"call"],
-$isEH:true}}],["","",,N,{
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.RZ=J.Q5(z,C.vb,z.RZ,a)},"$1",null,2,0,null,168,"call"]}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.LN.LX(a)
 C.LN.XI(a)
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V35;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)},
+"^":"V34;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 static:{N5: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.OoF.LX(a)
-C.OoF.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.ta.LX(a)
+C.ta.XI(a)
 return a}}},
-V35:{
-"^":"uL+Pi;",
+V34:{
+"^":"uL+Piz;",
 $isd3:true},
 IW:{
-"^":"V36;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.Ho(a.ow)},"$1","gX0",2,0,169,13],
-qW:[function(a,b){$.Kh.pZ(a.ow)
-return J.df(a.ow)},"$1","gDQ",2,0,169,13],
-PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.UR(a.ow)},"$1","gLc",2,0,169,13],
-XQ:[function(a,b){$.Kh.pZ(a.ow)
-return J.MU(a.ow)},"$1","gqF",2,0,169,13],
-Cx:[function(a,b){$.Kh.pZ(a.ow)
-return J.Fy(a.ow)},"$1","gZp",2,0,169,13],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V35;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+Fv:[function(a,b){return J.v6(a.RZ)},"$1","gX0",2,0,169,15],
+xK:[function(a,b){$.Pi.pZ(a.RZ)
+return J.df(a.RZ)},"$1","gbY",2,0,169,15],
+tb:[function(a,b){$.Pi.pZ(a.RZ)
+return J.aN(a.RZ)},"$1","gLc",2,0,169,15],
+lM:[function(a,b){$.Pi.pZ(a.RZ)
+return J.ex(a.RZ)},"$1","gqF",2,0,169,15],
+Cx:[function(a,b){$.Pi.pZ(a.RZ)
+return J.Fy(a.RZ)},"$1","gVX",2,0,169,15],
+static:{zr:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.F2.LX(a)
 C.F2.XI(a)
 return a}}},
-V36:{
-"^":"uL+Pi;",
+V35:{
+"^":"uL+Piz;",
 $isd3:true},
 Qh:{
-"^":"V37;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
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.rCJ.LX(a)
-C.rCJ.XI(a)
+"^":"V36;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+static:{kgI:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.kd.LX(a)
+C.kd.XI(a)
 return a}}},
-V37:{
-"^":"uL+Pi;",
+V36:{
+"^":"uL+Piz;",
 $isd3:true},
 Oz:{
-"^":"V38;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)},
+"^":"V37;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 static:{TSH: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.mb.LX(a)
-C.mb.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YGo.LX(a)
+C.YGo.XI(a)
 return a}}},
-V38:{
-"^":"uL+Pi;",
+V37:{
+"^":"uL+Piz;",
 $isd3:true},
-vT:{
-"^":"a;NK,aF",
+Tb:{
+"^":"a;Q,a",
 eC:function(a){var z,y,x,w,v,u
-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()
-v=J.BQ(y.t(a,w),"%")
+z=this.Q.Q
+if(J.mG(z.nQ("getNumberOfColumns"),0)){z.Z("addColumn",["string","Name"])
+z.Z("addColumn",["number","Value"])}z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.RE(a),x=J.Nx(y.gvc(a));x.D();){w=x.gk()
+v=J.BQ(y.p(a,w),"%")
 if(0>=v.length)return H.e(v,0)
 u=[]
 C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.GD(u)
 u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
+z.Z("addRow",[u])}}},
 Z4:{
-"^":"V39;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)},
+"^":"V38;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gXE:function(a){return a.RZ},
+sXE:function(a,b){a.RZ=this.ct(a,C.bJ,a.RZ,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.vT(new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null)),null)
-z=a.iw
+if(a.RZ==null)return
+if($.Ib().Q.Q!==0&&a.ij==null)a.ij=new D.Tb(new G.Kf(P.zV(J.Tf($.NR,"DataTable"),null)),null)
+z=a.ij
 if(z==null)return
-z.eC(a.wd)
+z.eC(a.RZ)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-x=z.aF
-if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
-x.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+if(y!=null){z=a.ij
+x=z.a
+if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x.Q=P.zV(J.Tf($.NR,"PieChart"),[y])
+z.a=x}x.Am(0,z.Q)}},"$1","ghU",2,0,20,61],
+static:{Oll:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.aXP.LX(a)
 C.aXP.XI(a)
 return a}}},
-V39:{
-"^":"uL+Pi;",
+V38:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
-Lr:{
-"^":"a;KK,S2",
+cA:{
+"^":"a;Q,a",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.KK.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-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.Q0(a.gaf(),"Idle")
-v=a.gvh()
-for(u=0;u<a.gFw().length;++u){y=a.gFw()
+z=this.Q.Q
+if(J.mG(z.nQ("getNumberOfColumns"),0)){z.Z("addColumn",["string","Time"])
+for(y=J.Nx(a.gfJ());y.D();){x=y.c
+if(J.mG(x,"Idle"))continue
+z.Z("addColumn",["number",x])}}z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+w=J.YQ(a.gfJ(),"Idle")
+v=a.gZ0()
+for(u=0;u<a.glI().length;++u){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-t=y[u].SP
+t=y[u].Q
 s=[]
-if(t>0){if(typeof v!=="number")return H.s(v)
+if(t>0){if(typeof v!=="number")return H.o(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.gFw()
+y=a.glI()
 if(u>=y.length)return H.e(y,u)
-r=y[u].jf
+r=y[u].b
 if(r===0){q=0
-while(!0){y=a.gFw()
+while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
+if(!(q<y[u].a.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.gFw()
+while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
+if(!(q<y[u].a.length))break
 c$1:{if(q===w)break c$1
-y=a.gFw()
+y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=y[u].XE
+y=y[u].a
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.x4(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])}}},
+z.Z("addRow",[y])}}},
 qk:{
-"^":"V40;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="+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.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
+"^":"V39;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+vV:[function(a,b){var z=a.RZ
+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],
+af:[function(a){a.RZ.m7().ml(new L.LX(a))},"$0","gke",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gke(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.Cn=null}},
-pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",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,169,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,169,13],
+a.ij=null}},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
+Fv:[function(a,b){return a.RZ.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,169,15],
+xK:[function(a,b){return a.RZ.cv("resume").ml(new L.CZ(a))},"$1","gbY",2,0,169,15],
 static:{Qtp:function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.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.hys.LX(a)
-C.hys.XI(a)
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.TQ=new L.cA(new G.Kf(z),null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.Xe.LX(a)
+C.Xe.XI(a)
 return a}}},
-V40:{
-"^":"uL+Pi;",
+V39:{
+"^":"uL+Piz;",
 $isd3:true},
 LX:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w,v
-z=this.a
-y=z.LR
+z=this.Q
+y=z.TQ
 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.yD(null,w)
-v.vR=P.zV(J.UQ($.NR,"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.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,170,"call"],
-$isEH:true},
+if(x!=null){if(y.a==null){w=P.L5(null,null,null,null,null)
+v=new G.qu(null,w)
+v.Q=P.zV(J.Tf($.NR,"SteppedAreaChart"),[x])
+y.a=v
+w.q(0,"isStacked",!0)
+y.a.a.q(0,"connectSteps",!1)
+y.a.a.q(0,"vAxis",P.B(["minValue",0,"maxValue",100],null,null))}y.a.Am(0,y.Q)}if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.cC(z))},"$1",null,2,0,null,170,"call"]},
 CV:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-Vq:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,Z,{
+"^":"r:14;Q",
+$1:[function(a){return J.LE(this.Q.RZ)},"$1",null,2,0,null,121,"call"]},
+CZ:{
+"^":"r:14;Q",
+$1:[function(a){return J.LE(this.Q.RZ)},"$1",null,2,0,null,121,"call"]}}],["","",,Z,{
 "^":"",
 xh:{
-"^":"a;ue,GO",
+"^":"a;Q,a",
 KW:function(a,b){var z,y,x,w,v,u,t,s
-z=this.GO
+z=this.a
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
-t=y.t(a,u)
-s=J.x(t)
-if(!!s.$isT8){s=C.yo.U("  ",b)
-w.IN+=s
+for(y=J.RE(a),x=J.Nx(y.gvc(a)),w=this.Q,v=b+1;x.D();){u=x.gk()
+t=y.p(a,u)
+s=J.t(t)
+if(!!s.$isw){s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": {\n"
-w.IN+=s
+w.Q+=s
 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)
-w.IN+=s
+s=C.yo.R("  ",b)
+s=w.Q+=s
+w.Q=s+"}\n"}else if(!!s.$isWO){s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": [\n"
-w.IN+=s
+w.Q+=s
 this.J7(t,v)
-s=C.yo.U("  ",b)
-s=w.IN+=s
-w.IN=s+"]\n"}else{s=C.yo.U("  ",b)
-w.IN+=s
+s=C.yo.R("  ",b)
+s=w.Q+=s
+w.Q=s+"]\n"}else{s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": "+H.d(t)
-s=w.IN+=s
-w.IN=s+"\n"}}z.Rz(0,a)},
+s=w.Q+=s
+w.Q=s+"\n"}}z.Rz(0,a)},
 J7:function(a,b){var z,y,x,w,v,u
-z=this.GO
+z=this.a
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
-u=J.x(v)
-if(!!u.$isT8){u=C.yo.U("  ",b)
-u=x.IN+=u
-x.IN=u+"{\n"
+for(y=J.Nx(a),x=this.Q,w=b+1;y.D();){v=y.gk()
+u=J.t(v)
+if(!!u.$isw){u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"{\n"
 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)
-u=x.IN+=u
-x.IN=u+"[\n"
+u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"}\n"}else if(!!u.$isWO){u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"[\n"
 this.J7(v,w)
-u=C.yo.U("  ",b)
-u=x.IN+=u
-x.IN=u+"]\n"}else{u=C.yo.U("  ",b)
-x.IN+=u
-u=x.IN+=typeof v==="string"?v:H.d(v)
-x.IN=u+"\n"}}z.Rz(0,a)}},
+u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"]\n"}else{u=C.yo.R("  ",b)
+x.Q+=u
+u=x.Q+=typeof v==="string"?v:H.d(v)
+x.Q=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V41;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},
+"^":"V40;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gIr:function(a){return a.RZ},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
-glp:function(a){return a.cs},
-slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
-oC:[function(a,b){var z,y,x
+sIr:function(a,b){a.RZ=this.ct(a,C.SR,a.RZ,b)},
+glp:function(a){return a.ij},
+slp:function(a,b){a.ij=this.ct(a,C.t6,a.ij,b)},
+qW:[function(a,b){var z,y,x
 z=P.p9("")
-y=P.Ls(null,null,null,null)
-x=a.Ly
-z.IN=""
+y=P.fM(null,null,null,null)
+x=a.RZ
+z.Q=""
 z.KF("{\n")
 new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
-z=z.IN
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+z=z.Q
+z=z.charCodeAt(0)==0?z:z
+a.ij=this.ct(a,C.t6,a.ij,z)},"$1","gdB",2,0,20,61],
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Du.LX(a)
-C.Du.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.GB.LX(a)
+C.GB.XI(a)
 return a}}},
-V41:{
-"^":"uL+Pi;",
+V40:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"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:{dH: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{bUN:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Z3.LX(a)
 C.Z3.XI(a)
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V42;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],
+"^":"V41;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gHt:function(a){return a.RZ},
+sHt:function(a,b){a.RZ=this.ct(a,C.EV,a.RZ,b)},
+vV:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.ag.LX(a)
-C.ag.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.MG.LX(a)
+C.MG.XI(a)
 return a}}},
-V42:{
-"^":"uL+Pi;",
+V41:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
+"^":"a;oc:Q>,eT:a>,b,Zm:c>,wd:d>,e",
 gB8:function(){var z,y,x
-z=this.eT
-y=z==null||J.xC(J.DA(z),"")
-x=this.oc
+z=this.a
+y=z==null||J.mG(J.DA(z),"")
+x=this.Q
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.cK
+gOR:function(){if($.RL){var z=this.b
 if(z!=null)return z
-z=this.eT
+z=this.a
 if(z!=null)return z.gOR()}return $.DR},
-sOR:function(a){if($.RL&&this.eT!=null)this.cK=a
-else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
+sOR:function(a){if($.RL&&this.a!=null)this.b=a
+else{if(this.a!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.DR=a}},
-gSZ:function(){return this.qX()},
-mL:function(a){return a.P>=this.gOR().P},
+gY:function(){return this.qX()},
+mL:function(a){return a.a>=this.gOR().a},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
-if(typeof b!=="string")b=J.AG(b)
+if(a.a>=this.gOR().a){if(!!J.t(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.Lz(b)
 z=this.gB8()
-y=new P.iP(Date.now(),!1)
-y.EK()
+y=Date.now()
 x=$.xO
 $.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
+w=new N.HV(a,b,z,new P.iP(y,!1),x,c,d)
 if($.RL)for(v=this;v!=null;){v.js(w)
 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.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)},
+X2A:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
+x9: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)},
+ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZW(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)},
-hh:function(a){return this.WB(a,null,null)},
-qX:function(){if($.RL||this.eT==null){var z=this.z3
+r6:function(a,b,c){return this.Y6(C.cd,a,b,c)},
+YX:function(a){return this.r6(a,null,null)},
+qX:function(){if($.RL||this.a==null){var z=this.e
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.z3=z}z.toString
-return H.VM(new P.Ln(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())
+this.e=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
+js:function(a){var z=this.e
+if(z!=null){if(z.b>=4)H.vh(z.Pq())
 z.MW(a)}},
-QL:function(a,b,c){var z=this.eT
-if(z!=null)J.jd(z).u(0,this.oc,this)},
+QL:function(a,b,c){var z=this.a
+if(z!=null)J.jd(z).q(0,this.Q,this)},
 $isTJ:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
-aO:{
-"^":"TpZ:76;a",
+static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.dG(a))}}},
+dG:{
+"^":"r:77;Q",
 $0:function(){var z,y,x,w,v
-z=this.a
-if(C.yo.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
+z=this.Q
+if(C.yo.nC(z,"."))H.vh(P.p("name shouldn't start with a '.'"))
 y=C.yo.cn(z,".")
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.yo.Nj(z,0,y))
-z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
+z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.I,N.TJ)
+v=new N.TJ(z,x,null,w,H.J(new P.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},
-$isEH:true},
+return v}},
 Ng:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isNg&&this.P===b.P},
-C:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<z},
-E:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<=z},
-D:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>z},
-F:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>=z},
-iM:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P-z},
-giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gCR",0,0,73],
+"^":"a;oc:Q>,M:a>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isNg&&this.a===b.a},
+w:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a<z},
+B:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a<=z},
+A:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a>z},
+C:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a>=z},
+iM:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a-z},
+giO:function(a){return this.a},
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,wC,uxc"}},
+static:{"^":"V7K,cU,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,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],
+"^":"a;OR:Q<,G1:a>,b,Fl:c<,d,kc:e>,I4:f<",
+X:[function(a){return"["+this.Q.Q+"] "+this.b+": "+H.d(this.a)},"$0","gCR",0,0,0],
 $isHV:true,
 static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e555())
+N.QM("").gY().yI(new F.e551())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Xw(),"google")
+z=J.Tf($.Xw(),"google")
 y=$.Ib()
-z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e556())},
-e555:{
-"^":"TpZ:172;",
+z.Z("load",["visualization","1",P.jT(P.B(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
+$.Ib().Q.ml(G.vN()).ml(new F.e552())},
+e551:{
+"^":"r:172;",
 $1:[function(a){var z
-if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
+if(J.mG(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-e556:{
-"^":"TpZ:12;",
+P.FL(a.gOR().Q+": "+a.gFl().X(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"]},
+e552:{
+"^":"r:14;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.Zw()}catch(y){x=H.Ru(y)
+try{A.Ok()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").hh("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["","",,N,{
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,15,"call"]}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V43;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},
-sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
-geZ:function(a){return a.zv},
-seZ:function(a,b){a.zv=this.ct(a,C.tf,a.zv,b)},
+"^":"V42;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+guc:function(a){return a.RZ},
+suc:function(a,b){a.RZ=this.ct(a,C.EP,a.RZ,b)},
+god:function(a){return a.ij},
+sod:function(a,b){a.ij=this.ct(a,C.rB,a.ij,b)},
+geZ:function(a){return a.TQ},
+seZ:function(a,b){a.TQ=this.ct(a,C.tf,a.TQ,b)},
 Sd:function(a){var z,y
-if(a.zv!=null)return
-if(a.OM!=null){z=a.GC
+if(a.TQ!=null)return
+if(a.ij!=null){z=a.RZ
 z=z!=null&&z.gcX()!=null}else z=!1
-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().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
+if(z){z=a.ij.gpG().Q.p(0,a.RZ.gcX())
+z=this.ct(a,C.tf,a.TQ,z)
+a.TQ=z
+if(z==null){z=a.ij.gSn().Q.p(0,a.RZ.gcX())
+a.TQ=this.ct(a,C.tf,a.TQ,z)}}if(a.TQ==null&&a.ij!=null){z=a.ij.gpG().Q
 y=z.gUQ(z)
-z=y.gqG(y)
-a.zv=this.ct(a,C.tf,a.zv,z)}},
+z=y.gtH(y)
+a.TQ=this.ct(a,C.tf,a.TQ,z)}},
 Es:function(a){this.Sd(a)},
-vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.AP(a))},"$1","guz",2,0,19,59],
-pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
+GU:[function(a,b){var z=a.ij
+if(z!=null)z.VT().ml(new N.oYh(a))},"$1","guz",2,0,20,61],
+SK:[function(a,b){a.ij.VT().wM(b)},"$1","gvC",2,0,20,102],
 Cd9:[function(a,b,c,d){var z,y,x
-z=J.Vs(d).dA.getAttribute("data-id")
-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().LL.t(0,z)
-y=this.ct(a,C.tf,a.zv,y)
-a.zv=y}x=a.GC
+z=J.Vs(d).Q.getAttribute("data-id")
+y=a.ij.gpG().Q.p(0,z)
+y=this.ct(a,C.tf,a.TQ,y)
+a.TQ=y
+if(y==null){y=a.ij.gSn().Q.p(0,z)
+y=this.ct(a,C.tf,a.TQ,y)
+a.TQ=y}x=a.RZ
 if(y!=null)x.scX(z)
-else x.scX(null)},"$3","gUt",6,0,105,2,106,107],
+else x.scX(null)},"$3","gUt",6,0,105,4,106,107],
 $isqn:true,
 static:{hYg: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.po.LX(a)
 C.po.XI(a)
 return a}}},
-V43:{
-"^":"uL+Pi;",
+V42:{
+"^":"uL+Piz;",
 $isd3:true},
-AP:{
-"^":"TpZ:12;a",
-$1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+oYh:{
+"^":"r:14;Q",
+$1:[function(a){J.O8(this.Q)},"$1",null,2,0,null,15,"call"]},
 I2:{
-"^":"V44;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.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
-jV:function(a,b,c){var z,y
+"^":"V43;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+guc:function(a){return a.RZ},
+suc:function(a,b){a.RZ=this.ct(a,C.EP,a.RZ,b)},
+gbe:function(a){return a.ij},
+sbe:function(a,b){a.ij=this.ct(a,C.kB,a.ij,b)},
+mu: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
+for(z=J.RE(b),y=0;y<J.wS(z.gbG(b));++y)if(J.mG(H.BU(J.SW(J.Tf(z.gbG(b),y)),null,null),c))return y
 return},
-Es:function(a){Z.uL.prototype.Es.call(this,a)
+Es:function(a){this.VM(a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.on==null)return
+if(a.ij==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
+J.yi(z,this.mu(a,z,a.ij.gmw()!=null?J.cj(a.ij.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.on.ghM()))},
-y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
+J.yi(y,this.mu(a,y,a.ij.ghM()))},
+Fe:[function(a,b){this.hB(a)},"$1","gyZ",2,0,14,61],
 rm:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.ij
 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,"$isbs").value,null,null)
-y=a.on
+a.RZ.TG(z,y)},"$3","gIf",6,0,105,4,106,107],
+bW:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.ij
 if(y==null)return
-y.shM(z)},"$3","gTK",6,0,105,2,106,107],
+y.shM(z)},"$3","gTK",6,0,105,4,106,107],
 static:{rI3: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Ax.LX(a)
-C.Ax.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.pc.LX(a)
+C.pc.XI(a)
 return a}}},
-V44:{
-"^":"uL+Pi;",
+V43:{
+"^":"uL+Piz;",
 $isd3:true},
 FB:{
-"^":"V45;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)
-a.tB=this.ct(a,C.O9,a.tB,z)
-Z.uL.prototype.Es.call(this,a)},
+"^":"V44;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gbe:function(a){return a.TQ},
+sbe:function(a,b){a.TQ=this.ct(a,C.kB,a.TQ,b)},
+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=P.xC(0,0,0,0,0,1)
+a.LD=this.ct(a,C.O9,a.LD,z)
+this.VM(a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.ij==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.yD(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"LineChart"),[z])
-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.on.gJk().XG.length;++y){x=a.on.gJk().XG
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.Q=P.zV(J.Tf($.NR,"LineChart"),[z])
+a.ij=y}if(a.TQ==null)return
+this.Ta(a)
+a.ij.Am(0,a.RZ)},
+Ta:function(a){var z,y,x,w,v,u,t
+z=a.RZ.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=0;y<a.TQ.gtB().b.length;++y){x=a.TQ.gtB().b
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
-v=J.Vm(w)
+v=J.SW(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
 C.Nm.FV(x,C.Nm.ez([t,v],P.En()))
 x=new P.GD(x)
 x.$builtinTypeInfo=[null]
-z.V7("addRow",[x])}},
-y3q:[function(a,b){var z
-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.on)])}},"$1","gyZ",2,0,12,59],
+z.Z("addRow",[x])}},
+Fe:[function(a,b){var z
+if(!J.mG(b,a.TQ)){z=a.RZ.Q
+z.Z("removeColumns",[0,z.nQ("getNumberOfColumns")])
+z.Z("addColumn",["timeofday","time"])
+z.Z("addColumn",["number",J.DA(a.TQ)])}},"$1","gyZ",2,0,14,61],
 static:{kUw:function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.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.Mw.LX(a)
-C.Mw.XI(a)
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.RZ=new G.Kf(z)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.h1.LX(a)
+C.h1.XI(a)
 return a}}},
-V45:{
-"^":"uL+Pi;",
+V44:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V46;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)},
+"^":"V45;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+giC:function(a){return a.RZ},
+siC:function(a,b){a.RZ=this.ct(a,C.Ys,a.RZ,b)},
 static:{DCi: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.i4=!0
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.aV.LX(a)
-C.aV.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!0
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.kDK.LX(a)
+C.kDK.XI(a)
 return a}}},
-V46:{
-"^":"uL+Pi;",
+V45:{
+"^":"uL+Piz;",
 $isd3:true},
 Bm:{
-"^":"V47;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},
-swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-grZ:function(a){return a.Jo},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJ: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.KU="#"
-a.V4="---"
-a.Jo=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.IG.LX(a)
-C.IG.XI(a)
+"^":"V46;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPj:function(a){return a.RZ},
+sPj:function(a,b){a.RZ=this.ct(a,C.kV,a.RZ,b)},
+gwp:function(a){return a.ij},
+swp:function(a,b){a.ij=this.ct(a,C.P,a.ij,b)},
+grZ:function(a){return a.TQ},
+srZ:function(a,b){a.TQ=this.ct(a,C.uk,a.TQ,b)},
+static:{AJm:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="#"
+a.ij="---"
+a.TQ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YY.LX(a)
+C.YY.XI(a)
 return a}}},
-V47:{
-"^":"uL+Pi;",
+V46:{
+"^":"uL+Piz;",
 $isd3:true},
 Ya:{
-"^":"V48;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:{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])
-x=P.Fl(null,null)
-w=P.Fl(null,null)
-a.KU="#"
-a.V4="---"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V47;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPj:function(a){return a.RZ},
+sPj:function(a,b){a.RZ=this.ct(a,C.kV,a.RZ,b)},
+gwp:function(a){return a.ij},
+swp:function(a,b){a.ij=this.ct(a,C.P,a.ij,b)},
+static:{P5Z:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="#"
+a.ij="---"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.nn.LX(a)
 C.nn.XI(a)
 return a}}},
-V48:{
-"^":"uL+Pi;",
+V47:{
+"^":"uL+Piz;",
 $isd3:true},
 Ww:{
-"^":"V49;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},
+"^":"V48;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gFR:function(a){return a.RZ},
 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.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
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+gjl:function(a){return a.ij},
+sjl:function(a,b){a.ij=this.ct(a,C.S,a.ij,b)},
+gph:function(a){return a.TQ},
+sph:function(a,b){a.TQ=this.ct(a,C.hf,a.TQ,b)},
+Kp:[function(a,b,c,d){var z=a.ij
 if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-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.Hq="Refresh"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+a.ij=this.ct(a,C.S,z,!0)
+if(a.RZ!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,116,4,106,107],
+wY6:[function(a){a.ij=this.ct(a,C.S,a.ij,!1)},"$0","gCB",0,0,1],
+static:{wC:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.TQ="Refresh"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J7.LX(a)
 C.J7.XI(a)
 return a}}},
-V49:{
-"^":"uL+Pi;",
+V48:{
+"^":"uL+Piz;",
 $isd3:true},
 ye:{
-"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.br.LX(a)
-C.br.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.pl.LX(a)
+C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V50;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V49;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grZ:function(a){return a.RZ},
+srZ:function(a,b){a.RZ=this.ct(a,C.uk,a.RZ,b)},
+static:{J8h:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.OKl.LX(a)
 C.OKl.XI(a)
 return a}}},
-V50:{
-"^":"uL+Pi;",
+V49:{
+"^":"uL+Piz;",
 $isd3:true},
 fl:{
-"^":"V51;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","guz",2,0,19,59],
-gu6:function(a){var z=a.iy
+"^":"V50;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grZ:function(a){return a.RZ},
+srZ:function(a,b){a.RZ=this.ct(a,C.uk,a.RZ,b)},
+god:function(a){return a.ij},
+sod:function(a,b){a.ij=this.ct(a,C.rB,a.ij,b)},
+GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,61],
+gu6:function(a){var z=a.ij
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.RRl.LX(a)
 C.RRl.XI(a)
 return a}}},
-V51:{
-"^":"uL+Pi;",
+V50:{
+"^":"uL+Piz;",
 $isd3:true},
 UK:{
-"^":"V52;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},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+"^":"V51;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gHt:function(a){return a.RZ},
+sHt:function(a,b){a.RZ=this.ct(a,C.EV,a.RZ,b)},
+grZ:function(a){return a.ij},
+srZ:function(a,b){a.ij=this.ct(a,C.uk,a.ij,b)},
 static:{Qje: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.xA.LX(a)
 C.xA.XI(a)
 return a}}},
-V52:{
-"^":"uL+Pi;",
+V51:{
+"^":"uL+Piz;",
 $isd3:true},
 wM:{
-"^":"V53;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},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+"^":"V52;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRu:function(a){return a.RZ},
+sRu:function(a,b){a.RZ=this.ct(a,C.XA,a.RZ,b)},
+grZ:function(a){return a.ij},
+srZ:function(a,b){a.ij=this.ct(a,C.uk,a.ij,b)},
 static:{ZTA: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ic.LX(a)
 C.ic.XI(a)
 return a}}},
-V53:{
-"^":"uL+Pi;",
+V52:{
+"^":"uL+Piz;",
 $isd3:true},
-Co:{
-"^":"V54;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)},
+NK:{
+"^":"V53;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRk:function(a){return a.RZ},
+sRk:function(a,b){a.RZ=this.ct(a,C.ld,a.RZ,b)},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.BJj.LX(a)
 C.BJj.XI(a)
 return a}}},
-V54:{
-"^":"uL+Pi;",
+V53:{
+"^":"uL+Piz;",
 $isd3:true},
 Zx:{
-"^":"V55;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)},
-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,169,13],
-PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,169,13],
-XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,169,13],
-Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,169,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,173,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V54;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRk:function(a){return a.RZ},
+sRk:function(a,b){a.RZ=this.ct(a,C.ld,a.RZ,b)},
+gMl:function(a){return a.ij},
+sMl:function(a,b){a.ij=this.ct(a,C.p8,a.ij,b)},
+xK:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.df(J.wg(a.ij))},"$1","gbY",2,0,169,15],
+tb:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.aN(J.wg(a.ij))},"$1","gLc",2,0,169,15],
+lM:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.ex(J.wg(a.ij))},"$1","gqF",2,0,169,15],
+Cx:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.Fy(J.wg(a.ij))},"$1","gVX",2,0,169,15],
+cz:[function(a,b,c,d){J.V1(a.RZ,a.ij)},"$3","gTA",6,0,173,4,106,107],
+static:{zC:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.L8.LX(a)
 C.L8.XI(a)
 return a}}},
-V55:{
-"^":"uL+Pi;",
+V54:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V56;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)},
-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],
+"^":"V55;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+gIi:function(a){return a.ij},
+sIi:function(a,b){a.ij=this.ct(a,C.XM,a.ij,b)},
+gyK:function(a){return a.TQ},
+syK:function(a,b){a.TQ=this.ct(a,C.uO,a.TQ,b)},
+gCF:function(a){return a.ca},
+sCF:function(a,b){a.ca=this.ct(a,C.tg,a.ca,b)},
+Cq:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/retained")).ml(new L.uWE(a))},"$1","ghN",2,0,111,113],
+DC:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,33],
+yg:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,33],
+SK:[function(a,b){J.LE(a.RZ).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
-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.wA=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.h5.LX(a)
-C.h5.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ca=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.br.LX(a)
+C.br.XI(a)
 return a}}},
-V56:{
-"^":"uL+Pi;",
+V55:{
+"^":"uL+Piz;",
 $isd3:true},
-rQ:{
-"^":"TpZ:115;a",
+uWE:{
+"^":"r:115;Q",
 $1:[function(a){var z,y
-z=this.a
-y=H.BU(a.gPE(),null,null)
-z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-ky:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-WZ:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,L,{
+z=this.Q
+y=H.BU(a.gHD(),null,null)
+z.ca=J.Q5(z,C.tg,z.ca,y)},"$1",null,2,0,null,96,"call"]},
+vT:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.XM,z.ij,a)},"$1",null,2,0,null,96,"call"]},
+C1y:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.TQ=J.Q5(z,C.uO,z.TQ,a)},"$1",null,2,0,null,96,"call"]}}],["","",,L,{
 "^":"",
 NT:{
-"^":"V57;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
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.LQi.LX(a)
-C.LQi.XI(a)
+"^":"V56;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+static:{iLU:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Lj.LX(a)
+C.Lj.XI(a)
 return a}}},
-V57:{
-"^":"uL+Pi;",
+V56:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V58;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)},
+"^":"V57;RZ,iJ:ij=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gzj:function(a){return a.RZ},
+szj:function(a,b){a.RZ=this.ct(a,C.VK,a.RZ,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.Tj]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+this.VM(a)
+if(a.RZ===!0){z=new G.mL(H.J([],[G.MQ]),null,new G.OR("/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.Tj])
+a.ij=z}else{z=H.J([],[G.MQ])
 y=Q.pT(null,D.Mk)
-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)
+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)
 y.Ty(a)
-a.i6=y}},
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+a.ij=y}},
+static:{JT8:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.YpE.LX(a)
 C.YpE.XI(a)
 return a}}},
-V58:{
-"^":"uL+Pi;",
+V57:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"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).fN},
-gl6:function(a){return J.D8(this.guc(a))},
-Es:function(a){A.zs.prototype.Es.call(this,a)
-this.U2(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)},
+"^":"Xfs;LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+giJ:function(a){return $.Pi},
+guc:function(a){return this.giJ(a).a},
+gl6:function(a){return J.BI(this.guc(a))},
+Es:["VM",function(a){this.tZ(a)
+this.U2(a)}],
+aC:function(a,b,c,d){this.Ud(a,b,c,d)},
+dQ:["eX",function(a){this.xD(a)
+this.mv(a)}],
+I9:["Ni",function(a){this.Kv(a)}],
+gMT:function(a){return a.LD},
+sMT:function(a,b){a.LD=this.ct(a,C.O9,a.LD,b)},
 yY:function(a){},
-JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.yM(a)},"$1","grX",2,0,19,59],
+Lq:[function(a,b){if(a.LD!=null)this.U2(a)
+else this.mv(a)},"$1","gj8",2,0,20,61],
 U2:function(a){var z
-if(a.tB==null)return
-z=a.Qf
+if(a.LD==null)return
+z=a.kX
 if(z!=null)z.Gv()
-a.Qf=P.cH(a.tB,this.gPs(a))},
-yM:function(a){var z=a.Qf
+a.kX=P.cH(a.LD,this.gPs(a))},
+mv:function(a){var z=a.kX
 if(z!=null)z.Gv()
-a.Qf=null},
+a.kX=null},
 Yl:[function(a){var z
 this.yY(a)
-z=a.tB
-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,173,87,106,107],
-Gxe:[function(a,b){this.gi6(a).Z6
+z=a.LD
+if(z==null){this.mv(a)
+return}a.kX=P.cH(z,this.gPs(a))},"$0","gPs",0,0,1],
+cD:[function(a,b,c,d){this.giJ(a).b.Cz(b,c,d)},"$3","gCK",6,0,173,87,106,107],
+XD:[function(a,b){this.giJ(a).b
 return"#"+H.d(b)},"$1","gGs",2,0,174,175],
-Qb:[function(a,b){return G.M5(b)},"$1","gSs",2,0,176,177],
-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],
+Om:[function(a,b){return G.M5(b)},"$1","gSs",2,0,176,177],
+Ze:[function(a,b){return G.O3(b)},"$1","gbJ",2,0,16,17],
+S2:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,21],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
-z.push(C.yo.j("'",0))
-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"))
-else if(w.n(x,"\u000c".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\f"))
-else if(w.n(x,"\u0008".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\b"))
-else if(w.n(x,"\t".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\t"))
-else if(w.n(x,"\u000b".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\v"))
-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.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.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,178,69,20,179],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z.push(39)
+for(y=J.OX(b),y=y.gu(y);y.D();){x=y.c
+w=J.t(x)
+if(w.m(x,10))C.Nm.FV(z,new J.mN("\\n"))
+else if(w.m(x,13))C.Nm.FV(z,new J.mN("\\r"))
+else if(w.m(x,12))C.Nm.FV(z,new J.mN("\\f"))
+else if(w.m(x,8))C.Nm.FV(z,new J.mN("\\b"))
+else if(w.m(x,9))C.Nm.FV(z,new J.mN("\\t"))
+else if(w.m(x,11))C.Nm.FV(z,new J.mN("\\v"))
+else if(w.m(x,36))C.Nm.FV(z,new J.mN("\\$"))
+else if(w.m(x,92))C.Nm.FV(z,new J.mN("\\\\"))
+else if(w.m(x,39))C.Nm.FV(z,new J.mN("'"))
+else if(w.w(x,32))C.Nm.FV(z,new J.mN("\\u"+C.yo.Zp(w.WZ(x,16),4,"0")))
+else z.push(x)}if(c===!0)C.Nm.FV(z,new J.mN("..."))
+else z.push(39)
+return P.Qe(z,0,null)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,178,71,21,179],
+static:{LD:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Pfz.LX(a)
 C.Pfz.XI(a)
 return a}}},
 Xfs:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
 Ap:{
 "^":"a;",
-sP:function(a,b){},
+sM:function(a,b){},
 fR:function(){},
 $isAp:true}}],["","",,O,{
 "^":"",
-Pi:{
+Piz:{
 "^":"a;",
-gqh:function(a){var z=a.Vg
+gqh:function(a){var z=a.cy$
 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.Ln(z),[H.u3(z,0)])},
-w37:[function(a){},"$0","gcm",0,0,17],
-dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
+z=P.bK(this.gl1(a),z,!0,null)
+a.cy$=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gcm",0,0,1],
+dt:[function(a){a.cy$=null},"$0","gl1",0,0,1],
 HC:[function(a){var z,y,x
-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())
+z=a.db$
+a.db$=null
+if(this.gnz(a)&&z!=null){y=a.cy$
+x=H.J(new P.Eb(z),[T.yj])
+if(y.b>=4)H.vh(y.Pq())
 y.MW(x)
 return!0}return!1},"$0","gDx",0,0,131],
 gnz:function(a){var z,y
-z=a.Vg
-if(z!=null){y=z.iE
+z=a.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
+SZ:function(a,b){if(!this.gnz(a))return
+if(a.db$==null){a.db$=[]
+P.rb(this.gDx(a))}a.db$.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
 $isyj:true},
 qI:{
-"^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
+"^":"yj;WA:Q>,oc:a>,b,c",
+X:[function(a){return"#<PropertyChangeRecord "+H.d(this.a)+" from: "+H.d(this.b)+" to: "+H.d(this.c)+">"},"$0","gCR",0,0,0],
 $isqI:true}}],["","",,O,{
 "^":"",
-X0:function(){var z,y,x,w,v,u,t,s,r,q
+N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -15187,65 +14658,59 @@
 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=$.S5()
+if(w&&v){w=$.aT()
 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.Ff
+for(s=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.D();){r=s.c
 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))+".")}}$.Nc=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.p(r,0))+", object: "+H.d(q.p(r,1))+".")}}$.dL=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.qj(z),null,null,null,null,null,null)},
-YC:{
-"^":"TpZ:180;a",
-$2:function(a,b){var z=this.a
+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,null)},
+Nq:{
+"^":"r:180;Q",
+$2:function(a,b){var z=this.Q
 if(z.a)return
 z.a=!0
-a.RK(b,new O.N0(z))},
-$isEH:true},
-N0:{
-"^":"TpZ:76;a",
-$0:[function(){this.a.a=!1
-O.X0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+a.RK(b,new O.jB(z))}},
+jB:{
+"^":"r:77;Q",
+$0:[function(){this.Q.a=!1
+O.N0()},"$0",null,0,0,null,"call"]},
 zI:{
-"^":"TpZ:29;b",
+"^":"r:30;Q",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
-$isEH:true},
+return new O.HF(this.Q,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"]},
 HF:{
-"^":"TpZ:76;c,d,e,f",
-$0:[function(){this.c.$2(this.d,this.e)
-return this.f.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-qj:{
-"^":"TpZ:181;UI",
+"^":"r:77;Q,a,b,c",
+$0:[function(){this.Q.$2(this.a,this.b)
+return this.c.$0()},"$0",null,0,0,null,"call"]},
+bF:{
+"^":"r:181;Q",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
-$isEH:true},
+return new O.iu(this.Q,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"]},
 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,182,"call"],
-$isEH:true}}],["","",,G,{
+"^":"r:14;Q,a,b,c",
+$1:[function(a){this.Q.$2(this.a,this.b)
+return this.c.$1(a)},"$1",null,2,0,null,182,"call"]}}],["","",,G,{
 "^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+LR: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)
+y=J.WB(J.D5(c,b),1)
 x=Array(z)
-for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(y)
+for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.o(y)
 u=Array(y)
 if(v>=w)return H.e(x,v)
 x[v]=u
 if(0>=u.length)return H.e(u,0)
-u[0]=v}if(typeof y!=="number")return H.s(y)
+u[0]=v}if(typeof y!=="number")return H.o(y)
 t=0
 for(;t<y;++t){if(0>=w)return H.e(x,0)
 u=x[0]
 if(t>=u.length)return H.e(u,t)
-u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
-p=J.xC(d[q],s.t(a,J.bI(u.g(b,t),1)))
+u[t]=t}for(u=J.rv(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
+p=J.mG(d[q],s.p(a,J.D5(u.g(b,t),1)))
 o=x[r]
 n=x[v]
 m=t-1
@@ -15263,10 +14728,10 @@
 if(m>=o)return H.e(n,m)
 m=n[m]
 if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
+m=P.C(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+Mw: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)
@@ -15292,7 +14757,7 @@
 t=a[y]
 if(s>=t.length)return H.e(t,s)
 o=t[s]
-n=P.J(P.J(p,o),q)
+n=P.C(P.C(p,o),q)
 if(n===q){if(q==null?v==null:q===v)u.push(0)
 else{u.push(1)
 v=q}x=s
@@ -15300,152 +14765,147 @@
 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.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)
+x=s}}}return H.J(new H.iK(u),[H.u3(H.J(new H.ii(),[H.u3(u,0)]),0)]).br(0)},
+uf:function(a,b,c){var z,y,x
+for(z=J.U6(a),y=0;y<c;++y){x=z.p(a,y)
 if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
+if(!J.mG(x,b[y]))return y}return c},
 xU:function(a,b,c){var z,y,x,w,v
 z=J.U6(a)
-y=z.gB(a)
+y=z.gv(a)
 x=b.length
 w=0
 while(!0){if(w<c){--y
-v=z.t(a,y);--x
+v=z.p(a,y);--x
 if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(v,b[x])}else v=!1
+v=J.mG(v,b[x])}else v=!1
 if(!v)break;++w}return w},
 jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
 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.rN(a,d,y):0
-v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
+y=P.C(z.T(c,b),f-e)
+x=J.t(b)
+w=x.m(b,0)&&e===0?G.uf(a,d,y):0
+v=z.m(c,J.wS(a))&&f===d.length?G.xU(a,d,y-w):0
 b=x.g(b,w)
 e+=w
-c=z.W(c,v)
+c=z.T(c,v)
 f-=v
 z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
-if(J.xC(b,c)){u=[]
-z=new P.Ui(u)
+if(J.mG(z.T(c,b),0)&&f-e===0)return C.xD
+if(J.mG(b,c)){u=[]
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,b,0)
-for(;e<f;e=s){z=t.kJ
+for(;e<f;e=s){z=t.b
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.T(c,b)
 u=[]
-x=new P.Ui(u)
+x=new P.Eb(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(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)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
+t=new G.Zq(a,z,u,o,0)}t.d=J.WB(t.d,1)
 o=J.WB(o,1)
-z=t.kJ
+z=t.b
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
+t=new G.Zq(a,z,u,o,0)}t.d=J.WB(t.d,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}z=t.kJ
+t=new G.Zq(a,z,u,o,0)}z=t.b
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(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
+yq: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=J.qA(b.gkJ())
+x=C.Nm.br(b.gkJ())
 w=b.gNg()
-if(w==null)w=0
-v=new P.Ui(x)
+v=new P.Eb(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
-q.kW=J.WB(q.kW,s)
+q.c=J.WB(q.c,s)
 if(t)continue
-z=u.kW
-y=J.WB(z,u.HD.G4.length)
-x=q.kW
-p=P.J(y,J.WB(x,q.wF))-P.y(z,x)
+z=u.c
+y=J.WB(z,u.a.Q.length)
+x=q.c
+p=P.C(y,J.WB(x,q.d))-P.u(z,x)
 if(p>=0){C.Nm.W4(a,r);--r
-z=J.bI(q.wF,q.HD.G4.length)
-if(typeof z!=="number")return H.s(z)
+z=J.D5(q.d,q.a.Q.length)
+if(typeof z!=="number")return H.o(z)
 s-=z
-z=J.WB(u.wF,J.bI(q.wF,p))
-u.wF=z
-y=u.HD.G4.length
-x=q.HD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.kJ
-if(J.u6(u.kW,q.kW)){z=u.HD
-z=z.Yc(z,0,J.bI(q.kW,u.kW))
-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.kW,u.HD.G4.length),J.WB(q.kW,q.wF))){z=u.HD
-J.bj(o,z.Yc(z,J.bI(J.WB(q.kW,q.wF),u.kW),u.HD.G4.length))}u.kJ=o
-u.HD=q.HD
-if(J.u6(q.kW,u.kW))u.kW=q.kW
-t=!1}}else if(J.u6(u.kW,q.kW)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.wF,u.HD.G4.length)
-q.kW=J.WB(q.kW,n)
-if(typeof n!=="number")return H.s(n)
+z=J.WB(u.d,J.D5(q.d,p))
+u.d=z
+y=u.a.Q.length
+x=q.a.Q.length
+if(J.mG(z,0)&&y+x-p===0)t=!0
+else{o=q.b
+if(J.UN(u.c,q.c)){z=u.a
+z=z.Mu(z,0,J.D5(q.c,u.c))
+if(!!o.fixed$length)H.vh(P.f("insertAll"))
+H.FR(o,0,z)}if(J.vU(J.WB(u.c,u.a.Q.length),J.WB(q.c,q.d))){z=u.a
+C.Nm.FV(o,z.Mu(z,J.D5(J.WB(q.c,q.d),u.c),u.a.Q.length))}u.b=o
+u.a=q.a
+if(J.UN(q.c,u.c))u.c=q.c
+t=!1}}else if(J.UN(u.c,q.c)){C.Nm.aP(a,r,u);++r
+n=J.D5(u.d,u.a.Q.length)
+q.c=J.WB(q.c,n)
+if(typeof n!=="number")return H.o(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-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.Ff)
+VT:function(a,b){var z,y
+z=H.J([],[G.Zq])
+for(y=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.D();)G.yq(z,y.c)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-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
+for(y=G.VT(a,b),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.b;y.D();){w=y.c
+if(J.mG(w.gNg(),1)&&w.gRt().Q.length===1){v=w.gRt().Q
 if(0>=v.length)return H.e(v,0)
 v=v[0]
 u=J.zj(w)
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
-if(!J.xC(v,x[u]))z.push(w)
+if(!J.mG(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().G4.length))}return z},
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().Q.length))}return z},
 Zq:{
-"^":"yj;WA>,HD,kJ<,kW,wF",
-gvH:function(a){return this.kW},
-gRt:function(){return this.HD},
-gNg:function(){return this.wF},
-aa:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.kW
-if(typeof z!=="number")return H.s(z)
+"^":"yj;WA:Q>,a,kJ:b<,c,d",
+gvH:function(a){return this.c},
+gRt:function(){return this.a},
+gNg:function(){return this.d},
+vP:function(a){var z
+if(typeof a==="number"&&Math.floor(a)===a){z=this.c
+if(typeof z!=="number")return H.o(z)
 z=a<z}else z=!0
 if(z)return!1
-if(!J.xC(this.wF,this.HD.G4.length))return!0
-return J.u6(a,J.WB(this.kW,this.wF))},
-bu:[function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.kW)+", removed: "
-y=this.HD
-return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+if(!J.mG(this.d,this.a.Q.length))return!0
+return J.UN(a,J.WB(this.c,this.d))},
+X:[function(a){return"#<ListChangeRecord index: "+H.d(this.c)+", removed: "+H.d(this.a)+", addedCount: "+H.d(this.d)+">"},"$0","gCR",0,0,0],
 $isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
-z=new P.Ui(d)
+z=new P.Eb(d)
 z.$builtinTypeInfo=[null]
 return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
@@ -15454,79 +14914,78 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.X0()},"$0","Jy",0,0,17],
+kM:[function(){return O.N0()},"$0","Jy",0,0,1],
 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]))
+if(z.gnz(a)&&!J.mG(c,d))z.SZ(a,H.J(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,xt:cU%",
+"^":"a;VE:dx$%,r9:dy$%,xt:fr$%",
 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)
+if(this.gVE(a)==null){z=this.gvl(a)
+this.sVE(a,P.bK(this.gEp(a),z,!0,null))}z=this.gVE(a)
 z.toString
-return H.VM(new P.Ln(z),[H.u3(z,0)])},
+return H.J(new P.rk(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
+if(this.gVE(a)!=null){z=this.gVE(a)
+y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-W7Y:[function(a){var z,y,x,w
+WW:[function(a){var z,y,x,w
 z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
+if(z==null){z=H.J([],[F.d3])
 $.Oo=z}z.push(a)
-$.Nc=$.Nc+1
+$.dL=$.dL+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.Vc,!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],
+for(z=this.gbx(a),z=$.II().WT(0,z,new A.yM(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){x=J.DA(z.c)
+w=$.cp().Q.Q.p(0,x)
+if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
+y.q(0,x,w.$1(a))}this.sr9(a,y)},"$0","gvl",0,0,1],
+Fw:[function(a){if(this.gr9(a)!=null)this.sr9(a,null)},"$0","gEp",0,0,1],
 HC:function(a){var z,y
 z={}
-if(this.grJ(a)==null||!this.gnz(a))return!1
+if(this.gr9(a)==null||!this.gnz(a))return!1
 z.a=this.gxt(a)
 this.sxt(a,null)
-this.grJ(a).aN(0,new F.X6(z,a))
+this.gr9(a).aN(0,new F.X6(z,a))
 if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Ui(z.a),[T.yj])
-if(y.YM>=4)H.vh(y.Pq())
+y=this.gVE(a)
+z=H.J(new P.Eb(z.a),[T.yj])
+if(y.b>=4)H.vh(y.Pq())
 y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
+SZ:function(a,b){if(!this.gnz(a))return
 if(this.gxt(a)==null)this.sxt(a,[])
 this.gxt(a).push(b)},
 $isd3:true},
 X6:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a",
 $2:function(a,b){var z,y,x,w,v
-z=this.b
+z=this.a
 y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
+if(!J.mG(b,y)){x=this.Q
 w=x.a
 if(w==null){v=[]
 x.a=v
 x=v}else x=w
-x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.Zh(z).u(0,a,y)}},
-$isEH:true}}],["","",,A,{
+x.push(H.J(new T.qI(z,a,b,y),[null]))
+J.Xi(z).q(0,a,y)}}}}],["","",,A,{
 "^":"",
 xhq:{
-"^":"Pi;",
-gP:function(a){return this.Xq},
-sP:function(a,b){this.Xq=F.Wi(this,C.zd,this.Xq,b)},
-bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
+"^":"Piz;",
+gM:function(a){return this.Q},
+sM:function(a,b){this.Q=F.Wi(this,C.zd,this.Q,b)},
+X:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Q)+">"},"$0","gCR",0,0,0]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"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.Ln(z),[H.u3(z,0)])},
-gB:function(a){return this.XG.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.XG
+"^":"uFU;lr:Q@,a,b,cy$,db$",
+gXF:function(){var z=this.a
+if(z==null){z=P.bK(new Q.OA(this),null,!0,null)
+this.a=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])},
+gv:function(a){return this.b.length},
+sv:function(a,b){var z,y,x,w,v
+z=this.b
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15534,144 +14993,145 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.wb()
+if(x)if(b<y){x=new H.ii()
 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))
+P.iZ(b,y,z.length,null,null,null)
 w=new H.bX(z,b,y)
 w.$builtinTypeInfo=[H.u3(x,0)]
-if(b<0)H.vh(P.N(b))
-if(y<0)H.vh(P.N(y))
-if(b>y)H.vh(P.TE(b,0,y))
+if(b<0)H.vh(P.ve(b,0,null,"start",null))
+if(y<0)H.vh(P.ve(y,0,null,"end",null))
+if(b>y)H.vh(P.ve(b,0,y,"start",null))
 x=w.br(0)
-w=new P.Ui(x)
+w=new P.Eb(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
-x=new P.Ui(v)
+x=new P.Eb(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.XG
+this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sv(z,b)},
+p:function(a,b){var z=this.b
 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.XG
+q:function(a,b,c){var z,y,x,w
+z=this.b
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
-w=new P.Ui(x)
+w=new P.Eb(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
 Mh:function(a,b,c){var z,y,x
-z=J.x(c)
+z=J.t(c)
 if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.Mu
-if(z!=null){x=z.iE
+y=J.wS(c)
+z=this.a
+if(z!=null){x=z.c
 z=x==null?z!=null:x!==z}else z=!1
-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)},
+if(z&&y>0){z=this.b
+x=H.J(new H.ii(),[H.u3(z,0)])
+P.iZ(b,y,z.length,null,null,null)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}z=this.b
+C.Nm.uy(z,"setAll")
+H.h8(z,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.XG
+z=this.b
 y=z.length
 this.Xy(y,y+1)
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 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.XG
+z=this.b
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.Mu
-if(z!=null){w=z.iE
+z=this.a
+if(z!=null){w=z.c
 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.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.b,y=0;y<z.length;++y)if(J.mG(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.XG.length)H.vh(P.TE(b,0,this.gB(this)))
-y=!(c<b)
-if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.XG
-v=w.length
-u=v-x
-this.ct(this,C.Wn,v,u)
-t=v===0
-u=u===0
-this.ct(this,C.ai,t,u)
-this.ct(this,C.nZ,!t,!u)
-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.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))
-z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[H.u3(u,0)]
-if(b<0)H.vh(P.N(b))
-if(c<0)H.vh(P.N(c))
-if(b>c)H.vh(P.TE(b,0,c))
-z=z.br(0)
-y=new P.Ui(z)
-y.$builtinTypeInfo=[null]
-this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
+oq:function(a,b,c){var z,y,x,w,v
+if(b<0||b>this.b.length)H.vh(P.ve(b,0,this.gv(this),null,null))
+if(c<b||c>this.b.length)H.vh(P.ve(c,b,this.gv(this),null,null))
+z=c-b
+y=this.b
+x=y.length
+w=x-z
+this.ct(this,C.Wn,x,w)
+v=x===0
+w=w===0
+this.ct(this,C.ai,v,w)
+this.ct(this,C.nZ,!v,!w)
+w=this.a
+if(w!=null){v=w.c
+w=v==null?w!=null:v!==w}else w=!1
+if(w&&z>0){w=new H.ii()
+w.$builtinTypeInfo=[H.u3(y,0)]
+P.iZ(b,c,y.length,null,null,null)
+v=new H.bX(y,b,c)
+v.$builtinTypeInfo=[H.u3(w,0)]
+if(b<0)H.vh(P.ve(b,0,null,"start",null))
+if(c<0)H.vh(P.ve(c,0,null,"end",null))
+if(b>c)H.vh(P.ve(b,0,c,"start",null))
+w=v.br(0)
+v=new P.Eb(w)
+v.$builtinTypeInfo=[null]
+this.E2(new G.Zq(this,v,w,b,0))}C.Nm.oq(y,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=J.x(c)
+if(b<0||b>this.b.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=J.t(c)
 if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.XG
+y=J.wS(c)
+z=this.b
 x=z.length
-C.Nm.sB(z,x+y)
+C.Nm.sv(z,x+y)
 w=z.length
+C.Nm.uy(z,"set range")
 H.qG(z,b+y,w,this,b)
+C.Nm.uy(z,"setAll")
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.Mu
-if(z!=null){w=z.iE
+z=this.a
+if(z!=null){w=z.c
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-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
+aP:function(a,b,c){var z,y,x
+if(b>this.b.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.b
 y=z.length
 if(b===y){this.h(0,c)
-return}C.Nm.sB(z,y+1)
+return}C.Nm.sv(z,y+1)
 y=z.length
+C.Nm.uy(z,"set range")
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.Mu
-if(y!=null){x=y.iE
+y=this.a
+if(y!=null){x=y.c
 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.Mu
-if(z!=null){y=z.iE
+z=this.a
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.lr==null){this.lr=[]
-P.rb(this.gL6())}this.lr.push(a)},
+if(this.Q==null){this.Q=[]
+P.rb(this.gL6())}this.Q.push(a)},
 Xy:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
@@ -15679,2216 +15139,2134 @@
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
 oCy:[function(){var z,y,x
-z=this.lr
+z=this.Q
 if(z==null)return!1
 y=G.Qi(this,z)
-this.lr=null
-z=this.Mu
-if(z!=null){x=z.iE
+this.Q=null
+z=this.a
+if(z!=null){x=z.c
 x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
-if(z.YM>=4)H.vh(z.Pq())
+if(x&&y.length!==0){x=H.J(new P.Eb(y),[G.Zq])
+if(z.b>=4)H.vh(z.Pq())
 z.MW(x)
 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])},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()
+static:{pT:function(a,b){var z=H.J([],[b])
+return H.J(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.p("can't use same list for previous and current"))
+for(z=J.Nx(c),y=J.w1(b);z.D();){x=z.gk()
 w=J.RE(x)
 v=J.WB(w.gvH(x),x.gNg())
-u=J.WB(w.gvH(x),x.gRt().G4.length)
-t=y.Yc(b,w.gvH(x),v)
+u=J.WB(w.gvH(x),x.gRt().Q.length)
+t=y.Mu(b,w.gvH(x),v)
 w=w.gvH(x)
-s=J.Wx(w)
-if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
-r=J.Wx(u)
-if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
-q=r.W(u,w)
-p=t.gB(t)
-r=J.Wx(q)
-if(r.F(q,p)){o=r.W(q,p)
-n=s.g(w,p)
-s=a.length
-if(typeof o!=="number")return H.s(o)
-m=s-o
+P.iZ(w,u,a.length,null,null,null)
+s=J.D5(u,w)
+r=t.gv(t)
+q=J.Wx(s)
+p=J.rv(w)
+if(q.C(s,r)){o=q.T(s,r)
+n=p.g(w,r)
+q=a.length
+if(typeof o!=="number")return H.o(o)
+m=q-o
 H.qG(a,w,n,t,0)
 if(o!==0){H.qG(a,n,m,a,u)
-C.Nm.sB(a,m)}}else{o=J.bI(p,q)
-r=a.length
-if(typeof o!=="number")return H.s(o)
-l=r+o
-n=s.g(w,p)
-C.Nm.sB(a,l)
+C.Nm.sv(a,m)}}else{o=J.D5(r,s)
+q=a.length
+if(typeof o!=="number")return H.o(o)
+l=q+o
+n=p.g(w,r)
+C.Nm.sv(a,l)
 H.qG(a,n,l,a,u)
 H.qG(a,w,n,t,0)}}}}},
 uFU:{
-"^":"ark+Pi;",
+"^":"ark+Piz;",
 $isd3:true},
-xb:{
-"^":"TpZ:76;a",
-$0:function(){this.a.Mu=null},
-$isEH:true}}],["","",,V,{
+OA:{
+"^":"r:77;Q",
+$0:function(){this.Q.a=null}}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,aC,w5",
-bu:[function(a){var z
-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],
+"^":"yj;G3:Q>,a,b,c,d",
+X:[function(a){var z
+if(this.c)z="insert"
+else z=this.d?"remove":"set"
+return"#<MapChangeRecord "+z+" "+H.d(this.Q)+" from: "+H.d(this.a)+" to: "+H.d(this.b)+">"},"$0","gCR",0,0,0],
 $isya:true},
 qC:{
-"^":"Pi;LL,Vg,fn",
-gvc:function(a){var z=this.LL
+"^":"Piz;Q,cy$,db$",
+gvc:function(a){var z=this.Q
 return z.gvc(z)},
-gUQ:function(a){var z=this.LL
+gUQ:function(a){var z=this.Q
 return z.gUQ(z)},
-gB:function(a){var z=this.LL
-return z.gB(z)},
-gl0:function(a){var z=this.LL
-return z.gB(z)===0},
-gor:function(a){var z=this.LL
-return z.gB(z)!==0},
-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
+gv:function(a){var z=this.Q
+return z.gv(z)},
+gl0:function(a){var z=this.Q
+return z.gv(z)===0},
+gor:function(a){var z=this.Q
+return z.gv(z)!==0},
+NZ:function(a,b){return this.Q.NZ(0,b)},
+p:function(a,b){return this.Q.p(0,b)},
+q:function(a,b,c){var z,y,x,w
+z=this.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
-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)
-if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
-this.nq(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
-this.ld()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
-this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
+if(!z){this.Q.q(0,b,c)
+return}z=this.Q
+x=z.gv(z)
+w=z.p(0,b)
+z.q(0,b,c)
+if(x!==z.gv(z)){F.Wi(this,C.Wn,x,z.gv(z))
+this.SZ(this,H.J(new V.ya(b,null,c,!0,!1),[null,null]))
+this.ld()}else if(!J.mG(w,c)){this.SZ(this,H.J(new V.ya(b,w,c,!1,!1),[null,null]))
+this.SZ(this,H.J(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.LL
-y=z.gB(z)
+z=this.Q
+y=z.gv(z)
 x=z.Rz(0,b)
-w=this.Vg
-if(w!=null){v=w.iE
+w=this.cy$
+if(w!=null){v=w.c
 w=v==null?w!=null:v!==w}else w=!1
-if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.ya(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))
+if(w&&y!==z.gv(z)){this.SZ(this,H.J(new V.ya(b,x,null,!1,!0),[null,null]))
+F.Wi(this,C.Wn,y,z.gv(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.LL
-y=z.gB(z)
-x=this.Vg
-if(x!=null){w=x.iE
+z=this.Q
+y=z.gv(z)
+x=this.cy$
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-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]))},
+aN:function(a,b){return this.Q.aN(0,b)},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+ld:function(){this.SZ(this,H.J(new T.qI(this,C.SY,null,null),[null]))
+this.SZ(this,H.J(new T.qI(this,C.l4,null,null),[null]))},
 $isqC:true,
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{AB:function(a,b,c){var z,y
-z=J.x(a)
-if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
+z=J.t(a)
+if(!!z.$isBa)y=H.J(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.J(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.J(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.a,"qC")}},
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.Q,"qC")}},
 Lo:{
-"^":"TpZ:81;a",
-$2:function(a,b){var z=this.a
-z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["","",,Y,{
+"^":"r:80;Q",
+$2:function(a,b){var z=this.Q
+z.SZ(z,H.J(new V.ya(a,b,null,!1,!0),[null,null]))}}}],["","",,Y,{
 "^":"",
-cU:{
-"^":"Ap;Os,he,mD,iI,A2",
-bl:function(a){return this.he.$1(a)},
-WM:function(a){return this.iI.$1(a)},
+aU:{
+"^":"Ap;Q,a,b,c,d",
+ip:function(a){return this.a.$1(a)},
+kk:function(a){return this.c.$1(a)},
 TR:function(a,b){var z
-this.iI=b
-z=this.bl(J.mu(this.Os,this.gYZ()))
-this.A2=z
+this.c=b
+z=this.ip(J.mu(this.Q,this.ghz()))
+this.d=z
 return z},
-pN:[function(a){var z=this.bl(a)
-if(J.xC(z,this.A2))return
-this.A2=z
-return this.WM(z)},"$1","gYZ",2,0,12,60],
-xO:function(a){var z=this.Os
-if(z!=null)J.yd(z)
-this.Os=null
-this.he=null
-this.mD=null
-this.iI=null
-this.A2=null},
-gP:function(a){var z=this.bl(J.Vm(this.Os))
-this.A2=z
+ab:[function(a){var z=this.ip(a)
+if(J.mG(z,this.d))return
+this.d=z
+return this.kk(z)},"$1","ghz",2,0,14,62],
+xO:function(a){var z=this.Q
+if(z!=null)J.xl(z)
+this.Q=null
+this.a=null
+this.b=null
+this.c=null
+this.d=null},
+gM:function(a){var z=this.ip(J.SW(this.Q))
+this.d=z
 return z},
-sP:function(a,b){J.Fc(this.Os,b)},
-fR:function(){return this.Os.fR()}}}],["","",,L,{
+sM:function(a,b){J.Ja(this.Q,b)},
+fR:function(){return this.Q.fR()}}}],["","",,L,{
 "^":"",
-yfW:function(a,b){var z,y,x,w,v
+B2:function(a,b){var z,y,x,w,v
 if(a==null)return
 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)))return J.UQ(a,b)}else{z=b
-if(typeof z==="string")return J.UQ(a,b)
-else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.t(a).$isWO&&J.u6(b,0)&&J.UN(b,J.wS(a)))return J.Tf(a,b)}else{z=b
+if(typeof z==="string")return J.Tf(a,b)
+else if(!!J.t(b).$isIN){z=a
+y=H.RB(z,"$isueT",[P.I,null],"$asueT")
 if(!y){z=a
-y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
+y=H.RB(z,"$isw",[P.I,null],"$asw")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.Mg().xV.af.t(0,b))
+if(z)return J.Tf(a,$.Mg().Q.e.p(0,b))
 try{z=a
 y=b
-x=$.cp().xV.II.t(0,y)
-if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().Q.Q.p(0,y)
+if(x==null)H.vh(O.lA("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=$.mX().NW(z,C.OV)
+return z}catch(w){if(!!J.t(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()
-if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
+if(z.mL(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
 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.kW(a,b,c)
-return!0}}else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.t(a).$isWO&&J.u6(b,0)&&J.UN(b,J.wS(a))){J.H9(a,b,c)
+return!0}}else if(!!J.t(b).$isIN){z=a
+y=H.RB(z,"$isueT",[P.I,null],"$asueT")
 if(!y){z=a
-y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
+y=H.RB(z,"$isw",[P.I,null],"$asw")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.kW(a,$.Mg().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(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
-if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
+if(z){J.H9(a,$.Mg().Q.e.p(0,b),c)
+return!0}try{$.cp().Q1(a,b,c)
+return!0}catch(x){if(!!J.t(H.Ru(x)).$isJS){z=J.bB(a)
+if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(z.mL(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"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)},
+"^":"ARh;d,e,f,Q,a,b,c",
+gIi:function(a){return this.d},
+sM:function(a,b){var z=this.d
+if(z!=null)z.rL(this.e,b)},
 gDJ:function(){return 2},
-TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.KJ(this,this.Lq)
+TR:function(a,b){return this.kv(this,b)},
+Ej:function(a){this.f=L.KJ(this,this.e)
 this.CG(!0)},
-U9:function(){this.z7=null
-this.HS=null
-this.Lq=null},
-VC:function(a){this.HS.I5(this.Lq,a)},
+Wm:function(){this.b=null
+this.d=null
+this.e=null},
+QC:function(a){this.d.KJ(this.e,a)},
 CG:function(a){var z,y
-z=this.z7
-y=this.HS.WK(this.Lq)
-this.z7=y
-if(a||J.xC(y,z))return!1
-this.dC(this.z7,z,this)
+z=this.b
+y=this.d.Tl(this.e)
+this.b=y
+if(a||J.mG(y,z))return!1
+this.vk(this.b,z,this)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zl:{
-"^":"a;T7",
-gB:function(a){return this.T7.length},
-gl0:function(a){return this.T7.length===0},
+Tv:{
+"^":"a;Q",
+gv:function(a){return this.Q.length},
+gl0:function(a){return this.Q.length===0},
 gPu:function(){return!0},
-bu:[function(a){var z,y,x,w,v,u
+X:[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.Ff
-v=J.x(w)
-if(!!v.$isIN){if(!x)z.IN+="."
-u=$.Mg().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="[\""+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
+for(y=this.Q,y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.D();x=!1){w=y.c
+v=J.t(w)
+if(!!v.$isIN){if(!x)z.Q+="."
+u=$.Mg().Q.e.p(0,w)
+z.Q+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
+z.Q+=v}else{v="[\""+H.d(J.JA(v.X(w),"\"","\\\""))+"\"]"
+z.Q+=v}}y=z.Q
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isZl)return!1
+if(!J.t(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.T7
+z=this.Q
 y=z.length
-x=b.T7
+x=b.Q
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
-if(!J.xC(v,x[w]))return!1}return!0},
+if(!J.mG(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.T7,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Q,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
-if(typeof v!=="number")return H.s(v)
+if(typeof v!=="number")return H.o(v)
 x=536870911&x+v
 x=536870911&x+((524287&x)<<10>>>0)
 x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
 x^=x>>>11
 return 536870911&x+((16383&x)<<15>>>0)},
-WK:function(a){var z,y
+Tl: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.Ff
+for(z=this.Q,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
 if(a==null)return
-a=L.yfW(a,y)}return a},
+a=L.B2(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.T7
+z=this.Q
 y=z.length-1
 if(y<0)return!1
 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)
+a=L.B2(a,z[x])}if(y>=z.length)return H.e(z,y)
 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
+KJ:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Q.length===0)return
+z=this.Q
 y=z.length-1
-for(x=0;a!=null;x=w){if(0>=z.length)return H.e(z,0)
-b.$2(a,z[0])
+for(x=0;a!=null;x=w){if(x>=z.length)return H.e(z,x)
+b.$2(a,z[x])
 if(x>=y)break
 w=x+1
 if(x>=z.length)return H.e(z,x)
-a=L.yfW(a,z[x])}},
-$isZl:true,
+a=L.B2(a,z[x])}},
+$isTv:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
-z=J.x(a)
-if(!!z.$isZl)return a
+z=J.t(a)
+if(!!z.$isTv)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)
+if(!!J.t(a).$isWO){y=P.z(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-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)
+for(;z.D();){x=z.c
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.t(x).$isIN)throw H.b(P.p("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
+w=z.p(0,a)
 if(w!=null)return w
-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 $.RZ()
-w=new L.Zl(C.Nm.tt(v,!1))
-if(z.X5>=100){u=new P.i5(z)
+v=new L.Pw([],-1,null,P.B(["beforePath",P.B(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.B(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.B(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.B(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.B(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.B(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.B(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.B(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.B(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.B(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.Nc()
+w=new L.Tv(C.Nm.tt(v,!1))
+if(z.Q>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
-t=u.gA(u)
-if(!t.G())H.vh(H.DU())
-z.Rz(0,t.gl())}z.u(0,a,w)
+t=u.gu(u)
+if(!t.D())H.vh(H.DU())
+z.Rz(0,t.gk())}z.q(0,a,w)
 return w}}},
 vH:{
-"^":"Zl;T7",
+"^":"Tv;Q",
 gPu:function(){return!1},
-static:{"^":"dY"}},
-lPa:{
-"^":"TpZ:76;",
-$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},
-iF:{
-"^":"a;vc>,vH>,nl*,ep",
+static:{"^":"HS"}},
+MdQ:{
+"^":"r:77;",
+$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)}},
+Pw:{
+"^":"a;vc:Q>,vH:a>,G3:b*,c",
 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.eT([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return P.Qe([a],0,null)
 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)
+case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.o(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
 else z=!0
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rXF:function(){var z,y,x,w
-z=this.nl
+rX:function(a){var z,y,x,w
+z=this.b
 if(z==null)return
-z=$.cx().B0(z)
-y=this.vc
-x=this.nl
-if(z)y.push($.Mg().xV.T4.t(0,x))
+z=$.EN().zD(z)
+y=this.Q
+x=this.b
+if(z)y.push($.Mg().Q.f.p(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
-this.nl=z==null?b:H.d(z)+H.d(b)},
-jN:function(a,b){var z,y,x
-z=this.vH
+y.push(w!=null?w:this.b)}this.b=null},
+MM:function(a,b){var z=this.b
+this.b=z==null?b:H.d(z)+H.d(b)},
+lA:function(a,b){var z,y,x
+z=this.a
 y=b.length
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
-z=b[z]
-x=H.eT([z])
+x=P.Qe([b[z]],0,null)
 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
+if(z){++this.a
+z=this.b
+this.b=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
-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}},
+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.c,x=z.length,w="beforePath";w!=null;){v=++this.a
+if(v>=x)u=null
+else{if(v<0)return H.e(z,v)
+u=z[v]}if(u!=null&&P.Qe([u],0,null)==="\\"&&this.lA(w,z))continue
+t=this.Xn(u)
+if(J.mG(w,"error"))return
+s=y.p(0,w)
+r=s.p(0,t)
+if(r==null)r=s.p(0,"else")
+if(r==null)return
+v=J.U6(r)
+w=v.p(r,0)
+q=v.gv(r)>1?v.p(r,1):null
+p=J.t(q)
+if(p.m(q,"push")&&this.b!=null)this.rX(0)
+if(p.m(q,"append")){if(v.gv(r)>2){v.p(r,2)
+p=!0}else p=!1
+o=p?v.p(r,2):P.Qe([u],0,null)
+v=this.b
+this.b=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.Q}return}},
 PD:{
-"^":"TpZ:12;",
-$1:function(a){return},
-$isEH:true},
-nQ:{
-"^":"ARh;IE,pu,vl,zo,dR,z7,KZ",
+"^":"r:14;",
+$1:function(a){return}},
+NV:{
+"^":"ARh;d,e,f,Q,a,b,c",
 gDJ:function(){return 3},
-TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
+TR:function(a,b){return this.kv(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.zr){z=$.rf
-if(z!=null){y=z.Ou
+for(z=this.f,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.rf
+if(z!=null){y=z.Q
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.Ls(null,null,null,null)
-z=new L.XU(w,z,[],null)
-$.rf=z}if(z.Ou==null){z.Ou=w
-z.pe=P.Ls(null,null,null,null)}z.JD.push(this)
-this.VC(z.gUu(z))
-this.IE=null
-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.zr){w=z+1
+if(y){z=w==null?null:P.fM(null,null,null,null)
+z=new L.Og(w,z,[],null)
+$.rf=z}if(z.Q==null){z.Q=w
+z.a=P.fM(null,null,null,null)}z.b.push(this)
+this.QC(z.gTT(z))
+this.d=null
+break}}this.CG(!this.e)},
+Wm:function(){var z,y,x,w
+for(z=0;y=this.f,x=y.length,z<x;z+=2)if(y[z]===C.aZ){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===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
+J.xl(y[w])}this.f=null
+this.b=null},
+WX:function(a,b){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Cannot add paths once started."))
 b=L.hk(b)
-z=this.vl
+z=this.f
 z.push(a)
 z.push(b)
-if(!this.pu)return
-J.bi(this.z7,b.WK(a))},
+if(!this.e)return
+J.dH(this.b,b.Tl(a))},
 ti:function(a){return this.WX(a,null)},
-YU:function(a){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
-z=this.vl
-z.push(C.zr)
+Qs:function(a){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Cannot add observers once started."))
+z=this.f
+z.push(C.aZ)
 z.push(a)
-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.zr){v=z+1
+if(!this.e)return
+J.dH(this.b,J.mu(a,new L.bjd(this)))},
+QC:function(a){var z,y,x,w,v
+for(z=0;y=this.f,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").I5(w,a)}}},
+H.Go(y[v],"$isTv").KJ(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-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]
+J.RS(this.b,C.jn.BU(this.f.length,2))
+for(z=!1,y=null,x=0;w=this.f,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.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
+if(u===C.aZ){H.Go(s,"$isAp")
+r=this.c===$.qF?s.TR(0,new L.R2(this)):s.gM(s)}else r=H.Go(s,"$isTv").Tl(u)
+if(a){J.H9(this.b,C.jn.BU(x,2),r)
+continue}w=this.b
 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(J.mG(r,J.Tf(w,v)))continue
+w=this.a
+if(typeof w!=="number")return w.C()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.z7,v))}J.kW(this.z7,v,r)
+y.q(0,v,J.Tf(this.b,v))}J.H9(this.b,v,r)
 z=!0}if(!z)return!1
-this.dC(this.z7,y,w)
+this.vk(this.b,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
-return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-vI:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
-return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+bjd:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.c===$.ljh)z.fl()
+return},"$1",null,2,0,null,15,"call"]},
+R2:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.c===$.ljh)z.fl()
+return},"$1",null,2,0,null,15,"call"]},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-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===$.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.RI(b))
+Yd:function(){return this.Q.$0()},
+d1:function(a){return this.Q.$1(a)},
+qk:function(a,b){return this.Q.$2(a,b)},
+hw:function(a,b,c){return this.Q.$3(a,b,c)},
+gB9:function(){return this.c===$.ljh},
+TR:["kv",function(a,b){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Observer has already been opened."))
+if(X.Cz(b)>this.gDJ())throw H.b(P.p("callback should take "+this.gDJ()+" or fewer arguments"))
+this.Q=b
+this.a=P.C(this.gDJ(),X.aA(b))
 this.Ej(0)
-this.KZ=$.ljh
-return this.z7},
-gP:function(a){this.CG(!0)
-return this.z7},
-xO:function(a){if(this.KZ!==$.ljh)return
-this.U9()
-this.z7=null
-this.zo=null
-this.KZ=$.ls},
-fR:function(){if(this.KZ===$.ljh)this.fl()},
+this.c=$.ljh
+return this.b}],
+gM:function(a){this.CG(!0)
+return this.b},
+xO:function(a){if(this.c!==$.ljh)return
+this.Wm()
+this.b=null
+this.Q=null
+this.c=$.H2},
+fR:function(){if(this.c===$.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
-try{switch(this.dR){case 0:this.Yd()
+vk:function(a,b,c){var z,y,x,w
+try{switch(this.a){case 0:this.Yd()
 break
 case 1:this.d1(a)
 break
 case 2:this.qk(a,b)
 break
-case 3:this.Tu(a,b,c)
+case 3:this.hw(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)}}},
-XU:{
-"^":"a;Ou,pe,JD,YR",
-zJ:[function(a,b,c){var z=this.Ou
-if(b==null?z==null:b===z)this.pe.h(0,c)
-z=J.x(b)
+y=new H.XO(x,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0(z,y)}}},
+Og:{
+"^":"a;Q,a,b,c",
+zJ:[function(a,b,c){var z=this.Q
+if(b==null?z==null:b===z)this.a.h(0,c)
+z=J.t(b)
 if(!!z.$iswn)this.hr(b.gXF())
-if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,183,96,184],
-hr:function(a){var z=this.YR
+if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gTT",4,0,183,96,184],
+hr:function(a){var z=this.c
 if(z==null){z=P.YM(null,null,null,null,null)
-this.YR=z}if(!z.NZ(0,a))this.YR.u(0,a,a.yI(this.gCP()))},
-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.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.pe.tg(0,y.kW))return!1}else return!1}return!0},
-Fk0:[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.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,185],
+this.c=z}if(!z.NZ(0,a))this.c.q(0,a,a.yI(this.gCP()))},
+kR:function(a){var z,y,x,w
+for(z=J.Nx(a);z.D();){y=z.gk()
+x=J.t(y)
+if(!!x.$isqI){if(y.Q!==this.Q||this.a.tg(0,y.a))return!1}else if(!!x.$isZq){x=y.Q
+w=this.Q
+if((x==null?w!=null:x!==w)||this.a.tg(0,y.c))return!1}else return!1}return!0},
+uG:[function(a){var z,y,x
+if(this.kR(a))return
+for(z=this.b,y=C.Nm.tt(z,!1),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=y.c
+if(x.gB9())x.QC(this.gTT(this))}for(z=C.Nm.tt(z,!1),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){x=z.c
+if(x.gB9())x.mX()}},"$1","gCP",2,0,20,185],
 static:{"^":"rf",KJ:function(a,b){var z,y
 z=$.rf
-if(z!=null){y=z.Ou
+if(z!=null){y=z.Q
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.Ls(null,null,null,null)
-z=new L.XU(b,z,[],null)
-$.rf=z}if(z.Ou==null){z.Ou=b
-z.pe=P.Ls(null,null,null,null)}z.JD.push(a)
-a.VC(z.gUu(z))}}}}],["","",,R,{
+if(y){z=b==null?null:P.fM(null,null,null,null)
+z=new L.Og(b,z,[],null)
+$.rf=z}if(z.Q==null){z.Q=b
+z.a=P.fM(null,null,null,null)}z.b.push(a)
+a.QC(z.gTT(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
-z=J.x(a)
+z=J.t(a)
 if(!!z.$isd3)return a
-if(!!z.$isT8){y=V.AB(a,null,null)
+if(!!z.$isw){y=V.AB(a,null,null)
 z.aN(a,new R.Fk(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
+return y}if(!!z.$isQV){z=z.ez(a,R.WZ())
 x=Q.pT(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,12,20],
+return x}return a},"$1","WZ",2,0,14,21],
 Fk:{
-"^":"TpZ:81;a",
-$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,{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,R.tB(a),R.tB(b))}}}],["","",,A,{
 "^":"",
-ec:function(a,b,c){var z=$.lx()
-if(z==null||$.Snm()!==!0)return
-z.V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
+YG:function(a,b,c){var z=$.lx()
+if(z==null||$.oo()!==!0)return
+z.Z("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gmH(a)
-if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
+z=w.gLU(a)
+if(J.mG(z,""))z=w.gQg(a).Q.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.W3.i3(w,"GET",z,!1)
+C.Dt.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isBK){y=w
-x=new H.oP(v,null)
-$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+if(!!J.t(w).$isNh){y=w
+x=new H.XO(v,null)
+$.eU().Ny("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=$.Mg().xV.af.t(0,a)
+z=$.Mg().Q.e.p(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],
-Ad:function(a,b){$.lQ().u(0,a,b)
-H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
+y=J.NH(z)
+return y.C1(z,"Changed")&&!y.m(z,"attributeChanged")},"$1","F4",2,0,66,67],
+Ad:function(a,b){var z
+$.lC().q(0,a,b)
+z=$.Xw()
+H.Go(J.Tf(z,"Polymer"),"$isr7").PO([a])
+H.Go(J.Tf(J.Tf(z,"HTMLElement"),"register"),"$isr7").PO([a,J.Tf(J.Tf(z,"HTMLElement"),"prototype")])},
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.Snm()===!0)b=document.head
+if($.oo()===!0)b=document.head
 z=document.createElement("style",null)
-J.t3(z,J.yO(a))
+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.ae(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
-Zw:function(){A.c4()
-if($.UG){A.X1($.M6,!0)
+if(w.gor(w))x=J.QP(C.t5.grZ(w.Q))}b.insertBefore(z,x)},
+Ok:function(){A.c4()
+if($.UG){A.X1($.MU,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.HE)throw H.b("Initialization was already done.")
-$.HE=!0
+if($.DG)throw H.b("Initialization was already done.")
+$.DG=!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.nj)
+A.Ad("auto-binding-dart",C.CR)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.Dw(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,96,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
+J.Tf($.XX(),"init").qP([],z)
+for(y=H.J(new H.a7(a,96,0,null),[H.u3(a,0)]);y.D();)y.c.$0()
+A.bS()},
 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."))
+z=J.Tf($.Xw(),"Polymer")
+if(z==null)throw H.b(P.s("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($.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.kW($.Dw(),"register",P.mt(new A.k2(y,x)))},
-c4:function(){var z,y,x,w
+z.Z("whenPolymerReady",[y.ce(new A.XR())])
+x=J.Tf($.XX(),"register")
+if(x==null)throw H.b(P.s("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+J.H9($.XX(),"register",P.mt(new A.k2(y,x)))},
+c4:function(){var z,y,x,w,v
 z={}
 $.RL=!0
-y=J.UQ($.Xw(),"logFlags")
-z.a=y
-if(y==null)z.a=P.Fl(null,null)
-x=[$.dn(),$.vo(),$.iX(),$.Lu(),$.ek(),$.lg()]
-w=N.QM("polymer")
-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())},
-So:{
-"^":"a;FL>,t5>,Jh<,oc>,Q7<,tN<,ws>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
+y=J.Tf($.Xw(),"WebComponents")
+x=y==null||J.Tf(y,"flags")==null?P.A(null,null):J.Tf(J.Tf(y,"flags"),"log")
+z.a=x
+if(x==null)z.a=P.A(null,null)
+w=[$.FX(),$.Uk(),$.UW(),$.aQ(),$.Is(),$.zG()]
+v=N.QM("polymer")
+if(!H.Ck(w,new A.j0(z))){v.sOR(C.oO)
+return}H.J(new H.U5(w,new A.j0N(z)),[H.u3(H.J(new H.ii(),[H.u3(w,0)]),0)]).aN(0,new A.MZ6())
+v.gY().yI(new A.mqr())},
+bS:function(){var z={}
+z.a=J.wS($.uj().Z("waitingFor",[null]))
+z.b=null
+P.SZ(P.xC(0,0,0,0,0,1),new A.yd(z))},
+XP:{
+"^":"a;FL:Q>,t5:a>,P1:b<,oc:c>,Q7:d<,DB:e<,Tw:f>,iz:r<,CY:x<,ix:y<,z,ch,ZJ:cx>,mR:cy<,db,dx",
 gZf:function(){var z,y
-z=J.yR(this.FL,"template")
-if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+z=J.Eh(this.Q,"template")
+if(z!=null)y=J.NB(!!J.t(z).$ishs?z:M.uH(z))
 else y=null
 return y},
+IW:function(a){var z,y
+if($.c0().tg(0,a)){z="Cannot define property \""+H.d(a)+"\" for element \""+H.d(this.c)+"\" because it has the same name as an HTMLElement property, and not all browsers support overriding that. Consider giving it a different name. "
+y=$.oK
+if(y==null)H.qw(z)
+else y.$1(z)
+return!0}return!1},
 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.gJh()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.uj()
+for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).Q.getAttribute("extends")
+y=y.gP1()}x=document
+W.wi(window,x,a,this.a,z)},
+RH:function(a){var z=$.uj()
 if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
+J.Tf(z,"urlResolver").Z("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
 if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.Ls(null,null,null,null)
+this.d=y}if(a.gix()!=null){z=a.gix()
+y=P.fM(null,null,null,null)
 y.FV(0,z)
-this.ix=y}}z=this.t5
+this.y=y}}z=this.a
 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.rr(y.Ff)
+x=J.Vs(this.Q).Q.getAttribute("attributes")
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.c;y.D();){v=J.Q7(y.c)
 if(v==="")continue
-u=$.Mg().xV.T4.t(0,v)
+u=$.Mg().Q.f.p(0,v)
 t=u!=null
 if(t){s=L.hk([u])
-r=this.Q7
+r=this.d
 if(r!=null&&r.NZ(0,s))continue
-q=$.mX().CV(z,u)}else{q=null
+q=$.II().CV(z,u)}else{q=null
 s=null}if(!t||q==null||q.gUA()||J.or(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)}},
+continue}t=this.d
+if(t==null){t=P.A(null,null)
+this.d=t}t.q(0,s,q)}},
 en:function(a){var z,y,x,w,v
-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
+for(z=$.II().WT(0,a,C.BK),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
 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)
+if(this.IW(x.goc(y)))continue
+w=this.d
+if(w==null){w=P.A(null,null)
+this.d=w}w.q(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.wb()
+v=new H.ii()
 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.rg())){w=this.ix
-if(w==null){w=P.Ls(null,null,null,null)
-this.ix=w}x=x.goc(y)
-w.h(0,$.Mg().xV.af.t(0,x))}}},
+if(w.Vr(0,new A.Hs())){w=this.y
+if(w==null){w=P.fM(null,null,null,null)
+this.y=w}x=x.goc(y)
+w.h(0,$.Mg().Q.e.p(0,x))}}},
 Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-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.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.Mp(z.Ff)},
+z=P.L5(null,null,null,P.I,P.a)
+this.x=z
+y=this.b
+if(y!=null)z.FV(0,y.gCY())
+J.Vs(this.Q).aN(0,new A.ih(this))},
+W3:function(a){J.Vs(this.Q).aN(0,new A.LJ(a))},
+fk:function(){var z=this.Bg("link[rel=stylesheet]")
+this.z=z
+for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.vX(z.c)},
 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.Mp(z.Ff)},
-yq:function(){var z,y,x,w,v,u,t,s
-z=this.y0
+this.ch=z
+for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.vX(z.c)},
+OL:function(){var z,y,x,w,v,u,t,s
+z=this.z
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
+y=H.J(new H.U5(z,new A.IJ()),[H.u3(H.J(new H.ii(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-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.lu(this.FL).createElement("style",null)
+for(z=H.J(new H.Mo(J.Nx(y.Q),y.a),[H.u3(y,0)]),v=z.Q;z.D();){u=A.Hl(v.gk())
+t=w.Q+=typeof u==="string"?u:H.d(u)
+w.Q=t+"\n"}if(w.Q.length>0){s=J.Do(this.Q).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.FO(x,s,z.gNL(x))}}},
+z.mK(x,s,z.gPZ(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.Vj(this.FL,a)
+z=J.Vj(this.Q,a)
 y=z.br(z)
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-ds:function(a){var z,y,x,w,v,u
+kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-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.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.yO(y.gl())
-w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}return z.IN},
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.z,x.toString,x=H.J(new H.U5(x,y),[H.u3(H.J(new H.ii(),[H.u3(x,0)]),0)]),x=H.J(new H.Mo(J.Nx(x.Q),x.a),[H.u3(x,0)]),w=x.Q;x.D();){v=A.Hl(w.gk())
+u=z.Q+=typeof v==="string"?v:H.d(v)
+z.Q=u+"\n\n"}for(x=this.ch,x.toString,x=H.J(new H.U5(x,y),[H.u3(H.J(new H.ii(),[H.u3(x,0)]),0)]),x=H.J(new H.Mo(J.Nx(x.Q),x.a),[H.u3(x,0)]),y=x.Q;x.D();){v=J.dY(y.gk())
+w=z.Q+=typeof v==="string"?v:H.d(v)
+z.Q=w+"\n\n"}y=z.Q
+return y.charCodeAt(0)==0?y:y},
 J3:function(a,b){var z
-if(a==="")return
+if(J.mG(a,""))return
 z=document.createElement("style",null)
 J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
+z.setAttribute("element",H.d(this.c)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-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.ws==null)this.ws=P.YM(null,null,null,null,null)
+for(z=$.HN(),z=$.II().WT(0,this.a,z),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+if(this.f==null)this.f=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.Mg().xV.af.t(0,w)
+v=$.Mg().Q.e.p(0,w)
 w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.ws.u(0,L.hk(v),[x.goc(y)])}},
+v=w.Nj(v,0,J.D5(w.gv(v),7))
+w=x.goc(y)
+if($.js().tg(0,w))continue
+this.f.q(0,L.hk(v),[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()
+for(z=$.II().WT(0,this.a,C.SM),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c.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.nk(z))
+for(;x.D();)continue}},
+jq:function(a){var z=P.L5(null,null,null,P.I,null)
+a.aN(0,new A.fh(z))
 return z},
-ut:function(){var z,y,x,w,v,u,t,s,r
-z=P.Fl(null,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.In(),null)
-u=J.RE(w)
-t=u.goc(w)
-s=z.t(0,t)
-if(s!=null){u=u.gt5(w)
+hW:function(){var z,y,x,w,v,u,t,s,r
+z=P.A(null,null)
+for(y=$.II().WT(0,this.a,C.h5),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.r;y.D();){w=y.c
+v=J.RE(w)
+u=v.goc(w)
+if(this.IW(u))continue
+t=H.Sz(w.gDv(),new A.HH(),null)
+s=z.p(0,u)
+if(s!=null){v=v.gt5(w)
 r=J.zH(s)
-r=$.mX().xs(u,r)
-u=r}else u=!0
-if(u){x.u(0,t,v.gXt())
-z.u(0,t,w)}}},
-$isSo:true,
-static:{"^":"Kb"}},
+r=$.II().xs(v,r)
+v=r}else v=!0
+if(v){x.q(0,u,t.gEV())
+z.q(0,u,w)}}},
+$isXP:true,
+static:{"^":"Kb,Il,x9"}},
 Zd:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isxn},
-$isEH:true},
-rg:{
-"^":"TpZ:12;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-EB:{
-"^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
-$isEH:true},
-Y1:{
-"^":"TpZ:81;a",
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isA2}},
+Hs:{
+"^":"r:14;",
+$1:function(a){return a.gvn()}},
+ih:{
+"^":"r:80;Q",
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.Q.x.q(0,a,b)}},
+LJ:{
+"^":"r:80;Q",
 $2:function(a,b){var z,y,x
-z=J.Qe(a)
+z=J.NH(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.bS(C.yo.Nj(b,y+2,x)))}},
-$isEH:true},
+if(y>=0&&x>=0)this.Q.q(0,z.yn(a,3),C.yo.bS(C.yo.Nj(b,y+2,x)))}}},
 IJ:{
-"^":"TpZ:12;",
-$1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ui:{
-"^":"TpZ:12;a",
-$1:function(a){return J.wK(a,this.a)},
-$isEH:true},
-XUG:{
-"^":"TpZ:76;",
-$0:function(){return[]},
-$isEH:true},
-nk:{
-"^":"TpZ:186;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-In:{
-"^":"TpZ:12;",
-$1:function(a){return!1},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return J.Vs(a).Q.hasAttribute("polymer-scope")!==!0}},
+Vi:{
+"^":"r:14;Q",
+$1:function(a){return J.YN(a,this.Q)}},
+zR:{
+"^":"r:77;",
+$0:function(){return[]}},
+fh:{
+"^":"r:186;Q",
+$2:function(a,b){this.Q.q(0,H.d(a).toLowerCase(),b)}},
+HH:{
+"^":"r:14;",
+$1:function(a){return!1}},
 Li:{
-"^":"BG9;Mn,oe",
+"^":"BG9;a,Q",
 op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.op(a,b,c)},
+return this.a.op(a,b,c)},
 static:{"^":"rd0,QPA"}},
 BG9:{
-"^":"vE+d23;"},
+"^":"VE+d23;"},
 d23:{
 "^":"a;",
-XB:function(a){var z,y
-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")
-else if(!!z.$ish4){y=J.UQ(P.XY(a),"eventController")
-if(y!=null)return y}a=z.gAd(a)}return!!z.$isI0?a.host:null},
-Z8:function(a,b,c){var z={}
+h5:function(a){var z,y
+for(;z=J.RE(a),z.gKV(a)!=null;){if(!!z.$iszs&&J.Tf(a.r$,"eventController")!=null)return J.Tf(z.gCp(a),"eventController")
+else if(!!z.$isz2){y=J.Tf(P.kW(a),"eventController")
+if(y!=null)return y}a=z.gKV(a)}return!!z.$isBn?a.host:null},
+Y2:function(a,b,c){var z={}
 z.a=a
-return new A.l5(z,this,b,c)},
+return new A.AC(z,this,b,c)},
 CZ:function(a,b,c){var z,y,x,w
 z={}
-y=J.Qe(b)
+y=J.NH(b)
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.yt.t(0,x)
+w=C.lyV.p(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-l5:{
-"^":"TpZ:12;a,b,c,d",
+AC:{
+"^":"r:14;Q,a,b,c",
 $1:[function(a){var z,y,x,w
-z=this.a
+z=this.Q
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
+if(y==null||!J.t(y).$iszs){x=this.a.h5(this.b)
 z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(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)
+y=x}if(!!J.t(y).$iszs){y=J.t(a)
+if(!!y.$isDG4){w=C.lG.gey(a)
+if(w==null)w=J.Tf(P.kW(a),"detail")}else w=null
+y=y.gAJ(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},
+J.bH(z,z,this.c,[a,w,y])}else throw H.b(P.s("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,4,"call"]},
 liz:{
-"^":"TpZ:190;a,b,c",
+"^":"r:190;Q,a,b",
 $3:[function(a,b,c){var z,y,x
-z=this.c
-y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
-x=this.a
-$.tNi().V7("addEventListener",[b,x.a,y])
+z=this.b
+y=P.mt(new A.kD($.X3.mS(this.a.Y2(null,b,z))))
+x=this.Q
+$.Op().Z("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,187,188,189,"call"],
-$isEH:true},
+return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,187,188,189,"call"]},
 kD:{
-"^":"TpZ:81;d",
-$2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
-$isEH:true},
-zIs:{
-"^":"Ap;ED,d9,dF,Xj",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
-xn:{
-"^":"iv;vn<",
-$isxn:true},
+"^":"r:80;Q",
+$2:[function(a,b){return this.Q.$1(b)},"$2",null,4,0,null,15,4,"call"]},
+d6:{
+"^":"Ap;Q,a,b,c",
+gM:function(a){return"{{ "+this.Q+" }}"},
+TR:function(a,b){return"{{ "+this.Q+" }}"},
+xO:function(a){$.Op().Z("removeEventListener",[this.a,this.b,this.c])}},
+A2:{
+"^":"iv;vn:Q<",
+$isA2:true},
 xc:{
-"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-XI:function(a){this.kR(a)},
+"^":"TR0;cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+XI:function(a){this.Yi(a)},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.GBL.LX(a)
-C.GBL.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ki.LX(a)
+C.Ki.XI(a)
 return a}}},
 jpR:{
-"^":"Bo+zs;Cp:n7=,KM:ZQ=",
+"^":"Bo+zs;Cp:r$=,KM:z$=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
 TR0:{
-"^":"jpR+Pi;",
+"^":"jpR+Piz;",
 $isd3:true},
 zs:{
-"^":"a;Cp:n7=,KM:ZQ=",
-gFL:function(a){return a.IX},
-gwX:function(a){return},
-gJQ:function(a){var z,y
-z=a.IX
+"^":"a;Cp:r$=,KM:z$=",
+gFL:function(a){return a.Q$},
+gZJ:function(a){return},
+gRT:function(a){var z,y
+z=a.Q$
 if(z!=null)return J.DA(z)
-y=this.gQg(a).dA.getAttribute("is")
+y=this.gQg(a).Q.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
-kR:function(a){var z,y
-z=this.gmb(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gJQ(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
+Yi:function(a){var z,y
+z=this.gCn(a)
+if(z!=null&&z.Q!=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.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.gJQ(a))
+y=this.gM0(a)
+if(!J.mG($.Tg().p(0,y),!0))this.Sx(a)},
+Ec:function(a){var z
+if(a.Q$!=null){window
+z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.XY(a)
-z=this.gJQ(a)
-a.IX=$.vu().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))
+return}a.r$=P.kW(a)
+z=this.gRT(a)
+a.Q$=$.RA().p(0,z)
+this.nt(a)
+z=a.e$
+if(z!=null)z.kv(z,this.gnu(a))
+if(a.Q$.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xL(a)
+this.kK(a)
 this.Uc(a)},
-rf:function(a){if(a.OD)return
-a.OD=!0
+Sx:function(a){if(a.f$)return
+a.f$=!0
 this.bT(a)
-this.Qs(a,a.IX)
+this.z2(a,a.Q$)
 this.gQg(a).Rz(0,"unresolved")
-$.lg().To(new A.pN(a))
+$.zG().To(new A.Eo(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.gJQ(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
+I9:["Kv",function(a){}],
+Es:["tZ",function(a){if(a.Q$==null)throw H.b(P.s("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))}},
-Lx:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+if(!a.x$){a.x$=!0
+this.rW(a,new A.hp(a))}}],
+dQ:["xD",function(a){this.x3(a)}],
+z2:function(a,b){if(b!=null){this.z2(a,b.gP1())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.XT(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).dA.getAttribute("name")
+y=z.Wk(b,"template")
+if(y!=null){x=this.TH(a,y)
+w=z.gQg(b).Q.getAttribute("name")
 if(w==null)return
-a.ZM.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.TL(a)
-M.Xi(b).cl(null)
-y=this.gwX(a)
-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)
+a.y$.q(0,w,x)}},
+TH:function(a,b){var z,y,x,w,v,u
+z=this.er(a)
+M.uH(b).Jh(null)
+y=this.gZJ(a)
+x=!!J.t(b).$ishs?b:M.uH(b)
+w=J.Km(x,a,y==null&&J.Ee(x)==null?J.vo(a.Q$):y)
+v=a.b$
+u=$.nR().p(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.Ff
-y.u(0,J.eS(x),x)}},
-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.gPH().aN(0,new A.Sv(a))},
-xL:function(a){if(a.IX.gtN()==null)return
+for(z=J.Vj(b,"[id]"),z=z.gu(z),y=a.z$;z.D();){x=z.c
+y.q(0,J.eS(x),x)}},
+aC:["Ud",function(a,b,c,d){var z=J.t(b)
+if(!z.m(b,"class")&&!z.m(b,"style"))this.D3(a,b,d)}],
+oR:function(a){a.Q$.gCY().aN(0,new A.WC(a))},
+kK:function(a){if(a.Q$.gDB()==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,$.VCp())===!0)return
+if(c==null||J.kE(c,$.iB())===!0)return
 y=J.RE(z)
 x=y.goc(z)
 w=$.cp().jD(a,x)
 v=y.gt5(z)
-x=J.x(v)
-u=Z.fd(c,w,(x.n(v,C.Vc)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+x=J.t(v)
+u=Z.Zh(c,w,(x.m(v,C.AP)||x.m(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gCg",4,0,191],
-B2:function(a,b){var z=a.IX.gtN()
+$.cp().Q1(a,y,u)}},"$2","gCg",4,0,191],
+B2:function(a,b){var z=a.Q$.gDB()
 if(z==null)return
-return z.t(0,b)},
+return z.p(0,b)},
 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)
+JY:function(a,b){var z,y
+z=L.hk(b).Tl(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).dA.setAttribute(b,y)
+if(y!=null)this.gQg(a).Q.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.IB(M.Xi(a),b,c,d)
+if(z==null)return J.FS1(M.uH(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.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()
+if(J.mG(J.Tf(J.Tf($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.C5(M.uH(a))==null){w=P.A(null,null)
+J.Rb(M.uH(a),w)}J.H9(J.C5(M.uH(a)),b,x)}v=a.Q$.gix()
 y=y.goc(z)
-u=$.Mg().xV.af.t(0,y)
-if(v!=null&&v.tg(0,u))this.QH(a,u)
+u=$.Mg().Q.e.p(0,y)
+if(v!=null&&v.tg(0,u))this.JY(a,u)
 return x}},
-lL:function(a){return this.rf(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))},
+x5:function(a){return this.Sx(a)},
+gCd:function(a){return J.C5(M.uH(a))},
+sCd:function(a,b){J.Rb(M.uH(a),b)},
+gCn:function(a){return J.OC(M.uH(a))},
 x3:function(a){var z,y
-if(a.bb===!0)return
-$.iX().J4(new A.N3(a))
-z=a.TT
-y=this.gyz(a)
+if(a.c$===!0)return
+$.UW().Ny(new A.rs(a))
+z=a.d$
+y=this.gJg(a)
 if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.TT=z},
-GBV:[function(a){if(a.bb===!0)return
+z.ui(0,y,null)
+a.d$=z},
+GB:[function(a){if(a.c$===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gyz",0,0,17],
+a.c$=!0},"$0","gJg",0,0,1],
 oW:function(a){var z
-if(a.bb===!0){$.iX().j2(new A.ti(a))
-return}$.iX().J4(new A.Rb(a))
-z=a.TT
-if(z!=null){z.nY(0)
-a.TT=null}},
-jM:function(a){var z,y,x,w,v
-z=J.eM(a.IX)
-if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.z7=[]
-a.MJ=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
+if(a.c$===!0){$.UW().j2(new A.TV(a))
+return}$.UW().Ny(new A.Z7(a))
+z=a.d$
+if(z!=null){z.TP(0)
+a.d$=null}},
+nt:function(a){var z,y,x,w,v
+z=J.ui(a.Q$)
+if(z!=null){y=new L.NV(null,!1,[],null,null,null,$.qF)
+y.b=[]
+a.e$=y
+a.b$.push(y)
+for(x=H.J(new P.fG(z),[H.u3(z,0)]),w=x.Q,x=H.J(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.D();){v=x.c
 y.WX(a,v)
-this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.eM(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,192],
+this.rJ(a,v,v.Tl(a),null)}}},
+l7:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.ui(a.Q$),P.Ca(null,null,null,null)))},"$3","gnu",6,0,192],
 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
-w=x.oc
-if(y.t(0,w)!=null)continue
-this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,193,185],
+for(z=J.Nx(b),y=a.ch$;z.D();){x=z.gk()
+if(!J.t(x).$isqI)continue
+w=x.a
+if(y.p(0,w)!=null)continue
+this.Dt(a,w,x.c,x.b)}},"$1","gLj",2,0,193,185],
 Dt:function(a,b,c,d){var z,y
-$.ek().To(new A.qW(a,b,c,d))
-z=$.Mg().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
-z=J.eM(a.IX)
+$.Is().To(new A.qW(a,b,c,d))
+z=$.Mg().Q.e.p(0,b)
+y=a.Q$.gix()
+if(y!=null&&y.tg(0,z))this.JY(a,z)},
+rJ:function(a,b,c,d){var z,y,x,w,v
+z=J.ui(a.Q$)
 if(z==null)return
-y=z.t(0,b)
+y=z.p(0,b)
 if(y==null)return
-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)
+if(!!J.t(d).$iswn){$.FX().Ny(new A.xf(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.t(c).$iswn){$.FX().Ny(new A.Y0(a,b))
+x=c.gXF().w3(new A.fS(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.Bd
-if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
-a.Bd=v}v.u(0,w,x)}},
+v=a.a$
+if(v==null){v=P.L5(null,null,null,P.I,P.yX)
+a.a$=v}v.q(0,w,x)}},
 hq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-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)))
+rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().Q.Q.p(0,b)
+if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.X(a)))
 y=z.$1(a)
-x=a.qJ.t(0,b)
+x=a.ch$.p(0,b)
 if(x==null){w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,y)
-v=new A.lK(a,b,c,null,null)
-v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
+if(w.gM(c)==null)w.sM(c,y)
+v=new A.BfZ(a,b,c,null,null)
+v.c=this.gqh(a).w3(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
-v.vP=w
-u=$.cp().xV.F8.t(0,b)
-if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
+v.d=w
+u=$.cp().Q.a.p(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.X(a)))
 u.$2(a,w)
-a.f4.push(v)
-return v}x.mn=c
+a.b$.push(v)
+return v}x.c=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
 if(d){s=t==null?y:t
-if(t==null?y!=null:t!==y){w.sP(c,s)
-t=s}}y=x.VB
-w=x.I6
-r=x.JQ
+if(t==null?y!=null:t!==y){w.sM(c,s)
+t=s}}y=x.a
+w=x.b
+r=x.Q
 q=J.RE(w)
-x.VB=q.ct(w,r,y,t)
+x.a=q.ct(w,r,y,t)
 q.hq(w,r,t,y)
 v=new A.p0(x)
-a.f4.push(v)
+a.b$.push(v)
 return v},
-hH:function(a,b,c){return this.hO(a,b,c,!1)},
-yO:function(a,b){var z=a.IX.gGl().t(0,b)
+wc:function(a,b,c){return this.rh(a,b,c,!1)},
+yO:function(a,b){var z=a.Q$.giz().p(0,b)
 if(z==null)return
-return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+return T.pw().$3$globals(T.EPS().$1(z),a,J.vo(a.Q$).a.b)},
 bT:function(a){var z,y,x,w,v,u,t,s
-z=a.IX.gGl()
-for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
+z=a.Q$.giz()
+for(v=J.Nx(J.q8(z)),u=a.ch$;v.D();){y=v.gk()
 try{x=this.yO(a,y)
-if(u.t(0,y)==null){t=new A.js(y,J.Vm(x),a,null)
+if(u.p(0,y)==null){t=new A.Zw(y,J.SW(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
+u.q(0,y,t)}this.wc(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)
+t="Failed to create computed property "+H.d(y)+" ("+H.d(J.Tf(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-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)
+for(z=a.b$,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+if(y!=null)J.xl(y)}a.b$=[]},
+Mx:function(a,b){var z=a.a$.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.Bd
+z=a.a$
 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.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().Cq(a,b,c)
-return}return this.hO(a,b,c,!0)},
-Uc:function(a){var z=a.IX.gmR()
+for(z=z.gUQ(z),z=H.J(new H.MH(null,J.Nx(z.Q),z.a),[H.u3(z,0),H.u3(z,1)]);z.D();){y=z.Q
+if(y!=null)y.Gv()}a.a$.V1(0)
+a.a$=null},
+Fy:function(a,b,c,d){var z=$.aQ()
+z.Ny(new A.aM(a,b,c))
+if(d){if(!!J.t(c).$isAp)z.j2(new A.aMY(a,b,c))
+$.cp().Q1(a,b,c)
+return}return this.rh(a,b,c,!0)},
+Uc:function(a){var z=a.Q$.gmR()
 if(z.gl0(z))return
-$.vo().J4(new A.SX(a,z))
+$.Uk().Ny(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
-ea:function(a,b,c,d){var z,y,x
-z=$.vo()
+ea:["jk",function(a,b,c,d){var z,y,x
+z=$.Uk()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.RI(c)
+if(!!J.t(c).$isEH){y=X.aA(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=$.Mg().xV.T4.t(0,c)
-$.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.J4(new A.cB(a,c))},
+C.Nm.sv(d,y)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.Mg().Q.f.p(0,c)
+$.cp().Ol(b,x,d,!0,null)}else z.j2("invalid callback")
+z.Ny(new A.cB(a,c))}],
 rW:function(a,b){var z
 P.rb(F.Jy())
-$.Kc().nQ("flush")
+$.uj().nQ("flush")
 z=window
-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.Ph(a,z)
+C.ol.y4(z)
+return C.ol.ne(z,W.Yt(b))},
+SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+this.H2(a,z)
 return z},
-ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
+ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
-pN:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+J.AG(this.a)+"]: ready"},"$0",null,0,0,null,"call"],
-$isEH:true},
+Eo:{
+"^":"r:77;Q",
+$0:[function(){return"["+J.Lz(this.Q)+"]: ready"},"$0",null,0,0,null,"call"]},
 hp:{
-"^":"TpZ:12;a",
-$1:[function(a){return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-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())
-z.t(0,a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return},"$1",null,2,0,null,15,"call"]},
+WC:{
+"^":"r:80;Q",
+$2:function(a,b){var z=J.Vs(this.Q)
+if(z.NZ(0,a)!==!0)z.q(0,a,new A.Te4(b).$0())
+z.p(0,a)}},
 Te4:{
-"^":"TpZ:76;b",
-$0:function(){return this.b},
-$isEH:true},
-N3:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
-ti:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
-Rb:{
-"^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.f9c(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return this.Q}},
+rs:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"]},
+TV:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"]},
+Z7:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"]},
 OaD:{
-"^":"TpZ:81;a,b,c,d,e,f",
+"^":"r:80;Q,a,b,c,d,e",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=J.UQ(x,2*a+1)
-v=this.e
+z=this.a
+y=J.Tf(z,a)
+x=this.c
+if(typeof a!=="number")return H.o(a)
+w=J.Tf(x,2*a+1)
+v=this.d
 if(v==null)return
-u=v.t(0,w)
+u=v.p(0,w)
 if(u==null)return
-for(v=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;v.G();){p=v.gl()
+for(v=J.Nx(u),t=this.Q,s=J.RE(t),r=this.b,q=this.e;v.D();){p=v.gk()
 if(!q.h(0,p))continue
-s.j6(t,w,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,59,"call"],
-$isEH:true},
+s.rJ(t,w,y,b)
+$.cp().Ol(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,61,"call"]},
 qW:{
-"^":"TpZ:76;a,b,c,d",
-$0:[function(){return"["+J.AG(this.a)+"]: "+H.d(this.b)+" changed from: "+H.d(this.d)+" to: "+H.d(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b,c",
+$0:[function(){return"["+J.Lz(this.Q)+"]: "+H.d(this.a)+" changed from: "+H.d(this.c)+" to: "+H.d(this.b)},"$0",null,0,0,null,"call"]},
 xf:{
-"^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] observeArrayValue: unregister "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 Y0:{
-"^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.f9c(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-kMK:{
-"^":"TpZ:12;e,f",
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] observeArrayValue: register "+H.d(this.a)},"$0",null,0,0,null,"call"]},
+fS:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
-$.cp().Ck(y,x,[a],!0,null)}},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+for(z=J.Nx(this.a),y=this.Q;z.D();){x=z.gk()
+$.cp().Ol(y,x,[a],!0,null)}},"$1",null,2,0,null,194,"call"]},
 aM:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.f9c(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return"bindProperty: ["+H.d(this.b)+"] to ["+H.d(J.RI(this.Q))+"].["+H.d(this.a)+"]"},"$0",null,0,0,null,"call"]},
 aMY:{
-"^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.f9c(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.Q))+"].["+H.d(this.a)+"], but found "+H.a5(this.b)+"."},"$0",null,0,0,null,"call"]},
 SX:{
-"^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] addHostListeners: "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 Jys:{
-"^":"TpZ:81;c",
-$2:function(a,b){var z=this.c
-$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){var z=this.Q
+$.Op().Z("addEventListener",[z,a,$.X3.mS(J.vo(z.Q$).Y2(z,z,b))])}},
 od:{
-"^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.f9c(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return">>> ["+H.d(J.RI(this.Q))+"]: dispatch "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 cB:{
-"^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.f9c(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lK:{
-"^":"Ap;I6,ko,q0,Sx,vP",
-z9N:[function(a){this.vP=a
-$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+"^":"r:77;Q,a",
+$0:[function(){return"<<< ["+H.d(J.RI(this.Q))+"]: dispatch "+H.d(this.a)},"$0",null,0,0,null,"call"]},
+BfZ:{
+"^":"Ap;Q,a,b,c,d",
+z9:[function(a){this.d=a
+$.cp().Q1(this.Q,this.a,a)},"$1","gew",2,0,20,62],
 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().xV.II.t(0,y)
-if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
+for(z=J.Nx(a),y=this.a;z.D();){x=z.gk()
+if(!!J.t(x).$isqI&&J.mG(x.a,y)){z=this.Q
+w=$.cp().Q.Q.p(0,y)
+if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.Lz(z)))
 v=w.$1(z)
-z=this.vP
-if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
+z=this.d
+if(z==null?v!=null:z!==v)J.Ja(this.b,v)
 return}}},"$1","gou",2,0,193,185],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.Fc(this.q0,b)
+TR:function(a,b){return J.mu(this.b,b)},
+gM:function(a){return J.SW(this.b)},
+sM:function(a,b){J.Ja(this.b,b)
 return b},
-xO:function(a){var z=this.Sx
+xO:function(a){var z=this.c
 if(z!=null){z.Gv()
-this.Sx=null}J.yd(this.q0)}},
+this.c=null}J.xl(this.b)}},
 p0:{
-"^":"Ap;pO",
+"^":"Ap;Q",
 TR:function(a,b){},
-gP:function(a){return},
-sP:function(a,b){},
+gM:function(a){return},
+sM:function(a,b){},
 fR:function(){},
 xO:function(a){var z,y
-z=this.pO
-y=z.mn
+z=this.Q
+y=z.c
 if(y==null)return
-J.yd(y)
-z.mn=null}},
+J.xl(y)
+z.c=null}},
 FT:{
-"^":"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.ole.Wq(z)
-this.lS=C.ole.rK(z,W.Yt(new A.K3(this)))},
-nY:function(a){var z,y
-z=this.lS
+"^":"a;Q,a,b",
+Dj:function(){return this.Q.$0()},
+ui:[function(a,b,c){var z
+this.TP(0)
+this.Q=b
+if(c==null){z=window
+C.ol.y4(z)
+this.b=C.ol.ne(z,W.Yt(new A.K3(this)))}else this.a=P.cH(c,this.gv6(this))},function(a,b){return this.ui(a,b,null)},"x0","$2","$1","gJ",2,2,195,23,42,196],
+TP:function(a){var z,y
+z=this.b
 if(z!=null){y=window
-C.ole.Wq(y)
+C.ol.y4(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.Ar
+this.b=null}z=this.a
 if(z!=null){z.Gv()
-this.Ar=null}}},
+this.a=null}},
+dS:[function(a){if(this.a!=null||this.b!=null){this.TP(0)
+this.Dj()}},"$0","gv6",0,0,1]},
 K3:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.Ar!=null||z.lS!=null){z.nY(0)
-z.Dj()}return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.a!=null||z.b!=null){z.TP(0)
+z.Dj()}return},"$1",null,2,0,null,15,"call"]},
 mS:{
-"^":"TpZ:76;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.X1($.MU,$.UG)},"$0",null,0,0,null,"call"]},
 XR:{
-"^":"TpZ:76;",
-$0:[function(){var z=$.j6().MM
-if(z.YM!==0)H.vh(P.w("Future already completed"))
-z.Xf(null)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return $.j6().dS(0)},"$0",null,0,0,null,"call"]},
 k2:{
-"^":"TpZ:197;a,b",
-$3:[function(a,b,c){var z=$.lQ().t(0,b)
-if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vu().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,195,58,196,"call"],
-$isEH:true},
-zR:{
-"^":"TpZ:76;c,d,e,f",
+"^":"r:199;Q,a",
+$3:[function(a,b,c){var z=$.lC().p(0,b)
+if(z!=null)return this.Q.Gr(new A.v4(a,b,z,$.RA().p(0,c)))
+return this.a.qP([b,c],a)},"$3",null,6,0,null,197,60,198,"call"]},
+v4:{
+"^":"r:77;Q,a,b,c",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=P.Fl(null,null)
-u=$.Ak()
-t=P.Fl(null,null)
-v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.vu().u(0,y,v)
+z=this.Q
+y=this.a
+x=this.b
+w=this.c
+v=P.A(null,null)
+u=$.Cl()
+t=P.A(null,null)
+v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.RA().q(0,y,v)
 v.Zw(w)
-s=v.Q7
-if(s!=null)v.tN=v.jq(s)
+s=v.d
+if(s!=null)v.e=v.jq(s)
 v.rH()
 v.I7()
-v.ut()
+v.hW()
 s=J.RE(z)
-r=s.XT(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
-v.ka()
+r=s.Wk(z,"template")
+if(r!=null)J.NA(!!J.t(r).$ishs?r:M.uH(r),u)
+v.fk()
 v.f6()
-v.yq()
-A.ZI(v.J3(v.ds("global"),"global"),document.head)
-v.Cw(z)
+v.OL()
+A.ZI(v.J3(v.kO("global"),"global"),document.head)
+v.RH(z)
 v.Vk()
 v.W3(t)
-q=s.gQg(z).dA.getAttribute("assetpath")
+q=s.gQg(z).Q.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gJ8(z).baseURI)
+p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
-o=z.Fi
-if(o.length!==0){if(z.Kk!=null){n=z.ku
+o=z.c
+if(o.length!==0){if(z.Q!=null){n=z.d
 m=z.gJf(z)
-l=z.QB!=null?z.gtp(z):null}else{n=""
+l=z.a!=null?z.gtp(z):null}else{n=""
 m=null
-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
+l=null}k=p.mE(z.b)
+j=z.e
+if(j!=null);else j=null}else{o=p.c
+if(z.Q!=null){n=z.d
 m=z.gJf(z)
-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
-if(u===""){k=p.Ee
-j=z.xu
-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.QB}}i=z.ys
+l=P.Ec(z.a!=null?z.gtp(z):null,o)
+k=p.mE(z.b)
+j=z.e
+if(j!=null);else j=null}else{u=z.b
+t=J.t(u)
+if(t.m(u,"")){k=p.b
+j=z.e
+if(j!=null);else j=p.e}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Kf(p.b,u))
+j=z.e
+if(j!=null);else j=null}n=p.d
+m=p.Q
+l=p.a}}i=z.f
 if(i!=null);else i=null
-v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
+v.dx=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.ec(z,y,w!=null?J.DA(w):null)
-if($.mX().n6(x,C.c86))$.cp().Ck(x,C.c86,[v],!1,null)
+A.YG(z,y,w!=null?J.DA(w):null)
+if($.II().n6(x,C.L9))$.cp().Ol(x,C.L9,[v],!1,null)
 v.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
+return},"$0",null,0,0,null,"call"]},
 Md:{
-"^":"TpZ:76;",
-$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},
+"^":"r:77;",
+$0:function(){var z=J.Tf(P.kW(document.createElement("polymer-element",null)),"__proto__")
+return!!J.t(z).$isKV?P.kW(z):z}},
 j0:{
-"^":"TpZ:12;a",
-$1:function(a){return J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return J.mG(J.Tf(this.Q.a,J.DA(a)),!0)}},
 j0N:{
-"^":"TpZ:12;a",
-$1:function(a){return!J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return!J.mG(J.Tf(this.Q.a,J.DA(a)),!0)}},
 MZ6:{
-"^":"TpZ:12;",
-$1:function(a){a.sOR(C.oOA)},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){a.sOR(C.oO)}},
 mqr:{
-"^":"TpZ:12;",
-$1:[function(a){P.FL(a)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-js:{
-"^":"a;JQ,VB,I6,mn",
-xz:[function(a){var z,y,x,w
-z=this.VB
-y=this.I6
-x=this.JQ
+"^":"r:14;",
+$1:[function(a){P.FL(a)},"$1",null,2,0,null,171,"call"]},
+yd:{
+"^":"r:201;Q",
+$1:[function(a){var z,y,x
+z=$.uj().Z("waitingFor",[null])
+y=J.U6(z)
+if(y.gl0(z)===!0){a.Gv()
+return}x=this.Q
+if(!J.mG(y.gv(z),x.a)){x.a=y.gv(z)
+return}if(J.mG(x.b,x.a))return
+x.b=x.a
+P.FL("No elements registered in a while, but still waiting on "+H.d(y.gv(z))+" elements to be registered. Check that you have a class with an @CustomTag annotation for each of the following tags: "+H.d(J.ZG(y.ez(z,new A.Vw()),", ")))},"$1",null,2,0,null,200,"call"]},
+Vw:{
+"^":"r:14;",
+$1:[function(a){return"'"+H.d(J.Vs(a).Q.getAttribute("name"))+"'"},"$1",null,2,0,null,4,"call"]},
+Zw:{
+"^":"a;Q,a,b,c",
+u3:[function(a){var z,y,x,w
+z=this.a
+y=this.b
+x=this.Q
 w=J.RE(y)
-this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"js")},60],
-gP:function(a){var z=this.mn
+this.a=w.ct(y,x,z,a)
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"Zw")},62],
+gM:function(a){var z=this.c
 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.xz(b)},
-bu:[function(a){var z,y
-z=$.Mg().xV.af.t(0,this.JQ)
-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,{
+return this.a},
+sM:function(a,b){var z=this.c
+if(z!=null)J.Ja(z,b)
+else this.u3(b)},
+X:[function(a){var z,y
+z=$.Mg().Q.e.p(0,this.Q)
+y=this.c==null?"(no-binding)":"(with-binding)"
+return"["+H.d(new H.cu(H.wO(this),null))+": "+J.Lz(this.b)+"."+H.d(z)+": "+H.d(this.a)+" "+y+"]"},"$0","gCR",0,0,77]}}],["","",,Y,{
 "^":"",
-hg:{
-"^":"Hq;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)},
-gA0:function(a){return J.qy(a.Hf)},
-sA0:function(a,b){J.D4(a.Hf,b)},
-V1:function(a){return J.U2(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)},
+G0:{
+"^":"Hq;kX,dx$,dy$,fr$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gk8:function(a){return J.ZH(a.kX)},
+gG5:function(a){return J.Ee(a.kX)},
+sG5:function(a,b){J.NA(a.kX,b)},
+V1:function(a){return J.U2(a.kX)},
+gZJ:function(a){return J.Ee(a.kX)},
+ZK:function(a,b,c){return J.Km(a.kX,b,c)},
+ea:function(a,b,c,d){return this.jk(a,b===a?J.ZH(a.kX):b,c,d)},
 dX:function(a){var z
-this.kR(a)
-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))},
+this.Yi(a)
+a.kX=M.uH(a)
+z=T.GF(null,C.qY)
+J.NA(a.kX,new Y.oM(a,z,null))
+$.j6().Q.ml(new Y.lkK(a))},
 $isDT:true,
-$isvy:true,
+$ishs: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Gkp.LX(a)
 C.Gkp.dX(a)
 return a}}},
-GLL:{
-"^":"OH+zs;Cp:n7=,KM:ZQ=",
+RP:{
+"^":"yY+zs;Cp:r$=,KM:z$=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
 Hq:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
+"^":"RP+d3;VE:dx$%,r9:dy$%,xt:fr$%",
 $isd3:true},
 lkK:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
 z.setAttribute("bind","")
-J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-Mrx:{
-"^":"TpZ:12;b",
+J.mI(z,new Y.dv(z))},"$1",null,2,0,null,15,"call"]},
+dv:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.b
+z=this.Q
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+y.ZB(z,"template-bound")},"$1",null,2,0,null,15,"call"]},
 oM:{
-"^":"Li;dq,Mn,oe",
-XB:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;b,a,Q",
+h5:function(a){return this.b}}}],["","",,Z,{
 "^":"",
-fd:function(a,b,c){var z,y,x
-z=$.h2().t(0,c)
+Zh:function(a,b,c){var z,y,x
+z=$.RO().p(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.iQ(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
+DO:{
+"^":"r:80;",
+$2:function(a,b){return a}},
 lP:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-wJY:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
-"^":"TpZ:81;",
+"^":"r:80;",
+$2:function(a,b){return a}},
+Uf:{
+"^":"r:80;",
 $2:function(a,b){var z,y
-try{z=P.zu(a)
+try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-W6o:{
-"^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-MdQ:{
-"^":"TpZ:81;",
-$2:function(a,b){return H.BU(a,null,new Z.pp(b))},
-$isEH:true},
-pp:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a},
-$isEH:true},
-YJG:{
-"^":"TpZ:81;",
-$2:function(a,b){return H.RR(a,new Z.fT(b))},
-$isEH:true},
+return b}}},
+Ra:{
+"^":"r:80;",
+$2:function(a,b){return!J.mG(a,"false")}},
+wJY:{
+"^":"r:80;",
+$2:function(a,b){return H.BU(a,null,new Z.fT(b))}},
 fT:{
-"^":"TpZ:12;b",
-$1:function(a){return this.b},
-$isEH:true}}],["","",,T,{
+"^":"r:14;Q",
+$1:function(a){return this.Q}},
+zOQ:{
+"^":"r:80;",
+$2:function(a,b){return H.RR(a,new Z.Lf(b))}},
+Lf:{
+"^":"r:14;Q",
+$1:function(a){return this.Q}}}],["","",,T,{
 "^":"",
-aW:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
+Rj:[function(a){var z=J.t(a)
+if(!!z.$isw)z=J.Vk(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","ey",2,0,52,66],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.ex(a)),";")
+return z},"$1","PG6",2,0,53,68],
+PX5:[function(a){var z=J.t(a)
+if(!!z.$isw)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Bn",2,0,52,66],
+return z},"$1","ey",2,0,53,68],
 IK:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
-$isEH:true},
-ex:{
-"^":"TpZ:12;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.mG(J.Tf(this.Q,a),!0)},"$1",null,2,0,null,202,"call"]},
+k9:{
+"^":"r:14;Q",
+$1:[function(a){return H.d(a)+": "+H.d(J.Tf(this.Q,a))},"$1",null,2,0,null,202,"call"]},
 QB:{
-"^":"vE;OH,nF,R3,SY,oe",
+"^":"VE;a,b,c,d,Q",
 op:function(a,b,c){var z,y,x
 z={}
-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)
+y=T.eHj(a,null).oK()
+if(M.CF(c)){x=J.t(b)
+x=x.m(b,"bind")||x.m(b,"repeat")}else x=!1
+if(x){z=J.t(y)
 if(!!z.$isDI)return new T.qb(this,y.gxG(),z.gkZ(y))
 else return new T.Xyb(this,y)}z.a=null
-x=!!J.x(c).$ish4
-if(x&&J.xC(b,"class"))z.a=T.ey()
-else if(x&&J.xC(b,"style"))z.a=T.Bn()
+x=!!J.t(c).$isz2
+if(x&&J.mG(b,"class"))z.a=T.PG6()
+else if(x&&J.mG(b,"style"))z.a=T.ey()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.SY.t(0,a)
-if(z==null)return new T.uKo(this,a)
-return new T.r6k(this,a,z)},
-jX:function(a){var z,y,x,w,v
+CE:function(a){var z=this.d.p(0,a)
+if(z==null)return new T.rc(this,a)
+return new T.uKo(this,a,z)},
+LR:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=z.gAd(a)
+y=z.gKV(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
+if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
 z=J.RE(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.jX(y)},
-fi:function(a,b){var z,y
-if(a==null)return K.xVr(b,this.nF)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isPF)return b
-y=this.R3
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gAd(a)!=null)return this.W5(z.gAd(a),b)
+w=z.gCn(x)
+v=w==null?z.gk8(x):w.Q
+if(!!J.t(v).$isPF)return v
+else return this.c.p(0,a)}return this.LR(y)},
+mH:function(a,b){var z,y
+if(a==null)return K.cT(b,this.b)
+z=J.t(a)
+if(!!z.$isz2);if(!!J.t(b).$isPF)return b
+y=this.c
+if(y.p(0,a)!=null){y.p(0,a)
+return y.p(0,a)}else if(z.gKV(a)!=null)return this.W5(z.gKV(a),b)
 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).$isvy?a:M.Xi(a)
+if(M.CF(a)){z=!!J.t(a).$ishs?a:M.uH(a)
 y=J.RE(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.xVr(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-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)
+if(y.gCn(z)==null)y.gk8(z)
+return this.c.p(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.c.p(0,a)
+return x!=null?x:K.cT(b,this.b)}else return this.W5(y.gKV(a),b)}},
+static:{"^":"rp3",GF:function(a,b){var z,y,x
+z=H.J(new P.nj(null),[K.PF])
+y=H.J(new P.nj(null),[P.I])
+x=P.L5(null,null,null,P.I,P.a)
 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.xVr(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]}},
+return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","EPS",2,0,69],mD:[function(a,b,c,d){var z=K.cT(b,c)
+return d?T.rD(a,z,null):new T.mY(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","pw",4,5,70,23,71]}},
 qb:{
-"^":"TpZ:198;b,c,d",
+"^":"r:203;Q,a,b",
 $3:[function(a,b,c){var z,y
-z=this.b
-z.SY.u(0,b,this.c)
-y=!!J.x(a).$isPF?a:K.xVr(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,187,188,189,"call"],
-$isEH:true},
+z=this.Q
+z.d.q(0,b,this.a)
+y=!!J.t(a).$isPF?a:K.cT(a,z.b)
+z.c.q(0,b,y)
+return new T.mY(y,null,this.b,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
 Xyb:{
-"^":"TpZ:198;e,f",
+"^":"r:203;Q,a",
 $3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isPF?a:K.xVr(a,z.nF)
-z.R3.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"],
-$isEH:true},
+z=this.Q
+y=!!J.t(a).$isPF?a:K.cT(a,z.b)
+z.c.q(0,b,y)
+if(c===!0)return T.rD(this.a,y,null)
+return new T.mY(y,null,this.a,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
 Ddj:{
-"^":"TpZ:198;a,UI,bK",
-$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,187,188,189,"call"],
-$isEH:true},
-uKo:{
-"^":"TpZ:12;a,b",
+"^":"r:203;Q,a,b",
+$3:[function(a,b,c){var z=this.a.mH(b,a)
+if(c===!0)return T.rD(this.b,z,this.Q.a)
+return new T.mY(z,this.Q.a,this.b,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
+rc:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.R3.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.xVr(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,187,"call"],
-$isEH:true},
-r6k:{
-"^":"TpZ:12;c,d,e",
+z=this.Q
+y=this.a
+x=z.c.p(0,y)
+if(x!=null){if(J.mG(a,J.ZH(x)))return x
+return K.cT(a,z.b)}else return z.mH(y,a)},"$1",null,2,0,null,187,"call"]},
+uKo:{
+"^":"r:14;Q,a,b",
 $1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.R3.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.jX(y).t1(w,a)},"$1",null,2,0,null,187,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
-Ko:function(a){return this.mo.$1(a)},
-AO:function(a){return this.qc.$1(a)},
+z=this.Q
+y=this.a
+x=z.c.p(0,y)
+w=this.b
+if(x!=null)return x.Ek(w,a)
+else return z.LR(y).Ek(w,a)},"$1",null,2,0,null,187,"call"]},
+mY:{
+"^":"Ap;Q,a,b,c,d,e,f",
+Ko:function(a){return this.a.$1(a)},
+AO:function(a){return this.c.$1(a)},
 Mr:[function(a,b){var z,y
-z=this.Ke
-y=this.mo==null?a:this.Ko(a)
-this.Ke=y
-if(b!==!0&&this.qc!=null&&!J.xC(z,y)){this.AO(this.Ke)
-return!0}return!1},function(a){return this.Mr(a,!1)},"Eu0","$2$skipChanges","$1","gGX",2,3,199,69,60,200],
-gP:function(a){if(this.qc!=null){this.kf(!0)
-return this.Ke}return T.rD(this.te,this.Hk,this.mo)},
-sP:function(a,b){var z,y,x,w
-try{K.jXm(this.te,b,this.Hk,!1)}catch(x){w=H.Ru(x)
+z=this.f
+y=this.a==null?a:this.Ko(a)
+this.f=y
+if(b!==!0&&this.c!=null&&!J.mG(z,y)){this.AO(this.f)
+return!0}return!1},function(a){return this.Mr(a,!1)},"hR","$2$skipChanges","$1","gGX",2,3,204,71,62,205],
+gM:function(a){if(this.c!=null){this.kf(!0)
+return this.f}return T.rD(this.b,this.Q,this.a)},
+sM:function(a,b){var z,y,x,w
+try{K.jXm(this.b,b,this.Q,!1)}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.te)+"': "+H.d(z),y)}},
+y=new H.XO(x,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0("Error evaluating expression '"+H.d(this.b)+"': "+H.d(z),y)}},
 TR:function(a,b){var z,y
-if(this.qc!=null)throw H.b(P.w("already open"))
-this.qc=b
-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
+if(this.c!=null)throw H.b(P.s("already open"))
+this.c=b
+z=J.ph(this.b,new K.Oy(P.NZ2(null,null)))
+this.e=z
+y=z.gE6().yI(this.gGX())
+y.fm(0,new T.yF(this))
+this.d=y
 this.kf(!0)
-return this.Ke},
-kf:function(a){var z,y,x,w,v
-try{x=this.uZ
-J.okV(x,new K.Edh(this.Hk,a))
-x.gBI()
-x=this.Mr(this.uZ.gBI(),a)
+return this.f},
+kf:function(a){var z,y,x,w
+try{x=this.e
+J.ph(x,new K.pf(this.Q,a))
+x.gLl()
+x=this.Mr(this.e.gLl(),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)
+y=new H.XO(w,null)
+x=new P.Gc(0,$.X3,null)
 x.$builtinTypeInfo=[null]
-new P.Zf(x).$builtinTypeInfo=[null]
-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)
+x=new P.Zf(x)
+x.$builtinTypeInfo=[null]
+x.w0("Error evaluating expression '"+H.d(this.e)+"': "+H.d(z),y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
-if(this.qc==null)return
-this.RQ.Gv()
-this.RQ=null
-this.qc=null
+if(this.c==null)return
+this.d.Gv()
+this.d=null
+this.c=null
 z=$.Pk()
-y=this.uZ
+y=this.e
 z.toString
-J.okV(y,z)
-this.uZ=null},
-fR:function(){if(this.qc!=null)this.Cm()},
-Cm:function(){var z=0
+J.ph(y,z)
+this.e=null},
+fR:function(){if(this.c!=null)this.Dy()},
+Dy:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
 static:{"^":"Hi1",rD:function(a,b,c){var z,y,x,w,v
-try{z=J.okV(a,new K.GQ(b))
+try{z=J.ph(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
+x=new H.XO(v,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[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.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,167,"call"],
-$isEH:true},
+"^":"r:80;Q",
+$2:[function(a,b){H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0("Error evaluating expression '"+H.d(this.Q.e)+"': "+H.d(a),b)},"$2",null,4,0,null,4,167,"call"]},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-LL:{
-"^":"xhq;vq>,Xq,Vg,fn",
-vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
+De:{
+"^":"xhq;vq:a>,Q,cy$,db$",
+vb:function(a,b){this.a.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
+static:{z4:function(a,b){var z=H.J(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
-"^":"TpZ;a,b",
-$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,"LL")}}}],["","",,K,{
+"^":"r;Q,a",
+$1:[function(a){var z=this.a
+z.Q=F.Wi(z,C.zd,z.Q,a)},"$1",null,2,0,null,97,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.a,"De")}}}],["","",,K,{
 "^":"",
 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=H.J([],[U.rN])
+for(;y=J.t(a),!!y.$isuku;){if(!J.mG(y.gxS(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
-v=!1}else if(!!y.$isvn){w=a.gZs()
+a=y.gBb(a)}if(!!y.$isfp){x=y.gM(a)
+w=C.HI
+v=!1}else if(!!y.$iszX){w=a.ghP()
 x=a.gmU()
-v=!0}else{if(!!y.$isx9){w=a.gZs()
-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))
+v=!0}else{if(!!y.$iszg){w=a.ghP()
+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.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.D();){u=y.c
+J.ph(u,new K.GQ(c))
+if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
+else return}t=J.ph(w,new K.GQ(c))
 if(t==null)return
-if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.Mg().xV.T4.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-xVr: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},
+if(v)J.H9(t,J.ph(x,new K.GQ(c)),b)
+else{y=$.Mg().Q.f.p(0,x)
+$.cp().Q1(t,y,b)}return b},
+cT:function(a,b){var z,y
+z=P.L5(null,null,null,P.I,P.a)
+z.FV(0,b)
+y=new K.Ph(new K.ug(a),z)
+if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+z=y
+return z},
+w10:{
+"^":"r:80;",
+$2:function(a,b){return J.WB(a,b)}},
+w11:{
+"^":"r:80;",
+$2:function(a,b){return J.D5(a,b)}},
+w12:{
+"^":"r:80;",
+$2:function(a,b){return J.lX(a,b)}},
 w13:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.WB(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.x4(a,b)}},
 w14:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.FWx(a,b)}},
 w15:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.mG(a,b)}},
 w16:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return!J.mG(a,b)}},
 w17:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.jOZ(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a==null?b==null:a===b}},
 w18:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a==null?b!=null:a!==b}},
 w19:{
-"^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.vU(a,b)}},
 w20:{
-"^":"TpZ:81;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.u6(a,b)}},
 w21:{
-"^":"TpZ:81;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.UN(a,b)}},
 w22:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xZ(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.W1(a,b)}},
 w23:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a===!0||b===!0}},
 w24:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a===!0&&b===!0}},
 w25:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w26:{
-"^":"TpZ:81;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w27:{
-"^":"TpZ:81;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w28:{
-"^":"TpZ:81;",
+"^":"r:80;",
 $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.zq("Filters must be a one-argument function."))},
-$isEH:true},
-w10:{
-"^":"TpZ:12;",
-$1:function(a){return a},
-$isEH:true},
-w11:{
-"^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
-$isEH:true},
-w12:{
-"^":"TpZ:12;",
-$1:function(a){return a!==!0},
-$isEH:true},
+throw H.b(K.du("Filters must be a one-argument function."))}},
+lPa:{
+"^":"r:14;",
+$1:function(a){return a}},
+Ufa:{
+"^":"r:14;",
+$1:function(a){return J.EFh(a)}},
+Raa:{
+"^":"r:14;",
+$1:function(a){return a!==!0}},
 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.zq("'this' cannot be used as a variable name."))
+q:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
+Ek:function(a,b){if(J.mG(a,"this"))H.vh(K.du("'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]}},
+$asueT:function(){return[P.I,P.a]}},
 ug:{
-"^":"PF;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.Mg().xV.T4.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+"^":"PF;k8:Q>",
+p:function(a,b){var z,y
+if(J.mG(b,"this"))return this.Q
+z=$.Mg().Q.f.p(0,b)
+y=this.Q
+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).$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]},
+return!!J.t(y).$iscb?B.z4(y,null):y},
+Eq:function(a){return!J.mG(a,"this")},
+X:[function(a){return"[model: "+H.d(this.Q)+"]"},"$0","gCR",0,0,0]},
 Rf:{
-"^":"PF;eT>,hI,P>",
-gk8:function(a){var z=this.eT
+"^":"PF;eT:Q>,a,M:b>",
+gk8:function(a){var z=this.Q
 z=z.gk8(z)
 return z},
-t:function(a,b){var z
-if(J.xC(this.hI,b)){z=this.P
-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]},
+p:function(a,b){var z
+if(J.mG(this.a,b)){z=this.b
+return!!J.t(z).$iscb?B.z4(z,null):z}return this.Q.p(0,b)},
+Eq:function(a){if(J.mG(this.a,a))return!1
+return this.Q.Eq(a)},
+X:[function(a){return this.Q.X(0)+" > [local: "+H.d(this.a)+"]"},"$0","gCR",0,0,0]},
 Ph:{
-"^":"PF;eT>,Z3<",
-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).$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: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
+"^":"PF;eT:Q>,Z3:a<",
+gk8:function(a){return this.Q.Q},
+p:function(a,b){var z=this.a
+if(z.NZ(0,b)){z=z.p(0,b)
+return!!J.t(z).$iscb?B.z4(z,null):z}return this.Q.p(0,b)},
+Eq:function(a){if(this.a.NZ(0,a))return!1
+return!J.mG(a,"this")},
+X:[function(a){var z=this.a
+return"[model: "+H.d(this.Q.Q)+"] > [global: "+H.d(H.J(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,0]},
 Ay0:{
-"^":"a;VO?,Xl<",
-gju:function(){var z=this.vO
-return H.VM(new P.Ln(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.Yo(a)},
-fs:function(){var z=this.tj
+"^":"a;Hg:a?,Xl:c<",
+gE6:function(){var z=this.d
+return H.J(new P.rk(z),[H.u3(z,0)])},
+gEV:function(){return this.Q},
+gLl:function(){return this.c},
+Lz:function(a){},
+BZ:function(a){var z
+this.Wn(0,a,!1)
+z=this.a
+if(z!=null)z.BZ(a)},
+fs:function(){var z=this.b
 if(z!=null){z.Gv()
-this.tj=null}},
-jK:function(a,b,c){var z,y,x
+this.b=null}},
+Wn:function(a,b,c){var z,y,x
 this.fs()
-z=this.Xl
-this.MN(b)
-if(!c){y=this.Xl
+z=this.c
+this.Lz(b)
+if(!c){y=this.c
 y=y==null?z!=null:y!==z}else y=!1
-if(y){y=this.vO
-x=this.Xl
-if(y.YM>=4)H.vh(y.Pq())
+if(y){y=this.d
+x=this.c
+if(y.b>=4)H.vh(y.Pq())
 y.MW(x)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$isrx:true},
-Edh:{
-"^":"cfS;ms,OQ",
-xn:function(a){a.jK(0,this.ms,this.OQ)}},
+X:[function(a){return this.Q.X(0)},"$0","gCR",0,0,0],
+$isrN:true},
+pf:{
+"^":"cfS;Q,a",
+xn:function(a){a.Wn(0,this.Q,this.a)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
 static:{"^":"jC"}},
 GQ:{
-"^":"P55;ms",
-W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.o2.RR(0,this)},
-Ci:function(a){var z,y,x
-z=J.okV(a.gZs(),this)
+"^":"P55;Q",
+W9:function(a){return J.ZH(this.Q)},
+Hs:function(a){return a.Q.RR(0,this)},
+T7:function(a){var z,y,x
+z=J.ph(a.ghP(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.Mg().xV.T4.t(0,y)
+x=$.Mg().Q.f.p(0,y)
 return $.cp().jD(z,x)},
-CU:function(a){var z=J.okV(a.gZs(),this)
+CU:function(a){var z=J.ph(a.ghP(),this)
 if(z==null)return
-return J.UQ(z,J.okV(a.gmU(),this))},
+return J.Tf(z,J.ph(a.gmU(),this))},
 Y7:function(a){var z,y,x,w,v
-z=J.okV(a.gZs(),this)
+z=J.ph(a.ghP(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 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=$.Mg().xV.T4.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-I6W:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
+y=H.J(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gbP(a)==null)return H.eC(z,y,P.Te(null))
+x=a.gbP(a)
+v=$.Mg().Q.f.p(0,x)
+return $.cp().Ol(z,v,y,!1,null)},
+I6:function(a){return a.gM(a)},
+Zh:function(a){return H.J(new H.A8(a.gMO(),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.Ff
-z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
+z=P.A(null,null)
+for(y=a.gJq(a),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=y.c
+z.q(0,J.ph(J.Kt(x),this),J.ph(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))},
+qv:function(a){return J.Tf(this.Q,a.gM(a))},
 ex:function(a){var z,y,x,w,v
 z=a.gxS(a)
-y=J.okV(a.gBb(a),this)
-x=J.okV(a.gT8(a),this)
-w=$.YP().t(0,z)
-v=J.x(z)
-if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
-return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
+y=J.ph(a.gBb(a),this)
+x=J.ph(a.gT8(a),this)
+w=$.RTI().p(0,z)
+v=J.t(z)
+if(v.m(z,"&&")||v.m(z,"||")){v=y==null?!1:y
+return w.$2(v,x==null?!1:x)}else if(v.m(z,"==")||v.m(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-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)
+Hx:function(a){var z,y
+z=J.ph(a.gO4(),this)
+y=$.fs().p(0,a.gxS(a))
+if(J.mG(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.geE(),this)},
-ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+RD:function(a){return J.mG(J.ph(a.gdc(),this),!0)?J.ph(a.gav(),this):J.ph(a.grM(),this)},
+MV: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.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)
+"^":"P55;Q",
+W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.Q.RR(0,this)},
+T7:function(a){var z,y
+z=J.ph(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(y)
+z.sHg(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.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z=J.ph(a.ghP(),this)
+y=J.ph(a.gmU(),this)
+x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(x)
+y.sHg(x)
 return x},
 Y7:function(a){var z,y,x,w,v
-z=J.okV(a.gZs(),this)
+z=J.ph(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 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.zD(v))
+y=H.J(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(v)
+if(y!=null)C.Nm.aN(y,new K.Wv(v))
 return v},
-I6W:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+I6:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
-y=new K.Gt(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+z=H.J(new H.A8(a.gMO(),this.gnG()),[null,null]).tt(0,!1)
+y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
+C.Nm.aN(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.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.Xs(y))
+z=H.J(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))
+C.Nm.aN(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
-z=J.okV(a.gnl(a),this)
-y=J.okV(a.gv4(),this)
+z=J.ph(a.gG3(a),this)
+y=J.ph(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z.sHg(x)
+y.sHg(x)
 return x},
-qv:function(a){return new K.Yw(a,null,null,null,P.bK(null,null,!1,null))},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
-z=J.okV(a.gBb(a),this)
-y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z=J.ph(a.gBb(a),this)
+y=J.ph(a.gT8(a),this)
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(x)
+y.sHg(x)
 return x},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
+Hx:function(a){var z,y
+z=J.ph(a.gO4(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(y)
+z.sHg(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.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)
+z=J.ph(a.gdc(),this)
+y=J.ph(a.gav(),this)
+x=J.ph(a.grM(),this)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(w)
+y.sHg(w)
+x.sHg(w)
 return w},
-ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+MV: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},
+Wv:{
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
 XV:{
-"^":"TpZ:12;a",
-$1:function(a){var z=this.a
-a.sVO(z)
-return z},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
 Xs:{
-"^":"TpZ:12;a",
-$1:function(a){var z=this.a
-a.sVO(z)
-return z},
-$isEH:true},
-Il:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=J.ZH(a)},
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
+WhS:{
+"^":"Ay0;Q,a,b,c,d",
+Lz:function(a){this.c=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.WH]},
-$isWH:true,
-$isrx:true},
+$asAy0:function(){return[U.EO]},
+$isEO:true,
+$isrN:true},
 z0:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-gP:function(a){var z=this.KL
-return z.gP(z)},
-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},
-Gt:{
-"^":"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)},
+"^":"Ay0;Q,a,b,c,d",
+gM:function(a){var z=this.Q
+return z.gM(z)},
+Lz:function(a){var z=this.Q
+this.c=z.gM(z)},
+RR:function(a,b){return b.I6(this)},
+$asAy0:function(){return[U.Dv]},
+$asDv:function(){return[null]},
+$isDv:true,
+$isrN:true},
+UF:{
+"^":"Ay0;MO:e<,Q,a,b,c,d",
+Lz:function(a){this.c=H.J(new H.A8(this.e,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$isrx:true},
+$asAy0:function(){return[U.Ej]},
+$isEj:true,
+$isrN:true},
 Hv:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
-$isEH:true},
-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())},
+"^":"r:14;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"]},
+ED:{
+"^":"Ay0;Jq:e>,Q,a,b,c,d",
+Lz:function(a){this.c=H.n3(this.e,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,
-$isrx:true},
+$isrN:true},
 Ku:{
-"^":"TpZ:81;",
-$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
-return a},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){J.H9(a,J.Kt(b).gXl(),b.gv4().gXl())
+return a}},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+"^":"Ay0;G3:e>,v4:f<,Q,a,b,c,d",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$isrx:true},
-Yw:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-gP:function(a){var z=this.KL
-return z.gP(z)},
-MN:function(a){var z,y,x,w
-z=this.KL
+$isrN:true},
+ek:{
+"^":"Ay0;Q,a,b,c,d",
+gM:function(a){var z=this.Q
+return z.gM(z)},
+Lz:function(a){var z,y,x,w
+z=this.Q
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
-if(!a.tc(z.gP(z)))return
+this.c=y.p(a,z.gM(z))
+if(!a.Eq(z.gM(z)))return
 x=y.gk8(a)
-y=J.x(x)
+y=J.t(x)
 if(!y.$isd3)return
-z=z.gP(z)
-w=$.Mg().xV.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+z=z.gM(z)
+w=$.Mg().Q.f.p(0,z)
+this.b=y.gqh(x).yI(new K.OCQ(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asAy0:function(){return[U.fp]},
 $isfp:true,
-$isrx:true},
-OC:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+$isrN:true},
+OCQ:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.GC(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
 mv:{
-"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
-gxS:function(a){var z=this.KL
+"^":"Ay0;O4:e<,Q,a,b,c,d",
+gxS:function(a){var z=this.Q
 return z.gxS(z)},
-MN:function(a){var z,y
-z=this.KL
-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,
-$isrx:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
-gxS:function(a){var z=this.KL
+Lz:function(a){var z,y
+z=this.Q
+y=$.fs().p(0,z.gxS(z))
+if(J.mG(z.gxS(z),"!")){z=this.e.gXl()
+this.c=y.$1(z==null?!1:z)}else{z=this.e
+this.c=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.Hx(this)},
+$asAy0:function(){return[U.In]},
+$isIn:true,
+$isrN:true},
+ky:{
+"^":"Ay0;Bb:e>,T8:f>,Q,a,b,c,d",
+gxS:function(a){var z=this.Q
 return z.gxS(z)},
-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.gXl()
+Lz:function(a){var z,y,x
+z=this.Q
+y=$.RTI().p(0,z.gxS(z))
+if(J.mG(z.gxS(z),"&&")||J.mG(z.gxS(z),"||")){z=this.e.gXl()
 if(z==null)z=!1
-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.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())}}},
+x=this.f.gXl()
+this.c=y.$2(z,x==null?!1:x)}else if(J.mG(z.gxS(z),"==")||J.mG(z.gxS(z),"!="))this.c=y.$2(this.e.gXl(),this.f.gXl())
+else{x=this.e
+if(x.gXl()==null||this.f.gXl()==null)this.c=null
+else{if(J.mG(z.gxS(z),"|")&&!!J.t(x.gXl()).$iswn)this.b=H.Go(x.gXl(),"$iswn").gXF().yI(new K.cw(this,a))
+this.c=y.$2(x.gXl(),this.f.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$isrx:true},
-P8:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-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()},
+$isrN:true},
+cw:{
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.BZ(this.a)},"$1",null,2,0,null,15,"call"]},
+an:{
+"^":"Ay0;dc:e<,av:f<,rM:r<,Q,a,b,c,d",
+Lz:function(a){var z=this.e.gXl()
+this.c=(z==null?!1:z)===!0?this.f.gXl():this.r.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.x06]},
-$isx06:true,
-$isrx:true},
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
+$isrN:true},
 vl:{
-"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
-goc:function(a){var z=this.KL
+"^":"Ay0;hP:e<,Q,a,b,c,d",
+goc:function(a){var z=this.Q
 return z.goc(z)},
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
-return}y=this.KL
+Lz:function(a){var z,y,x
+z=this.e.gXl()
+if(z==null){this.c=null
+return}y=this.Q
 y=y.goc(y)
-x=$.Mg().xV.T4.t(0,y)
-this.Xl=$.cp().jD(z,x)
-y=J.x(z)
-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,
-$isrx:true},
-Vw:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+x=$.Mg().Q.f.p(0,y)
+this.c=$.cp().jD(z,x)
+y=J.t(z)
+if(!!y.$isd3)this.b=y.gqh(z).yI(new K.e9n(this,a,x))},
+RR:function(a,b){return b.T7(this)},
+$asAy0:function(){return[U.zg]},
+$iszg:true,
+$isrN:true},
+e9n:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.WKb(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
-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()
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
+iT:{
+"^":"Ay0;hP:e<,mU:f<,Q,a,b,c,d",
+Lz:function(a){var z,y,x
+z=this.e.gXl()
+if(z==null){this.c=null
+return}y=this.f.gXl()
 x=J.U6(z)
-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))},
+this.c=x.p(z,y)
+if(!!x.$iswn)this.b=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.b=x.gqh(z).yI(new K.oD(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.vn]},
-$isvn:true,
-$isrx:true},
+$asAy0:function(){return[U.zX]},
+$iszX:true,
+$isrN:true},
 tE:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.eyp(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
-eyp:{
-"^":"TpZ:12;d",
-$1:[function(a){return a.aa(this.d)},"$1",null,2,0,null,85,"call"],
-$isEH:true},
-jai:{
-"^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.GST(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.GST(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 GST:{
-"^":"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,Xl,vO",
-gnK:function(a){var z=this.KL
-return z.gnK(z)},
-MN:function(a){var z,y,x,w
-z=this.re
+"^":"r:14;Q",
+$1:[function(a){return a.vP(this.Q)},"$1",null,2,0,null,85,"call"]},
+oD:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.zw(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
+zw:{
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isya&&J.mG(a.Q,this.Q)},"$1",null,2,0,null,85,"call"]},
+xJ:{
+"^":"Ay0;hP:e<,re:f<,Q,a,b,c,d",
+gbP:function(a){var z=this.Q
+return z.gbP(z)},
+Lz:function(a){var z,y,x,w
+z=this.f
 z.toString
-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.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
-w=$.Mg().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.BGc(this,a,w))}},
+y=H.J(new H.A8(z,new K.BGc()),[null,null]).br(0)
+x=this.e.gXl()
+if(x==null){this.c=null
+return}z=this.Q
+if(z.gbP(z)==null){z=H.eC(x,y,P.Te(null))
+this.c=!!J.t(z).$iscb?B.z4(z,null):z}else{z=z.gbP(z)
+w=$.Mg().Q.f.p(0,z)
+this.c=$.cp().Ol(x,w,y,!1,null)
+z=J.t(x)
+if(!!z.$isd3)this.b=z.gqh(x).yI(new K.WWJ(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$isrx:true},
-vQ:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
-$isEH:true},
+$isrN:true},
 BGc:{
-"^":"TpZ:201;a,b,c",
-$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,52,"call"]},
+WWJ:{
+"^":"r:206;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.ho(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
 B03:{
-"^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{zq:function(a){return new K.B03(a)}}}}],["","",,U,{
+"^":"a;G1:Q>",
+X:[function(a){return"EvalException: "+this.Q},"$0","gCR",0,0,0],
+static:{du:function(a){return new K.B03(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17896,428 +17274,388 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.xC(y,b[z]))return!1}return!0},
+if(!J.mG(y,b[z]))return!1}return!0},
 N4:function(a){a.toString
-return U.Le(H.n3(a,0,new U.lc()))},
+return U.Le(H.n3(a,0,new U.jf()))},
 C0C:function(a,b){var z=J.WB(a,b)
-if(typeof z!=="number")return H.s(z)
+if(typeof z!=="number")return H.o(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Le:function(a){if(typeof a!=="number")return H.s(a)
+Le:function(a){if(typeof a!=="number")return H.o(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,202,2,49]},
-rx:{
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,207,4,52]},
+rN:{
 "^":"a;",
-$isrx:true},
-WH:{
-"^":"rx;",
+$isrN:true},
+EO:{
+"^":"rN;",
 RR:function(a,b){return b.W9(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
+$isEO:true},
+Dv:{
+"^":"rN;M:Q>",
+RR:function(a,b){return b.I6(this)},
+X:[function(a){var z=this.Q
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-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)},
-$isnoG:true},
-c0:{
-"^":"rx;Bx<",
+z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+return z&&J.mG(J.SW(b),this.Q)},
+giO:function(a){return J.v1(this.Q)},
+$isDv:true},
+Ej:{
+"^":"rN;MO:Q<",
 RR:function(a,b){return b.Zh(this)},
-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).$isc0&&U.Pu(b.gBx(),this.Bx)},
-giO:function(a){return U.N4(this.Bx)},
-$isc0:true},
+X:[function(a){return H.d(this.Q)},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isEj&&U.Pu(b.gMO(),this.Q)},
+giO:function(a){return U.N4(this.Q)},
+$isEj:true},
 Mm:{
-"^":"rx;Jq>",
+"^":"rN;Jq:Q>",
 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
+X:[function(a){return"{"+H.d(this.Q)+"}"},"$0","gCR",0,0,0],
+m: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.N4(this.Jq)},
+z=J.t(b)
+return!!z.$isMm&&U.Pu(z.gJq(b),this.Q)},
+giO:function(a){return U.N4(this.Q)},
 $isMm:true},
 nu:{
-"^":"rx;nl>,v4<",
+"^":"rN;G3:Q>,v4:a<",
 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
+X:[function(a){return this.Q.X(0)+": "+H.d(this.a)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isnu&&J.xC(z.gnl(b),this.nl)&&J.xC(b.gv4(),this.v4)},
+z=J.t(b)
+return!!z.$isnu&&J.mG(z.gG3(b),this.Q)&&J.mG(b.gv4(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.nl.P)
-y=J.v1(this.v4)
+z=J.v1(this.Q.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"rx;o2",
+"^":"rN;Q",
 RR:function(a,b){return b.Hs(this)},
-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.o2,this.o2)},
-giO:function(a){return J.v1(this.o2)},
+X:[function(a){return"("+H.d(this.Q)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isXC&&J.mG(b.Q,this.Q)},
+giO:function(a){return J.v1(this.Q)},
 $isXC:true},
 fp:{
-"^":"rx;P>",
+"^":"rN;M:Q>",
 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
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
-giO:function(a){return J.v1(this.P)},
+z=J.t(b)
+return!!z.$isfp&&J.mG(z.gM(b),this.Q)},
+giO:function(a){return J.v1(this.Q)},
 $isfp:true},
-FH:{
-"^":"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
+In:{
+"^":"rN;xS:Q>,O4:a<",
+RR:function(a,b){return b.Hx(this)},
+X:[function(a){return H.d(this.Q)+" "+H.d(this.a)},"$0","gCR",0,0,0],
+m: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.go2(),this.o2)},
+z=J.t(b)
+return!!z.$isIn&&J.mG(z.gxS(b),this.Q)&&J.mG(b.gO4(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.xS)
-y=J.v1(this.o2)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isFH:true},
+$isIn:true},
 uku:{
-"^":"rx;xS>,Bb>,T8>",
+"^":"rN;xS:Q>,Bb:a>,T8:b>",
 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
+X:[function(a){return"("+H.d(this.a)+" "+H.d(this.Q)+" "+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+z=J.t(b)
+return!!z.$isuku&&J.mG(z.gxS(b),this.Q)&&J.mG(z.gBb(b),this.a)&&J.mG(z.gT8(b),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.xS)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=J.v1(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-x06:{
-"^":"rx;dc<,av<,eE<",
+Dc:{
+"^":"rN;dc:Q<,av:a<,rM:b<",
 RR:function(a,b){return b.RD(this)},
-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.geE(),this.eE)},
+X:[function(a){return"("+H.d(this.Q)+" ? "+H.d(this.a)+" : "+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isDc&&J.mG(b.gdc(),this.Q)&&J.mG(b.gav(),this.a)&&J.mG(b.grM(),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.dc)
-y=J.v1(this.av)
-x=J.v1(this.eE)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=J.v1(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isx06:true},
+$isDc:true},
 X7S:{
-"^":"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},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
+"^":"rN;Bb:Q>,T8:a>",
+RR:function(a,b){return b.MV(this)},
+gxG:function(){var z=this.Q
+return z.gM(z)},
+gkZ:function(a){return this.a},
+X:[function(a){return"("+H.d(this.Q)+" in "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isX7S&&b.Q.m(0,this.Q)&&J.mG(b.a,this.a)},
 giO:function(a){var z,y
-z=this.Bb
+z=this.Q
 z=z.giO(z)
-y=J.v1(this.T8)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-va:{
-"^":"rx;Bb>,T8>",
+NM:{
+"^":"rN;Bb:Q>,T8:a>",
 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).$isva&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+gxG:function(){var z=this.a
+return z.gM(z)},
+gkZ:function(a){return this.Q},
+X:[function(a){return"("+H.d(this.Q)+" as "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isNM&&J.mG(b.Q,this.Q)&&b.a.m(0,this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
+z=J.v1(this.Q)
+y=this.a
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isva:true,
+$isNM:true,
 $isDI:true},
-vn:{
-"^":"rx;Zs<,mU<",
+zX:{
+"^":"rN;hP:Q<,mU:a<",
 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
-return!!J.x(b).$isvn&&J.xC(b.gZs(),this.Zs)&&J.xC(b.gmU(),this.mU)},
+X:[function(a){return H.d(this.Q)+"["+H.d(this.a)+"]"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$iszX&&J.mG(b.ghP(),this.Q)&&J.mG(b.gmU(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Zs)
-y=J.v1(this.mU)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isvn:true},
-x9:{
-"^":"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
+$iszX:true},
+zg:{
+"^":"rN;hP:Q<,oc:a>",
+RR:function(a,b){return b.T7(this)},
+X:[function(a){return H.d(this.Q)+"."+H.d(this.a)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gZs(),this.Zs)&&J.xC(z.goc(b),this.oc)},
+z=J.t(b)
+return!!z.$iszg&&J.mG(b.ghP(),this.Q)&&J.mG(z.goc(b),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Zs)
-y=J.v1(this.oc)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
+$iszg:true},
 RWc:{
-"^":"rx;Zs<,nK>,re<",
+"^":"rN;hP:Q<,bP:a>,re:b<",
 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
+X:[function(a){return H.d(this.Q)+"."+H.d(this.a)+"("+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isRWc&&J.xC(b.gZs(),this.Zs)&&J.xC(z.gnK(b),this.nK)&&U.Pu(b.gre(),this.re)},
+z=J.t(b)
+return!!z.$isRWc&&J.mG(b.ghP(),this.Q)&&J.mG(z.gbP(b),this.a)&&U.Pu(b.gre(),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.Zs)
-y=J.v1(this.nK)
-x=U.N4(this.re)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=U.N4(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
-lc:{
-"^":"TpZ:81;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["","",,T,{
+jf:{
+"^":"r:80;",
+$2:function(a,b){return U.C0C(a,J.v1(b))}}}],["","",,T,{
 "^":"",
-FX:{
-"^":"a;Wi,f7,JR,V6",
-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)])
+X5:{
+"^":"a;Q,a,b,c",
+gQN:function(){return this.c.c},
+oK:function(){var z=this.a.zl()
+this.b=z
+this.c=H.J(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.Ff
-z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.Ff
-z=z==null||!J.xC(J.Vm(z),b)}else z=!1
+return this.Kk()},
+It:function(a,b){var z
+if(a!=null){z=this.c.c
+z=z==null||!J.mG(J.Iz(z),a)}else z=!1
+if(!z)if(b!=null){z=this.c.c
+z=z==null||!J.mG(J.SW(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)},
-HM:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.Ff==null){this.Wi.toString
-return C.x4}var z=this.ZR()
+if(z)throw H.b(Y.RV4("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQN())))
+this.c.D()},
+jz:function(){return this.It(null,null)},
+Bw:function(a){return this.It(a,null)},
+Kk:function(){if(this.c.c==null)return C.HI
+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"))
+Ay:function(a,b){var z,y,x
+for(;z=this.c.c,z!=null;)if(J.mG(J.Iz(z),9))if(J.mG(J.SW(this.c.c),"("))a=new U.RWc(a,null,this.Hr())
+else if(J.mG(J.SW(this.c.c),"["))a=new U.zX(a,this.FD())
+else break
+else if(J.mG(J.Iz(this.c.c),3)){this.jz()
+a=this.Ju(a,this.ZR())}else if(J.mG(J.Iz(this.c.c),10))if(J.mG(J.SW(this.c.c),"in")){if(!J.t(a).$isfp)H.vh(Y.RV4("in... statements must start with an identifier"))
 this.jz()
-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)
+a=new U.X7S(a,this.Kk())}else if(J.mG(J.SW(this.c.c),"as")){this.jz()
+y=this.Kk()
+if(!J.t(y).$isfp)H.vh(Y.RV4("'as' statements must end with an identifier"))
+a=new U.NM(a,y)}else break
+else{if(J.mG(J.Iz(this.c.c),8)){z=this.c.c.gG8()
+if(typeof z!=="number")return z.C()
+if(typeof b!=="number")return H.o(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
-v=this.VK()
-this.HM(5)
-u=this.VK()
-this.Wi.toString
-a=new U.x06(a,v,u)}else a=this.Ax(a)
+if(z)if(J.mG(J.SW(this.c.c),"?")){this.It(8,"?")
+x=this.Kk()
+this.Bw(5)
+a=new U.Dc(a,x,this.Kk())}else a=this.Vg(a)
 else break}return a},
-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.Ff
+Ju:function(a,b){var z=J.t(b)
+if(!!z.$isfp)return new U.zg(a,z.gM(b))
+else if(!!z.$isRWc&&!!J.t(b.ghP()).$isfp)return new U.RWc(a,J.SW(b.ghP()),b.gre())
+else throw H.b(Y.RV4("expected identifier: "+H.d(b)))},
+Vg:function(a){var z,y,x,w,v
+z=this.c.c
 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))))
+if(!C.Nm.tg(C.fW,y.gM(z)))throw H.b(Y.RV4("unknown operator: "+H.d(y.gM(z))))
 this.jz()
 x=this.ZR()
-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()
+while(!0){w=this.c.c
+if(w!=null)if(J.mG(J.Iz(w),8)||J.mG(J.Iz(this.c.c),3)||J.mG(J.Iz(this.c.c),9)){w=this.c.c.gG8()
 v=z.gG8()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
+if(typeof w!=="number")return w.A()
+if(typeof v!=="number")return H.o(v)
 v=w>v
 w=v}else w=!1
 else w=!1
 if(!w)break
-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.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)
+x=this.Ay(x,this.c.c.gG8())}return new U.uku(y.gM(z),a,x)},
+ZR:function(){var z,y
+if(J.mG(J.Iz(this.c.c),8)){z=J.SW(this.c.c)
+y=J.t(z)
+if(y.m(z,"+")||y.m(z,"-")){this.jz()
+if(J.mG(J.Iz(this.c.c),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.SW(this.c.c)),null,null))
 z.$builtinTypeInfo=[null]
 this.jz()
-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)
+return z}else if(J.mG(J.Iz(this.c.c),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.SW(this.c.c)),null))
 z.$builtinTypeInfo=[null]
 this.jz()
-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.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()
+return z}else return new U.In(z,this.Ay(this.ar(),11))}else if(y.m(z,"!")){this.jz()
+return new U.In(z,this.Ay(this.ar(),11))}else throw H.b(Y.RV4("unexpected token: "+H.d(z)))}return this.ar()},
+ar:function(){var z,y
+switch(J.Iz(this.c.c)){case 10:z=J.SW(this.c.c)
+if(J.mG(z,"this")){this.jz()
+return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV4("unexpected keyword: "+H.d(z)))
+throw H.b(Y.RV4("unrecognized keyword: "+H.d(z)))
+case 2:return this.xh()
+case 1:return this.Gz()
+case 6:return this.Dp()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
-y=this.VK()
-this.Jn(9,")")
-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()
+case 9:if(J.mG(J.SW(this.c.c),"(")){this.jz()
+y=this.Kk()
+this.It(9,")")
+return new U.XC(y)}else if(J.mG(J.SW(this.c.c),"{"))return this.Hz()
+else if(J.mG(J.SW(this.c.c),"["))return this.U3()
 return
-case 5:throw H.b(Y.RV("unexpected token \":\""))
+case 5:throw H.b(Y.RV4("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
-z.push(this.VK())
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
-this.Jn(9,"]")
-return new U.c0(z)},
-hR:function(){var z,y,x
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),"]"))break
+z.push(this.Kk())
+y=this.c.c}while(y!=null&&J.mG(J.SW(y),","))
+this.It(9,"]")
+return new U.Ej(z)},
+Hz:function(){var z,y,x
 z=[]
 do{this.jz()
-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]
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),"}"))break
+y=new U.Dv(J.SW(this.c.c))
+y.$builtinTypeInfo=[null]
 this.jz()
-this.Jn(5,":")
-z.push(new U.nu(x,this.VK()))
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
-this.Jn(9,"}")
+this.It(5,":")
+z.push(new U.nu(y,this.Kk()))
+x=this.c.c}while(x!=null&&J.mG(J.SW(x),","))
+this.It(9,"}")
 return new U.Mm(z)},
-Yj:function(){var z,y,x
-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)
+xh:function(){var z,y,x
+if(J.mG(J.SW(this.c.c),"true")){this.jz()
+return H.J(new U.Dv(!0),[null])}if(J.mG(J.SW(this.c.c),"false")){this.jz()
+return H.J(new U.Dv(!1),[null])}if(J.mG(J.SW(this.c.c),"null")){this.jz()
+return H.J(new U.Dv(null),[null])}if(!J.mG(J.Iz(this.c.c),2))H.vh(Y.RV4("expected identifier: "+H.d(this.gQN())+".value"))
+z=J.SW(this.c.c)
 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.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+z=this.c.c
+if(z!=null&&J.mG(J.Iz(z),9)&&J.mG(J.SW(this.c.c),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
-y.push(this.VK())
-z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
-this.Jn(9,")")
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),")"))break
+y.push(this.Kk())
+z=this.c.c}while(z!=null&&J.mG(J.SW(z),","))
+this.It(9,")")
 return y}return},
-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,"]")
+FD:function(){var z,y
+z=this.c.c
+if(z!=null&&J.mG(J.Iz(z),9)&&J.mG(J.SW(this.c.c),"[")){this.jz()
+y=this.Kk()
+this.It(9,"]")
 return y}return},
-Dy:function(){var z,y
-z=J.Vm(this.V6.Ff)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+Gz:function(){var z=H.J(new U.Dv(J.SW(this.c.c)),[null])
 this.jz()
-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])
+return z},
+ldL:function(a){var z=H.J(new U.Dv(H.BU(H.d(a)+H.d(J.SW(this.c.c)),null,null)),[null])
 this.jz()
-return y},
-c9:function(){return this.Rb("")},
-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])
+return z},
+Dp:function(){return this.ldL("")},
+JL:function(a){var z=H.J(new U.Dv(H.RR(H.d(a)+H.d(J.SW(this.c.c)),null)),[null])
 this.jz()
-return y},
-eD:function(){return this.XO("")},
-static:{OD:function(a,b){var z,y,x
-z=H.VM([],[Y.qS])
+return z},
+eD:function(){return this.JL("")},
+static:{eHj:function(a,b){var z,y,x
+z=H.J([],[Y.PnY])
 y=P.p9("")
 x=new U.Fs()
-return new T.FX(x,new Y.dd(z,y,new P.ysG(a,0,0,null),null),null,null)}}}}],["","",,K,{
+return new T.X5(x,new Y.dd(z,y,new P.Kg(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],
-Aep:{
-"^":"a;vH>,P>",
-n:function(a,b){if(b==null)return!1
-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],
-$isAep:true},
+Dce:[function(a){return H.J(new K.Bt(a),[null])},"$1","HZg",2,0,72,73],
+O1:{
+"^":"a;vH:Q>,M:a>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isO1&&J.mG(b.Q,this.Q)&&J.mG(b.a,this.a)},
+giO:function(a){return J.v1(this.a)},
+X:[function(a){return"("+H.d(this.Q)+", "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+$isO1:true},
 Bt:{
-"^":"mW;FD",
-gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
+"^":"mW;Q",
+gu:function(a){var z=new K.vR(J.Nx(this.Q),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-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))
+gv:function(a){return J.wS(this.Q)},
+gl0:function(a){return J.FN(this.Q)},
+gtH:function(a){var z=new K.O1(0,J.bP(this.Q))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.FD
+z=this.Q
 y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.O1(J.D5(y.gv(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
+$asmW:function(a){return[[K.O1,a]]},
+$asQV:function(a){return[[K.O1,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.Aep(this.vk++,z.gl()),[null])
-return!0}this.Uh=null
+"^":"Anv;Q,a,b",
+gk:function(){return this.b},
+D:function(){var z=this.Q
+if(z.D()){this.b=H.J(new K.O1(this.a++,z.gk()),[null])
+return!0}this.b=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
 "^":"",
 Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -18325,376 +17663,376 @@
 case 116:return 9
 case 118:return 11
 default:return a}},
-qS:{
-"^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
-$isqS:true},
+PnY:{
+"^":"a;fY:Q>,M:a>,G8:b<",
+X:[function(a){return"("+this.Q+", '"+H.d(this.a)+"')"},"$0","gCR",0,0,0],
+$isPnY:true},
 dd:{
-"^":"a;Bv,Lz,LP,pV",
+"^":"a;Q,a,b,c",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.LP
-this.pV=z.G()?z.ft:null
-for(y=this.Bv;x=this.pV,x!=null;)if(x===32||x===9||x===160)this.pV=z.G()?z.ft:null
+z=this.b
+this.c=z.D()?z.c:null
+for(y=this.Q;x=this.c,x!=null;)if(x===32||x===9||x===160)this.c=z.D()?z.c:null
 else if(x===34||x===39)this.DS()
-else{if(typeof x!=="number")return H.s(x)
+else{if(typeof x!=="number")return H.o(x)
 if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
 else w=!0
 if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.ft:null
-this.pV=x
-if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.e1()
-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.eT([v,x])
-if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
-this.pV=x
+else if(x===46){x=z.D()?z.c:null
+this.c=x
+if(typeof x!=="number")return H.o(x)
+if(48<=x&&x<=57)this.L8()
+else y.push(new Y.PnY(3,".",11))}else if(x===44){this.c=z.D()?z.c:null
+y.push(new Y.PnY(4,",",0))}else if(x===58){this.c=z.D()?z.c:null
+y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.c
+x=z.D()?z.c:null
+this.c=x
+if(C.Nm.tg(C.bg,x)){u=P.Qe([v,this.c],0,null)
+if(C.Nm.tg(C.ip,u)){x=z.D()?z.c:null
+this.c=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.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},
+this.c=z.D()?z.c:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.PnY(8,t,C.w0.p(0,t)))}else if(C.Nm.tg(C.ML,this.c)){s=H.mx(this.c)
+y.push(new Y.PnY(9,s,C.w0.p(0,s)))
+this.c=z.D()?z.c:null}else this.c=z.D()?z.c:null}return y},
 DS:function(){var z,y,x,w
-z=this.pV
-y=this.LP
-x=y.G()?y.ft:null
-this.pV=x
-for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.ft:null
-this.pV=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
+z=this.c
+y=this.b
+x=y.D()?y.c:null
+this.c=x
+for(w=this.a;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV4("unterminated string"))
+if(x===92){x=y.D()?y.c:null
+this.c=x
+if(x==null)throw H.b(Y.RV4("unterminated string"))
 x=H.mx(Y.Ox(x))
-w.IN+=x}else{x=H.mx(x)
-w.IN+=x}x=y.G()?y.ft:null
-this.pV=x}this.Bv.push(new Y.qS(1,w.IN,0))
-w.IN=""
-this.pV=y.G()?y.ft:null},
+w.Q+=x}else{x=H.mx(x)
+w.Q+=x}x=y.D()?y.c:null
+this.c=x}x=w.Q
+this.Q.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
+w.Q=""
+this.c=y.D()?y.c:null},
 y3:function(){var z,y,x,w,v
-z=this.LP
-y=this.Lz
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+z=this.b
+y=this.a
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
 else w=!0
 else w=!0}else w=!1
 if(!w)break
 x=H.mx(x)
-y.IN+=x
-this.pV=z.G()?z.ft:null}v=y.IN
-z=this.Bv
-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=""},
+y.Q+=x
+this.c=z.D()?z.c:null}z=y.Q
+v=z.charCodeAt(0)==0?z:z
+z=this.Q
+if(C.Nm.tg(C.oP,v))z.push(new Y.PnY(10,v,0))
+else z.push(new Y.PnY(2,v,0))
+y.Q=""},
 jj:function(){var z,y,x,w
-z=this.LP
-y=this.Lz
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+z=this.b
+y=this.a
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-y.IN+=x
-this.pV=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
-this.pV=z
-if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.e1()
-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
+y.Q+=x
+this.c=z.D()?z.c:null}if(x===46){z=z.D()?z.c:null
+this.c=z
+if(typeof z!=="number")return H.o(z)
+if(48<=z&&z<=57)this.L8()
+else this.Q.push(new Y.PnY(3,".",11))}else{z=y.Q
+this.Q.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
+y.Q=""}},
+L8:function(){var z,y,x,w
+z=this.a
 z.KF(H.mx(46))
-y=this.LP
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+y=this.b
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-z.IN+=x
-this.pV=y.G()?y.ft:null}this.Bv.push(new Y.qS(7,z.IN,0))
-z.IN=""}},
+z.Q+=x
+this.c=y.D()?y.c:null}y=z.Q
+this.Q.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
+z.Q=""}},
 hAN:{
-"^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
+"^":"a;G1:Q>",
+X:[function(a){return"ParseException: "+this.Q},"$0","gCR",0,0,0],
+static:{RV4:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,203,167]},
+DV:[function(a){return J.ph(a,this)},"$1","gnG",2,0,208,167]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.o2.RR(0,this)
+Hs:function(a){a.Q.RR(0,this)
 this.xn(a)},
-Ci:function(a){J.okV(a.gZs(),this)
+T7:function(a){J.ph(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.okV(a.gZs(),this)
-J.okV(a.gmU(),this)
+CU:function(a){J.ph(a.ghP(),this)
+J.ph(a.gmU(),this)
 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.Ff,this)
+J.ph(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,this)
 this.xn(a)},
-I6W:function(a){this.xn(a)},
+I6:function(a){this.xn(a)},
 Zh:function(a){var z
-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)
+for(z=a.gMO(),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,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.Ff,this)
+for(z=a.gJq(a),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,this)
 this.xn(a)},
-YV:function(a){J.okV(a.gnl(a),this)
-J.okV(a.gv4(),this)
+YV:function(a){J.ph(a.gG3(a),this)
+J.ph(a.gv4(),this)
 this.xn(a)},
 qv:function(a){this.xn(a)},
-ex:function(a){J.okV(a.gBb(a),this)
-J.okV(a.gT8(a),this)
+ex:function(a){J.ph(a.gBb(a),this)
+J.ph(a.gT8(a),this)
 this.xn(a)},
-kb:function(a){J.okV(a.go2(),this)
+Hx:function(a){J.ph(a.gO4(),this)
 this.xn(a)},
-RD:function(a){J.okV(a.gdc(),this)
-J.okV(a.gav(),this)
-J.okV(a.geE(),this)
+RD:function(a){J.ph(a.gdc(),this)
+J.ph(a.gav(),this)
+J.ph(a.grM(),this)
 this.xn(a)},
-ky:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
+MV:function(a){a.Q.RR(0,this)
+a.a.RR(0,this)
 this.xn(a)},
-eS:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
+eS:function(a){a.Q.RR(0,this)
+a.a.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V59;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)},
-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)},
-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},
-sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
-giZ:function(a){return a.ZJ},
-siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
-gTj:function(a){return a.PZ},
-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)},
-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))
+"^":"V58;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,TO,S8,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtu:function(a){return a.RZ},
+stu:function(a,b){a.RZ=this.ct(a,C.PX,a.RZ,b)},
+gfg:function(a){return a.ij},
+sfg:function(a,b){a.ij=this.ct(a,C.A7,a.ij,b)},
+gGV:function(a){return a.TQ},
+sGV:function(a,b){a.TQ=this.ct(a,C.vY,a.TQ,b)},
+gLf:function(a){return a.ca},
+sLf:function(a,b){a.ca=this.ct(a,C.IT,a.ca,b)},
+gJb:function(a){return a.Jc},
+sJb:function(a,b){a.Jc=this.ct(a,C.Gr,a.Jc,b)},
+gML:function(a){return a.cw},
+sML:function(a,b){a.cw=this.ct(a,C.kI,a.cw,b)},
+gxT:function(a){return a.bN},
+sxT:function(a,b){a.bN=this.ct(a,C.nt,a.bN,b)},
+giZ:function(a){return a.mT},
+siZ:function(a,b){a.mT=this.ct(a,C.vs,a.mT,b)},
+gTj:function(a){return a.Jr},
+sTj:function(a,b){a.Jr=this.ct(a,C.uG,a.Jr,b)},
+gGd:function(a){return a.IL},
+sGd:function(a,b){a.IL=this.ct(a,C.SA,a.IL,b)},
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,16,45],
+vr:function(a){var z,y
+z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.cw))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,204,205,206],
+pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,209,210,211],
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.giH(a))
-a.Nf=y
+if(z!=null){y=W.Ws(this.gcL(a))
+a.TO=y
 C.S2.OT(y,z,!0)}},
-Lx:function(a){var z=a.Nf
+dQ:function(a){var z=a.TO
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+a.TO=null}this.eX(a)},
 mN:[function(a,b){this.Um(a)
-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],
+this.vr(a)},"$1","goL",2,0,20,61],
+Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,20,61],
+ib:[function(a,b){this.Um(a)},"$1","gRq",2,0,20,61],
+Vj:[function(a,b){this.Um(a)},"$1","grO",2,0,20,61],
 Um:function(a){var z,y,x
-a.PZ=this.ct(a,C.uG,a.PZ,!1)
-if(a.D6!=null)return
-z=a.Ny
+a.Jr=this.ct(a,C.uG,a.Jr,!1)
+if(a.S8!=null)return
+z=a.RZ
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
-return}z=a.Fd
-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.Ny.q6(z):null
-a.He=this.ct(a,C.kI,a.He,z)
-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.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
+if(J.iS(z)!==!0){a.S8=J.SK(a.RZ).ml(new T.cg(a))
+return}z=a.ca
+z=z!=null?a.RZ.q6(z):1
+a.bN=this.ct(a,C.nt,a.bN,z)
+z=a.TQ
+z=z!=null?a.RZ.q6(z):null
+a.cw=this.ct(a,C.kI,a.cw,z)
+z=a.Jc
+y=a.RZ
+z=z!=null?y.q6(z):J.wS(J.de(y))
+a.mT=this.ct(a,C.vs,a.mT,z)
+J.U2(a.IL)
+for(x=J.D5(a.bN,1);z=J.Wx(x),z.B(x,J.D5(a.mT,1));x=z.g(x,1))J.dH(a.IL,J.Tf(J.de(a.RZ),x))
+a.Jr=this.ct(a,C.uG,a.Jr,!0)},
+static:{T5i:function(a){var z,y,x,w,v
 z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.t7=null
-a.PZ=!1
-a.Kf=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
-C.za.LX(a)
-C.za.XI(a)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.ij=null
+a.Jr=!1
+a.IL=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.Fa.LX(a)
+C.Fa.XI(a)
 return a}}},
-V59:{
-"^":"uL+Pi;",
+V58:{
+"^":"uL+Piz;",
 $isd3:true},
-Es:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.Ny)===!0){z.D6=null
-J.XP(z)}},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+cg:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(J.iS(z.RZ)===!0){z.S8=null
+J.v7(z)}},"$1",null,2,0,null,15,"call"]},
 vr:{
-"^":"V60;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},
-sO9:function(a,b){a.pL=this.ct(a,C.S4,a.pL,b)},
+"^":"V59;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRd:function(a){return a.RZ},
+sRd:function(a,b){a.RZ=this.ct(a,C.VI,a.RZ,b)},
+gO9:function(a){return a.ij},
+sO9:function(a,b){a.ij=this.ct(a,C.S4,a.ij,b)},
 SC:[function(a,b,c,d){var z,y
-z=a.pL
+z=a.ij
 if(z===!0)return
-a.pL=this.ct(a,C.S4,z,!0)
-z=a.X9.gqr()
-y=a.X9
-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],
+a.ij=this.ct(a,C.S4,z,!0)
+z=a.RZ.gqr()
+y=a.RZ
+if(z==null)J.wg(J.fx(y)).PI(J.fx(a.RZ),J.f2(a.RZ)).ml(new T.eE(a))
+else J.wg(J.fx(y)).Xu(a.RZ.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,52,55,85],
 static:{aed: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.pL=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.FC.LX(a)
 C.FC.XI(a)
 return a}}},
-V60:{
-"^":"uL+Pi;",
+V59:{
+"^":"uL+Piz;",
 $isd3:true},
 eE:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.S4,z.ij,!1)},"$1",null,2,0,null,15,"call"]},
 b3:{
-"^":"TpZ:12;b",
-$1:[function(a){var z=this.b
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["","",,A,{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.S4,z.ij,!1)},"$1",null,2,0,null,15,"call"]}}],["","",,A,{
 "^":"",
 kn:{
-"^":"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
+"^":"oEY;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gBV:function(a){return a.TQ},
+sBV:function(a,b){a.TQ=this.ct(a,C.tW,a.TQ,b)},
+gJp:function(a){var z=a.RZ
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
-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
+return z.gzz()},
+J4:[function(a,b){this.at(a,null)},"$1","gIF",2,0,20,61],
+at:[function(a,b){var z=a.RZ
 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],
+this.ct(a,C.Fh,0,1)}},"$1","gRX",2,0,20,15],
 goc:function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
-if(J.J5(a.jJ,0)){z=J.iS(a.tY)
-y=a.tY
-if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gRy(a))}return Q.xI.prototype.goc.call(this,a)},
-gO3:function(a){if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0))if(J.iS(a.tY)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.jJ)
-else J.SK(a.tY).ml(this.gRy(a))
+if(a.RZ==null)return Q.xI.prototype.goc.call(this,a)
+if(J.u6(a.TQ,0)){z=J.iS(a.RZ)
+y=a.RZ
+if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.TQ))
+else J.SK(y).ml(this.gRX(a))}return Q.xI.prototype.goc.call(this,a)},
+gO3:function(a){if(a.RZ==null)return Q.xI.prototype.gO3.call(this,a)
+if(J.u6(a.TQ,0))if(J.iS(a.RZ)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.TQ)
+else J.SK(a.RZ).ml(this.gRX(a))
 return Q.xI.prototype.gO3.call(this,a)},
 static:{Thl: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.jJ=-1
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.c07.LX(a)
-C.c07.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=-1
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 oEY:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V61;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)},
+"^":"V60;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtu:function(a){return a.RZ},
+stu:function(a,b){a.RZ=this.ct(a,C.PX,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
+this.VM(a)
+z=a.RZ
 if(z==null)return
 J.SK(z)},
-pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V61:{
-"^":"uL+Pi;",
+V60:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,D,{
 "^":"",
-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
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","I8",4,0,74],
+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
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(b==null)return
 z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").hh("Malformed service object: "+H.d(b))
+z=z.p(b,"id")!=null&&z.p(b,"type")!=null
+if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
 z=J.U6(b)
-y=z.t(b,"type")
-x=J.Qe(y)
+y=z.p(b,"type")
+x=J.NH(y)
 if(x.nC(y,"@"))y=x.yn(y,1)
-if(z.t(b,"_vmType")!=null){z=z.t(b,"_vmType")
-x=J.Qe(z)
+if(z.p(b,"_vmType")!=null){z=z.p(b,"_vmType")
+x=J.NH(z)
 w=x.nC(z,"@")?x.yn(z,1):z}else w=y
 switch(y){case"Class":z=D.xB
 x=[]
@@ -18716,12 +18054,12 @@
 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.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)
+s=new D.dy(null,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)
 break
 case"Code":z=[]
-z.$builtinTypeInfo=[D.ta]
+z.$builtinTypeInfo=[D.Fc]
 x=[]
-x.$builtinTypeInfo=[D.ta]
+x.$builtinTypeInfo=[D.Fc]
 v=D.Q4
 u=[]
 u.$builtinTypeInfo=[v]
@@ -18758,9 +18096,9 @@
 case"Isolate":z=J.wp(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
 x.$builtinTypeInfo=[null,null]
-v=P.L5(null,null,null,P.qU,D.af)
+v=P.L5(null,null,null,P.I,D.af)
 u=[]
-u.$builtinTypeInfo=[P.qU]
+u.$builtinTypeInfo=[P.I]
 t=[]
 t.$builtinTypeInfo=[D.ER]
 r=D.dy
@@ -18773,13 +18111,13 @@
 p.$builtinTypeInfo=[r]
 p=new Q.wn(null,null,p,null,null)
 p.$builtinTypeInfo=[r]
-r=P.L5(null,null,null,P.qU,P.Vf)
+r=P.L5(null,null,null,P.I,P.CP)
 r=R.tB(r)
-o=P.qU
+o=P.I
 n=D.YX
 m=new V.qC(P.YM(null,null,null,o,n),null,null)
 m.$builtinTypeInfo=[o,n]
-o=P.qU
+o=P.I
 n=D.YX
 l=new V.qC(P.YM(null,null,null,o,n),null,null)
 l.$builtinTypeInfo=[o,n]
@@ -18812,12 +18150,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.Z9
+case"Object":switch(w){case"PcDescriptors":z=D.xb
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.Hx(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.hn(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.")
@@ -18829,12 +18167,12 @@
 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.RA(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.Ik(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)
 break
-case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"ServiceException":s=new D.Ix(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
@@ -18843,1542 +18181,1518 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.A(null,null),P.A(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
 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.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
+default:s=D.Ep(y)||J.mG(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},
-UW:function(a){if(a.gHh())return
+vQ:function(a){if(a.gHh())return
 return a},
-bF:function(a){var z
+PG: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
+z=z.p(a,"id")!=null&&z.p(a,"type")!=null}else z=!1
 return z},
-kT:function(a,b){var z=J.x(a)
+kT:function(a,b){var z=J.t(a)
 if(!!z.$isvO)return
 if(!!z.$isqC)D.Gf(a,b)
 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.XG,y=0;y<z.length;++y){x=z[y]
-w=J.x(x)
+for(z=a.b,y=0;y<z.length;++y){x=z[y]
+w=J.t(x)
 v=!!w.$isqC
-if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
+if(v)u=w.p(x,"id")!=null&&w.p(x,"type")!=null
 else u=!1
-if(u)a.u(0,y,b.Qn(x))
+if(u)a.q(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
 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.aT(this.V0)},
-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.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")},
-gJE:function(){return J.xC(this.JK,"MirrorReference")},
-gl2:function(){return J.xC(this.JK,"WeakProperty")},
+"^":"Piz;px:e@,GR:f@",
+gXP:function(){return this.Q},
+gwv:function(a){return J.wp(this.Q)},
+god:function(a){return J.wg(this.Q)},
+gjO:function(a){return this.a},
+gt5:function(a){return this.b},
+gv5:function(){return this.c},
+glO:function(){return D.rO(this.b)},
+gjS:function(){return J.mG(this.b,"bool")},
+gzx:function(){return J.mG(this.b,"double")},
+gt3:function(){return J.mG(this.b,"Error")},
+gNs:function(){return D.Ep(this.b)},
+gSO:function(){return J.mG(this.b,"int")},
+gK4:function(a){return J.mG(this.b,"List")},
+gHh:function(){return J.mG(this.b,"null")},
+gfo:function(){return J.mG(this.b,"Sentinel")},
+gu7:function(){return J.mG(this.b,"String")},
+gOC:function(){return J.mG(this.c,"MirrorReference")},
+gl2:function(){return J.mG(this.c,"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.TU)},
-gox:function(a){return this.qu},
+gXM:function(){return J.mG(this.b,"Instance")&&!J.mG(this.c,"MirrorReference")&&!J.mG(this.c,"WeakProperty")&&!this.gBF()},
+gPj:function(a){return this.Q.Mq(this.a)},
+gox:function(a){return this.d},
 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))},
-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.TU,""))return P.Ab(this,null)
-if(this.qu&&this.gM8())return P.Ab(this,null)
-z=this.mQ
+goc:function(a){return this.gpx()},
+soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
+gzz:function(){return this.gGR()},
+szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){var z
+if(this.d){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}return this.VD(0)},
+VD:["BA",function(a){var z
+if(J.mG(this.a,"")){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}if(this.d&&this.gM8()){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}z=this.r
 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},
+this.r=z}return z}],
 eC:function(a){var z,y,x,w
 z=J.U6(a)
-y=J.co(z.t(a,"type"),"@")
-x=z.t(a,"type")
-w=J.Qe(x)
+y=J.co(z.p(a,"type"),"@")
+x=z.p(a,"type")
+w=J.NH(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-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.R5(0,a,y)},
-YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,174,207],
+w=this.a
+if(w!=null&&!J.mG(w,z.p(a,"id")));this.a=z.p(a,"id")
+this.b=x
+if(z.NZ(a,"_vmType")===!0){z=z.p(a,"_vmType")
+w=J.NH(z)
+this.c=w.nC(z,"@")?w.yn(z,1):z}else this.c=this.b
+this.bF(0,a,y)},
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,174,212],
 $isaf:true},
 n1:{
-"^":"TpZ:209;a",
+"^":"r:214;Q",
 $1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.Qe(z)
+z=J.Tf(a,"type")
+y=J.NH(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.oU))return D.Nl(y.gXP(),a)
+y=this.Q
+if(!J.mG(z,y.b))return D.Nl(y.gXP(),a)
 y.eC(a)
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
+return y},"$1",null,2,0,null,213,"call"]},
 jI:{
-"^":"TpZ:76;b",
-$0:[function(){this.b.mQ=null},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.r=null},"$0",null,0,0,null,"call"]},
 boh:{
 "^":"a;",
-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,210]},
-P5:{
-"^":"TpZ:12;a",
+Yz:function(a){J.Me(a,new D.u9(this))},
+lh:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.TC(this))},"$0","gaL",0,0,215]},
+u9:{
+"^":"r:14;Q",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,211,"call"],
-$isEH:true},
-Rv:{
-"^":"TpZ:209;a",
-$1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,208,"call"],
-$isEH:true},
+z.p(a,"script").lV(z.p(a,"hits"))},"$1",null,2,0,null,216,"call"]},
+TC:{
+"^":"r:214;Q",
+$1:[function(a){var z=this.Q
+z.Yz(D.Nl(J.mG(z.gt5(z),"Isolate")?z:z.gXP(),a).p(0,"coverage"))},"$1",null,2,0,null,213,"call"]},
 xm:{
 "^":"af;"},
 wv:{
-"^":"O1w;Li<,G2<,Rk>",
+"^":"O1w;Xs:dy<,G2:fr<,Rk:fx>",
 gwv:function(a){return this},
 god:function(a){return},
-gi2:function(){var z=this.Qi
+gi2:function(){var z=this.go
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.TU)},
-YC:[function(a){return H.d(a)},"$1","gua",2,0,174,207],
-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.kU},
-gJW:function(){return this.l7},
+gPj:function(a){return H.d(this.a)},
+Mq:[function(a){return H.d(a)},"$1","gua",2,0,174,212],
+gYe:function(a){return this.x},
+gJk:function(){return this.ch},
+gA3:function(){return this.cx},
+gdW:function(){return this.cy},
+gU6:function(){return this.db},
+gPE:function(){return this.dx},
 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.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.jy(z,this,w))},
+if(b!=null)J.H9(y,"_data",b)}catch(x){H.Ru(x)
+N.QM("").YX("Ignoring malformed event message: "+H.d(a))
+return}if(!J.mG(J.Tf(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.Tf(z.a,"type"))+"'")
+return}w=J.Tf(J.Tf(z.a,"isolate"),"id")
+this.wD(w).ml(new D.mT(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
+z=$.r0().R4(0,a)
 if(z==null)return
-y=z.pX
+y=z.a
 x=y.input
 w=y.index
 if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
+y=J.wS(y[0])
+if(typeof y!=="number")return H.o(y)
 return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.PY().R4(0,a)
+z=$.Gi().R4(0,a)
 if(z==null)return""
-y=z.pX
+y=z.a
 x=y.index
 if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
+y=J.wS(y[0])
+if(typeof y!=="number")return H.o(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.nO(null))},
-wD:function(a){var z
-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.MZ(this,a))},
+wD:function(a){var z,y
+if(J.mG(a,"")){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(null)
+return z}y=this.go.p(0,a)
+if(y!=null){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(y)
+return z}return this.VD(0).ml(new D.QQ(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.aEE(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.kk(this,y))}x=this.fy.p(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.oew(this,a))},
-B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+return this.jU(a).ml(new D.it(this,a))},
+Ah:[function(a,b){return b},"$2","gJ2",4,0,80],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gJ2())
+try{y=new P.Mx(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.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())},
-R5:function(a,b,c){var z,y
+if(!D.PG(a)){z=P.B(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Xo(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.mG(z.p(a,"type"),"ServiceError"))return P.Xo(D.Nl(this,a),null,null)
+else if(J.mG(z.p(a,"type"),"ServiceException"))return P.Xo(D.Nl(this,a),null,null)
+z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(a)
+return z},
+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.pa(this),new D.zA2())},
+bF:function(a,b,c){var z,y
 if(c)return
-this.qu=!0
+this.d=!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.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.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.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"))},
+y=z.p(b,"version")
+this.x=F.Wi(this,C.zn,this.x,y)
+y=z.p(b,"targetCPU")
+this.y=F.Wi(this,C.Bx,this.y,y)
+y=z.p(b,"architectureBits")
+this.z=F.Wi(this,C.hb,this.z,y)
+y=z.p(b,"uptime")
+this.ch=F.Wi(this,C.mh,this.ch,y)
+y=P.Wu(H.BU(z.p(b,"date"),null,null),!1)
+this.dx=F.Wi(this,C.GI,this.dx,y)
+y=z.p(b,"assertsEnabled")
+this.cx=F.Wi(this,C.ET,this.cx,y)
+y=z.p(b,"pid")
+this.db=F.Wi(this,C.uI,this.db,y)
+y=z.p(b,"typeChecksEnabled")
+this.cy=F.Wi(this,C.J2,this.cy,y)
+this.y8(z.p(b,"isolates"))},
 y8:function(a){var z,y,x,w,v,u
-z=this.Qi
-y=P.L5(null,null,null,P.qU,D.bv)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.UQ(w,"id")
-u=z.t(0,v)
-if(u!=null)y.u(0,v,u)
+z=this.go
+y=P.L5(null,null,null,P.I,D.bv)
+for(x=J.Nx(a);x.D();){w=x.gk()
+v=J.Tf(w,"id")
+u=z.p(0,v)
+if(u!=null)y.q(0,v,u)
 else{u=D.Nl(this,w)
-y.u(0,v,u)
-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")
-this.uj.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
+y.q(0,v,u)
+N.QM("").To("New isolate '"+H.d(u.a)+"'")}}y.aN(0,new D.Yu())
+this.go=y},
+Lw:function(){this.e=this.ct(this,C.YS,this.e,"vm")
+this.f=this.ct(this,C.KS,this.f,"vm")
+this.fy.q(0,"vm",this)
+var z=P.B(["id","vm","type","@VM"],null,null)
 this.eC(R.tB(z))},
 $iswv:true},
 O1w:{
-"^":"xm+Pi;",
+"^":"xm+Piz;",
 $isd3:true},
-jy:{
-"^":"TpZ:12;a,b,c",
+mT:{
+"^":"r:14;Q,a,b",
 $1:[function(a){var z,y
-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,212,"call"],
-$isEH:true},
-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},
-aEE:{
-"^":"TpZ:12;a,b",
+if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.b))
+else{z=D.Nl(a,this.Q.a)
+y=this.a.fx
+if(y.b>=4)H.vh(y.Pq())
+y.MW(z)}},"$1",null,2,0,null,217,"call"]},
+QQ:{
+"^":"r:14;Q,a",
+$1:[function(a){if(!J.t(a).$iswv)return
+return this.Q.go.p(0,this.a)},"$1",null,2,0,null,121,"call"]},
+kk:{
+"^":"r:14;Q,a",
 $1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.LE(a)
-else return a.cv(z)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
-oew:{
-"^":"TpZ:209;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.Nl(z,a)
-if(y.gjm())z.uj.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
-QZ:{
-"^":"TpZ:76;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"TpZ:12;a,b",
-$1:[function(a){var z,y,x
+if(a==null)return this.Q
 z=this.a
+if(z==null)return J.LE(a)
+else return a.cv(z)},"$1",null,2,0,null,8,"call"]},
+it:{
+"^":"r:214;Q,a",
+$1:[function(a){var z,y
+z=this.Q
+y=D.Nl(z,a)
+if(y.gjm())z.fy.to(0,this.a,new D.K0(y))
+return y},"$1",null,2,0,null,213,"call"]},
+K0:{
+"^":"r:77;Q",
+$0:function(){return this.Q}},
+zA:{
+"^":"r:14;Q,a",
+$1:[function(a){var z,y,x
+z=this.Q
 y=z.hb(a)
-x=$.ax
-if(x!=null)x.ab("Received response for "+H.d(this.b),y)
-return z.OJ(y)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
+x=$.hm
+if(x!=null)x.AS("Received response for "+H.d(this.a),y)
+return z.OJ(y)},"$1",null,2,0,null,157,"call"]},
 tm:{
-"^":"TpZ:12;c",
-$1:[function(a){var z=this.c.G2
-if(z.YM>=4)H.vh(z.Pq())
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.fr
+if(z.b>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
-$isEH:true},
+return P.Xo(a,null,null)},"$1",null,2,0,null,24,"call"]},
 mR:{
-"^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-hc:{
-"^":"TpZ:12;d",
-$1:[function(a){var z=this.d.Li
-if(z.YM>=4)H.vh(z.Pq())
-z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return!!J.t(a).$isN7},"$1",null,2,0,null,4,"call"]},
 pa:{
-"^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isIx},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.dy
+if(z.b>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Xo(a,null,null)},"$1",null,2,0,null,90,"call"]},
+zA2:{
+"^":"r:14;",
+$1:[function(a){return!!J.t(a).$isIx},"$1",null,2,0,null,4,"call"]},
 Yu:{
-"^":"TpZ:81;",
-$2:function(a,b){J.LE(b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){J.LE(b)}},
 ER:{
-"^":"a;SP,XE>,jf",
+"^":"a;Q,XE:a>,b",
 eK:function(a){var z,y,x,w,v
-z=this.XE
+z=this.a
+C.Nm.uy(z,"setAll")
 H.h8(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.jf
+for(y=z.length,x=0;x<y;++x){w=this.b
 v=z[x]
-if(typeof v!=="number")return H.s(v)
-this.jf=w+v}},
+if(typeof v!=="number")return H.o(v)
+this.b=w+v}},
 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)
+for(z=this.a,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.p(a,v)
 if(v>=w)return H.e(b,v)
-u=J.bI(u,b[v])
+u=J.D5(u,b[v])
 z[v]=u
-t=this.jf
-if(typeof u!=="number")return H.s(u)
-this.jf=t+u}},
-k5:[function(a,b){var z,y,x,w,v,u
+t=this.b
+if(typeof u!=="number")return H.o(u)
+this.b=t+u}},
+wY:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.XE
+y=this.a
 x=y.length
 w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=z.gv(b)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-u=z.t(b,w)
+u=z.p(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.xZ(y[w],u)?y[w]:u;++w}},"$1","gA5",2,0,213,214],
+y[w]=J.vU(y[w],u)?y[w]:u;++w}},"$1","gA5",2,0,218,219],
 CJ:function(){var z,y,x
-for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
+for(z=this.a,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,Fw<,u1,Ob,Eq,kL",
-gvh:function(){return this.u1},
+"^":"a;fJ:Q<,lI:a<,b,c,d,e",
+gZ0:function(){return this.b},
 Qv:function(a,b){var z,y,x,w,v,u
-this.u1=a
+this.b=a
 z=J.U6(b)
-y=z.t(b,"counters")
-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
-if(typeof v!=="number")return H.s(v)
+y=z.p(b,"counters")
+x=this.Q
+if(x.length===0){C.Nm.FV(x,z.p(b,"names"))
+this.e=J.wS(z.p(b,"counters"))
+for(z=this.d,x=this.a,w=0;w<z;++w){v=this.e
+if(typeof v!=="number")return H.o(v)
 v=Array(v)
-v.fixed$length=init
+v.fixed$length=Array
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}z=this.kL
-if(typeof z!=="number")return H.s(z)
+x.push(u)}z=this.e
+if(typeof z!=="number")return H.o(z)
 z=Array(z)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.Ob=z
+z.fixed$length=Array
+z=new D.ER(0,H.J(z,[P.KN]),0)
+this.c=z
 z.eK(y)
-return}z=this.kL
-if(typeof z!=="number")return H.s(z)
+return}z=this.e
+if(typeof z!=="number")return H.o(z)
 z=Array(z)
-z.fixed$length=init
-u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.pg(y,this.Ob.XE)
-this.Ob.k5(0,y)
-z=this.Fw
+z.fixed$length=Array
+u=new D.ER(a,H.J(z,[P.KN]),0)
+u.pg(y,this.c.a)
+this.c.wY(0,y)
+z=this.a
 z.push(u)
-if(z.length>this.Eq)C.Nm.W4(z,0)}},
+if(z.length>this.d)C.Nm.W4(z,0)}},
 eK:{
-"^":"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},
-gqZ:function(){return this.hu},
+"^":"Piz;Q,a,b,c,d,e,cy$,db$",
+gcs:function(){return this.Q},
+gCs:function(){return this.a},
+gMX:function(){return this.b},
+gYk:function(){return this.c},
+gpy:function(){return this.d},
+goX:function(){return this.e},
 eC:function(a){var z,y
 z=J.U6(a)
-y=z.t(a,"used")
-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")
-this.j8=F.Wi(this,C.h7,this.j8,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-y=z.t(a,"time")
-this.Og=F.Wi(this,C.Jl,this.Og,y)
-z=z.t(a,"avgCollectionPeriodMillis")
-this.hu=F.Wi(this,C.BE,this.hu,z)}},
+y=z.p(a,"used")
+this.Q=F.Wi(this,C.LP,this.Q,y)
+y=z.p(a,"capacity")
+this.a=F.Wi(this,C.bV,this.a,y)
+y=z.p(a,"external")
+this.b=F.Wi(this,C.h7,this.b,y)
+y=z.p(a,"collections")
+this.c=F.Wi(this,C.J6,this.c,y)
+y=z.p(a,"time")
+this.d=F.Wi(this,C.bo,this.d,y)
+z=z.p(a,"avgCollectionPeriodMillis")
+this.e=F.Wi(this,C.T,this.e,z)}},
 bv:{
-"^":"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,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gwv:function(a){return this.V0},
+"^":"bvc;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,px:id@,GR:k1@,k2,k3,k4,UY:r1<,xQ:r2<,rx,ry,Np:x1<,x2,y1,is:y2<,TB,pG:ej<,Sn:lZ<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gwv:function(a){return this.Q},
 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.TU)},
-gBP:function(a){return this.Jr},
-gGL:function(){return this.EY},
-gaj:function(){return this.eU},
-gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,174,207],
+gXE:function(a){return this.x},
+sXE:function(a,b){this.x=F.Wi(this,C.bJ,this.x,b)},
+gPj:function(a){return"/"+H.d(this.a)},
+gBP:function(a){return this.y},
+gGL:function(){return this.z},
+gaj:function(){return this.ch},
+gn0:function(){return this.cx},
+Mq:[function(a){return"/"+H.d(this.a)+"/"+H.d(a)},"$1","gua",2,0,174,212],
 N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
+z=H.J([],[D.kx])
 y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.I1()
+for(x=J.Nx(y.p(a,"codes"));x.D();)z.push(J.Tf(x.gk(),"code"))
+this.Id()
 this.nN(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.qo=this.Jm(w,z)},
-I1:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.TV())},
+w=y.p(a,"exclusive_trie")
+if(w!=null)this.x1=this.Jm(w,z)},
+Id:function(){var z=this.db
+z.gUQ(z).aN(0,new D.S0())},
 nN:function(a,b){var z,y,x,w
 z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
+y=z.p(a,"codes")
+x=z.p(a,"samples")
+for(z=J.Nx(y);z.D();){w=z.gk()
+J.Tf(w,"code").Il(w,b,x)}},
 WR:function(){return this.cv("classes").ml(this.gLG()).ml(this.gHB())},
-d8:[function(a){var z,y,x,w
+xWD:[function(a){var z,y,x,w
 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.Ne(z,!1)},"$1","gLG",2,0,215,216],
-lKe:[function(a){var z,y,x,w
-z=this.AI
+for(y=J.Nx(J.Tf(a,"members"));y.D();){x=y.gk()
+w=J.t(x)
+if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,220,221],
+yQ:[function(a){var z,y,x,w
+z=this.fr
 z.V1(z)
-this.Wm=F.Wi(this,C.jo,this.Wm,null)
-for(y=J.mY(a);y.G();){x=y.gl()
+this.dy=F.Wi(this,C.as,this.dy,null)
+for(y=J.Nx(a);y.D();){x=y.gk()
 if(x.gAY()==null)z.h(0,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)
+if(J.mG(x.gzz(),"Object")&&J.mG(x.geh(),!1)){w=this.dy
+if(this.gnz(this)&&!J.mG(w,x)){w=new T.qI(this,C.as,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,217,218],
+this.SZ(this,w)}this.dy=x}}z=this.dy
+y=H.J(new P.Gc(0,$.X3,null),[null])
+y.Xf(z)
+return y},"$1","gHB",2,0,222,223],
 Qn:function(a){var z,y,x
 if(a==null)return
-z=J.UQ(a,"id")
-y=this.uj
-x=y.t(0,z)
+z=J.Tf(a,"id")
+y=this.db
+x=y.p(0,z)
 if(x!=null)return x
 x=D.Nl(this,a)
-if(x!=null&&x.gjm())y.u(0,z,x)
+if(x!=null&&x.gjm())y.q(0,z,x)
 return x},
-cv:function(a){var z=this.uj.t(0,a)
+cv:function(a){var z=this.db.p(0,a)
 if(z!=null)return J.LE(z)
-return this.V0.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)},
-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)},
-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.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)},
-Bs:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return this.Q.jU("/"+H.d(this.a)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.dy},
+gVc:function(){return this.fx},
+sVc:function(a){this.fx=F.Wi(this,C.eN,this.fx,a)},
+gvU:function(){return this.fy},
+gkw:function(){return this.go},
+goc:function(a){return this.id},
+soc:function(a,b){this.id=F.Wi(this,C.YS,this.id,b)},
+gzz:function(){return this.k1},
+szz:function(a){this.k1=F.Wi(this,C.KS,this.k1,a)},
+gIT:function(){return this.k2},
+gw2:function(){return this.k3},
+sw2:function(a){this.k3=F.Wi(this,C.tP,this.k3,a)},
+gkc:function(a){return this.ry},
+skc:function(a,b){this.ry=F.Wi(this,C.yh,this.ry,b)},
+WU:function(a){var z=J.U6(a)
+this.r1.eC(z.p(a,"new"))
+this.r2.eC(z.p(a,"old"))},
+bF: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)
-y=z.t(b,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)
-y=z.t(b,"name")
-this.f5=F.Wi(this,C.KS,this.f5,y)
+y=z.p(b,"mainPort")
+this.k2=F.Wi(this,C.wT,this.k2,y)
+y=z.p(b,"name")
+this.id=F.Wi(this,C.YS,this.id,y)
+y=z.p(b,"name")
+this.k1=F.Wi(this,C.KS,this.k1,y)
 if(c)return
-this.qu=!0
-this.yP=F.Wi(this,C.DY,this.yP,!1)
+this.d=!0
+this.cx=F.Wi(this,C.DY,this.cx,!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("").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.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(z.p(b,"rootLib")==null||z.p(b,"timers")==null||z.p(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
+return}y=z.p(b,"rootLib")
+this.fx=F.Wi(this,C.eN,this.fx,y)
+if(z.p(b,"entry")!=null){y=z.p(b,"entry")
+this.k3=F.Wi(this,C.tP,this.k3,y)}if(z.p(b,"topFrame")!=null){y=z.p(b,"topFrame")
+this.go=F.Wi(this,C.bc,this.go,y)}else this.go=F.Wi(this,C.bc,this.go,null)
+x=z.p(b,"tagCounters")
 if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
+w=y.p(x,"names")
+v=y.p(x,"counters")
 y=J.U6(v)
 u=0
 t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=y.gv(v)
+if(typeof s!=="number")return H.o(s)
 if(!(t<s))break
-s=y.t(v,t)
-if(typeof s!=="number")return H.s(s)
-u+=s;++t}s=P.Fl(null,null)
+s=y.p(v,t)
+if(typeof s!=="number")return H.o(s)
+u+=s;++t}s=P.A(null,null)
 s=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
+this.x=F.Wi(this,C.bJ,this.x,s)
 if(u===0){y=J.U6(w)
 t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=y.gv(w)
+if(typeof s!=="number")return H.o(s)
 if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+J.H9(this.x,y.p(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)
+while(!0){r=s.gv(w)
+if(typeof r!=="number")return H.o(r)
 if(!(t<r))break
-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
+J.H9(this.x,s.p(w,t),C.CD.Sy(J.x4(y.p(v,t),u)*100,2)+"%");++t}}}q=P.A(null,null)
+J.Me(z.p(b,"timers"),new D.Qq(q))
+y=this.k4
 s=J.w1(y)
-s.u(y,"total",q.t(0,"time_total_runtime"))
-s.u(y,"compile",q.t(0,"time_compilation"))
-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.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)
+s.q(y,"total",q.p(0,"time_total_runtime"))
+s.q(y,"compile",q.p(0,"time_compilation"))
+s.q(y,"gc",0)
+s.q(y,"init",J.WB(J.WB(J.WB(q.p(0,"time_script_loading"),q.p(0,"time_creating_snapshot")),q.p(0,"time_isolate_initialization")),q.p(0,"time_bootstrap")))
+s.q(y,"dart",q.p(0,"time_dart_execution"))
+this.WU(z.p(b,"heaps"))
+p=z.p(b,"features")
+if(p!=null)for(y=J.Nx(p);y.D();)if(J.mG(y.gk(),"io")){s=this.cy
+if(this.gnz(this)&&!J.mG(s,!0)){s=new T.qI(this,C.iA,s,!0)
 s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
-y=F.Wi(this,C.yG,this.Jr,y)
-this.Jr=y
-y=y==null&&z.t(b,"topFrame")!=null
-this.EY=F.Wi(this,C.L2,this.EY,y)
-y=this.Jr==null&&z.t(b,"topFrame")==null
-this.eU=F.Wi(this,C.q2,this.eU,y)
-y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-y=this.tW
+this.SZ(this,s)}this.cy=!0}y=z.p(b,"pauseEvent")
+y=F.Wi(this,C.yG,this.y,y)
+this.y=y
+y=y==null&&z.p(b,"topFrame")!=null
+this.z=F.Wi(this,C.L2,this.z,y)
+y=this.y==null&&z.p(b,"topFrame")==null
+this.ch=F.Wi(this,C.q2,this.ch,y)
+y=z.p(b,"error")
+this.ry=F.Wi(this,C.yh,this.ry,y)
+y=this.fy
 y.V1(y)
-y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.E0())},
-xB:function(){return this.V0.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.n5=0
-this.l9=a
+y.FV(0,z.p(b,"libraries"))
+y.GT(y,D.I8())},
+m7:function(){return this.Q.jU("/"+H.d(this.a)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.x2=0
+this.y1=a
 if(a==null)return
-if(J.u6(J.q8(a),3))return
+if(J.UN(J.wS(a),3))return
 return this.ci(b)},
 ci:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.l9
-y=this.n5
+z=this.y1
+y=this.x2
 if(typeof y!=="number")return y.g()
-this.n5=y+1
-x=J.UQ(z,y)
+this.x2=y+1
+x=J.Tf(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.l9
-z=this.n5
+y=this.y1
+z=this.x2
 if(typeof z!=="number")return z.g()
-this.n5=z+1
-v=J.UQ(y,z)
+this.x2=z+1
+v=J.Tf(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
-y=this.l9
-t=this.n5
+z.$builtinTypeInfo=[D.t9]
+u=new D.t9(w,v,z,0)
+y=this.y1
+t=this.x2
 if(typeof t!=="number")return t.g()
-this.n5=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
+this.x2=t+1
+s=J.Tf(y,t)
+if(typeof s!=="number")return H.o(s)
 r=0
 for(;r<s;++r){q=this.ci(a)
 z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-Eb:function(a){var z,y,x,w,v,u
+y=u.c
+t=q.a
+if(typeof t!=="number")return H.o(t)
+u.c=y+t}return u},
+Eb:function(a){var z,y,x,w
 z=J.U6(a)
-y=J.UQ(z.t(a,"location"),"script")
-x=J.UQ(z.t(a,"location"),"tokenPos")
+y=J.Tf(z.p(a,"location"),"script")
+x=J.Tf(z.p(a,"location"),"tokenPos")
 z=J.RE(y)
 if(z.gox(y)===!0){w=y.q6(x)
-J.UQ(z.gGd(y),J.bI(w,1)).sqr(a)}else{z=z.xW(y)
-z.toString
-v=$.X3
-u=new P.Gc(0,v,null,null,v.cR(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
-u.$builtinTypeInfo=[null]
-z.xf(u)}},
+J.Tf(z.gGd(y),J.D5(w,1)).sqr(a)}else z.xW(y).ml(new D.Ye(this,a))},
 eF:function(a){var z,y,x,w,v,u
-z=this.iD
-if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
+z=this.y2
+if(z!=null)for(z=J.Nx(J.Tf(z,"breakpoints"));z.D();){y=z.gk()
 x=J.U6(y)
-w=J.UQ(x.t(y,"location"),"script")
-v=J.UQ(x.t(y,"location"),"tokenPos")
+w=J.Tf(x.p(y,"location"),"script")
+v=J.Tf(x.p(y,"location"),"tokenPos")
 x=J.RE(w)
 if(x.gox(w)===!0){u=w.q6(v)
-J.UQ(x.gGd(w),J.bI(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.Eb(z.gl())
-this.iD=a},
-Xb:function(){var z=this.hz
+J.Tf(x.gGd(w),J.D5(u,1)).sqr(null)}}for(z=J.Nx(J.Tf(a,"breakpoints"));z.D();)this.Eb(z.gk())
+this.y2=a},
+Xb:function(){var z=this.TB
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
-this.hz=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+this.TB=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))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,210],
-QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,210],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,210],
-Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,210],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,210],
-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],
+yy:[function(a){return this.cv("debug/pause").ml(new D.qU(this))},"$0","gX0",0,0,215],
+QE:[function(a){return this.cv("debug/resume").ml(new D.bL(this))},"$0","gbY",0,0,215],
+fV:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,215],
+ks:[function(a){return this.cv("debug/resume?step=over").ml(new D.Ro(this))},"$0","gqF",0,0,215],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gVX",0,0,215],
+Z6:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.Z6("metrics",this.ej).ml(new D.y17(this))},
+X:[function(a){return"Isolate("+H.d(this.a)+")"},"$0","gCR",0,0,0],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
 "^":"xm+boh;"},
 bvc:{
-"^":"PKX+Pi;",
+"^":"PKX+Piz;",
 $isd3:true},
-TV:{
-"^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
-a.Du=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)
-C.Nm.sB(a.hw,0)
-a.n3.V1(0)}},
-$isEH:true},
+S0:{
+"^":"r:14;",
+$1:function(a){if(!!J.t(a).$iskx){a.y=F.Wi(a,C.Kj,a.y,0)
+a.z=0
+a.ch=0
+a.fx=F.Wi(a,C.EF,a.fx,"")
+a.fy=F.Wi(a,C.uU,a.fy,"")
+C.Nm.sv(a.db,0)
+C.Nm.sv(a.dx,0)
+a.fr.V1(0)}}},
 KQ:{
-"^":"TpZ:209;a,b",
+"^":"r:214;Q,a",
 $1:[function(a){var z,y
-z=this.a
+z=this.Q
 y=D.Nl(z,a)
-if(y.gjm())z.uj.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
-Ea:{
-"^":"TpZ:76;c",
-$0:function(){return this.c},
-$isEH:true},
+if(y.gjm())z.db.to(0,this.a,new D.Eav(y))
+return y},"$1",null,2,0,null,213,"call"]},
+Eav:{
+"^":"r:77;Q",
+$0:function(){return this.Q}},
 Qq:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $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,219,"call"],
-$isEH:true},
+this.Q.q(0,z.p(a,"name"),z.p(a,"time"))},"$1",null,2,0,null,200,"call"]},
 O5:{
-"^":"TpZ:209;a",
-$1:[function(a){var z,y
-z=Date.now()
-new P.iP(z,!1).EK()
-y=this.a.KJ
-y.Qv(z/1000,a)
-return y},"$1",null,2,0,null,168,"call"],
-$isEH:true},
+"^":"r:214;Q",
+$1:[function(a){var z=this.Q.dx
+z.Qv(Date.now()/1000,a)
+return z},"$1",null,2,0,null,168,"call"]},
 Ye:{
-"^":"TpZ:12;a,b",
-$1:[function(a){this.a.Eb(this.b)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){this.Q.Eb(this.a)},"$1",null,2,0,null,15,"call"]},
 y4:{
-"^":"TpZ:12;a",
-$1:[function(a){this.a.eF(a)},"$1",null,2,0,null,220,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){this.Q.eF(a)},"$1",null,2,0,null,224,"call"]},
 Cm:{
-"^":"TpZ:76;b",
-$0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-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"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.TB=null},"$0",null,0,0,null,"call"]},
+JL:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(!!J.t(a).$iscn)J.Tf(J.de(this.a),J.D5(this.b,1)).sj9(!1)
+return this.Q.Xb()},"$1",null,2,0,null,121,"call"]},
 fw:{
-"^":"TpZ:12;a,b",
+"^":"r:14;Q,a",
 $1:[function(a){var z,y
-if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
-z=this.a
-y=z.Jr
-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("").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("").hh(a.LD)
-return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-qD:{
-"^":"TpZ:12;a",
-$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},
-A6:{
-"^":"TpZ:12;a",
-$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},
-xK:{
-"^":"TpZ:12;a",
-$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},
+if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+z=this.Q
+y=z.y
+if(y!=null&&y.gYZ()!=null&&J.mG(J.Tf(z.y.gYZ(),"id"),J.Tf(this.a,"id")))return z.VD(0)
+else return z.Xb()},"$1",null,2,0,null,121,"call"]},
+qU:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+bL:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+wX:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+Ro:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+pW:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
 oq:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x
-z=J.x(a)
-if(!!z.$iscn){N.QM("").hh(a.LD)
-return}y=this.a
+z=J.t(a)
+if(!!z.$iscn){N.QM("").YX(a.y)
+return}y=this.Q
 y.V1(0)
-for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
-y.u(0,J.eS(x),x)}return y},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-y1:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+for(z=J.Nx(z.p(a,"members"));z.D();){x=z.gk()
+y.q(0,J.eS(x),x)}return y},"$1",null,2,0,null,121,"call"]},
+y17:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+return z.Z6("metrics/vm",z.lZ)},"$1",null,2,0,null,15,"call"]},
 vO:{
-"^":"af;RF,V0,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)},
+"^":"af;x,Q,a,b,c,d,e,f,r,cy$,db$",
+gjm:function(){return(J.mG(this.b,"Class")||J.mG(this.b,"Function")||J.mG(this.b,"Field"))&&!J.co(this.a,$.RQ)},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x
-this.qu=!c
-z=this.RF
+bF:function(a,b,c){var z,y,x
+this.d=!c
+z=this.x
 z.V1(0)
 z.FV(0,b)
-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)},
-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.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.LL.t(0,b)},
-u:function(a,b,c){this.RF.u(0,b,c)
+y=z.Q
+x=y.p(0,"name")
+this.e=this.ct(0,C.YS,this.e,x)
+y=y.NZ(0,"vmName")?y.p(0,"vmName"):this.e
+this.f=this.ct(0,C.KS,this.f,y)
+D.kT(z,this.Q)},
+FV:function(a,b){return this.x.FV(0,b)},
+V1:function(a){return this.x.V1(0)},
+NZ:function(a,b){return this.x.Q.NZ(0,b)},
+aN:function(a,b){return this.x.Q.aN(0,b)},
+Rz:function(a,b){return this.x.Rz(0,b)},
+p:function(a,b){return this.x.Q.p(0,b)},
+q:function(a,b,c){this.x.q(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.LL
-return z.gB(z)===0},
-gor:function(a){var z=this.RF.LL
-return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.LL
+gl0:function(a){var z=this.x.Q
+return z.gv(z)===0},
+gor:function(a){var z=this.x.Q
+return z.gv(z)!==0},
+gvc:function(a){var z=this.x.Q
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.LL
+gUQ:function(a){var z=this.x.Q
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.LL
-return z.gB(z)},
-HC:[function(a){var z=this.RF
+gv:function(a){var z=this.x.Q
+return z.gv(z)},
+HC:[function(a){var z=this.x
 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)},
-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
+SZ:function(a,b){var z=this.x
+return z.SZ(z,b)},
+ct:function(a,b,c,d){return F.Wi(this.x,b,c,d)},
+Tr:[function(a){return},"$0","gcm",0,0,1],
+dt:[function(a){this.x.cy$=null
+return},"$0","gl1",0,0,1],
+gqh:function(a){var z=this.x
 return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.Vg
-if(z!=null){y=z.iE
+z=this.x.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
+X:[function(a){return"ServiceMap("+H.d(this.x)+")"},"$0","gCR",0,0,0],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
-$isT8:true,
-$asT8:function(){return[null,null]},
+$isw:true,
+$asw:function(){return[null,null]},
 $isd3:true,
 static:{"^":"RQ"}},
 cn:{
-"^":"wVq;I0,LD,jo,Ne,Vg,fn,V0,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)},
-R5:function(a,b,c){var z,y,x
+"^":"wVq;x,y,z,ch,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+gja:function(a){return this.z},
+sja:function(a,b){this.z=F.Wi(this,C.ne,this.z,b)},
+bF: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
-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"))
-this.Ne=F.Wi(this,C.HO,this.Ne,z)
-z="DartError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+y=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,y)
+y=this.Q
+x=D.Nl(y,z.p(b,"exception"))
+this.z=F.Wi(this,C.ne,this.z,x)
+z=D.Nl(y,z.p(b,"stacktrace"))
+this.ch=F.Wi(this,C.Yh,this.ch,z)
+z="DartError "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"DartError("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $iscn:true},
 wVq:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gfY:function(a){return this.I0},
-gG1:function(a){return this.LD},
-R5:function(a,b,c){var z,y
-this.qu=!0
+"^":"dZL;x,y,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+bF:function(a,b,c){var z,y
+this.d=!0
 z=J.U6(b)
-y=z.t(b,"kind")
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-z=z.t(b,"message")
-this.LD=F.Wi(this,C.pX,this.LD,z)
-z="ServiceError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"ServiceError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+z=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,z)
+z="ServiceError "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"ServiceError("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $isN7:true},
 dZL:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,fn,V0,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},
-R5:function(a,b,c){var z,y
+"^":"w8F;x,y,z,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+gS4:function(a){return this.z},
+bF: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)
-y=z.t(b,"message")
-this.LD=F.Wi(this,C.pX,this.LD,y)
-z=z.t(b,"response")
-this.IV=F.Wi(this,C.F3,this.IV,z)
-z="ServiceException "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"ServiceException("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+y=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,y)
+z=z.p(b,"response")
+this.z=F.Wi(this,C.F3,this.z,z)
+z="ServiceException "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"ServiceException("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $isIx:true},
 w8F:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,ZK,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gfG:function(a){return this.eq},
-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},
-R5:function(a,b,c){var z,y
-this.qu=!0
-D.kT(b,this.V0)
+"^":"V4b;x,y,z,ch,cx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfG:function(a){return this.x},
+gYZ:function(){return this.y},
+gja:function(a){return this.z},
+sja:function(a,b){this.z=F.Wi(this,C.ne,this.z,b)},
+gRn:function(a){return this.ch},
+gAv:function(){return this.cx},
+bF:function(a,b,c){var z,y
+this.d=!0
+D.kT(b,this.Q)
 z=J.U6(b)
-y=z.t(b,"eventType")
-y=F.Wi(this,C.qR,this.eq,y)
-this.eq=y
+y=z.p(b,"eventType")
+y=F.Wi(this,C.qR,this.x,y)
+this.x=y
 y="ServiceEvent "+H.d(y)
-y=this.ct(this,C.YS,this.bN,y)
-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.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
-z="ServiceEvent of type "+H.d(this.eq)+" with "
-y=this.ZK
-return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,73],
+y=this.ct(this,C.YS,this.e,y)
+this.e=y
+this.f=this.ct(this,C.KS,this.f,y)
+if(z.p(b,"breakpoint")!=null){y=z.p(b,"breakpoint")
+this.y=F.Wi(this,C.hR,this.y,y)}if(z.p(b,"exception")!=null){y=z.p(b,"exception")
+this.z=F.Wi(this,C.ne,this.z,y)}if(z.p(b,"_data")!=null){y=z.p(b,"_data")
+this.ch=F.Wi(this,C.ee,this.ch,y)}if(z.p(b,"count")!=null){z=z.p(b,"count")
+this.cx=F.Wi(this,C.o9,this.cx,z)}},
+X:[function(a){var z,y
+z="ServiceEvent of type "+H.d(this.x)+" with "
+y=this.ch
+return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,0],
 $isMk:true},
 V4b:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gO3:function(a){return this.dj},
+"^":"rG9;x,Pb:y<,XR:z<,DD:ch>,Z3:cx<,jV:cy<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gO3:function(a){return this.x},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w,v
+bF:function(a,b,c){var z,y,x,w
 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
+y=z.p(b,"url")
+x=F.Wi(this,C.Fh,this.x,y)
+this.x=x
+if(J.co(x,"file://")||J.co(this.x,"http://")){y=this.x
 w=J.U6(y)
-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)
+x=w.yn(y,w.cn(y,"/")+1)}y=z.p(b,"name")
+y=this.ct(this,C.YS,this.e,y)
+this.e=y
+if(J.FN(y)===!0)this.e=this.ct(this,C.YS,this.e,x)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-y=this.Bm
+this.d=!0
+D.kT(b,J.wg(this.Q))
+y=this.y
 y.V1(y)
-w=J.dF(z.t(b,"imports")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.p(b,"imports")).br(0)
+C.Nm.uy(w,"sort")
+H.ig(w,D.I8())
 y.FV(0,w)
-y=this.XR
+w=this.z
+w.V1(w)
+y=J.Ij(z.p(b,"scripts")).br(0)
+C.Nm.uy(y,"sort")
+H.ig(y,D.I8())
+w.FV(0,y)
+y=this.ch
 y.V1(y)
-w=J.dF(z.t(b,"scripts")).br(0)
-H.ig(w,D.E0())
-y.FV(0,w)
-y=this.DD
+y.FV(0,z.p(b,"classes"))
+y.GT(y,D.I8())
+y=this.cx
 y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y.GT(y,D.E0())
-y=this.Z3
+y.FV(0,z.p(b,"variables"))
+y.GT(y,D.I8())
+y=this.cy
 y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y.GT(y,D.E0())
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())},
-bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
+y.FV(0,z.p(b,"functions"))
+y.GT(y,D.I8())},
+X:[function(a){return"Library("+H.d(this.x)+")"},"$0","gCR",0,0,0],
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
 rG9:{
-"^":"T5W+Pi;",
+"^":"T5W+Piz;",
 $isd3:true},
-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)},
-gfj:function(){return this.wY}},
+qp:{
+"^":"Piz;Q,a,cy$,db$",
+gWt:function(a){return this.Q},
+sWt:function(a,b){this.Q=F.Wi(this,C.yB,this.Q,b)},
+gET:function(){return this.a}},
 Iy:{
-"^":"a;EJ<,l<",
+"^":"a;EJ:Q<,k:a<",
 eC:function(a){var z,y,x
-z=this.EJ
+z=this.Q
 y=J.U6(a)
-x=y.t(a,6)
-z.wf=F.Wi(z,C.yB,z.wf,x)
-x=y.t(a,7)
-z.wY=F.Wi(z,C.hN,z.wY,x)
-x=this.l
-z=J.WB(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.WB(y.t(a,3),y.t(a,5))
-x.wY=F.Wi(x,C.hN,x.wY,y)},
+x=y.p(a,6)
+z.Q=F.Wi(z,C.yB,z.Q,x)
+x=y.p(a,7)
+z.a=F.Wi(z,C.hN,z.a,x)
+x=this.a
+z=J.WB(y.p(a,2),y.p(a,4))
+x.Q=F.Wi(x,C.yB,x.Q,z)
+y=J.WB(y.p(a,3),y.p(a,5))
+x.a=F.Wi(x,C.hN,x.a,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,V0,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},
-gRs:function(){return this.GQ},
-geh:function(){return this.J1},
-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},
-skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
+"^":"cOr;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,UY:fy<,xQ:go<,id,tJ:k1<,jV:k2<,k3,p2:k4<,LT:r1<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gHt:function(a){return this.x},
+sHt:function(a,b){this.x=F.Wi(this,C.EV,this.x,b)},
+gtu:function(a){return this.y},
+stu:function(a,b){this.y=F.Wi(this,C.PX,this.y,b)},
+gvo:function(){return this.z},
+gRh:function(){return this.ch},
+geh:function(){return this.cy},
+gVF:function(){return this.dx},
+sVF:function(a){this.dx=F.Wi(this,C.dA,this.dx,a)},
+gLK:function(){return this.dy},
+sLK:function(a){this.dy=F.Wi(this,C.Fe,this.dy,a)},
+gkc:function(a){return this.fr},
+skc:function(a,b){this.fr=F.Wi(this,C.yh,this.fr,b)},
 gMp:function(){var z,y
-z=this.UY
-y=z.EJ
-if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1
-if(z){z=this.xQ
-y=z.EJ
-if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1}else z=!1
+z=this.fy
+y=z.Q
+if(J.mG(y.Q,0)&&J.mG(y.a,0)){z=z.a
+z=J.mG(z.Q,0)&&J.mG(z.a,0)}else z=!1
+if(z){z=this.go
+y=z.Q
+if(J.mG(y.Q,0)&&J.mG(y.a,0)){z=z.a
+z=J.mG(z.Q,0)&&J.mG(z.a,0)}else z=!1}else z=!1
 return z},
-gAY:function(){return this.k9},
-sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
+gAY:function(){return this.k3},
+sAY:function(a){this.k3=F.Wi(this,C.FZ,this.k3,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w
+bF: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)
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+y=H.BU(J.ZZ(this.a,8),null,null)
+this.fx=F.Wi(this,C.qo,this.fx,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-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")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"abstract")
-this.Lh=F.Wi(this,C.XH,this.Lh,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"finalized")
-this.GU=F.Wi(this,C.WV,this.GU,y)
-y=z.t(b,"patch")
-this.J1=F.Wi(this,C.XL,this.J1,y)
-y=z.t(b,"implemented")
-this.E8=F.Wi(this,C.tA,this.E8,y)
-y=z.t(b,"tokenPos")
-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.LT
+this.d=!0
+D.kT(b,J.wg(this.Q))
+if(!!J.t(z.p(b,"library")).$isU4){y=z.p(b,"library")
+this.x=F.Wi(this,C.EV,this.x,y)}else this.x=F.Wi(this,C.EV,this.x,null)
+y=z.p(b,"script")
+this.y=F.Wi(this,C.PX,this.y,y)
+y=z.p(b,"abstract")
+this.z=F.Wi(this,C.XH,this.z,y)
+y=z.p(b,"const")
+this.ch=F.Wi(this,C.Nr,this.ch,y)
+y=z.p(b,"finalized")
+this.cx=F.Wi(this,C.yz,this.cx,y)
+y=z.p(b,"patch")
+this.cy=F.Wi(this,C.XL,this.cy,y)
+y=z.p(b,"implemented")
+this.db=F.Wi(this,C.Ih,this.db,y)
+y=z.p(b,"tokenPos")
+this.dx=F.Wi(this,C.dA,this.dx,y)
+y=z.p(b,"endTokenPos")
+this.dy=F.Wi(this,C.Fe,this.dy,y)
+y=this.r1
 y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.E0())
-y=this.tJ
+y.FV(0,z.p(b,"subclasses"))
+y.GT(y,D.I8())
+y=this.k1
 y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y.GT(y,D.E0())
-y=this.mu
+y.FV(0,z.p(b,"fields"))
+y.GT(y,D.I8())
+y=this.k2
 y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())
-y=z.t(b,"super")
-y=F.Wi(this,C.FZ,this.k9,y)
-this.k9=y
-if(y!=null&&J.xC(J.DA(y),"Object"))this.k9.u2(this)
-y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-x=z.t(b,"allocationStats")
+y.FV(0,z.p(b,"functions"))
+y.GT(y,D.I8())
+y=z.p(b,"super")
+y=F.Wi(this,C.FZ,this.k3,y)
+this.k3=y
+if(y!=null&&J.mG(J.DA(y),"Object"))this.k3.u2(this)
+y=z.p(b,"error")
+this.fr=F.Wi(this,C.yh,this.fr,y)
+x=z.p(b,"allocationStats")
 if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))
-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.LT
+this.fy.eC(z.p(x,"new"))
+this.go.eC(z.p(x,"old"))
+y=this.id
+w=z.p(x,"promotedInstances")
+y.Q=F.Wi(y,C.yB,y.Q,w)
+z=z.p(x,"promotedBytes")
+y.a=F.Wi(y,C.hN,y.a,z)}},
+u2:function(a){var z=this.r1
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.E0())},
-cv:function(a){return J.aT(this.V0).cv(J.WB(this.TU,"/"+H.d(a)))},
-bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
+z.GT(z,D.I8())},
+cv:function(a){return J.wg(this.Q).cv(J.WB(this.a,"/"+H.d(a)))},
+X:[function(a){return"Class("+H.d(this.f)+")"},"$0","gCR",0,0,0],
 $isdy:true},
 ZzQ:{
 "^":"af+boh;"},
 cOr:{
-"^":"ZzQ+Pi;",
+"^":"ZzQ+Piz;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,V0,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)},
-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.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)},
-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)},
-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},
-sCM:function(a){this.TG=F.Wi(this,C.Tc,this.TG,a)},
-gnl:function(a){return this.tk},
-snl:function(a,b){this.tk=F.Wi(this,C.z6,this.tk,b)},
-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},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.V0))
+"^":"Zqa;x,y,z,ch,cx,cy,px:db@,dx,dy,fr,fx,fy,go,id,k1,k2,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
+gHD:function(){return this.z},
+gae:function(){return this.ch},
+gwz:function(){return this.cx},
+swz:function(a){this.cx=F.Wi(this,C.aw,this.cx,a)},
+gu5:function(){return this.cy},
+su5:function(a){this.cy=F.Wi(this,C.mM,this.cy,a)},
+goc:function(a){return this.db},
+soc:function(a,b){this.db=F.Wi(this,C.YS,this.db,b)},
+gv:function(a){return this.dx},
+sv:function(a,b){this.dx=F.Wi(this,C.Wn,this.dx,b)},
+gQR:function(){return this.dy},
+sQR:function(a){this.dy=F.Wi(this,C.hx,this.dy,a)},
+gtJ:function(){return this.fr},
+stJ:function(a){this.fr=F.Wi(this,C.fV,this.fr,a)},
+gDm:function(){return this.fx},
+gnS:function(a){return this.fy},
+snS:function(a,b){this.fy=F.Wi(this,C.mw,this.fy,b)},
+gCM:function(){return this.id},
+sCM:function(a){this.id=F.Wi(this,C.Tc,this.id,a)},
+gG3:function(a){return this.k1},
+sG3:function(a,b){this.k1=F.Wi(this,C.z6,this.k1,b)},
+gM:function(a){return this.k2},
+sM:function(a,b){this.k2=F.Wi(this,C.zd,this.k2,b)},
+gBF:function(){return this.cx!=null},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=z.t(b,"valueAsString")
-this.lA=F.Wi(this,C.Db,this.lA,y)
-y=J.xC(z.t(b,"valueAsStringIsTruncated"),!0)
-this.fQ=F.Wi(this,C.aF,this.fQ,y)
-y=z.t(b,"closureFunc")
-this.ni=F.Wi(this,C.aw,this.ni,y)
-y=z.t(b,"closureCtxt")
-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")
-this.cM=F.Wi(this,C.Wn,this.cM,y)
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=z.p(b,"valueAsString")
+this.z=F.Wi(this,C.Db,this.z,y)
+y=J.mG(z.p(b,"valueAsStringIsTruncated"),!0)
+this.ch=F.Wi(this,C.aF,this.ch,y)
+y=z.p(b,"closureFunc")
+this.cx=F.Wi(this,C.aw,this.cx,y)
+y=z.p(b,"closureCtxt")
+this.cy=F.Wi(this,C.mM,this.cy,y)
+y=z.p(b,"name")
+this.db=F.Wi(this,C.YS,this.db,y)
+y=z.p(b,"length")
+this.dx=F.Wi(this,C.Wn,this.dx,y)
 if(c)return
-y=z.t(b,"nativeFields")
-this.dG=F.Wi(this,C.uw,this.dG,y)
-y=z.t(b,"fields")
-this.oI=F.Wi(this,C.fV,this.oI,y)
-y=z.t(b,"elements")
-this.Rf=F.Wi(this,C.mw,this.Rf,y)
-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.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.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]},
+y=z.p(b,"nativeFields")
+this.fx=F.Wi(this,C.uw,this.fx,y)
+y=z.p(b,"fields")
+this.fr=F.Wi(this,C.fV,this.fr,y)
+y=z.p(b,"elements")
+this.fy=F.Wi(this,C.mw,this.fy,y)
+y=z.p(b,"type_class")
+this.dy=F.Wi(this,C.hx,this.dy,y)
+y=z.p(b,"user_name")
+this.go=F.Wi(this,C.ct,this.go,y)
+y=z.p(b,"referent")
+this.id=F.Wi(this,C.Tc,this.id,y)
+y=z.p(b,"key")
+this.k1=F.Wi(this,C.z6,this.k1,y)
+z=z.p(b,"value")
+this.k2=F.Wi(this,C.zd,this.k2,z)
+this.d=!0},
+X:[function(a){var z=this.z
+return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.x)))+")"},"$0","gCR",0,0,0]},
 Zqa:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,V0,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)},
-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)},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.V0))
+"^":"D3i;x,y,z,ch,cx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
+gqH:function(){return this.z},
+sqH:function(a){this.z=F.Wi(this,C.BV,this.z,a)},
+gv:function(a){return this.ch},
+sv:function(a,b){this.ch=F.Wi(this,C.Wn,this.ch,b)},
+gZ3:function(){return this.cx},
+sZ3:function(a){this.cx=F.Wi(this,C.xw,this.cx,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=z.t(b,"length")
-this.cM=F.Wi(this,C.Wn,this.cM,y)
-y=z.t(b,"parent")
-this.Jx=F.Wi(this,C.BV,this.Jx,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=z.p(b,"length")
+this.ch=F.Wi(this,C.Wn,this.ch,y)
+y=z.p(b,"parent")
+this.z=F.Wi(this,C.BV,this.z,y)
 if(c)return
-y=z.t(b,"class")
-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.qu=!0},
-bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+z=z.p(b,"variables")
+this.cx=F.Wi(this,C.xw,this.cx,z)
+this.d=!0},
+X:[function(a){return"Context("+H.d(this.ch)+")"},"$0","gCR",0,0,0]},
 D3i:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
-ma:{
-"^":"a;Sf",
-bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-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",Ih:function(a){switch(a){case"kRegularFunction":return $.qu()
-case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.xW()
-case"kSetterFunction":return $.Kw()
+r2:{
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,77],
+Q2:function(){return C.Nm.tg([$.Ps(),$.Nk(),$.PY(),$.dh()],this)},
+static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Pc,Ll,fJ,bt,dQ,Oq,Gh,XK",Hn:function(a){switch(a){case"kRegularFunction":return $.xK()
+case"kClosureFunction":return $.HU()
+case"kGetterFunction":return $.rQ()
+case"kSetterFunction":return $.en()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
-case"kStaticInitializer":return $.y5()
-case"kMethodExtractor":return $.Ot()
+case"kStaticInitializer":return $.aC()
+case"kMethodExtractor":return $.kL()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.f6()
-case"Collected":return $.b1()
-case"Native":return $.YK()
-case"Tag":return $.zx()
-case"Reused":return $.dh()}return $.lC()}}},
+case"kInvokeFieldDispatcher":return $.bh()
+case"Collected":return $.Ps()
+case"Native":return $.Nk()
+case"Tag":return $.PY()
+case"Reused":return $.dh()}return $.h4()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,V0,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},
-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.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},
-stT:function(a,b){this.v5=F.Wi(this,C.i4,this.v5,b)},
-gjW:function(){return this.NM},
-sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
-gW1:function(){return this.vf},
-gho:function(){return this.H7},
-gfY:function(a){return this.I0},
-guh:function(){return this.XN},
-gUx:function(){return this.Ni},
-gSu:function(){return this.kE},
-gMA:function(){return this.Z4},
-R5:function(a,b,c){var z,y
+"^":"S6L;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,id,k1,k2,k3,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gP2:function(){return this.x},
+sP2:function(a){this.x=F.Wi(this,C.YV,this.x,a)},
+gxH:function(){return this.y},
+sxH:function(a){this.y=F.Wi(this,C.If,this.y,a)},
+gFo:function(){return this.z},
+gRh:function(){return this.ch},
+geT:function(a){return this.cx},
+seT:function(a,b){this.cx=F.Wi(this,C.nX,this.cx,b)},
+gtu:function(a){return this.cy},
+stu:function(a,b){this.cy=F.Wi(this,C.PX,this.cy,b)},
+gVF:function(){return this.db},
+sVF:function(a){this.db=F.Wi(this,C.dA,this.db,a)},
+gLK:function(){return this.dx},
+sLK:function(a){this.dx=F.Wi(this,C.Fe,this.dx,a)},
+gtT:function(a){return this.dy},
+stT:function(a,b){this.dy=F.Wi(this,C.i4,this.dy,b)},
+gjW:function(){return this.fr},
+sjW:function(a){this.fr=F.Wi(this,C.OU,this.fr,a)},
+gW1:function(){return this.fx},
+gxL:function(){return this.fy},
+gfY:function(a){return this.go},
+gOs:function(){return this.id},
+gUx:function(){return this.k1},
+gSu:function(){return this.k2},
+gni:function(){return this.k3},
+bF: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.aT(this.V0))
-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
-this.EG=F.Wi(this,C.If,this.EG,y)
-y=D.Ih(z.t(b,"kind"))
-y=F.Wi(this,C.Lc,this.I0,y)
-this.I0=y
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+D.kT(b,J.wg(this.Q))
+y=z.NZ(b,"owningClass")===!0?z.p(b,"owningClass"):null
+this.x=F.Wi(this,C.YV,this.x,y)
+y=z.NZ(b,"owningLibrary")===!0?z.p(b,"owningLibrary"):null
+this.y=F.Wi(this,C.If,this.y,y)
+y=D.Hn(z.p(b,"kind"))
+y=F.Wi(this,C.Lc,this.go,y)
+this.go=y
 y=y.Q2()
-this.Z4=F.Wi(this,C.a0,this.Z4,!y)
+this.k3=F.Wi(this,C.a0,this.k3,!y)
 if(c)return
-y=z.t(b,"static")
-this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"parent")
-this.fd=F.Wi(this,C.nX,this.fd,y)
-y=z.t(b,"script")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"tokenPos")
-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.UW(z.t(b,"code"))
-this.v5=F.Wi(this,C.i4,this.v5,y)
-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)
-y=z.t(b,"inlinable")
-this.H7=F.Wi(this,C.MY,this.H7,y)
-y=z.t(b,"deoptimizations")
-this.XN=F.Wi(this,C.eR,this.XN,y)
-z=z.t(b,"usageCounter")
-this.kE=F.Wi(this,C.yv,this.kE,z)
-z=this.fd
-if(z==null){z=this.Pp
-z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-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)}},
+y=z.p(b,"static")
+this.z=F.Wi(this,C.AT,this.z,y)
+y=z.p(b,"const")
+this.ch=F.Wi(this,C.Nr,this.ch,y)
+y=z.p(b,"parent")
+this.cx=F.Wi(this,C.nX,this.cx,y)
+y=z.p(b,"script")
+this.cy=F.Wi(this,C.PX,this.cy,y)
+y=z.p(b,"tokenPos")
+this.db=F.Wi(this,C.dA,this.db,y)
+y=z.p(b,"endTokenPos")
+this.dx=F.Wi(this,C.Fe,this.dx,y)
+y=D.vQ(z.p(b,"code"))
+this.dy=F.Wi(this,C.i4,this.dy,y)
+y=D.vQ(z.p(b,"unoptimizedCode"))
+this.fr=F.Wi(this,C.OU,this.fr,y)
+y=z.p(b,"optimizable")
+this.fx=F.Wi(this,C.Vl,this.fx,y)
+y=z.p(b,"inlinable")
+this.fy=F.Wi(this,C.MY,this.fy,y)
+y=z.p(b,"deoptimizations")
+this.id=F.Wi(this,C.eR,this.id,y)
+z=z.p(b,"usageCounter")
+this.k2=F.Wi(this,C.yv,this.k2,z)
+z=this.cx
+if(z==null){z=this.x
+z=z!=null?H.d(J.DA(z))+"."+H.d(this.e):this.e
+this.k1=F.Wi(this,C.AO,this.k1,z)}else{z=H.d(z.gUx())+"."+H.d(this.e)
+this.k1=F.Wi(this,C.AO,this.k1,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
 S6L:{
-"^":"wvY+Pi;",
+"^":"wvY+Piz;",
 $isd3:true},
 xB:{
-"^":"Pqb;qy,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,ne,ar,eH,Vg,fn,V0,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},
-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)},
-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.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.V0))
+"^":"Pqb;x,y,z,ch,cx,cy,px:db@,GR:dx@,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gXP:function(){return this.x},
+sXP:function(a){this.x=F.Wi(this,C.Yp,this.x,a)},
+gOF:function(){return this.y},
+sOF:function(a){this.y=F.Wi(this,C.yC,this.y,a)},
+gFo:function(){return this.z},
+gV5:function(a){return this.ch},
+gRh:function(){return this.cx},
+gM:function(a){return this.cy},
+sM:function(a,b){this.cy=F.Wi(this,C.zd,this.cy,b)},
+goc:function(a){return this.db},
+soc:function(a,b){this.db=F.Wi(this,C.YS,this.db,b)},
+gzz:function(){return this.dx},
+szz:function(a){this.dx=F.Wi(this,C.KS,this.dx,a)},
+gRl:function(){return this.dy},
+gZD:function(){return this.fr},
+sZD:function(a){this.fr=F.Wi(this,C.ft,this.fr,a)},
+gtu:function(a){return this.fy},
+stu:function(a,b){this.fy=F.Wi(this,C.PX,this.fy,b)},
+gVF:function(){return this.go},
+sVF:function(a){this.go=F.Wi(this,C.dA,this.go,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 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.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")
-this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"final")
-this.f3=F.Wi(this,C.dR,this.f3,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"value")
-this.FA=F.Wi(this,C.zd,this.FA,y)
+y=z.p(b,"name")
+this.db=F.Wi(this,C.YS,this.db,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.db
+this.dx=F.Wi(this,C.KS,this.dx,y)
+y=z.p(b,"owner")
+this.x=F.Wi(this,C.Yp,this.x,y)
+y=z.p(b,"declaredType")
+this.y=F.Wi(this,C.yC,this.y,y)
+y=z.p(b,"static")
+this.z=F.Wi(this,C.AT,this.z,y)
+y=z.p(b,"final")
+this.ch=F.Wi(this,C.dR,this.ch,y)
+y=z.p(b,"const")
+this.cx=F.Wi(this,C.Nr,this.cx,y)
+y=z.p(b,"value")
+this.cy=F.Wi(this,C.zd,this.cy,y)
 if(c)return
-y=z.t(b,"guardNullable")
-this.ND=F.Wi(this,C.dr,this.ND,y)
-y=z.t(b,"guardClass")
-this.lw=F.Wi(this,C.ft,this.lw,y)
-y=z.t(b,"guardLength")
-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.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],
+y=z.p(b,"guardNullable")
+this.dy=F.Wi(this,C.dr,this.dy,y)
+y=z.p(b,"guardClass")
+this.fr=F.Wi(this,C.ft,this.fr,y)
+y=z.p(b,"guardLength")
+this.fx=F.Wi(this,C.fX,this.fx,y)
+y=z.p(b,"script")
+this.fy=F.Wi(this,C.PX,this.fy,y)
+z=z.p(b,"tokenPos")
+this.go=F.Wi(this,C.dA,this.go,z)
+this.d=!0},
+X:[function(a){return"Field("+H.d(J.DA(this.x))+"."+H.d(this.db)+")"},"$0","gCR",0,0,0],
 $isxB:true},
 Pqb:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 c2:{
-"^":"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},
-sqr:function(a){var z=this.Yp
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
+"^":"Piz;tu:Q>,Rd:a>,a4:b>,c,d,e,cy$,db$",
+gc1:function(){return this.c},
+sc1:function(a){this.c=F.Wi(this,C.Ss,this.c,a)},
+gqr:function(){return this.d},
+sqr:function(a){var z=this.d
+if(this.gnz(this)&&!J.mG(z,a)){z=new T.qI(this,C.M,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.Yp=a},
-gj9:function(){return this.am},
-sj9:function(a){this.am=F.Wi(this,C.Jf,this.am,a)},
+this.SZ(this,z)}this.d=a},
+gj9:function(){return this.e},
+sj9:function(a){this.e=F.Wi(this,C.Jf,this.e,a)},
 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.aT(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+z=D.y8(this.b)
+this.e=F.Wi(this,C.Jf,this.e,!z)
+for(z=this.Q,y=J.Nx(J.Tf(J.wg(z.Q).gis(),"breakpoints")),x=this.a;y.D();){w=y.gk()
 v=J.U6(w)
-u=J.UQ(v.t(w,"location"),"script")
-t=J.UQ(v.t(w,"location"),"tokenPos")
-if(J.xC(u,z)&&J.xC(u.q6(t),x)){v=this.Yp
-if(this.gnz(this)&&!J.xC(v,w)){v=new T.qI(this,C.WC,v,w)
+u=J.Tf(v.p(w,"location"),"script")
+t=J.Tf(v.p(w,"location"),"tokenPos")
+if(J.mG(u,z)&&J.mG(u.q6(t),x)){v=this.d
+if(this.gnz(this)&&!J.mG(v,w)){v=new T.qI(this,C.M,v,w)
 v.$builtinTypeInfo=[null]
-this.nq(this,v)}this.Yp=w}}},
+this.SZ(this,v)}this.d=w}}},
 $isc2:true,
 static:{Fu:function(a){var z,y
-z=J.x(a)
-if(z.n(a,"else"))return!0
+z=J.t(a)
+if(z.m(a,"else"))return!0
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
+for(;y.D();)switch(y.c){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.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))
+z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
+for(y=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.D();){x=J.BQ(y.c,new H.VR("(\\b)",H.Vq("(\\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.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.D();)if(!D.Fu(w.c))return!1}return!0},Yo: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,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,V0,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)},
+"^":"vix;Gd:x>,y,z,ch,cx,cy,db,dx,dy,fr,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.z},
+gxH:function(){return this.cy},
+sxH:function(a){this.cy=F.Wi(this,C.If,this.cy,a)},
 gjm:function(){return!0},
 gM8:function(){return!0},
-Vw:function(a){var z,y
-z=J.bI(a,1)
-y=this.Gd.XG
+rK:function(a){var z,y
+z=J.D5(a,1)
+y=this.x.b
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
-q6:function(a){return this.MO.t(0,a)},
-R5:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.V0))
+q6:function(a){return this.dy.p(0,a)},
+bF:function(a,b,c){var z,y,x
+D.kT(b,J.wg(this.Q))
 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
+y=z.p(b,"kind")
+this.z=F.Wi(this,C.Lc,this.z,y)
+y=z.p(b,"name")
+this.dx=y
 x=J.U6(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)
+y=x.yn(y,x.cn(y,"/")+1)
+this.db=y
+this.e=this.ct(this,C.YS,this.e,y)
+y=this.dx
+this.f=this.ct(this,C.KS,this.f,y)
 if(c)return
-this.Aj(z.t(b,"source"))
-this.YG(z.t(b,"tokenPosTable"))
-z=z.t(b,"owningLibrary")
-this.EG=F.Wi(this,C.If,this.EG,z)},
+this.Aj(z.p(b,"source"))
+this.YG(z.p(b,"tokenPosTable"))
+z=z.p(b,"owningLibrary")
+this.cy=F.Wi(this,C.If,this.cy,z)},
 YG:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
-z=this.MO
+z=this.dy
 z.V1(0)
-y=this.aQ
+y=this.fr
 y.V1(0)
-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()
+this.ch=F.Wi(this,C.Gd,this.ch,null)
+this.cx=F.Wi(this,C.qa,this.cx,null)
+x=P.fM(null,null,null,null)
+for(w=J.Nx(a);w.D();){v=w.gk()
 u=J.U6(v)
-t=u.t(v,0)
+t=u.p(v,0)
 x.h(0,t)
 s=1
-while(!0){r=u.gB(v)
-if(typeof r!=="number")return H.s(r)
+while(!0){r=u.gv(v)
+if(typeof r!=="number")return H.o(r)
 if(!(s<r))break
-q=u.t(v,s)
-p=u.t(v,s+1)
-r=this.E4
-if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
+q=u.p(v,s)
+p=u.p(v,s+1)
+r=this.ch
+if(r==null){if(this.gnz(this)&&!J.mG(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.E4=q
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+this.SZ(this,r)}this.ch=q
+r=this.cx
+if(this.gnz(this)&&!J.mG(r,q)){r=new T.qI(this,C.qa,r,q)
 r.$builtinTypeInfo=[null]
-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)
+this.SZ(this,r)}this.cx=q}else{r=J.W1(r,q)?this.ch:q
+o=this.ch
+if(this.gnz(this)&&!J.mG(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-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.kA,o,r)
+this.SZ(this,o)}this.ch=r
+r=J.u6(this.cx,q)?this.cx:q
+o=this.cx
+if(this.gnz(this)&&!J.mG(o,r)){o=new T.qI(this,C.qa,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.Ff
+this.SZ(this,o)}this.cx=r}z.q(0,q,t)
+y.q(0,q,p)
+s+=2}}for(z=this.x,z=z.gu(z);z.D();){v=z.c
 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)
-y=this.p3
+y=this.y
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=z.t(a,x)
-u=z.t(a,x+1)
-t=y.t(0,v)
-y.u(0,v,t!=null?J.WB(u,t):u)
+v=z.p(a,x)
+u=z.p(a,x+1)
+t=y.p(0,v)
+y.q(0,v,t!=null?J.WB(u,t):u)
 x+=2}this.f2()},
 Aj:function(a){var z,y,x,w
-this.qu=!1
+this.d=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.qu=!0
-y=this.Gd
+this.d=!0
+y=this.x
 y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.dx))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+y.h(0,D.Yo(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)))}},
+for(z=this.x,z=z.gu(z),y=this.y;z.D();){x=z.c
+x.sc1(y.p(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
 vix:{
-"^":"Vlh+Pi;",
+"^":"Vlh+Piz;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,fF<",
+"^":"a;Yu:Q<,bu:a<,fF:b<",
 $isuA:true},
-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)},
-gmE:function(){return this.up},
+xb:{
+"^":"Piz;Yu:Q<,a,VF:b<,c,fY:d>,e,f,cy$,db$",
+gtu:function(a){return this.e},
+stu:function(a,b){this.e=F.Wi(this,C.PX,this.e,b)},
+gP3:function(){return this.f},
 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","gkA",0,0,73],
-bR:function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,null)
-z=this.VF
-if(J.xC(z,-1))return
+z=this.a
+y=J.t(z)
+if(y.m(z,-1))return"N/A"
+return y.X(z)},"$0","gkA",0,0,0],
+va:function(a){var z,y
+this.e=F.Wi(this,C.PX,this.e,null)
+z=this.b
+if(J.mG(z,-1))return
 y=a.q6(z)
 if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.yO(a.Vw(y))
-this.up=F.Wi(this,C.oI,this.up,z)},
-$isZ9:true},
-Hx:{
-"^":"nla;df,MD,uH<,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+this.e=F.Wi(this,C.PX,this.e,a)
+z=J.dY(a.rK(y))
+this.f=F.Wi(this,C.oI,this.f,z)},
+$isxb:true},
+hn:{
+"^":"nla;x,y,uH:z<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=this.uH
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=this.z
 y.V1(y)
-for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+for(z=J.Nx(z.p(b,"members"));z.D();){x=z.gk()
 w=J.U6(x)
-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))}}},
+y.h(0,new D.xb(H.BU(w.p(x,"pc"),16,null),w.p(x,"deoptId"),w.p(x,"tokenPos"),w.p(x,"tryIndex"),J.Q7(w.p(x,"kind")),null,null,null,null))}}},
 nla:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 oC:{
-"^":"Pi;oc>,vH>,eb,Ml>,ePv,fY>,Vg,fn",
+"^":"Piz;oc:Q>,vH:a>,b,Jb:c>,d,fY:e>,cy$,db$",
 $isoC:true},
 Mi:{
-"^":"Fba;df,MD,uH<,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+"^":"Fba;x,y,uH:z<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=this.uH
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=this.z
 y.V1(y)
-for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+for(z=J.Nx(z.p(b,"members"));z.D();){x=z.gk()
 w=J.U6(x)
-y.h(0,new D.oC(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))}}},
+y.h(0,new D.oC(w.p(x,"name"),w.p(x,"index"),w.p(x,"beginPos"),w.p(x,"endPos"),w.p(x,"scopeId"),J.Q7(w.p(x,"kind")),null,null))}}},
 Fba:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
-RA:{
-"^":"laa;df,MD,C9,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+Ik:{
+"^":"laa;x,y,z,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y
+bF:function(a,b,c){var z,y
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-z=z.t(b,"privateKey")
-this.C9=F.Wi(this,C.rm,this.C9,z)}},
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+z=z.p(b,"privateKey")
+this.z=F.Wi(this,C.yt,this.z,z)}},
 laa:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-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
+"^":"Piz;Yu:Q<,a,u0:b<,c,uH:d<,cy$,db$",
+gSS:function(){return this.c},
+gUB:function(){return J.mG(this.Q,0)},
+gvN:function(){return this.d.b.length>0},
+dV:[function(){var z,y
+z=this.Q
+y=J.t(z)
+if(y.m(z,0))return""
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,0],
+Io:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gmQ().Q.p(0,this.Q)
 if(z==null)return""
-if(J.xC(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,221,78],
-P7:[function(a){var z
+if(J.mG(z.gfF(),z.gbu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,225,79],
+HUv:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gmQ().Q.p(0,this.Q)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,221,78],
+return D.Tn(z.gbu(),a.glt())+" ("+H.d(z.gbu())+")"},"$1","gAX",2,0,225,79],
 lF:function(){var z,y,x,w
-y=J.BQ(this.u0," ")
+y=J.BQ(this.b," ")
 x=y.length
 if(x!==2)return 0
 if(1>=x)return H.e(y,1)
@@ -20388,983 +19702,966 @@
 return x}catch(w){H.Ru(w)
 return 0}},
 pj:function(a){var z,y,x,w,v
-z=this.u0
+z=this.b
 if(!J.co(z,"j"))return
 y=this.lF()
-x=J.x(y)
-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)
+x=J.t(y)
+if(x.m(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
+return}for(z=a.b,w=0;w<z.length;++w){v=z[w]
+if(J.mG(v.gYu(),y)){z=this.c
+if(this.gnz(this)&&!J.mG(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=v
-return}}N.QM("").hh("Could not find instruction at "+x.WZ(y,16))},
+this.SZ(this,z)}this.c=v
+return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.x4(a,b),2)+"%"}}},
 WAE:{
-"^":"a;uX",
-bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
-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.yP
-else if(z.n(a,"Tag"))return C.Z7
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+static:{"^":"ql,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.t(a)
+if(z.m(a,"Native"))return C.Oc
+else if(z.m(a,"Dart"))return C.l8
+else if(z.m(a,"Collected"))return C.WA
+else if(z.m(a,"Reused"))return C.yP
+else if(z.m(a,"Tag"))return C.Ea
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
-ta:{
-"^":"a;tT>,Av<",
-$ista:true},
-D5:{
-"^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+Fc:{
+"^":"a;tT:Q>,Av:a<",
+$isFc:true},
+t9:{
+"^":"a;tT:Q>,Av:a<,wd:b>,c",
+$ist9:true},
 kx:{
-"^":"w29;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,fn,V0,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},
-gan:function(){return this.rF},
-gL1:function(){return this.fo},
-sL1:function(a){this.fo=F.Wi(this,C.zO,this.fo,a)},
-gig:function(a){return this.uG},
-sig:function(a,b){this.uG=F.Wi(this,C.nf,this.uG,b)},
-gtu:function(a){return this.ar},
-stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-goF:function(){return this.MH},
+"^":"w26;x,y,bu:z<,fF:ch<,cx,cy,db,dx,GA:dy<,mQ:fr<,fx,fy,go,id,k1,k2,k3,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+glt:function(){return this.y},
+gS7:function(){return this.fx},
+ga3:function(){return this.fy},
+gL1:function(){return this.go},
+sL1:function(a){this.go=F.Wi(this,C.zO,this.go,a)},
+gig:function(a){return this.id},
+sig:function(a,b){this.id=F.Wi(this,C.nf,this.id,b)},
+gtu:function(a){return this.k1},
+stu:function(a,b){this.k1=F.Wi(this,C.PX,this.k1,b)},
+goF:function(){return this.k2},
 gjm:function(){return!0},
 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.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,222,223],
-QW:function(){if(this.ar!=null)return
-if(!J.xC(this.I0,C.l8))return
-var z=this.uG
+this.k1=F.Wi(this,C.PX,this.k1,a)
+for(z=this.dy,z=z.gu(z);z.D();)for(y=z.c.guH(),y=y.gu(y);y.D();)y.c.va(a)},"$1","gH8",2,0,226,227],
+QW:function(){if(this.k1!=null)return
+if(!J.mG(this.x,C.l8))return
+var z=this.id
 if(z==null)return
-if(J.zE(z)==null){J.SK(this.uG).ml(new D.Ik(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)},
-ui:function(a,b,c){var z,y,x,w,v
+if(J.fx(z)==null){J.SK(this.id).ml(new D.fA(this))
+return}J.SK(J.fx(this.id)).ml(this.gH8())},
+VD:function(a){var z
+if(J.mG(this.x,C.l8))return this.BA(this)
+z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z},
+GK:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
+while(!0){x=z.gv(b)
+if(typeof x!=="number")return H.o(x)
 if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
+w=H.BU(z.p(b,y),null,null)
+v=H.BU(z.p(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.fx())},
+a.push(new D.Fc(c[w],v))
+y+=2}C.Nm.uy(a,"sort")
+H.ig(a,new D.jm())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.kr,this.xM,c)
+this.y=F.Wi(this,C.Kj,this.y,c)
 z=J.U6(a)
-this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.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.Mg(y)
-z=D.Vb0(this.fF,this.xM)+" ("+H.d(this.fF)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Vb0(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.rF=F.Wi(this,C.uU,this.rF,z)},
-R5:function(a,b,c){var z,y,x,w,v,u
+this.ch=H.BU(z.p(a,"inclusive_ticks"),null,null)
+this.z=H.BU(z.p(a,"exclusive_ticks"),null,null)
+this.GK(this.db,z.p(a,"callers"),b)
+this.GK(this.dx,z.p(a,"callees"),b)
+y=z.p(a,"ticks")
+if(y!=null)this.Zk(y)
+z=D.HP(this.ch,this.y)+" ("+H.d(this.ch)+")"
+this.fx=F.Wi(this,C.EF,this.fx,z)
+z=D.HP(this.z,this.y)+" ("+H.d(this.z)+")"
+this.fy=F.Wi(this,C.uU,this.fy,z)},
+bF: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)
-y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
-this.MH=F.Wi(this,C.pY,this.MH,y)
-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.uE=H.BU(z.t(b,"end"),16,null)
-y=this.V0
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+y=z.p(b,"optimized")!=null&&z.p(b,"optimized")
+this.k2=F.Wi(this,C.pY,this.k2,y)
+y=D.CQ(z.p(b,"kind"))
+this.x=F.Wi(this,C.Lc,this.x,y)
+this.cx=H.BU(z.p(b,"start"),16,null)
+this.cy=H.BU(z.p(b,"end"),16,null)
+y=this.Q
 x=J.RE(y)
-w=x.god(y).Qn(z.t(b,"function"))
-this.uG=F.Wi(this,C.nf,this.uG,w)
-y=x.god(y).Qn(z.t(b,"objectPool"))
-this.fo=F.Wi(this,C.zO,this.fo,y)
-v=z.t(b,"disassembly")
+w=x.god(y).Qn(z.p(b,"function"))
+this.id=F.Wi(this,C.nf,this.id,w)
+y=x.god(y).Qn(z.p(b,"objectPool"))
+this.go=F.Wi(this,C.zO,this.go,y)
+v=z.p(b,"disassembly")
 if(v!=null)this.cr(v)
-u=z.t(b,"descriptors")
-if(u!=null)this.Xd(J.UQ(u,"members"))
-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},
+u=z.p(b,"descriptors")
+if(u!=null)this.Xd(J.Tf(u,"members"))
+z=this.dy.b
+this.d=z.length!==0||!J.mG(this.x,C.l8)
+z=z.length!==0&&J.mG(this.x,C.l8)
+this.k3=F.Wi(this,C.zS,this.k3,z)},
+gUa:function(){return this.k3},
 cr:function(a){var z,y,x,w,v,u,t,s
-z=this.va
+z=this.dy
 z.V1(z)
 y=J.U6(a)
 x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-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.Z9
+v=y.p(a,x+1)
+u=y.p(a,x+2)
+t=!J.mG(y.p(a,x),"")?H.BU(y.p(a,x),null,null):0
+w=D.xb
 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.Ff.pj(z)},
+x+=3}for(y=z.gu(z);y.D();)y.c.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.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))
+y=H.BU(z.p(a,"pc"),16,null)
+x=z.p(a,"deoptId")
+w=z.p(a,"tokenPos")
+v=z.p(a,"tryIndex")
+u=J.Q7(z.p(a,"kind"))
+for(z=this.dy,z=z.gu(z);z.D();){t=z.c
+if(J.mG(t.gYu(),y)){t.guH().h(0,new D.xb(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())},
-Mg:function(a){var z,y,x,w,v
+for(z=J.Nx(a);z.D();)this.MY(z.gk())},
+Zk:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=this.n3
+y=this.fr
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=H.BU(z.t(a,x),16,null)
-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)))
+v=H.BU(z.p(a,x),16,null)
+y.q(0,v,new D.uA(v,H.BU(z.p(a,x+1),null,null),H.BU(z.p(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.uE)},
-gcE:function(){return J.xC(this.I0,C.l8)},
+return z.C(b,this.cx)&&z.w(b,this.cy)},
+gkU:function(){return J.mG(this.x,C.l8)},
 $iskx:true,
-static:{Vb0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-w29:{
-"^":"af+Pi;",
+static:{HP:function(a,b){return C.CD.Sy(100*J.x4(a,b),2)+"%"}}},
+w26:{
+"^":"af+Piz;",
 $isd3:true},
-Ik:{
-"^":"TpZ:12;a",
+fA:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.a
-y=J.zE(z.uG)
+z=this.Q
+y=J.fx(z.id)
 if(y==null)return
-J.SK(y).ml(z.gH8())},"$1",null,2,0,null,152,"call"],
-$isEH:true},
-fx:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
+J.SK(y).ml(z.gH8())},"$1",null,2,0,null,152,"call"]},
+jm:{
+"^":"r:80;",
+$2:function(a,b){return J.D5(b.gAv(),a.gAv())}},
 M9x:{
-"^":"a;uX",
-bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-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
-else if(z.n(a,"Internal"))return C.wj
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+static:{"^":"Cnk,lTU,FJy,wr",AR:function(a){var z=J.t(a)
+if(z.m(a,"Listening"))return C.Cn
+else if(z.m(a,"Normal"))return C.lT
+else if(z.m(a,"Pipe"))return C.FJ
+else if(z.m(a,"Internal"))return C.wj
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"w30;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w27;V8:x@,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,id,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 gjm:function(){return!0},
-gHY:function(){return J.xC(this.I0,C.FJ)},
-gfY:function(a){return this.I0},
-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},
-gki:function(){return this.zw},
-giP:function(){return this.tO},
-gfJ:function(){return this.HO},
-gNS:function(){return this.u8},
-gzK:function(){return this.EC},
-R5:function(a,b,c){var z,y
+gHY:function(){return J.mG(this.ch,C.FJ)},
+gfY:function(a){return this.ch},
+gA8:function(a){return this.cx},
+gm8:function(){return this.cy},
+gaU:function(){return this.db},
+gSf:function(){return this.dx},
+gzM:function(){return this.dy},
+gkE:function(){return this.fr},
+giP:function(){return this.fx},
+gmd:function(){return this.fy},
+gNS:function(){return this.go},
+guh:function(){return this.id},
+bF: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.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=D.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.p(b,"name")
+this.f=this.ct(this,C.KS,this.f,y)
+y=D.AR(z.p(b,"kind"))
+this.ch=F.Wi(this,C.Lc,this.ch,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-y=z.t(b,"readClosed")
-this.DB=F.Wi(this,C.I7,this.DB,y)
-y=z.t(b,"writeClosed")
-this.XK=F.Wi(this,C.Uy,this.XK,y)
-y=z.t(b,"closing")
-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")
-this.vu=F.Wi(this,C.AY,this.vu,y)
-y=z.t(b,"localAddress")
-this.tO=F.Wi(this,C.Lx,this.tO,y)
-y=z.t(b,"localPort")
-this.HO=F.Wi(this,C.M3,this.HO,y)
-y=z.t(b,"remoteAddress")
-this.u8=F.Wi(this,C.dx,this.u8,y)
-y=z.t(b,"remotePort")
-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.ip=z.t(b,"owner")}},
-w30:{
-"^":"af+Pi;",
+this.d=!0
+D.kT(b,J.wg(this.Q))
+y=z.p(b,"readClosed")
+this.cy=F.Wi(this,C.I7,this.cy,y)
+y=z.p(b,"writeClosed")
+this.db=F.Wi(this,C.Uy,this.db,y)
+y=z.p(b,"closing")
+this.dx=F.Wi(this,C.To,this.dx,y)
+y=z.p(b,"listening")
+this.dy=F.Wi(this,C.cc,this.dy,y)
+y=z.p(b,"protocol")
+this.cx=F.Wi(this,C.AY,this.cx,y)
+y=z.p(b,"localAddress")
+this.fx=F.Wi(this,C.Lx,this.fx,y)
+y=z.p(b,"localPort")
+this.fy=F.Wi(this,C.M3,this.fy,y)
+y=z.p(b,"remoteAddress")
+this.go=F.Wi(this,C.dx,this.go,y)
+y=z.p(b,"remotePort")
+this.id=F.Wi(this,C.ni,this.id,y)
+y=z.p(b,"fd")
+this.fr=F.Wi(this,C.R3,this.fr,y)
+this.x=z.p(b,"owner")}},
+w27:{
+"^":"af+Piz;",
 $isd3:true},
 G9:{
-"^":"a;P>,Fl<",
+"^":"a;M:Q>,Fl:a<",
 $isG9:true},
 YX:{
-"^":"w31;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w28;x,mw:y@,tB:z<,ch,cx,cy,db,dx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.wE},
-shM:function(a){this.wE=a
+ghM:function(){return this.ch},
+shM:function(a){this.ch=a
 this.Hi()},
-NT:function(a){this.Jk.h(0,a)
+Ck:function(a){this.z.h(0,a)
 this.Hi()},
 Hi:function(){var z,y,x
-z=this.Jk
-y=z.XG.length
-x=this.wE
-if(typeof x!=="number")return H.s(x)
+z=this.z
+y=z.b.length
+x=this.ch
+if(typeof x!=="number")return H.o(x)
 if(y>x)z.oq(0,0,y-x)},
-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.LV},
-R5:function(a,b,c){var z,y
+gN0:function(){return this.cx},
+gM:function(a){return this.cy},
+sM:function(a,b){this.cy=F.Wi(this,C.zd,this.cy,b)},
+gBp:function(a){return this.db},
+gA5:function(a){return this.dx},
+bF: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.t(b,"description")
-this.Qd=F.Wi(this,C.LS,this.Qd,y)
-y=z.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=z.t(b,"value")
-this.FA=F.Wi(this,C.zd,this.FA,y)
-y=z.t(b,"min")
-this.zn=F.Wi(this,C.a2,this.zn,y)
-z=z.t(b,"max")
-this.LV=F.Wi(this,C.qi,this.LV,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.p(b,"description")
+this.cx=F.Wi(this,C.LS,this.cx,y)
+y=z.p(b,"name")
+this.f=this.ct(this,C.KS,this.f,y)
+y=z.p(b,"value")
+this.cy=F.Wi(this,C.zd,this.cy,y)
+y=z.p(b,"min")
+this.db=F.Wi(this,C.a2,this.db,y)
+z=z.p(b,"max")
+this.dx=F.Wi(this,C.qi,this.dx,z)},
+X:[function(a){return"ServiceMetric("+H.d(this.a)+")"},"$0","gCR",0,0,0],
 $isYX:true},
-w31:{
-"^":"af+Pi;",
+w28:{
+"^":"af+Piz;",
 $isd3:true},
-W1:{
-"^":"a;Jb<,MT>,Cb",
-Gv:function(){var z=this.Cb
+xx:{
+"^":"a;fj:Q<,MT:a>,b",
+wE:[function(a){this.b=P.SZ(this.a,this.gia(this))},"$0","gJ",0,0,1],
+Gv:function(){var z=this.b
 if(z!=null)z.Gv()
-this.Cb=null},
-Lyg:[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)
-w.$builtinTypeInfo=[null]
-y.xf(w)}},"$1","gia",2,0,19,13],
-$isW1:true},
+this.b=null},
+Y0:[function(a,b){var z
+for(z=this.Q,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.LE(z.c).ml(new D.r6())},"$1","gia",2,0,20,15],
+$isxx:true},
 r6:{
-"^":"TpZ:12;",
-$1:[function(a){var z,y
-z=J.Vm(a)
-y=new P.iP(Date.now(),!1)
-y.EK()
-a.NT(new D.G9(z,y))},"$1",null,2,0,null,168,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){a.Ck(new D.G9(J.SW(a),new P.iP(Date.now(),!1)))},"$1",null,2,0,null,168,"call"]},
 Qf:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a",
 $2:function(a,b){var z,y
-z=J.x(b)
+z=J.t(b)
 y=!!z.$isqC
-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,{
+if(y&&D.PG(b))this.Q.q(0,a,this.a.Qn(b))
+else if(!!z.$iswn)D.f3(b,this.a)
+else if(y)D.Gf(b,this.a)}}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;eX@,A9<,oc*,w8<",
-gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+"^":"a;EH:Q@,A9:a<,oc:b*,w8:c<",
+gp8:function(){return this.a!==!0},
+Lt:function(){return P.B(["lastConnectionTime",this.Q,"chrome",this.a,"name",this.b,"networkAddress",this.c],null,null)},
 UT:function(a){var z=J.U6(a)
-this.eX=z.t(a,"lastConnectionTime")
-this.A9=z.t(a,"chrome")
-this.oc=z.t(a,"name")
-z=z.t(a,"networkAddress")
-this.w8=z
-if(this.oc==null)this.oc=z},
+this.Q=z.p(a,"lastConnectionTime")
+this.a=z.p(a,"chrome")
+this.b=z.p(a,"name")
+z=z.p(a,"networkAddress")
+this.c=z
+if(this.b==null)this.b=z},
 $isZ5:true,
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
 nm:{
-"^":"a;jO>,qT<",
+"^":"a;jO:Q>,mh:a<",
 $isnm:true},
 Uon:{
-"^":"wv;N>",
-gEH:function(){return this.Tn.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.M0()
+"^":"wv;K:k2>",
+ghX:function(){return this.id.Q},
+FZ:function(){if(!this.rx)return
+var z=this.k1
+if(z.Q.Q===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.k2.gw8()))
+z.aM(0,this)}},
+giG:function(a){return this.k1.Q},
+je:function(a){if(this.r2)this.x1.Q.close()
+this.QZ()
 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])
+if(!this.r2){this.r2=!0
+this.x1.Tc(this.k2.gw8(),this.gkQ(),this.gM3(),this.gAo(),this.gNu())}z=C.jn.X(this.r1++)
+y=P.I
+y=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[y])),[y])
 x=new L.nm(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.M0()
-this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.M0()
-this.FZ()},"$0","gCW",0,0,17],
-LNZ:[function(){var z,y
-z=this.N
-y=Date.now()
-new P.iP(y,!1).EK()
-z.seX(y)
+if(this.x1.Q.readyState===1)this.Mf(z,x)
+else this.k3.q(0,z,x)
+return y.Q},
+abp:[function(){this.QZ()
+this.FZ()},"$0","gNu",0,0,1],
+IdG:[function(){this.QZ()
+this.FZ()},"$0","gAo",0,0,1],
+LN:[function(){var z,y
+z=this.k2
+z.sEH(Date.now())
 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.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"))
-w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
-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("").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.aZ(this))
+this.rx=!0
+y=this.id
+if(y.Q.Q===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
+y.aM(0,this)}},"$0","gkQ",0,0,1],
+GF:[function(a){var z,y,x,w,v
+if(typeof a!=="string"){this.x1.OI(a).ml(new L.jF(this))
+return}z=C.xr.kV(a)
+if(z==null){N.QM("").YX("WebSocketVM got empty message")
+return}if(this.k2.gA9()===!0){y=J.U6(z)
+if(!J.mG(y.p(z,"method"),"Dart.observatoryData"))return
+x=J.Lz(J.Tf(y.p(z,"params"),"id"))
+w=J.Tf(y.p(z,"params"),"data")}else{y=J.U6(z)
+x=y.p(z,"seq")
+w=y.p(z,"response")}if(x==null){this.EM(w)
+return}v=this.k4.Rz(0,x)
+if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
+return}v.gmh().aM(0,w)},"$1","gM3",2,0,20],
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-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.")
+QZ:function(){var z=this.k4
+if(z.Q>0){N.QM("").To("Cancelling all pending requests.")
+this.ck(z)}z=this.k3
+if(z.Q>0){N.QM("").To("Cancelling all delayed requests.")
 this.ck(z)}},
-e2:function(){var z=this.WE
-if(z.X5===0)return
+e2:function(){var z=this.k3
+if(z.Q===0)return
 N.QM("").To("Sending all delayed requests.")
 z.aN(0,this.ge8())
 z.V1(0)},
 Mf:[function(a,b){var z,y
 z=J.RE(b)
-if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.Td.u(0,a,b)
-y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.Ra.bs.send(y)},"$2","ge8",4,0,224]},
+if(!J.ie(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.k2.gw8()))
+this.k4.q(0,a,b)
+y=this.k2.gA9()===!0?C.xr.KP(P.B(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.B(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.B(["seq",a,"request",z.gjO(b)],null,null))
+this.x1.Q.send(y)},"$2","ge8",4,0,228]},
 jF:{
-"^":"TpZ:225;a",
+"^":"r:229;Q",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.it)
-x=this.a
+y=z.mt(a,0,C.eL)
+x=this.Q
 w=z.gbg(a)
-v=z.gVl(a)
+v=z.grv(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.Sw(H.z4(w,v+8,y))
+u=x.ry.WJ(H.GG(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
-w=z.gVl(a)
+w=z.grv(a)
 if(typeof w!=="number")return w.g()
 z=z.gH3(a)
-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},
-aZ:{
-"^":"TpZ:226;a",
-$2:function(a,b){var z,y
-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"))
-z.Xf(y)},
-$isEH:true}}],["","",,R,{
+if(typeof z!=="number")return z.T()
+v.toString
+x.hQ(u,H.eb(v,w+t,z-t))},"$1",null,2,0,null,17,"call"]},
+dV:{
+"^":"r:230;Q",
+$2:function(a,b){b.gmh().aM(0,C.xr.KP(P.B(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null)))}}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V62;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V61;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkc:function(a){return a.RZ},
+skc:function(a,b){a.RZ=this.ct(a,C.yh,a.RZ,b)},
+static:{ZmK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V62:{
-"^":"uL+Pi;",
+V61:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V63;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)},
+"^":"V62;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gja:function(a){return a.RZ},
+sja:function(a,b){a.RZ=this.ct(a,C.ne,a.RZ,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Vd.LX(a)
 C.Vd.XI(a)
 return a}}},
-V63:{
-"^":"uL+Pi;",
+V62:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 hA:{
-"^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.P0(a,null)
-this.bs=z
-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
+"^":"a;Q",
+Tc:function(a,b,c,d,e){var z=W.D7(a,null)
+this.Q=z
+z=H.J(new W.vG(z,"close",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.lo(e)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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=H.J(new W.vG(z,"error",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.j3(d)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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=H.J(new W.vG(z,"open",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.Fz(b)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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()},
+z=H.J(new W.vG(z,"message",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.tv(c)),z.b),[H.u3(z,0)]).P6()},
+wR:function(a,b){this.Q.send(b)},
+xO:function(a){this.Q.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
-return y.gqG(y).ml(new U.OW(z))}},
+y=H.J(new W.vG(z,"loadend",!1),[null])
+return y.gtH(y).ml(new U.OW(z))}},
 lo:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.$0()},"$1",null,2,0,null,227,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,231,"call"]},
 j3:{
-"^":"TpZ:12;b",
-$1:[function(a){return this.b.$0()},"$1",null,2,0,null,228,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,232,"call"]},
 Fz:{
-"^":"TpZ:12;c",
-$1:[function(a){return this.c.$0()},"$1",null,2,0,null,228,"call"],
-$isEH:true},
-oy:{
-"^":"TpZ:229;d",
-$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,87,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,232,"call"]},
+tv:{
+"^":"r:233;Q",
+$1:[function(a){return this.Q.$1(J.ns(a))},"$1",null,2,0,null,87,"call"]},
 OW:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z,y,x,w
+z=C.MO.gyG(this.Q)
+y=J.RE(z)
+x=y.gbg(z)
+w=y.grv(z)
+y=y.gv(z)
+x.toString
+return H.eb(x,w,y)},"$1",null,2,0,null,4,"call"]},
 KM:{
-"^":"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,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Uon;id,k1,k2,k3,k4,r1,r2,rx,ry,x1,x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"wv;id,k1,k2,k3,x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 je:function(a){},
-gEH:function(){return this.eG.MM},
-giG:function(a){return this.rp.MM},
+ghX:function(){return this.id.Q},
+giG:function(a){return this.k1.Q},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.xC(x,"observatoryData"))return
-z=this.S3
-v=z.t(0,y)
+y=J.Tf(z.gRn(a),"id")
+x=J.Tf(z.gRn(a),"name")
+w=J.Tf(z.gRn(a),"data")
+if(!J.mG(x,"observatoryData"))return
+z=this.k2
+v=z.p(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gDi",2,0,19,230],
+J.Af(v,w)},"$1","gDi",2,0,20,234],
 z6:function(a,b){var z,y,x
-z=""+this.yb
-y=P.Fl(null,null)
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-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)
+z=""+this.k3
+y=P.A(null,null)
+y.q(0,"id",z)
+y.q(0,"method","observatoryQuery")
+y.q(0,"query",H.d(b));++this.k3
+x=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null])
+this.k2.q(0,z,x)
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},
-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,{
+return x.Q},
+ZH:function(){var z=H.J(new W.vG(window,"message",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gDi()),z.b),[H.u3(z,0)]).P6()
+this.id.aM(0,this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V64;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},
-sl6:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
+"^":"V63;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+gl6:function(a){return a.ij},
+sl6:function(a,b){a.ij=this.ct(a,C.Z,a.ij,b)},
 bc:function(a){var z
-switch(J.zH(a.Ll)){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
+switch(J.zH(a.RZ)){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.RZ)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
+J.oJ(z,a.RZ)
 return z
 case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
+J.NZ(z,a.RZ)
 return z
 case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
+J.T5(z,a.RZ)
 return z
 case"Context":z=W.r3("context-view",null)
-J.Hf(z,a.Ll)
+J.Hf(z,a.RZ)
 return z
 case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
+J.Qr(z,a.RZ)
 return z
 case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
+J.JZ(z,a.RZ)
 return z
 case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
+J.vJ(z,a.RZ)
 return z
 case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
+J.C3(z,a.RZ)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
+J.Nf(z,a.RZ)
 return z
 case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
+J.mU(z,a.RZ)
 return z
 case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
+J.fb(z,a.RZ)
 return z
 case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(z,a.Ll)
+J.i0(z,a.RZ)
 return z
 case"Object":z=W.r3("object-view",null)
-J.h9(z,a.Ll)
+J.h9(z,a.RZ)
 return z
 case"SocketList":z=W.r3("io-socket-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"Socket":z=W.r3("io-socket-view",null)
-J.Cu(z,a.Ll)
+J.Cu(z,a.RZ)
 return z
 case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
+J.w7(z,a.RZ)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.Rp(z,a.Ll)
+J.uM(z,a.RZ)
 return z
 case"Library":z=W.r3("library-view",null)
-J.cl(z,a.Ll)
+J.cl(z,a.RZ)
 return z
 case"ProcessList":z=W.r3("io-process-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"Process":z=W.r3("io-process-view",null)
-J.rL(z,a.Ll)
+J.rL(z,a.RZ)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.Ll)
+J.CJ(z,a.RZ)
 return z
 case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
+J.uF(z,a.RZ)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.Ll)
+J.Qr(z,a.RZ)
 return z
 case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
+J.BC(z,a.RZ)
 return z
 case"Script":z=W.r3("script-view",null)
-J.ry(z,a.Ll)
+J.ry(z,a.RZ)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.NH(z,a.Ll)
+J.tQ(z,a.RZ)
 return z
-default:if(a.Ll.gNs()||a.Ll.gl5()){z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
+default:if(a.RZ.gNs()||a.RZ.gfo()){z=W.r3("instance-view",null)
+J.Qy(z,a.RZ)
 return z}else{z=W.r3("json-view",null)
-J.wD(z,a.Ll)
+J.wD(z,a.RZ)
 return z}}},
-xJ:[function(a,b){var z,y,x
-this.D4(a)
-z=a.Ll
+Hfg:[function(a,b){var z,y,x
+this.ay(a)
+z=a.RZ
 if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gdr()
+return}y=z.gv5()
 x=this.bc(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,14,61],
 $isTi:true,
 static:{Gvt: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Uv.LX(a)
-C.Uv.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ns.LX(a)
+C.Ns.XI(a)
 return a}}},
-V64:{
-"^":"uL+Pi;",
+V63:{
+"^":"uL+Piz;",
 $isd3:true},
 Um:{
-"^":"V65;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)},
+"^":"V64;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gBN:function(a){return a.RZ},
+sBN:function(a,b){a.RZ=this.ct(a,C.nE,a.RZ,b)},
 static:{T21: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Uav.LX(a)
-C.Uav.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Rr.LX(a)
+C.Rr.XI(a)
 return a}}},
-V65:{
-"^":"uL+Pi;",
+V64:{
+"^":"uL+Piz;",
 $isd3:true},
 VZ:{
-"^":"V66;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},
+"^":"V65;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gIr:function(a){return a.RZ},
 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)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,168],
-Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,168],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,231,232,102],
+sIr:function(a,b){a.RZ=this.ct(a,C.SR,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+ITt:[function(a,b){return!!J.t(b).$isw},"$1","gEE",2,0,93,168],
+Cpp:[function(a,b){return!!J.t(b).$isWO},"$1","gK4",2,0,93,168],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){a.ij=this.ct(a,C.B0,a.ij,b)
+c.$0()},"$2","gNe",4,0,235,236,102],
 static:{Wzx: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.OX.LX(a)
-C.OX.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.vmJ.LX(a)
+C.vmJ.XI(a)
 return a}}},
-V66:{
-"^":"uL+Pi;",
+V65:{
+"^":"uL+Piz;",
 $isd3:true},
 WG:{
-"^":"V67;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)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,168],
-Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,168],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,231,232,102],
+"^":"V66;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+ITt:[function(a,b){return!!J.t(b).$isw},"$1","gEE",2,0,93,168],
+Cpp:[function(a,b){return!!J.t(b).$isWO},"$1","gK4",2,0,93,168],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){a.ij=this.ct(a,C.B0,a.ij,b)
+c.$0()},"$2","gNe",4,0,235,236,102],
 static:{KTC: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.DX.LX(a)
-C.DX.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.dl.LX(a)
+C.dl.XI(a)
 return a}}},
-V67:{
-"^":"uL+Pi;",
+V66:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"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.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))
+"^":"Dsd;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
+gjT:function(a){return a.ij},
+sjT:function(a,b){a.ij=this.ct(a,C.uu,a.ij,b)},
+Qj:["rb",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","gLe",2,0,19,59],
-gO3:function(a){var z=a.tY
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,20,61],
+gO3:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
 z=J.Ds(z)
-this.gi6(a).Z6
+this.giJ(a).b
 return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
+gJp:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
-return z.gTE()},
-goc:function(a){var z=a.tY
+return z.gzz()},
+goc:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
 return J.DA(z)},
 gWw:function(a){return this.goc(a)==null||J.FN(this.goc(a))===!0},
 static:{lKH: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.HRc.LX(a)
 C.HRc.XI(a)
 return a}}},
 Dsd:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 f7:{
-"^":"V68;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)},
+"^":"V67;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
 pY:function(a){var z
-switch(J.zH(a.tY)){case"Class":z=W.r3("class-ref",null)
-J.PP(z,a.tY)
+switch(J.zH(a.RZ)){case"Class":z=W.r3("class-ref",null)
+J.PP(z,a.RZ)
 return z
 case"Code":z=W.r3("code-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Context":z=W.r3("context-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Error":z=W.r3("error-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Field":z=W.r3("field-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Function":z=W.r3("function-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Library":z=W.r3("library-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Object":z=W.r3("object-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Script":z=W.r3("script-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
-default:if(a.tY.gNs()||a.tY.gl5()){z=W.r3("instance-ref",null)
-J.PP(z,a.tY)
+default:if(a.RZ.gNs()||a.RZ.gfo()){z=W.r3("instance-ref",null)
+J.PP(z,a.RZ)
 return z}else{z=W.r3("span",null)
-J.t3(z,"<<Unknown service ref: "+H.d(a.tY)+">>")
+J.t3(z,"<<Unknown service ref: "+H.d(a.RZ)+">>")
 return z}}},
 Qj:[function(a,b){var z,y,x
-this.D4(a)
-z=a.tY
+this.ay(a)
+z=a.RZ
 if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gdr()
+return}y=z.gv5()
 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","gLe",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,14,61],
 static:{wzV: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J9.LX(a)
 C.J9.XI(a)
 return a}}},
-V68:{
-"^":"uL+Pi;",
+V67:{
+"^":"uL+Piz;",
 $isd3:true},
 Ce:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ji.LX(a)
 C.ji.XI(a)
 return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"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.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,233,107],
+"^":"ImK;LD,kX,RZ,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gd4:function(a){return a.LD},
+sd4:function(a,b){a.LD=this.ct(a,C.bk,a.LD,b)},
+gEu:function(a){return a.kX},
+sEu:function(a,b){a.kX=this.ct(a,C.lH,a.kX,b)},
+gRY:function(a){return a.RZ},
+sRY:function(a,b){a.RZ=this.ct(a,C.zU,a.RZ,b)},
+oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.LD=this.ct(a,C.bk,a.LD,z)},"$3","gQU",6,0,116,4,237,107],
 static:{AlS: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.K6L.LX(a)
-C.K6L.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.zb.LX(a)
+C.zb.XI(a)
 return a}}},
 ImK:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
-rv:{
-"^":"a;kl,IW,Ya,Yx,ER,Ja,BY,rM",
-xZ:function(a,b){return this.rM.$1(b)},
-bu:[function(a){var z=P.p9("")
+yM:{
+"^":"a;Q,a,b,c,d,e,f,r",
+WO:function(a,b){return this.r.$1(b)},
+X:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.kl?"fields ":"")
-z.KF(this.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Ya?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.BY))
-z.KF(this.rM!=null?"with matcher":"")
+z.KF(this.Q?"fields ":"")
+z.KF(this.a?"properties ":"")
+z.KF(this.e?"methods ":"")
+z.KF(this.b?"inherited ":"_")
+z.KF(this.d?"no finals ":"")
+z.KF("annotations: "+H.d(this.f))
+z.KF(this.r!=null?"with matcher":"")
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73]},
+z=z.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0]},
 ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
-gZI:function(){return this.fY===C.nU},
-gRS:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.hU},
-giO:function(a){var z=this.oc
+"^":"a;oc:Q>,fY:a>,V5:b>,t5:c>,Fo:d<,Dv:e<",
+gHO:function(){return this.a===C.nU},
+gRS:function(){return this.a===C.BM},
+gUA:function(){return this.a===C.hU},
+giO:function(a){var z=this.Q
 return z.giO(z)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
-bu:[function(a){var z=P.p9("")
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isES&&this.Q.m(0,b.Q)&&this.a===b.a&&this.b===b.b&&this.c.m(0,b.c)&&this.d===b.d&&X.W4(this.e,b.e,!1)},
+X:[function(a){var z=P.p9("")
 z.KF("(declaration ")
-z.KF(this.oc)
-z.KF(this.fY===C.BM?" (property) ":" (method) ")
-z.KF(this.V5?"final ":"")
-z.KF(this.Fo?"static ":"")
-z.KF(this.Dv)
+z.KF(this.Q)
+z.KF(this.a===C.BM?" (property) ":" (method) ")
+z.KF(this.b?"final ":"")
+z.KF(this.d?"static ":"")
+z.KF(this.e)
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73],
+z=z.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["","",,X,{
+"^":"a;fY:Q>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
 if(z<b){y=Array(b)
-y.fixed$length=init
+y.fixed$length=Array
+C.Nm.uy(y,"set range")
 H.qG(y,0,z,a,0)
 return y}if(z>c){z=Array(c)
-z.fixed$length=init
+z.fixed$length=Array
+C.Nm.uy(z,"set range")
 H.qG(z,0,c,a,0)
 return z}return a},
 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.Ff
-b.length
+for(;z.D();){y=z.c
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.Ff
-if(w.n(y,v))return!0
-if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.mX().xs(u,v)}else u=!1
+w=J.t(y)
+for(;x.D();){v=x.c
+if(w.m(y,v))return!0
+if(!!J.t(v).$isUU){u=w.gbx(y)
+u=$.II().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-na:function(a){var z,y
+Cz:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -21375,7 +20672,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+aA:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -21390,170 +20687,166 @@
 z=a.length
 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.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.Ff
-v=x.t(0,w)
+if(c){x=P.A(null,null)
+for(z=H.J(new H.a7(b,y,0,null),[H.u3(b,0)]);z.D();){w=z.c
+v=x.p(0,w)
+x.q(0,w,J.WB(v==null?0:v,1))}for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){w=z.c
+v=x.p(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
-else x.u(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
+else x.q(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
 if(u>=y)return H.e(b,u)
 if(t!==b[u])return!1}return!0}}],["","",,D,{
 "^":"",
 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;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.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))},
+"^":"a;Q,a,b,c,d,fJ:e<,f,r",
+FV:function(a,b){this.Q.FV(0,b.gE4())
+this.a.FV(0,b.gF8())
+this.b.FV(0,b.gZG())
+O.PV(this.c,b.gYK())
+O.PV(this.d,b.gt6())
+this.e.FV(0,b.gfJ())
+b.gfJ().aN(0,new O.W2(this))},
+IZ:function(a,b,c,d,e,f,g){this.e.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)
+z=P.A(null,null)
+y=P.A(null,null)
 z=new O.Oj(c,f,e,b,y,d,z,a)
 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()
+for(z=b.gvc(b),z=z.gu(z);z.D(),!1;){y=z.gk()
 a.to(0,y,new O.oQ())
-J.bj(a.t(0,y),b.t(0,y))}}}},
+J.bj(a.p(0,y),b.p(0,y))}}}},
 PO:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.T4.u(0,b,a)},
-$isEH:true},
-T6:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.T4.u(0,b,a)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.f.q(0,b,a)}},
+W2:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.f.q(0,b,a)}},
 oQ:{
-"^":"TpZ:76;",
-$0:function(){return P.Fl(null,null)},
-$isEH:true},
+"^":"r:77;",
+$0:function(){return P.A(null,null)}},
 fH:{
-"^":"a;xV",
-jD: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)))
+"^":"a;Q",
+jD:function(a,b){var z=this.Q.Q.p(0,b)
+if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(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)))
+Q1:function(a,b,c){var z=this.Q.a.p(0,b)
+if(z==null)throw H.b(O.lA("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,r
+Ol:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r
 z=null
-x=!!J.x(a).$isLz&&!J.xC(b,C.QL)
-w=this.xV
-if(x){v=w.F3.t(0,a)
-z=v==null?null:J.UQ(v,b)}else{u=w.II.t(0,b)
-z=u==null?null:u.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
+x=!!J.t(a).$isUU&&!J.mG(b,C.QL)
+w=this.Q
+if(x){v=w.d.p(0,a)
+z=v==null?null:J.Tf(v,b)}else{u=w.Q.p(0,b)
+z=u==null?null:u.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){t=X.na(z)
+if(d){t=X.Cz(z)
 if(t>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,t,P.y(t,J.q8(c)))}else{s=X.RI(z)
-x=s>=0?s:J.q8(c)
+c=X.Na(c,t,P.u(t,J.wS(c)))}else{s=X.aA(z)
+x=s>=0?s:J.wS(c)
 c=X.Na(c,t,x)}}try{x=H.eC(z,c,P.Te(null))
-return x}catch(r){if(!!J.x(H.Ru(r)).$isJS){if(y!=null)P.FL(y)
+return x}catch(r){if(!!J.t(H.Ru(r)).$isJS){if(y!=null)P.FL(y)
 throw r}else throw r}}},
-bY:{
-"^":"a;xV",
+mO:{
+"^":"a;Q",
 xs:function(a,b){var z,y,x
-if(J.xC(a,b)||J.xC(b,C.Vc))return!0
-for(z=this.xV,y=z.ZG;!J.xC(a,C.Vc);a=x){x=y.t(0,a)
-if(J.xC(x,b))return!0
-if(x==null){if(!z.nX)return!1
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(J.mG(a,b)||J.mG(b,C.AP))return!0
+for(z=this.Q,y=z.b;!J.mG(a,C.AP);a=x){x=y.p(0,a)
+if(J.mG(x,b))return!0
+if(x==null){if(!z.r)return!1
+throw H.b(O.lA("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.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)
+z=this.Q
+y=z.c.p(0,a)
+if(y==null){if(!z.r)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}x=J.Tf(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.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
+if(z==null){if(!this.Q.r)return
+throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+WT:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Ya){y=this.xV
-x=y.ZG.t(0,b)
-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.gRS())continue
-if(c.ER&&J.or(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
-u=c.BY
+if(c.b){y=this.Q
+x=y.b.p(0,b)
+if(x==null){if(y.r)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.mG(x,c.c))z=this.WT(0,x,c)}y=this.Q
+w=y.c.p(0,b)
+if(w==null){if(!y.r)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.Nx(J.U8(w));y.D();){v=y.gk()
+if(!c.Q&&v.gHO())continue
+if(!c.a&&v.gRS())continue
+if(c.d&&J.or(v)===!0)continue
+if(!c.e&&v.gUA())continue
+if(c.r!=null&&c.WO(0,J.DA(v))!==!0)continue
+u=c.f
 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.xV,y=z.ZG,x=z.of;!J.xC(a,C.Vc);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.nX)return
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
+for(z=this.Q,y=z.b,x=z.c;!J.mG(a,C.AP);a=u){w=x.p(0,a)
+if(w!=null){v=J.Tf(w,b)
+if(v!=null)return v}u=y.p(0,a)
+if(u==null){if(!z.r)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;xV"},
+"^":"a;Q"},
 tk:{
-"^":"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)}}}}],["","",,M,{
+"^":"a;N0:Q<",
+X:[function(a){return"Missing "+this.Q+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,0],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,M,{
 "^":"",
-Wa:function(a,b){var z,y,x,w,v,u
-z=M.pNz(a,b)
+iX:function(a,b){var z,y,x,w,v,u
+z=M.pN(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.Wa(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.ks=w
+for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(w==null){w=Array(y.gdH(a).Q.childNodes.length)
+w.fixed$length=Array}if(v>=w.length)return H.e(w,v)
+w[v]=u}z.a=w
 return z},
-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.T0(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)
+Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Qm(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.JW(w):null,e,f,g,null)
+if(d.ghK()){M.uH(z).Jh(a)
+if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
 return z},
-aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
+b1:function(a,b){return!!J.t(a).$iskJ&&J.mG(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.VB(a)},
+z=J.Tf(a,"__dartBindable")
+return!!J.t(z).$isAp?z:new M.dP(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.qf
+if(!!J.t(a).$isdP)return a.Q
 z=$.X3
-y=new M.Ra(z)
+y=new M.Vf(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.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
-cao:function(a){var z
-for(;z=J.ra5(a),z!=null;a=z);return a},
+return P.jT(P.B(["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))},
+tA:function(a){var z
+for(;z=J.Cd(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.cao(a)
+for(;!0;){a=M.tA(a)
 y=$.nR()
 y.toString
-x=H.VKg(a,"expando$values")
-w=x==null?null:H.VKg(x,y.V2())
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.By())
 y=w==null
-if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
-else{u=J.x(a)
-v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+if(!y&&w.gad()!=null)v=J.Eh(w.gad(),z)
+else{u=J.t(a)
+v=!!u.$isSy||!!u.$isBn||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gXD()
+a=w.gBr()
 if(a==null)return}},
 ah:function(a,b,c){if(c==null)return
-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.$isUn){y=S.j9(a.textContent,M.ah("text",a,b))
+return new M.aR(a,b,c)},
+pN:function(a,b){var z,y
+z=J.t(a)
+if(!!z.$isz2)return M.F5(a,b)
+if(!!z.$iskJ){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="{{}}"
@@ -21567,600 +20860,583 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
+v=new M.vz(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.Z0=z
+v.c=z
 x=M.rJ(a,"bind",b)
-v.lC=x
+v.d=x
 u=M.rJ(a,"repeat",b)
-v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.ah("bind",a,b))
+v.e=u
+if(z!=null&&x==null&&u==null)v.d=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.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)
-if(typeof w!=="number")return H.s(w)
+og:function(a,b,c,d){var z,y,x,w,v,u,t
+if(b.gqz()){z=b.Ly(0)
+y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
+return b.gaW()?y:b.iy(y)}x=J.U6(b)
+w=x.gv(b)
+if(typeof w!=="number")return H.o(w)
 v=Array(w)
-v.fixed$length=init
+v.fixed$length=Array
 w=v.length
 u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
+while(!0){t=x.gv(b)
+if(typeof t!=="number")return H.o(t)
 if(!(u<t))break
-z=b.cf(u)
-t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
+z=b.Ly(u)
+t=z!=null?z.$3(d,c,!1):b.Pn(u).Tl(d)
 if(u>=w)return H.e(v,u)
-v[u]=t;++u}return b.qm(v)},
-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.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=[]
+v[u]=t;++u}return b.iy(v)},
+G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.geq())return M.og(a,b,c,d)
+if(b.gqz()){z=b.Ly(0)
+y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.qF)
+return b.gaW()?y:new Y.aU(y,b.gPf(),null,null,null)}y=new L.NV(null,!1,[],null,null,null,$.qF)
+y.b=[]
 x=J.U6(b)
 w=0
-while(!0){v=x.gB(b)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=x.gv(b)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-c$0:{u=b.AX(w)
-z=b.cf(w)
+c$0:{u=b.U0(w)
+z=b.Ly(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else y.YU(t)
+else y.Qs(t)
 break c$0}s=b.Pn(w)
-if(u===!0)y.ti(s.WK(d))
-else y.WX(d,s)}++w}return new Y.cU(y,b.gPf(),null,null,null)},
+if(u===!0)y.ti(s.Tl(d))
+else y.WX(d,s)}++w}return new Y.aU(y,b.gPf(),null,null,null)},
 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).$isvy?a:M.Xi(a)
+x=!!J.t(a).$ishs?a:M.uH(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
-while(!0){t=w.gB(y)
-if(typeof t!=="number")return H.s(t)
+while(!0){t=w.gv(y)
+if(typeof t!=="number")return H.o(t)
 if(!(u<t))break
-s=w.t(y,u)
-r=w.t(y,u+1)
-q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
+s=w.p(y,u)
+r=w.p(y,u+1)
+q=v.nR(x,s,M.G5(s,r,a,c),r.geq())
 if(q!=null&&!0)d.push(q)
-u+=2}v.lL(x)
-if(!z.$isqf)return
-p=M.Xi(a)
-p.sQk(c)
+u+=2}v.x5(x)
+if(!z.$isvz)return
+p=M.uH(a)
+p.sLn(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-Xi:function(a){var z,y,x,w
-z=$.as()
+uH:function(a){var z,y,x,w
+z=$.rw()
 z.toString
-y=H.VKg(a,"expando$values")
-x=y==null?null:H.VKg(y,z.V2())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.By())
 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.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+w=J.t(a)
+if(!!w.$isz2)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).Q.hasAttribute("template")===!0&&C.lY.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.XY(a),null):new M.vy(a,P.XY(a),null)
-z.u(0,a,x)
+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)
+z.q(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.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+CF:function(a){var z=J.t(a)
+if(!!z.$isz2)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).Q.hasAttribute("template")===!0&&C.lY.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:{
-"^":"a;oe",
+VE:{
+"^":"a;Q",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,ks>,rz>",
+"^":"a;Cd:Q>,wd:a>,rz:b>",
 ghK:function(){return!1},
-T0:function(a){var z=this.ks
+JW:function(a){var z=this.a
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qf:{
-"^":"XI;Z0,lC,vJ,Cd,ks,rz",
+vz:{
+"^":"XI;c,d,e,Q,a,b",
 ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;KB<,qf,qL?",
-gCd:function(a){var z=J.UQ(this.qf,"bindings_")
+$isvz:true},
+hs:{
+"^":"a;KB:Q<,a,qL:b?",
+gCd:function(a){var z=J.Tf(this.a,"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.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.H9(this.a,"bindings_",P.jT(P.A(null,null)))
 z=this.gCd(this)}z.FV(0,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")},
-gmb:function(a){var z=this.qL
+nR:["vZ",function(a,b,c,d){b=M.b1(this.gKB(),b)
+if(!d&&!!J.t(c).$isAp)c=M.fg(c)
+return M.xa(this.a.Z("bind",[b,c,d]))},"$3$oneTime","gDT",4,3,null,71],
+x5:function(a){return this.a.nQ("bindFinished")},
+gCn:function(a){var z=this.b
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
+z=J.OC(!!J.t(z).$ishs?z:M.uH(z))}else z=null
 return z},
-$isvy:true},
+$ishs: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).$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).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.dn,b,M.fg(c))},
+"^":"ilb;KB:Q<,dn:a<",
+gvc:function(a){return J.kl(J.Tf($.Xw(),"Object").Z("keys",[this.a]),new M.Tl(this))},
+p:function(a,b){if(!!J.t(this.Q).$iskJ&&J.mG(b,"text"))b="textContent"
+return M.xa(J.Tf(this.a,b))},
+q:function(a,b,c){if(!!J.t(this.Q).$iskJ&&J.mG(b,"text"))b="textContent"
+J.H9(this.a,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
-z=this.KB
-b=M.aR(z,b)
-y=this.dn
-x=M.xa(J.UQ(y,M.aR(z,b)))
+z=this.Q
+b=M.b1(z,b)
+y=this.a
+x=M.xa(J.Tf(y,M.b1(z,b)))
 y.Ji(b)
-return x},"$1","gUS",2,0,234,58],
+return x},"$1","gUS",2,0,238,60],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
-$asilb:function(){return[P.qU,A.Ap]},
-$asT8:function(){return[P.qU,A.Ap]}},
+$asilb:function(){return[P.I,A.Ap]},
+$asw:function(){return[P.I,A.Ap]}},
 Tl:{
-"^":"TpZ:12;a",
-$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},
-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")},
-$isVB:true},
-Ra:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.xi(a,!1)},
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(this.Q.Q).$iskJ&&J.mG(a,"textContent")?"text":a},"$1",null,2,0,null,60,"call"]},
+dP:{
+"^":"Ap;Q",
+TR:function(a,b){return this.Q.Z("open",[$.X3.mS(b)])},
+xO:function(a){return this.Q.nQ("close")},
+gM:function(a){return this.Q.nQ("discardChanges")},
+sM:function(a,b){this.Q.Z("setValue",[b])},
+fR:function(){return this.Q.nQ("deliver")},
+$isdP:true},
+Vf:{
+"^":"r:14;Q",
+$1:function(a){return this.Q.xi(a,!1)}},
 aY:{
-"^":"TpZ:12;b",
-$1:function(a){return this.b.rO(a,!1)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q.oj(a,!1)}},
 SL:{
-"^":"TpZ:12;c",
-$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,40,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.mu(this.Q,new M.Au(a))},"$1",null,2,0,null,42,"call"]},
 Au:{
-"^":"TpZ:12;d",
-$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,182,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.PO([a])},"$1",null,2,0,null,182,"call"]},
 no:{
-"^":"TpZ:76;e",
-$0:[function(){return J.yd(this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){return J.xl(this.Q)},"$0",null,0,0,null,"call"]},
 uD:{
-"^":"TpZ:76;f",
-$0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){return J.SW(this.Q)},"$0",null,0,0,null,"call"]},
+eT:{
+"^":"r:14;Q",
+$1:[function(a){J.Ja(this.Q,a)
+return a},"$1",null,2,0,null,182,"call"]},
 Wb:{
-"^":"TpZ:12;UI",
-$1:[function(a){J.Fc(this.UI,a)
-return a},"$1",null,2,0,null,182,"call"],
-$isEH:true},
-SLX:{
-"^":"TpZ:76;bK",
-$0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
-$isEH:true},
-qU9:{
-"^":"a;k8>,tA,MC"},
+"^":"r:77;Q",
+$0:[function(){return this.Q.fR()},"$0",null,0,0,null,"call"]},
+ze:{
+"^":"a;k8:Q>,a,b"},
 DT:{
-"^":"vy;Qk?,Rc,kr<,pK,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
-gKB:function(){return this.KB},
+"^":"hs;Ln:c?,d,CL:e<,f,Gw:r?,M5:x?,CS:y?,z,ch,cx,Q,a,b",
+gKB:function(){return this.Q},
 nR:function(a,b,c,d){var z,y
-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)
+if(!J.mG(b,"ref"))return this.vZ(this,b,c,d)
+z=d?c:J.mu(c,new M.Aj(this))
+J.Vs(this.Q).Q.setAttribute("ref",z)
 this.NB()
 if(d)return
-if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
+if(this.gCd(this)==null)this.sCd(0,P.A(null,null))
 y=this.gCd(this)
-J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
+J.H9(y.a,M.b1(y.Q,"ref"),M.fg(c))
 return c},
-KI:function(a){var z=this.kr
-if(z!=null)z.la()
-if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
+KI:function(a){var z=this.e
+if(z!=null)z.qT()
+if(a.c==null&&a.d==null&&a.e==null){z=this.e
 if(z!=null){z.xO(0)
-this.kr=null}return}z=this.kr
+this.e=null}return}z=this.e
 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($.ik(),this.KB,["ref"],!0)
-return this.kr},
-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.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 $.fT0()
+this.e=z}z.FE(a,this.c)
+J.ZW($.TQ(),this.Q,["ref"],!0)
+return this.e},
+ZK: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.d
+z=this.cx
+if(z==null){z=this.gws()
+z=J.NB(!!J.t(z).$ishs?z:M.uH(z))
+this.cx=z}y=J.RE(z)
+if(y.gPZ(z)==null)return $.fT0()
 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.Wa(z,x)
-x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.lu(this.KB)
-w=$.Ou()
-t=w.t(0,u)
+w=x.Q
+if(w==null){w=H.J(new P.nj(null),[null])
+x.Q=w}v=w.p(0,z)
+if(v==null){v=M.iX(z,x)
+x.Q.q(0,z,v)}w=this.z
+if(w==null){u=J.Do(this.Q)
+w=$.p2()
+t=w.p(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Ks().u(0,t,!0)
+$.Tg().q(0,t,!0)
 M.AL(t)
-w.u(0,u,t)}this.dK=t
-w=t}s=J.UF(w)
+w.q(0,u,t)}this.z=t
+w=t}s=J.bs(w)
 w=[]
 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.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.T0(n):null
-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.MC=s.lastChild
-r.cA=null
-r.XD=null
+r.b=this.Q
+r.c=z
+q.q(0,s,r)
+p=new M.ze(b,null,null)
+M.uH(s).sqL(p)
+for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+l=z?v.JW(n):null
+k=M.Ch(o,s,this.z,l,b,c,w,null)
+M.uH(k).sqL(p)
+if(m)r.a=k}p.a=s.firstChild
+p.b=s.lastChild
+r.c=null
+r.b=null
 return s},
-gk8:function(a){return this.Qk},
-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
-z=this.kr
-if(z!=null){z.z1=!1
-z.iz=null
-z.Mv=null}},
+gk8:function(a){return this.c},
+gG5:function(a){return this.d},
+sG5:function(a,b){var z
+if(this.d!=null)throw H.b(P.s("Template must be cleared before a new bindingDelegate can be assigned"))
+this.d=b
+this.ch=null
+z=this.e
+if(z!=null){z.cx=!1
+z.cy=null
+z.db=null}},
 NB:function(){var z,y
-if(this.kr!=null){z=this.XA
-y=this.gPI()
-y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
+if(this.e!=null){z=this.cx
+y=this.gws()
+y=J.NB(!!J.t(y).$ishs?y:M.uH(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.OP(z.Tf())},
+this.cx=null
+this.e.Oo(null)
+z=this.e
+z.uP(z.Tf())},
 V1:function(a){var z,y
-this.Qk=null
-this.Rc=null
+this.c=null
+this.d=null
 if(this.gCd(this)!=null){z=this.gCd(this).Rz(0,"ref")
-if(z!=null)z.xO(0)}this.XA=null
-y=this.kr
+if(z!=null)z.xO(0)}this.cx=null
+y=this.e
 if(y==null)return
 y.Oo(null)
-this.kr.xO(0)
-this.kr=null},
-gPI:function(){var z,y
+this.e.xO(0)
+this.e=null},
+gws:function(){var z,y
 this.xk()
-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.Xi(z).gPI()
+z=M.cS(this.Q,J.Vs(this.Q).Q.getAttribute("ref"))
+if(z==null){z=this.r
+if(z==null)return this.Q}y=M.uH(z).gws()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
-z=this.Yz
-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
+z=this.x
+return z!=null?z:H.Go(this.Q,"$isyY").content},
+Jh:function(a){var z,y,x,w,v,u,t
+if(this.y===!0)return!1
 M.oR()
 M.Tr()
-this.CS=!0
-z=!!J.x(this.KB).$isOH
+this.y=!0
+z=!!J.t(this.Q).$isyY
 y=!z
-if(y){x=this.KB
+if(y){x=this.Q
 w=J.RE(x)
-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).$isvy?v:M.Xi(v)
+if(w.gQg(x).Q.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.p("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.Q)
+v=!!J.t(v).$ishs?v:M.uH(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH
-u=!0}else{x=this.KB
+z=!!J.t(v.gKB()).$isyY
+u=!0}else{x=this.Q
 w=J.RE(x)
-if(w.gns(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.Q
 w=J.RE(x)
-t=w.gJ8(x).createElement("template",null)
-w.gAd(x).insertBefore(t,x)
+t=w.gM0(x).createElement("template",null)
+w.gKV(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).$isvy?t:M.Xi(t)
+v=!!J.t(t).$ishs?t:M.uH(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH}else{v=this
+z=!!J.t(v.gKB()).$isyY}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.UF(M.TA(v.gKB())))
+u=!1}if(!z)v.sM5(J.bs(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.O1(v,this.KB,u)
-else M.Af(J.f5(v))
+else if(y)M.KE(v,this.Q,u)
+else M.Kh(J.NB(v))
 return!0},
-xk:function(){return this.cl(null)},
+xk:function(){return this.Jh(null)},
 $isDT:true,
-static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
-z=J.lu(a)
+static:{"^":"Ub,kR,YO,v8,Hg,joK",TA:function(a){var z,y,x,w
+z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
-y=$.B8().t(0,z)
+y=$.B8().p(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
+if(w!=null)w.removeChild(x)}$.B8().q(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-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.Ff
-switch(w){case"template":v=z.gQg(a).dA
+y=z.gM0(a).createElement("template",null)
+z.gKV(a).insertBefore(y,a)
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=x.c
+switch(w){case"template":v=z.gQg(a).Q
 v.getAttribute(w)
 v.removeAttribute(w)
 break
 case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).dA
+v=z.gQg(a).Q
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-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
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.NB(a)
+if(c){J.RV(z,b)
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.MM(z,w)},Kh:function(a){var z,y
 z=new M.CE()
 y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.vU===!0)return
-$.vU=!0
+y.aN(y,z)},oR:function(){if($.v8===!0)return
+$.v8=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},Tr:function(){var z,y
-if($.Xa===!0)return
-$.Xa=!0
+if($.Hg===!0)return
+$.Hg=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.t(z).$isyY){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.PA(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.dc(z,document.baseURI)
-J.PA(a).appendChild(z)}}},
-De:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-J.Vs(z.KB).dA.setAttribute("ref",a)
-z.NB()},"$1",null,2,0,null,235,"call"],
-$isEH:true},
+if(J.Tw(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
+J.Fd(z,document.baseURI)
+J.Tw(a).appendChild(z)}}},
+Aj:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+J.Vs(z.Q).Q.setAttribute("ref",a)
+z.NB()},"$1",null,2,0,null,239,"call"]},
 CE:{
-"^":"TpZ:19;",
-$1:function(a){if(!M.Xi(a).cl(null))M.Af(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
-$isEH:true},
-DOe:{
-"^":"TpZ:12;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
-$isEH:true},
-Ufa:{
-"^":"TpZ:81;",
+"^":"r:20;",
+$1:function(a){if(!M.uH(a).Jh(null))M.Kh(J.NB(!!J.t(a).$ishs?a:M.uH(a)))}},
+W6o:{
+"^":"r:14;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,202,"call"]},
+YJG:{
+"^":"r:80;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,185,13,"call"],
-$isEH:true},
-Raa:{
-"^":"TpZ:76;",
+for(z=J.Nx(a);z.D();)M.uH(J.Zu(z.gk())).NB()},"$2",null,4,0,null,185,15,"call"]},
+DOe:{
+"^":"r:77;",
 $0:function(){var z=document.createDocumentFragment()
-$.nR().u(0,z,new M.Fi([],null,null,null))
-return z},
-$isEH:true},
+$.nR().q(0,z,new M.Fi([],null,null,null))
+return z}},
 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},
+"^":"a;dn:Q<,PQ:a<,Br:b<,ad:c<"},
+aR:{
+"^":"r:14;Q,a,b",
+$1:function(a){return this.b.op(a,this.Q,this.a)}},
 fE:{
-"^":"TpZ:81;a,b,c,d",
+"^":"r:80;Q,a,b,c",
 $2:function(a,b){var z,y,x,w
-for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
-if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
+for(;z=J.U6(a),J.mG(z.p(a,0),"_");)a=z.yn(a,1)
+if(this.c)z=z.m(a,"bind")||z.m(a,"if")||z.m(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.ah(a,this.b,this.c))
-if(y!=null){z=this.a
+y=S.j9(b,M.ah(a,this.a,this.b))
+if(y!=null){z=this.Q
 x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},
-$isEH:true},
+z.push(y)}}},
 TGm:{
-"^":"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},
-la:function(){var z,y
-z=this.Up
-y=J.x(z)
+"^":"Ap;Q,a,b,c,d,e,f,r,x,y,z,ch,cx,cy,db",
+Hf:function(a){return this.cy.$1(a)},
+TR:function(a,b){return H.vh(P.s("binding already opened"))},
+gM:function(a){return this.f},
+qT:function(){var z,y
+z=this.e
+y=J.t(z)
 if(!!y.$isAp){y.xO(z)
-this.Up=null}z=this.h6
-y=J.x(z)
+this.e=null}z=this.f
+y=J.t(z)
 if(!!y.$isAp){y.xO(z)
-this.h6=null}},
+this.f=null}},
 FE:function(a,b){var z,y,x,w,v
-this.la()
-z=this.yQ.KB
-y=a.Z0
+this.qT()
+z=this.Q.Q
+y=a.c
 x=y!=null
-this.dz=x
-this.Gi=a.vJ!=null
-if(x){this.vj=y.au
-w=M.jb("if",y,z,b)
-this.Up=w
-y=this.vj===!0
+this.r=x
+this.x=a.e!=null
+if(x){this.y=y.a
+w=M.G5("if",y,z,b)
+this.e=w
+y=this.y===!0
 if(y)x=!(null!=w&&!1!==w)
 else x=!1
 if(x){this.Oo(null)
 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.jb("repeat",y,z,b)
-this.h6=y
-v=y}else{y=a.lC
-this.lH=y.au
-y=M.jb("bind",y,z,b)
-this.h6=y
-v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
+if(this.x===!0){y=a.e
+this.z=y.a
+y=M.G5("repeat",y,z,b)
+this.f=y
+v=y}else{y=a.d
+this.z=y.a
+y=M.G5("bind",y,z,b)
+this.f=y
+v=y}if(this.z!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
 return}this.Ca(v)},
 Tf:function(){var z,y
-z=this.h6
-y=this.lH
-return!(null!=y&&y)?J.Vm(z):z},
+z=this.f
+y=this.z
+return!(null!=y&&y)?J.SW(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
-return}this.Ca(this.Tf())},"$1","ge7",2,0,19,236],
-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],
-Ca:function(a){this.Oo(this.Gi!==!0?[a]:a)},
+return}this.Ca(this.Tf())},"$1","ge7",2,0,20,240],
+uP:[function(a){var z
+if(this.r===!0){z=this.e
+if(this.y!==!0){H.Go(z,"$isAp")
+z=z.gM(z)}if(!(null!=z&&!1!==z)){this.Oo([])
+return}}this.Ca(a)},"$1","gVN",2,0,20,21],
+Ca:function(a){this.Oo(this.x!==!0?[a]:a)},
 Oo:function(a){var z,y
-z=J.x(a)
+z=J.t(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.nH
+z=this.b
 if(a===z)return
-this.ud()
-this.dO=a
-if(!!J.x(a).$iswn&&this.Gi===!0&&this.lH!==!0){if(a.glr()!=null)a.slr([])
-this.AB=a.gXF().yI(this.gSp())}y=this.dO
+this.Lx()
+this.c=a
+if(!!J.t(a).$iswn&&this.x===!0&&this.z!==!0){if(a.glr()!=null)a.slr([])
+this.ch=a.gXF().yI(this.gaH())}y=this.c
 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.yQ.KB
+this.LA(G.jj(y,0,J.wS(y),z,0,z.length))},
+VS:function(a){var z,y,x,w
+if(J.mG(a,-1))return this.Q.Q
 z=$.nR()
-y=this.tM
+y=this.a
 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.yQ.KB)return x
-w=M.Xi(x).gkr()
+x=z.p(0,y[a]).gPQ()
+if(x==null)return this.VS(a-1)
+if(!M.CF(x)||x===this.Q.Q)return x
+w=M.uH(x).gCL()
 if(w==null)return x
-return w.Dk(w.tM.length-1)},
+return w.VS(w.a.length-1)},
 C8:function(a){var z,y,x,w,v,u,t
-z=this.Dk(J.bI(a,1))
-y=this.Dk(a)
-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)
+z=this.VS(J.D5(a,1))
+y=this.VS(a)
+J.Cd(this.Q.Q)
+x=C.Nm.W4(this.a,a)
+for(w=J.RE(x),v=J.RE(z);!J.mG(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},
+w.MM(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
-if(this.vx||J.FN(a)===!0)return
-u=this.yQ
-t=u.KB
-if(J.ra5(t)==null){this.xO(0)
-return}s=this.nH
-Q.Oi(s,this.dO,a)
-z=u.Rc
-if(!this.z1){this.z1=!0
-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.Ff
+if(this.d||J.FN(a)===!0)return
+u=this.Q
+t=u.Q
+if(J.Cd(t)==null){this.xO(0)
+return}s=this.b
+Q.Oi(s,this.c,a)
+z=u.d
+if(!this.cx){this.cx=!0
+r=J.Ee(!!J.t(u.Q).$isDT?u.Q:u)
+if(r!=null){this.cy=r.a.CE(t)
+this.db=null}}q=P.YM(P.N3(),null,null,null,null)
+for(p=J.w1(a),o=p.gu(a),n=0;o.D();){m=o.gk()
+for(l=m.gRt(),l=l.gu(l),k=J.RE(m);l.D();){j=l.c
 i=this.C8(J.WB(k.gvH(m),n))
-if(!J.xC(i,$.fT0()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-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)
+if(!J.mG(i,$.fT0()))q.q(0,j,i)}l=m.gNg()
+if(typeof l!=="number")return H.o(l)
+n-=l}for(p=p.gu(a),o=this.a;p.D();){m=p.gk()
+for(l=J.RE(m),h=l.gvH(m);J.UN(h,J.WB(l.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(x==null)try{if(this.cy!=null)y=this.Hf(y)
 if(y==null)x=$.fT0()
-else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.oP(g,null)
-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=$.fT0()}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,237,238],
-vB:[function(a){var z,y
+else x=u.ZK(0,y,z)}catch(g){k=H.Ru(g)
+w=k
+v=new H.XO(g,null)
+k=new P.Gc(0,$.X3,null)
+k.$builtinTypeInfo=[null]
+k=new P.Zf(k)
+k.$builtinTypeInfo=[null]
+k.w0(w,v)
+x=$.fT0()}k=x
+f=this.VS(h-1)
+e=J.Cd(u.Q)
+C.Nm.aP(o,h,k)
+e.insertBefore(k,J.p7(f))}}for(u=q.gUQ(q),u=H.J(new H.MH(null,J.Nx(u.Q),u.a),[H.u3(u,0),H.u3(u,1)]);u.D();)this.Wf(u.Q)},"$1","gaH",2,0,241,242],
+Wf:[function(a){var z,y
 z=$.nR()
 z.toString
-y=H.VKg(a,"expando$values")
-for(z=J.mY((y==null?null:H.VKg(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,239],
-ud:function(){var z=this.AB
+y=H.of(a,"expando$values")
+for(z=J.Nx((y==null?null:H.of(y,z.By())).gdn());z.D();)J.xl(z.gk())},"$1","gJO",2,0,243],
+Lx:function(){var z=this.ch
 if(z==null)return
 z.Gv()
-this.AB=null},
+this.ch=null},
 xO:function(a){var z
-if(this.vx)return
-this.ud()
-z=this.tM
-H.bQ(z,this.gJO())
-C.Nm.sB(z,0)
-this.la()
-this.yQ.kr=null
-this.vx=!0}}}],["","",,S,{
+if(this.d)return
+this.Lx()
+z=this.a
+C.Nm.aN(z,this.gJO())
+C.Nm.sv(z,0)
+this.qT()
+this.Q.e=null
+this.d=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,ll",
-gqz:function(){return this.qN.length===5},
+"^":"a;Q,eq:a<,b",
+gqz:function(){return this.Q.length===5},
 gaW:function(){var z,y
-z=this.qN
+z=this.Q
 y=z.length
 if(y===5){if(0>=y)return H.e(z,0)
-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
+if(J.mG(z[0],"")){if(4>=z.length)return H.e(z,4)
+z=J.mG(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.ll},
-qm:function(a){return this.gPf().$1(a)},
-gB:function(a){return C.jn.BU(this.qN.length,4)},
-AX:function(a){var z,y
-z=this.qN
+gPf:function(){return this.b},
+iy:function(a){return this.gPf().$1(a)},
+gv:function(a){return C.jn.BU(this.Q.length,4)},
+U0:function(a){var z,y
+z=this.Q
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 Pn:function(a){var z,y
-z=this.qN
+z=this.Q
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-cf:function(a){var z,y
-z=this.qN
+Ly:function(a){var z,y
+z=this.Q
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 xTd:[function(a){var z,y,x,w
 if(a==null)a=""
-z=this.qN
+z=this.Q
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 x=z.length
 w=C.jn.BU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gSG",2,0,240,20],
-QY:[function(a){var z,y,x,w,v,u,t,s
-z=this.qN
+return y+H.d(z[w])},"$1","gSG",2,0,244,21],
+QYW:[function(a){var z,y,x,w,v,u,t,s
+z=this.Q
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
 x=C.jn.BU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.IN+=typeof u==="string"?u:H.d(u);++v
+for(w=J.U6(a),v=0;v<x;){u=w.p(a,v)
+if(u!=null)y.Q+=typeof u==="string"?u:H.d(u);++v
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,241,242],
-l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
+y.Q+=typeof s==="string"?s:H.d(s)}z=y.Q
+return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,245,246],
+nH:function(a,b){this.b=this.Q.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
@@ -22185,312 +21461,300 @@
 w.push(m)
 v=o+2}if(v===z)w.push("")
 y=new S.VH2(w,u,null)
-y.l3(w,u)
+y.nH(w,u)
 return y}}}}],["","",,Z,{
 "^":"",
 d8:function(a){var z,y
-z=J.x(a)
-if(!!z.$isT8){y=P.Fl(null,null)
+z=J.t(a)
+if(!!z.$isw){y=P.A(null,null)
 z.aN(a,new Z.mZ(y))
 return y}else if(!!z.$isWO){y=[]
 z.aN(a,new Z.WJ(y))
 return y}else return a},
 mZ:{
-"^":"TpZ:81;a",
-$2:[function(a,b){this.a.u(0,a,Z.d8(b))},"$2",null,4,0,null,79,80,"call"],
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,Z.d8(b))}},
 WJ:{
-"^":"TpZ:12;b",
-$1:function(a){this.b.push(Z.d8(a))},
-$isEH:true},
-lX:{
-"^":"a;NP,G1>,Ir*",
-gEa:function(a){return"T+"+H.d(this.NP)+"us"},
-bu:[function(a){return"["+("T+"+H.d(this.NP)+"us")+"] "+this.G1},"$0","gCR",0,0,73],
-ez:function(a,b){return this.Ir.$1(b)},
-$islX:true},
+"^":"r:14;Q",
+$1:function(a){this.Q.push(Z.d8(a))}},
+H3:{
+"^":"a;Q,G1:a>,Ir:b*",
+gee:function(a){return"T+"+H.d(this.Q)+"us"},
+X:[function(a){return"["+("T+"+H.d(this.Q)+"us")+"] "+this.a},"$0","gCR",0,0,0],
+ez:function(a,b){return this.b.$1(b)},
+$isH3:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,cU",
-Gv:function(){this.RV.Gv()},
-ab:function(a,b){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),a,null)
-z.Ir=Z.d8(b)
-J.bi(this.Rk,z)
+"^":"d3;Q,a,Rk:b*,dx$,dy$,fr$",
+Gv:function(){this.Q.Gv()},
+AS:function(a,b){var z=new Z.H3(J.bI(J.lX(this.a.gTY(),1000000),$.Ji),a,null)
+z.b=Z.d8(b)
+J.dH(this.b,z)
 return z},
-ZF:function(a){return this.ab(a,null)},
+WL:function(a){return this.AS(a,null)},
 l8:function(){var z=new P.VV(null,null)
-H.Xe()
+H.w4()
 $.Ji=$.xG
-this.NP=z
-z.D5(0)
-this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
-this.NP.CH(0)
-J.U2(this.Rk)},
-static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+this.a=z
+z.wE(0)
+this.Q=N.QM("").gY().yI(new Z.Ym(this))
+this.a.CH(0)
+J.U2(this.b)},
+static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.H3),null,null,null)
 z.l8()
 return z}}},
 Ym:{
-"^":"TpZ:172;a",
-$1:[function(a){this.a.ZF(a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"],
-$isEH:true}}],["","",,G,{
+"^":"r:172;Q",
+$1:[function(a){this.Q.WL(a.gOR().Q+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"]}}],["","",,G,{
 "^":"",
-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,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))},
+YZ:{
+"^":"mW;Q,a,b",
+gu:function(a){var z=this.a
+return new G.ay(this.Q,z-1,z+this.b)},
+gv:function(a){return this.b},
+Og:function(a,b,c){var z=this.a
+if(z>this.Q.Q.length)throw H.b(P.D(z,null,null))
+if(this.b<0)throw H.b(P.D(this.b,null,null))
+z=this.b+z
+if(z>this.Q.Q.length)throw H.b(P.D(z,null,null))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-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,{
+ay:{
+"^":"a;Q,a,b",
+gk:function(){return C.yo.O2(this.Q.Q,this.a)},
+D:function(){return++this.a<this.b},
+eR:function(a,b){this.a+=b}}}],["","",,Z,{
 "^":"",
 kb:{
-"^":"a;aH,Rr,O4",
-gA:function(a){return this},
-gl:function(){return this.O4},
-G:function(){var z,y,x,w,v,u
-this.O4=null
-z=this.aH
-y=++z.D1
-x=z.c0
+"^":"a;Q,a,b",
+gu:function(a){return this},
+gk:function(){return this.b},
+D:function(){var z,y,x,w,v,u
+this.b=null
+z=this.Q
+y=++z.a
+x=z.b
 if(y>=x)return!1
-w=z.f9.vF
-v=C.yo.j(w,y)
+w=z.Q.Q
+v=C.yo.O2(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
-if(y)this.O4=v
-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.D1
-this.O4=this.Rr}}else this.O4=this.Rr
+if(y)this.b=v
+else if(v<56320&&++z.a<x){u=C.yo.O2(w,z.a)
+if(u>=56320&&u<=57343)this.b=(v-55296<<10>>>0)+(65536+(u-56320))
+else{if(u>=55296&&u<56320)--z.a
+this.b=this.a}}else this.b=this.a
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.vF.length-b
-new G.GMB(a,b,z).a0(a,b,c)
+z=a.Q.length-b
+new G.YZ(a,b,z).Og(a,b,c)
 z=b+z
 y=b-1
-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
+x=new Z.kb(new G.ay(a,y,z),d,null)
+w=H.J(Array(z-y-1),[P.KN])
+for(z=w.length,v=0;x.D();v=u){u=v+1
+y=x.b
 if(v>=z)return H.e(w,v)
 w[v]=y}if(v===z)return w
 else{z=Array(v)
-z.fixed$length=init
-t=H.VM(z,[P.KN])
+z.fixed$length=Array
+t=H.J(z,[P.KN])
+C.Nm.uy(t,"set range")
 H.qG(t,0,v,w,0)
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V69;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
+"^":"V68;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gK:function(a){return a.RZ},
+sK:function(a,b){a.RZ=this.ct(a,C.pD,a.RZ,b)},
+gX8:function(a){var z=a.RZ
 if(z==null)return!1
 return z.gA9()},
-gnI:function(a){var z=$.Kh.Nv
+gR1:function(a){var z=$.Pi.c
 if(z==null)return!1
-return J.xC(H.Go(z,"$isKM").N,a.GG)},
-xX:[function(a,b,c,d){var z,y,x,w
+return J.mG(H.Go(z,"$isKM").k2,a.RZ)},
+f8D:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gEV(b)
-if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
+y=z.gpL(b)
+if(typeof y!=="number")return y.A()
+if(y>0||z.gNl(b)===!0||z.gAE(b)===!0||z.gqx(b)===!0||z.gw4(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.nm),P.L5(null,null,null,P.qU,L.nm),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=$.Pi.c
+if(x==null||!J.mG(J.Zu(x),a.RZ)){z=$.Pi
+y=a.RZ
+y=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),y,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,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,173,87,106,188],
-Fh:[function(a,b,c,d){var z,y,x,w
-z=$.Kh.m2
-y=a.GG
-x=z.bq
+z.swv(0,y)}w=J.Vs(d).Q.getAttribute("href")
+$.Pi.b.bo(0,w)},"$3","gkD",6,0,173,87,106,188],
+MeB:[function(a,b,c,d){var z,y,x,w
+z=$.Pi.d
+y=a.RZ
+x=z.a
 x.Rz(0,y)
 z.TV()
 z.TV()
-w=z.wo.IU+".history"
+w=z.Q.Q+".history"
 $.Vy().setItem(w,C.xr.KP(x))},"$3","gFb",6,0,173,87,106,188],
 static:{fXx: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V69:{
-"^":"uL+Pi;",
+V68:{
+"^":"uL+Piz;",
 $isd3:true},
 D2:{
-"^":"V70;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.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.iW(a)},
-VP:function(a,b){if(J.co(b,"ws://"))return b
+"^":"V69;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gvm:function(a){return a.RZ},
+svm:function(a,b){a.RZ=this.ct(a,C.uX,a.RZ,b)},
+gHL:function(a){return a.ij},
+sHL:function(a,b){a.ij=this.ct(a,C.oE,a.ij,b)},
+gFK:function(a){return a.TQ},
+sFK:function(a,b){a.TQ=this.ct(a,C.am,a.TQ,b)},
+yY:function(a){this.Wd(a)},
+wT: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.fD(b)
-z=this.VP(a,a.ot)
-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.nm),P.L5(null,null,null,P.qU,L.nm),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)
+ny:[function(a,b,c,d){var z,y,x
+J.Kr(b)
+z=this.wT(a,a.RZ)
+d=$.Pi.d.J8(z)
+y=$.Pi
+x=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),d,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,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","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)},
+$.Pi.b.bo(0,"#/vm")},"$3","gMt",6,0,116,4,106,107],
+jLH:[function(a,b,c,d){J.Kr(b)
+this.Wd(a)},"$3","gzG",6,0,116,4,106,107],
+Wd:function(a){G.QX(a.ij).ml(new V.Vn(a)).OA(new V.oU(a))},
+Kq:function(a){var z=P.xC(0,0,0,0,0,1)
+a.LD=this.ct(a,C.O9,a.LD,z)},
 static:{n5p: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
-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.ot=""
-a.YE="localhost:9222"
-a.E6=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.RZ=""
+a.ij="localhost:9222"
+a.TQ=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
 C.aXh.LX(a)
 C.aXh.XI(a)
 C.aXh.Kq(a)
 return a}}},
-V70:{
-"^":"uL+Pi;",
+V69:{
+"^":"uL+Piz;",
 $isd3:true},
 Vn:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w
-z=this.a
-J.U2(z.E6)
+z=this.Q
+J.U2(z.TQ)
 if(a==null)return
 y=J.U6(a)
 x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,243,"call"],
-$isEH:true},
+c$0:{if(y.p(a,x).gw8()==null)break c$0
+J.dH(z.TQ,y.p(a,x))}++x}},"$1",null,2,0,null,247,"call"]},
 oU:{
-"^":"TpZ:12;b",
-$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["","",,X,{
+"^":"r:14;Q",
+$1:[function(a){J.U2(this.Q.TQ)},"$1",null,2,0,null,4,"call"]}}],["","",,X,{
 "^":"",
 I5:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.cw.LX(a)
-C.cw.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{cFd:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.vA.LX(a)
+C.vA.XI(a)
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V71;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},
-skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-pA:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,19,102],
-static:{oH: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Hd.LX(a)
-C.Hd.XI(a)
+"^":"V70;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gwv:function(a){return a.RZ},
+swv:function(a,b){a.RZ=this.ct(a,C.RJ,a.RZ,b)},
+gkc:function(a){return a.ij},
+skc:function(a,b){a.ij=this.ct(a,C.yh,a.ij,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{oHO:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.dm.LX(a)
+C.dm.XI(a)
 return a}}},
-V71:{
-"^":"uL+Pi;",
+V70:{
+"^":"uL+Piz;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$islf=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
-y=P.Vf
-y.$isVf=z
-y.$islf=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=W.KV
 y.$isKV=z
 y.$isa=z
 W.vKL.$isa=z
-y=P.qU
-y.$isqU=z
+y=P.I
+y.$isI=z
 y.$isfRn=z
-y.$asfRn=[P.qU]
+y.$asfRn=[P.I]
 y.$isa=z
-W.QI.$isa=z
-y=P.lf
-y.$islf=z
+W.M5K.$isa=z
+y=P.FK
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -22501,75 +21765,82 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-y=W.h4
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
+P.a.$isa=z
+P.Od.$isa=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
+P.oz.$isa=z
+y=W.z2
+y.$isz2=z
+y.$isKV=z
 y.$isa=z
-y=U.x06
-y.$isrx=z
+y=K.O1
+y.$isO1=z
 y.$isa=z
-y=U.FH
-y.$isrx=z
+y=U.Dc
+y.$isrN=z
+y.$isa=z
+y=U.In
+y.$isrN=z
 y.$isa=z
 y=U.uku
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.nu
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.Mm
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
-y=U.c0
-y.$isrx=z
+y=U.Ej
+y.$isrN=z
 y.$isa=z
-y=U.noG
-y.$isrx=z
+y=U.Dv
+y.$isrN=z
 y.$isa=z
 y=U.RWc
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
-y=U.vn
-y.$isvn=z
-y.$isrx=z
+y=U.zX
+y.$iszX=z
+y.$isrN=z
 y.$isa=z
-y=U.x9
-y.$isrx=z
+y=U.zg
+y.$isrN=z
 y.$isa=z
-y=U.WH
-y.$isWH=z
-y.$isrx=z
+y=U.EO
+y.$isEO=z
+y.$isrN=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
 y.$isa=z
-y=P.Lz
-y.$isLz=z
+y=P.UU
+y.$isUU=z
 y.$isa=z
 N.TJ.$isa=z
 y=T.yj
 y.$isyj=z
 y.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
+F.d3.$isa=z
+A.XP.$isa=z
+W.O7.$isa=z
+y=P.SQ
+y.$isSQ=z
+y.$isa=z
+G.MQ.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
 y.$isa=z
 y=L.nm
 y.$isnm=z
@@ -22580,7 +21851,11 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
-D.ta.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+D.Fc.$isa=z
 D.ER.$isa=z
 y=D.xB
 y.$isaf=z
@@ -22605,132 +21880,105 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
-D.Z9.$isa=z
+D.xb.$isa=z
 D.oC.$isa=z
 D.c2.$isa=z
-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=P.SQ
-y.$isSQ=z
-y.$isa=z
-y=W.ew7
-y.$isea=z
-y.$isa=z
-W.fJ.$isa=z
+Z.H3.$isa=z
+D.xx.$isa=z
+P.A5.$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.$isBo=z
+y.$isz2=z
+y.$isKV=z
+y.$isa=z
 y=D.kx
 y.$iskx=z
 y.$isaf=z
 y.$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.Tj.$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
-Z.lX.$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
+D.t9.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
 H.HX.$isa=z
 H.IY.$isa=z
-H.aX.$isa=z
-y=W.I0
+H.Du.$isa=z
+y=W.Bn
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-y=W.AD
-y.$isAD=z
-y.$isea=z
+y=P.cb
+y.$iscb=z
 y.$isa=z
-y=P.wS
-y.$iswS=z
+y=P.yX
+y.$isyX=z
 y.$isa=z
-y=P.MO
-y.$isMO=z
-y.$isa=z
-Y.qS.$isa=z
-y=U.rx
-y.$isrx=z
+Y.PnY.$isa=z
+y=U.rN
+y.$isrN=z
 y.$isa=z
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.Ni.$isa=z
-y=V.qC
-y.$isqC=z
-y.$isT8=z
+G.E8.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
+y=P.kWp
+y.$iskWp=z
 y.$isa=z
 y=P.BpP
 y.$isBpP=z
 y.$isa=z
-y=P.V2
-y.$isV2=z
+y=V.qC
+y.$isqC=z
+y.$isw=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Wy
+y.$isWy=z
+y.$isa=z
+y=P.JIw
+y.$isJIw=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
-y.$isMO=z
-y.$isa=z
-y=P.LR
-y.$isLR=z
-y.$isKA=z
-y.$isNOT=z
-y.$isMO=z
+y.$isyX=z
 y.$isa=z
 y=D.vO
 y.$isvO=z
 y.$isaf=z
 y.$isqC=z
 y.$asqC=[null,null]
-y.$isT8=z
-y.$asT8=[null,null]
+y.$isw=z
+y.$asw=[null,null]
 y.$isa=z
 y=D.uq
 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=W.vn
+y.$isvn=z
+y.$isea=z
 y.$isa=z
 y=P.fRn
 y.$isfRn=z
@@ -22738,11 +21986,11 @@
 y=P.n7
 y.$isn7=z
 y.$isa=z
-y=P.T8
-y.$isT8=z
+y=P.w
+y.$isw=z
 y.$isa=z
-y=P.dX
-y.$isdX=z
+y=P.OH
+y.$isOH=z
 y.$isa=z
 y=P.QV
 y.$isQV=z
@@ -22756,16 +22004,32 @@
 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=O.Hz
-y.$isHz=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=W.Bo
+y.$isBo=z
+y.$isz2=z
+y.$isKV=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.na
+y.$isna=z
+y.$isa=z
+y=W.f5
+y.$isf5=z
+y.$isea=z
 y.$isa=z
 y=D.wv
 y.$iswv=z
@@ -22782,8 +22046,8 @@
 y=A.ES
 y.$isES=z
 y.$isa=z
-y=A.rv
-y.$isrv=z
+y=A.yM
+y.$isyM=z
 y.$isa=z
 y=L.ARh
 y.$isARh=z
@@ -22793,343 +22057,336 @@
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z})()
-J.Qc=function(a){if(typeof a=="number")return J.P.prototype
-if(typeof a=="string")return J.O.prototype
-if(a==null)return a
-if(!(a instanceof P.a))return J.kdQ.prototype
-return a}
-J.Qe=function(a){if(typeof a=="string")return J.O.prototype
+J.NH=function(a){if(typeof a=="string")return J.E.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.U6=function(a){if(typeof a=="string")return J.O.prototype
+return J.MZ(a)}
+J.U6=function(a){if(typeof a=="string")return J.E.prototype
 if(a==null)return a
-if(a.constructor==Array)return J.Q.prototype
+if(a.constructor==Array)return J.G.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.Wx=function(a){if(typeof a=="number")return J.P.prototype
+return J.MZ(a)}
+J.Wx=function(a){if(typeof a=="number")return J.F.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
-J.w1=function(a){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.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
+J.rv=function(a){if(typeof a=="number")return J.F.prototype
+if(typeof a=="string")return J.E.prototype
+if(a==null)return a
+if(!(a instanceof P.a))return J.kdQ.prototype
+return a}
+J.t=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+return J.VA.prototype}if(typeof a=="string")return J.E.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
-if(a.constructor==Array)return J.Q.prototype
+if(a.constructor==Array)return J.G.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
+J.w1=function(a){if(a==null)return a
+if(a.constructor==Array)return J.G.prototype
+if(typeof a!="object")return a
+if(a instanceof P.a)return a
+return J.MZ(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.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.A6=function(a,b){return J.RE(a).sdl(a,b)}
+J.AE=function(a,b){return J.RE(a).sJb(a,b)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AW=function(a){return J.RE(a).gnl(a)}
+J.AJ=function(a){return J.RE(a).gLF(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.As=function(a){return J.Wx(a).gVz(a)}
+J.Af=function(a,b){return J.RE(a).aM(a,b)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
+J.Al=function(a){return J.RE(a).goH(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
+J.Ay=function(a){return J.RE(a).gGs(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BI=function(a){return J.RE(a).gl6(a)}
 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.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.BQ=function(a,b){return J.NH(a).Fr(a,b)}
+J.BS2=function(a){return J.RE(a).gEu(a)}
 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.C5=function(a){return J.RE(a).gCd(a)}
+J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-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.Cd=function(a){return J.RE(a).gKV(a)}
+J.Co=function(a,b){return J.RE(a).szH(a,b)}
+J.Cr=function(a){return J.RE(a).gEQ(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.Cw=function(a,b,c){return J.U6(a).eM(a,b,c)}
+J.D5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
+return J.Wx(a).T(a,b)}
 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.DZ=function(a,b){return J.t(a).P(a,b)}
+J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Dv=function(a){return J.Wx(a).zQ(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
+J.E1=function(a){return J.RE(a).gi0(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.EFh=function(a){if(typeof a=="number")return-a
+return J.Wx(a).G(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(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.Ee=function(a){return J.RE(a).gG5(a)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Em=function(a){return J.RE(a).guo(a)}
-J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.Ez=function(a,b){return J.RE(a).sIH(a,b)}
 J.F9=function(a){return J.RE(a).gvm(a)}
+J.FH=function(a,b){return J.RE(a).sVX(a,b)}
 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.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.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FU=function(a,b){return J.RE(a).zc(a,b)}
+J.FW=function(a,b){return J.rv(a).iM(a,b)}
+J.FWx=function(a,b){return J.Wx(a).V(a,b)}
+J.Fd=function(a,b){return J.RE(a).sLU(a,b)}
+J.Ff=function(a){return J.RE(a).gLc(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
+J.G2=function(a){return J.RE(a).gS4(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).goH(a)}
-J.GL=function(a){return J.RE(a).gBp(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
+J.GGs=function(a){return J.RE(a).gEE(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.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
+J.Gt=function(a){return J.RE(a).gRY(a)}
 J.H1=function(a){return J.RE(a).gLe(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.H9=function(a,b,c){if((a.constructor==Array||H.wVW(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).q(a,b,c)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HP=function(a){return J.RE(a).gFK(a)}
+J.HL=function(a){return J.RE(a).gvq(a)}
+J.HO=function(a){return J.RE(a).Zi(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Ha=function(a,b){return J.RE(a).QV(a,b)}
+J.Hd=function(a,b,c){return J.w1(a).oq(a,b,c)}
 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.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.Hm=function(a){return J.RE(a).gTK(a)}
+J.Hy=function(a){return J.RE(a).gnx(a)}
+J.I0=function(a,b){return J.RE(a).bA(a,b)}
 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.IC=function(a,b){return J.NH(a).O2(a,b)}
+J.IE=function(a,b,c){return J.RE(a).f8(a,b,c)}
 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).gkZ(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.IR=function(a){return J.RE(a).gYt(a)}
+J.IS=function(a){return J.RE(a).gnv(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){return J.RE(a).gIH(a)}
-J.Ir=function(a){return J.RE(a).gyK(a)}
+J.Ir=function(a){return J.RE(a).ghf(a)}
 J.Iz=function(a){return J.RE(a).gfY(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.J2g=function(a){return J.RE(a).UV(a)}
+J.JA=function(a,b,c){return J.NH(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.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a){return J.RE(a).gWA(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.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.KG=function(a){return J.RE(a).guz(a)}
+J.Ja=function(a,b){return J.RE(a).sM(a,b)}
+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.KU=function(a,b){return J.RE(a).T2(a,b)}
-J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(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.Km=function(a,b,c){return J.RE(a).ZK(a,b,c)}
+J.Kr=function(a){return J.RE(a).e6(a)}
+J.Kt=function(a){return J.RE(a).gG3(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.LE=function(a){return J.RE(a).VD(a)}
-J.LM=function(a){return J.RE(a).gn9(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.LF=function(a){return J.RE(a).gpf(a)}
+J.LL=function(a){return J.RE(a).gFK(a)}
+J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LY4=function(a){return J.RE(a).gBp(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.Lz=function(a){return J.t(a).X(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).sQR(a,b)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MT=function(a){return J.RE(a).guc(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.Mh=function(a){return J.RE(a).gMt(a)}
 J.N1=function(a){return J.RE(a).Es(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).gNG(a)}
-J.NDJ=function(a){return J.RE(a).gWt(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
+J.NB=function(a){return J.RE(a).grz(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.NV=function(a){return J.RE(a).gYe(a)}
+J.NQ=function(a){return J.Wx(a).zQ(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gdH(a)}
+J.Nb=function(a){return J.RE(a).gt0(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.Nk=function(a){return J.RE(a).gtT(a)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
+J.Nj=function(a,b,c){return J.NH(a).Nj(a,b,c)}
+J.Nx=function(a){return J.w1(a).gu(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
+J.OC=function(a){return J.RE(a).gCn(a)}
+J.OD=function(a){return J.RE(a).gwd(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
+J.OP=function(a,b){return J.w1(a).uk(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
+J.OX=function(a){return J.NH(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
+J.Okq=function(a){return J.RE(a).ghU(a)}
+J.Ot=function(a){return J.RE(a).gRO(a)}
+J.Ou=function(a){return J.RE(a).gaL(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
+J.P3=function(a){return J.RE(a).goL(a)}
+J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
-J.PA=function(a){return J.RE(a).gQr(a)}
-J.PG=function(a){return J.RE(a).gEE(a)}
-J.PK=function(a){return J.RE(a).gQR(a)}
+J.PK=function(a){return J.RE(a).gdA(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.PR=function(a){return J.RE(a).gA5(a)}
-J.PS=function(a){return J.x(a).gCR(a)}
+J.PQ=function(a){return J.RE(a).gVY(a)}
+J.PS=function(a){return J.t(a).gCR(a)}
 J.PW=function(a){return J.RE(a).gVb(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.Pp=function(a){return J.RE(a).gDf(a)}
 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,b){return J.U6(a).OY(a,b)}
+J.Q0=function(a){return J.RE(a).gwh(a)}
 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.Q7=function(a){return J.NH(a).bS(a)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QE=function(a){return J.RE(a).gCd(a)}
+J.QD=function(a){return J.RE(a).gdB(a)}
+J.QI=function(a){return J.Wx(a).gfE(a)}
+J.QP=function(a){return J.RE(a).gWq(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.QY=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.Qd=function(a){return J.RE(a).gRn(a)}
+J.QZ=function(a){return J.RE(a).gpM(a)}
+J.Qd=function(a,b){return J.RE(a).sR9(a,b)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
+J.Qm=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
-J.Qt=function(a,b){return J.RE(a).sML(a,b)}
 J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
+J.QvL=function(a){return J.RE(a).gSs(a)}
 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.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
+J.RS=function(a,b){return J.U6(a).sv(a,b)}
+J.RV=function(a,b){return J.RE(a).MM(a,b)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
+J.Rb=function(a,b){return J.RE(a).sCd(a,b)}
 J.Rd=function(a,b){return J.RE(a).sO7(a,b)}
-J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rr=function(a){return J.RE(a).ga7(a)}
-J.Ry=function(a){return J.RE(a).gVE(a)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
+J.S5=function(a){return J.RE(a).gIF(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.Sf=function(a,b){return J.RE(a).sXE(a,b)}
+J.SS=function(a){return J.RE(a).gQP(a)}
+J.SW=function(a){return J.RE(a).gM(a)}
+J.Sf=function(a,b){return J.RE(a).sGV(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.TH=function(a){return J.RE(a).gGp(a)}
 J.TM=function(a){return J.RE(a).gOd(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.Tg=function(a){return J.RE(a).gCI(a)}
-J.Tm=function(a){return J.RE(a).grX(a)}
+J.TR=function(a,b){return J.RE(a).saL(a,b)}
+J.TZQ=function(a,b){return J.RE(a).sN(a,b)}
+J.Ta=function(a){return J.Wx(a).yu(a)}
+J.Tf=function(a,b){if(a.constructor==Array||typeof a=="string"||H.wVW(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
+return J.U6(a).p(a,b)}
 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.Tw=function(a){return J.RE(a).gKa(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){return J.RE(a).gEQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U8=function(a){return J.RE(a).gUQ(a)}
 J.UE=function(a){return J.w1(a).git(a)}
-J.UF=function(a){return J.RE(a).JP(a)}
-J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
+J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 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.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.US=function(a){return J.RE(a).gWt(a)}
+J.UZ=function(a){return J.RE(a).gIb(a)}
+J.Ua=function(a){return J.RE(a).gkZ(a)}
+J.Ul=function(a){return J.RE(a).ay(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.Vj=function(a,b){return J.RE(a).Md(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.Vk=function(a,b){return J.w1(a).ev(a,b)}
+J.Vr=function(a,b){return J.RE(a).sG3(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
-J.W3w=function(a,b){return J.RE(a).Ft(a,b)}
+J.W1=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
+return J.Wx(a).B(a,b)}
 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).sLF(a,b)}
+return J.rv(a).g(a,b)}
+J.WI=function(a,b){return J.RE(a).soc(a,b)}
+J.WN=function(a){return J.RE(a).gIi(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WU=function(a,b){return J.RE(a).sK(a,b)}
+J.WV=function(a){return J.RE(a).gPe(a)}
+J.WX7=function(a){return J.RE(a).gbJ(a)}
 J.We=function(a,b){return J.RE(a).sNJ(a,b)}
-J.Wf=function(a){return J.RE(a).D4(a)}
-J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a){return J.RE(a).gTK(a)}
+J.X9=function(a,b,c,d){return J.RE(a).hV(a,b,c,d)}
+J.XB=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XHl=function(a){return J.Wx(a).yu(a)}
-J.XP=function(a){return J.RE(a).Um(a)}
+J.Xa=function(a){return J.RE(a).gXc(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xr=function(a){return J.RE(a).gEa(a)}
+J.Xi=function(a){return J.RE(a).gr9(a)}
+J.Xp=function(a){return J.RE(a).gzH(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-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.Yd=function(a){return J.RE(a).gBV(a)}
+J.YH=function(a){return J.RE(a).gnS(a)}
+J.YN=function(a,b){return J.RE(a).WO(a,b)}
+J.YQ=function(a,b){return J.U6(a).OY(a,b)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yo=function(a,b,c){return J.RE(a).f8(a,b,c)}
-J.Yq=function(a){return J.RE(a).gph(a)}
+J.Yj=function(a){return J.RE(a).gIq(a)}
+J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
+J.Z8=function(a){return J.RE(a).gCf(a)}
+J.ZC=function(a){return J.RE(a).gph(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)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 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.ZZ=function(a,b){return J.NH(a).yn(a,b)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
-J.Zs=function(a){return J.RE(a).gcY(a)}
+J.Zs=function(a){return J.RE(a).grO(a)}
+J.Zu=function(a){return J.RE(a).gK(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.ae=function(a){return J.RE(a).gke(a)}
-J.an=function(a,b){return J.RE(a).Id(a,b)}
+J.aAQ=function(a){return J.RE(a).gzY(a)}
+J.aN=function(a){return J.RE(a).fV(a)}
+J.aO=function(a,b){return J.RE(a).Rg(a,b)}
+J.aP=function(a,b){return J.RE(a).sXE(a,b)}
+J.aW=function(a){return J.RE(a).gJp(a)}
+J.aX=function(a){return J.RE(a).gR9(a)}
 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.bB=function(a){return J.t(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).ghS(a)}
-J.bS=function(a){return J.RE(a).gUo(a)}
-J.bT=function(a){return J.w1(a).gqG(a)}
-J.bb=function(a){return J.RE(a).gHy(a)}
-J.bh=function(a){return J.RE(a).geZ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
+J.bI=function(a,b){return J.Wx(a).W(a,b)}
+J.bP=function(a){return J.w1(a).gtH(a)}
+J.bU=function(a,b){return J.RE(a).sbY(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.c7=function(a){return J.RE(a).guS(a)}
+J.cC=function(a){return J.RE(a).gke(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)}
@@ -23137,244 +22394,255 @@
 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.dE=function(a){return J.RE(a).gGs(a)}
-J.dF=function(a){return J.w1(a).zH(a)}
-J.dK=function(a){return J.RE(a).gWk(a)}
-J.dc=function(a,b){return J.RE(a).smH(a,b)}
+J.cm=function(a,b){return J.w1(a).srZ(a,b)}
+J.co=function(a,b){return J.NH(a).nC(a,b)}
+J.dH=function(a,b){return J.w1(a).h(a,b)}
+J.dY=function(a){return J.RE(a).ga4(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(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.eM=function(a){return J.RE(a).gws(a)}
+J.dn=function(a){return J.RE(a).gNa(a)}
+J.dw=function(a){return J.RE(a).gJ6(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.er=function(a){return J.RE(a).gyW(a)}
-J.ev=function(a){return J.RE(a).gkD(a)}
+J.ex=function(a){return J.RE(a).ks(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
-J.f5=function(a){return J.RE(a).grz(a)}
-J.f9c=function(a){return J.RE(a).gJQ(a)}
-J.fA=function(a){return J.RE(a).gJp(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.f6=function(a,b){return J.RE(a).sGq(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.fe=function(a){return J.RE(a).gNG(a)}
 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.h3=function(a){return J.RE(a).gHL(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.hfy=function(a){return J.RE(a).gDX(a)}
-J.hn=function(a){return J.RE(a).gEu(a)}
+J.hW=function(a){return J.RE(a).gql(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.hw=function(a,b){return J.RE(a).sGp(a,b)}
 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.i8=function(a){return J.RE(a).gzU(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iB=function(a){return J.RE(a).giC(a)}
+J.iF=function(a){return J.RE(a).gTU(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.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
+J.ie=function(a,b){return J.NH(a).C1(a,b)}
+J.ik=function(a){return J.RE(a).gHt(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){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.ix=function(a,b){return J.RE(a).sXc(a,b)}
+J.j1=function(a){return J.RE(a).giJ(a)}
+J.j8v=function(a){return J.RE(a).gO7(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.jd=function(a){return J.RE(a).gZm(a)}
-J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
-J.jq=function(a,b){return J.RE(a).sZp(a,b)}
+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.jy=function(a,b){return J.RE(a).sPe(a,b)}
 J.k0=function(a){return J.RE(a).giZ(a)}
+J.k4=function(a,b){return J.RE(a).syG(a,b)}
 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.kc=function(a){return J.RE(a).gGV(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).gDf(a)}
+J.ksQ=function(a){return J.RE(a).gB1(a)}
+J.kv=function(a){return J.RE(a).glp(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lA=function(a){return J.RE(a).gLc(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.lF=function(a,b){return J.RE(a).snS(a,b)}
+J.lK=function(a){return J.RE(a).gbw(a)}
+J.lX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
+return J.rv(a).R(a,b)}
+J.lk=function(a){return J.RE(a).gRq(a)}
+J.ll=function(a){return J.RE(a).gUt(a)}
+J.ls=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.m8=function(a,b){return J.RE(a).sEu(a,b)}
 J.mF=function(a){return J.RE(a).gHn(a)}
-J.mN=function(a){return J.RE(a).gRO(a)}
+J.mG=function(a,b){if(a==null)return b==null
+if(typeof a!="object")return b!=null&&a===b
+return J.t(a).m(a,b)}
+J.mI=function(a,b){return J.RE(a).rW(a,b)}
+J.mP=function(a){return J.RE(a).gzj(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).gO(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){return J.RE(a).gkD(a)}
 J.nG=function(a){return J.RE(a).gv8(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.ns=function(a){return J.RE(a).gRn(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
-J.o6=function(a){return J.RE(a).Lx(a)}
+J.o3=function(a,b){return J.Wx(a).L(a,b)}
 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.oH=function(a){return J.RE(a).gjT(a)}
 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.oS=function(a,b,c,d){return J.RE(a).hV(a,b,c,d)}
-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.ocJ=function(a,b){return J.RE(a).yU(a,b)}
 J.op=function(a){return J.RE(a).gD7(a)}
 J.or=function(a){return J.RE(a).gV5(a)}
-J.p5=function(a){return J.RE(a).gO7(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).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.q8=function(a){return J.U6(a).gB(a)}
+J.pU=function(a){return J.RE(a).gYe(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
+J.pg=function(a){return J.RE(a).gBj(a)}
+J.ph=function(a,b){return J.RE(a).RR(a,b)}
+J.pr=function(a){return J.RE(a).guS(a)}
+J.pz=function(a){return J.RE(a).gwe(a)}
+J.q0=function(a){return J.RE(a).guz(a)}
+J.q8=function(a){return J.RE(a).gvc(a)}
 J.qA=function(a){return J.w1(a).br(a)}
-J.ql=function(a){return J.RE(a).gaB(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.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.qq=function(a){return J.RE(a).dQ(a)}
+J.qv=function(a,b){return J.NH(a).dd(a,b)}
 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.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).gS(a)}
+J.rn=function(a){return J.w1(a).grZ(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
+J.rp=function(a){return J.RE(a).gd4(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.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
+J.tC=function(a){return J.RE(a).gj8(a)}
+J.tQ=function(a,b){return J.RE(a).swv(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).gCK(a)}
+J.tX=function(a){return J.RE(a).gtT(a)}
+J.tl=function(a){return J.RE(a).gyK(a)}
+J.tw=function(a){return J.RE(a).je(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
-J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return 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.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uN=function(a){return J.RE(a).gHo(a)}
+J.uF=function(a,b){return J.RE(a).sMZ(a,b)}
+J.uM=function(a,b){return J.RE(a).sod(a,b)}
+J.uN=function(a){return J.RE(a).gbY(a)}
+J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
-J.uf=function(a){return J.RE(a).gQU(a)}
 J.ufU=function(a){return J.RE(a).gxr(a)}
+J.ui=function(a){return J.RE(a).gTw(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.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).gwX(a)}
-J.vA=function(a,b){return J.RE(a).sRk(a,b)}
+J.v1=function(a){return J.t(a).giO(a)}
+J.v6=function(a){return J.RE(a).yy(a)}
+J.v7=function(a){return J.RE(a).Um(a)}
+J.v9=function(a){return J.RE(a).gX8(a)}
+J.vE=function(a){return J.RE(a).gMZ(a)}
+J.vI=function(a){return J.RE(a).gVX(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.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)}
+J.vP=function(a,b){return J.RE(a).QS(a,b)}
+J.vU=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).A(a,b)}
+J.vX=function(a){return J.w1(a).wg(a)}
+J.vo=function(a){return J.RE(a).gZJ(a)}
+J.vu=function(a,b){return J.RE(a).So(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 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.wK=function(a,b){return J.RE(a).xZ(a,b)}
+J.wS=function(a){return J.U6(a).gv(a)}
 J.wd=function(a){return J.RE(a).gqw(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.wg=function(a){return J.RE(a).god(a)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wm=function(a){return J.RE(a).goN(a)}
+J.wo=function(a,b){return J.RE(a).GE(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.x4=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).S(a,b)}
 J.x5=function(a){return J.RE(a).gpE(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).geZ(a)}
+J.xl=function(a){return J.RE(a).xO(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
-J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y1=function(a){return J.RE(a).gJ(a)}
 J.y3=function(a){return J.RE(a).gFL(a)}
+J.y5=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
+return J.Wx(a).s(a,b)}
+J.y6=function(a,b){return J.w1(a).GT(a,b)}
 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).gih(a)}
-J.yO=function(a){return J.RE(a).ga4(a)}
-J.yR=function(a,b){return J.RE(a).XT(a,b)}
-J.yd=function(a){return J.RE(a).xO(a)}
+J.yI=function(a){return J.RE(a).gLf(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.yz=function(a){return J.RE(a).gLF(a)}
+J.yr=function(a){return J.RE(a).gJb(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zE=function(a){return J.RE(a).gtu(a)}
-J.zF=function(a){return J.RE(a).gHL(a)}
+J.z8=function(a){return J.RE(a).gGq(a)}
+J.zB=function(a){return J.RE(a).gee(a)}
+J.zD=function(a){return J.RE(a).gEl(a)}
+J.zF=function(a){return J.RE(a).gih(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.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)}
 J.zv=function(a,b){return J.RE(a).suo(a,b)}
+I.uL=function(a){a.immutable$list=Array
+a.fixed$length=Array
+return a}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.hg.prototype
-C.QD=B.G6.prototype
+C.Gkp=Y.G0.prototype
+C.C8=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.i3=Q.eW.prototype
-C.fe=O.eo.prototype
+C.YZz=Q.eW.prototype
+C.RD=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
 C.vS=T.uV.prototype
-C.dZE=U.NY.prototype
+C.oS=U.NY.prototype
 C.O0=R.JI.prototype
+C.lG=W.DG4.prototype
 C.Pj=O.Hi.prototype
 C.AuX=O.NF.prototype
-C.mk=O.ts.prototype
-C.BKH=O.AK.prototype
-C.uyw=O.ys.prototype
+C.Y7=O.ts.prototype
+C.va=O.AK.prototype
+C.Yw=O.ys.prototype
 C.BB=G.Tk.prototype
-C.On=F.ZP.prototype
+C.a3=F.ZP.prototype
 C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.LTI=A.Gk.prototype
-C.kL=W.H05.prototype
+C.by=A.Gk.prototype
+C.MO=W.H0.prototype
 C.ls6=X.MJ.prototype
 C.n0=X.J3.prototype
-C.Xo=U.DK.prototype
+C.XoJ=U.DK.prototype
 C.PJ8=N.BS.prototype
-C.wc=O.Vb.prototype
-C.xut=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
+C.Cs=O.Vb.prototype
+C.Vc=K.Ly.prototype
+C.Dt=W.O7.prototype
+C.Ug=E.WS.prototype
 C.GII=E.H8.prototype
-C.Ie=E.mO.prototype
+C.Ie=E.IH.prototype
 C.Ig=E.DE.prototype
 C.VLs=E.U1.prototype
 C.ej=E.qM.prototype
@@ -23382,386 +22650,372 @@
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
-C.yr=E.ds.prototype
+C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.IXz=E.qh.prototype
+C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1o=E.L4.prototype
-C.ijR=E.Zn.prototype
-C.Fw=E.uE.prototype
-C.aVr=E.n5.prototype
+C.za=E.L4.prototype
+C.ag=E.Zn.prototype
+C.RrX=E.uE.prototype
+C.Dw=E.n5.prototype
 C.QFk=O.Im.prototype
 C.uRw=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
-C.rCJ=D.Qh.prototype
+C.kd=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
-C.mb=D.Oz.prototype
-C.OoF=D.St.prototype
-C.hys=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.VA7.prototype
+C.YGo=D.Oz.prototype
+C.ta=D.St.prototype
+C.Xe=L.qk.prototype
+C.Nm=J.G.prototype
+C.YI=J.VA.prototype
 C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
-C.CD=J.P.prototype
-C.yo=J.O.prototype
-C.Du=Z.vj.prototype
+C.CD=J.F.prototype
+C.yo=J.E.prototype
+C.GB=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.ag=M.CX.prototype
-C.DX=U.WG.prototype
-C.OX=U.VZ.prototype
-C.Ax=N.I2.prototype
-C.Mw=N.FB.prototype
+C.MG=M.CX.prototype
+C.dl=U.WG.prototype
+C.vmJ=U.VZ.prototype
+C.pc=N.I2.prototype
+C.h1=N.FB.prototype
 C.po=N.qn.prototype
 C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
-C.aV=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
+C.Jm=H.V6.prototype
+C.kDK=A.md.prototype
+C.pl=A.ye.prototype
+C.YY=A.Bm.prototype
 C.nn=A.Ya.prototype
-C.BJj=A.Co.prototype
+C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.h5=L.qV.prototype
+C.t5=W.dX.prototype
+C.br=L.qV.prototype
 C.ji=Q.Ce.prototype
-C.LQi=L.NT.prototype
+C.Lj=L.NT.prototype
 C.YpE=V.F1.prototype
 C.Pfz=Z.uL.prototype
-C.Sx=J.iCW.prototype
-C.GBL=A.xc.prototype
-C.za=T.ov.prototype
-C.c07=A.kn.prototype
+C.ZQ=J.iCW.prototype
+C.Ki=A.xc.prototype
+C.Fa=T.ov.prototype
+C.Wa=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
-C.Uv=U.Ti.prototype
+C.Ns=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.K6L=Q.CY.prototype
+C.zb=Q.CY.prototype
 C.OKl=A.G1.prototype
-C.Uav=U.Um.prototype
+C.Rr=U.Um.prototype
 C.vB=J.kdQ.prototype
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
-C.cw=X.I5.prototype
-C.Hd=U.el.prototype
-C.ole=W.K5.prototype
+C.vA=X.I5.prototype
+C.dm=U.el.prototype
+C.ol=W.K5.prototype
 C.Kn=new H.i6()
-C.x4=new U.WH()
+C.HI=new U.EO()
 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.zr=new L.iNc()
+C.aZ=new L.iNc()
 C.fQ=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
+C.Ea=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.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.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)
+C.Jny=H.K('U4')
+C.B10=new K.vly()
+C.PC=new A.A2(!1)
+C.cs=I.uL([C.B10,C.PC])
+C.V0=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.cs)
 C.kY=new H.tx("ref")
-C.SXK=H.Kxv('qC')
-C.rT=new A.ES(C.kY,C.BM,!1,C.SXK,!1,C.ucP)
-C.Zg=new H.tx("args")
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.jJ=H.K('qC')
+C.rT=new A.ES(C.kY,C.BM,!1,C.jJ,!1,C.cs)
+C.mi=new H.tx("text")
+C.yE=H.K('I')
+C.VB=new A.ES(C.mi,C.BM,!1,C.yE,!1,C.cs)
+C.Z=new H.tx("args")
+C.b7=new A.ES(C.Z,C.BM,!1,C.jJ,!1,C.cs)
 C.SR=new H.tx("map")
-C.MR1=H.Kxv('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
+C.BY=H.K('vO')
+C.S9=new A.ES(C.SR,C.BM,!1,C.BY,!1,C.cs)
+C.aH=new H.tx("displayCutoff")
+C.J19=new K.iv()
+C.y0=I.uL([C.B10,C.J19])
+C.Ei=new A.ES(C.aH,C.BM,!1,C.yE,!1,C.y0)
 C.ld=new H.tx("events")
-C.Gsc=H.Kxv('wn')
-C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
-C.aP=new H.tx("active")
-C.Ow=H.Kxv('SQ')
-C.oh=new A.ES(C.aP,C.BM,!1,C.Ow,!1,C.ucP)
+C.Gsc=H.K('wn')
+C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.cs)
+C.Gs=new H.tx("sampleCount")
+C.Wq=new A.ES(C.Gs,C.BM,!1,C.yE,!1,C.y0)
+C.Dj=new H.tx("refreshTime")
+C.kA=new A.ES(C.Dj,C.BM,!1,C.yE,!1,C.y0)
+C.S=new H.tx("active")
+C.nd=H.K('SQ')
+C.oh=new A.ES(C.S,C.BM,!1,C.nd,!1,C.cs)
 C.UL=new H.tx("profileChanged")
-C.yQP=H.Kxv('EH')
-C.xD=I.uLC([])
+C.yQP=H.K('EH')
+C.xD=I.uL([])
 C.bG=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.xD)
 C.TU=new H.tx("endPosChanged")
 C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.xD)
+C.uX=new H.tx("standaloneVmAddress")
+C.VM=new A.ES(C.uX,C.BM,!1,C.yE,!1,C.cs)
 C.Wm=new H.tx("refChanged")
 C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.xD)
 C.UY=new H.tx("result")
-C.SmN=H.Kxv('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
+C.Ct=H.K('af')
+C.n6=new A.ES(C.UY,C.BM,!1,C.Ct,!1,C.cs)
 C.SA=new H.tx("lines")
-C.hAX=H.Kxv('WO')
-C.J19=new K.iv()
-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.lY,!1,C.ucP)
+C.zJ=H.K('WO')
+C.KI=new A.ES(C.SA,C.BM,!1,C.zJ,!1,C.y0)
 C.mr=new H.tx("expanded")
-C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
+C.iz=new A.ES(C.mr,C.BM,!1,C.nd,!1,C.y0)
 C.VI=new H.tx("line")
-C.lhY=H.Kxv('c2')
-C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.ucP)
+C.lhY=H.K('c2')
+C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.cs)
 C.IT=new H.tx("startPos")
-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.lY,!1,C.ucP)
+C.yw=H.K('KN')
+C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.cs)
 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)
+C.Q56=H.K('uq')
+C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.cs)
+C.zU=new H.tx("uncheckedText")
+C.OS=new A.ES(C.zU,C.BM,!1,C.yE,!1,C.cs)
+C.PM=new H.tx("status")
+C.Jr=new A.ES(C.PM,C.BM,!1,C.yE,!1,C.y0)
 C.QK=new H.tx("qualified")
-C.P9=new A.ES(C.QK,C.BM,!1,C.Ow,!1,C.ucP)
+C.P9=new A.ES(C.QK,C.BM,!1,C.nd,!1,C.cs)
 C.tf=new H.tx("selectedMetric")
-C.cdY=H.Kxv('YX')
-C.q6=new A.ES(C.tf,C.BM,!1,C.cdY,!1,C.esx)
+C.cdY=H.K('YX')
+C.q6=new A.ES(C.tf,C.BM,!1,C.cdY,!1,C.y0)
 C.XA=new H.tx("cls")
-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.lY,!1,C.esx)
+C.Ks=H.K('dy')
+C.dq=new A.ES(C.XA,C.BM,!1,C.Ks,!1,C.cs)
 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.lY,!1,C.ucP)
+C.S8=H.K('bv')
+C.xY=new A.ES(C.rB,C.BM,!1,C.S8,!1,C.y0)
 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")
 C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.xD)
 C.yh=new H.tx("error")
-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.lY,!1,C.esx)
+C.oUD=H.K('N7')
+C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.cs)
 C.oj=new H.tx("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
+C.GT=new A.ES(C.oj,C.BM,!1,C.BY,!1,C.cs)
 C.td=new H.tx("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
+C.Zk=new A.ES(C.td,C.BM,!1,C.Ct,!1,C.cs)
 C.pD=new H.tx("target")
-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.lY,!1,C.esx)
-C.FQ=new H.tx("scriptHeight")
-C.OS=new A.ES(C.FQ,C.BM,!1,C.lY,!1,C.esx)
+C.NBK=H.K('Z5')
+C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.cs)
+C.t6=new H.tx("mapAsString")
+C.Hk=new A.ES(C.t6,C.BM,!1,C.yE,!1,C.y0)
 C.vp=new H.tx("list")
-C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
+C.Rz=new A.ES(C.vp,C.BM,!1,C.zJ,!1,C.cs)
+C.P=new H.tx("anchor")
+C.TE=new A.ES(C.P,C.BM,!1,C.yE,!1,C.cs)
 C.uO=new H.tx("inboundReferences")
-C.JT=new A.ES(C.uO,C.BM,!1,C.MR1,!1,C.ucP)
+C.JT=new A.ES(C.uO,C.BM,!1,C.BY,!1,C.cs)
 C.B0=new H.tx("expand")
-C.iH=new A.ES(C.B0,C.BM,!1,C.Ow,!1,C.ucP)
+C.iH=new A.ES(C.B0,C.BM,!1,C.nd,!1,C.cs)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
+C.yV=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
 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.lY,!1,C.esx)
 C.EP=new H.tx("page")
-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.VW=H.K('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.cs)
+C.zz=new H.tx("timeSpan")
+C.mb=new A.ES(C.zz,C.BM,!1,C.yE,!1,C.y0)
+C.CZi=H.K('cn')
+C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.cs)
 C.Ys=new H.tx("pad")
-C.Cg=new A.ES(C.Ys,C.BM,!1,C.Ow,!1,C.ucP)
+C.Cg=new A.ES(C.Ys,C.BM,!1,C.nd,!1,C.cs)
 C.nr=new H.tx("context")
-C.cL5=H.Kxv('lI')
-C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.ucP)
+C.cL5=H.K('lI')
+C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.cs)
 C.WQ=new H.tx("field")
-C.n8S=H.Kxv('xB')
-C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.ucP)
+C.n8S=H.K('xB')
+C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.cs)
 C.qX=new H.tx("fragmentationChanged")
 C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.xD)
 C.UX=new H.tx("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
+C.Pt=new A.ES(C.UX,C.BM,!1,C.BY,!1,C.cs)
 C.rP=new H.tx("mapChanged")
 C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.xD)
 C.kB=new H.tx("metric")
-C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.ucP)
+C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.cs)
 C.nf=new H.tx("function")
-C.QJ7=H.Kxv('Kp')
-C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.ucP)
-C.NK=new H.tx("activeFrame")
-C.ZX=new A.ES(C.NK,C.BM,!1,C.yw,!1,C.ucP)
+C.QJ7=H.K('Kp')
+C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.cs)
+C.N=new H.tx("activeFrame")
+C.ZX=new A.ES(C.N,C.BM,!1,C.yw,!1,C.cs)
 C.ne=new H.tx("exception")
-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.lY,!1,C.ucP)
+C.Mda=H.K('Ix')
+C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.cs)
 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)
+C.M7=H.K('WP')
+C.X4=new A.ES(C.Ve,C.BM,!1,C.M7,!1,C.cs)
 C.nt=new H.tx("startLine")
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.esx)
+C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.y0)
 C.tg=new H.tx("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.esx)
+C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.y0)
+C.eh=new H.tx("lineMode")
+C.IP=new A.ES(C.eh,C.BM,!1,C.yE,!1,C.y0)
 C.vY=new H.tx("currentPos")
-C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
+C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.cs)
 C.p8=new H.tx("event")
-C.Kp2=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
+C.x8=H.K('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.cs)
 C.rX=new H.tx("stack")
-C.Wp=new A.ES(C.rX,C.BM,!1,C.MR1,!1,C.ucP)
-C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
+C.Wp=new A.ES(C.rX,C.BM,!1,C.BY,!1,C.cs)
 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.lY,!1,C.esx)
+C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.y0)
 C.qs=new H.tx("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
+C.MN=new A.ES(C.qs,C.BM,!1,C.BY,!1,C.cs)
 C.QH=new H.tx("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
+C.C4=new A.ES(C.QH,C.BM,!1,C.BY,!1,C.cs)
 C.bk=new H.tx("checked")
-C.NS=new A.ES(C.bk,C.BM,!1,C.Ow,!1,C.ucP)
+C.NS=new A.ES(C.bk,C.BM,!1,C.nd,!1,C.cs)
 C.yL=new H.tx("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
+C.j5=new A.ES(C.yL,C.BM,!1,C.BY,!1,C.cs)
 C.pH=new H.tx("small")
-C.xV=new A.ES(C.pH,C.BM,!1,C.Ow,!1,C.ucP)
+C.xV=new A.ES(C.pH,C.BM,!1,C.nd,!1,C.cs)
 C.Wj=new H.tx("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.mi=new H.tx("text")
-C.eQ=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.ucP)
+C.Ah=new A.ES(C.Wj,C.BM,!1,C.BY,!1,C.cs)
 C.LH=new H.tx("metricChanged")
 C.oB=new A.ES(C.LH,C.hU,!1,C.yQP,!1,C.xD)
 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.lY,!1,C.esx)
-C.PM=new H.tx("status")
-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.lY,!1,C.esx)
-C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
+C.fz=new A.ES(C.He,C.BM,!1,C.nd,!1,C.y0)
 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.lW=new A.ES(C.VK,C.BM,!1,C.nd,!1,C.cs)
 C.vs=new H.tx("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
+C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.y0)
+C.TN=new H.tx("lastServiceGC")
+C.K1=new A.ES(C.TN,C.BM,!1,C.yE,!1,C.y0)
 C.li=new H.tx("startPosChanged")
 C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.xD)
 C.ox=new H.tx("countersChanged")
 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.MR1,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
+C.Tt=new A.ES(C.XM,C.BM,!1,C.BY,!1,C.cs)
+C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.y0)
 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.lY,!1,C.esx)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.cs)
+C.kw=H.K('w')
+C.hS=new A.ES(C.SR,C.BM,!1,C.kw,!1,C.cs)
+C.Zi=new H.tx("lastAccumulatorReset")
+C.vC=new A.ES(C.Zi,C.BM,!1,C.yE,!1,C.y0)
+C.hf=new H.tx("label")
+C.BT=new A.ES(C.hf,C.BM,!1,C.yE,!1,C.cs)
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
+C.mJ=new H.tx("color")
+C.Dx=new A.ES(C.mJ,C.BM,!1,C.yE,!1,C.cs)
 C.YT=new H.tx("expr")
-C.wG=H.Kxv('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
+C.wG=H.K('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.cs)
+C.FQ=new H.tx("scriptHeight")
+C.Ow=new A.ES(C.FQ,C.BM,!1,C.yE,!1,C.y0)
 C.yB=new H.tx("instances")
-C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
+C.vZ=new A.ES(C.yB,C.BM,!1,C.BY,!1,C.y0)
 C.jU=new H.tx("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
+C.bw=new A.ES(C.jU,C.BM,!1,C.BY,!1,C.cs)
 C.xS=new H.tx("tagSelectorChanged")
 C.hd=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.xD)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
+C.RU=new A.ES(C.rB,C.BM,!1,C.S8,!1,C.cs)
+C.nH=new A.ES(C.mi,C.BM,!1,C.yE,!1,C.y0)
 C.uu=new H.tx("internal")
-C.NJ=new A.ES(C.uu,C.BM,!1,C.Ow,!1,C.ucP)
+C.NJ=new A.ES(C.uu,C.BM,!1,C.nd,!1,C.cs)
 C.YE=new H.tx("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
+C.Wl=new A.ES(C.YE,C.BM,!1,C.BY,!1,C.cs)
 C.Gr=new H.tx("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
+C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.cs)
+C.bE=new H.tx("sampleDepth")
+C.Dh=new A.ES(C.bE,C.BM,!1,C.yE,!1,C.y0)
 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.lY,!1,C.ucP)
+C.U0P=H.K('wv')
+C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.cs)
 C.PX=new H.tx("script")
-C.KB=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
+C.c3=H.K('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.c3,!1,C.cs)
 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.MR1,!1,C.ucP)
-C.i4=new H.tx("code")
-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)
-C.kI=new H.tx("currentLine")
-C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.esx)
-C.kG=new H.tx("classTable")
-C.m7I=H.Kxv('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
-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.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")
-C.aj=new A.ES(C.S4,C.BM,!1,C.Ow,!1,C.esx)
-C.TI=new H.tx("showConsole")
-C.NU=new A.ES(C.TI,C.BM,!1,C.Ow,!1,C.ucP)
-C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.esx)
-C.am=new H.tx("chromeTargets")
-C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
+C.lH=new H.tx("checkedText")
+C.M6=new A.ES(C.lH,C.BM,!1,C.yE,!1,C.cs)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
+C.py=new A.ES(C.oE,C.BM,!1,C.yE,!1,C.cs)
+C.o0=new A.ES(C.vp,C.BM,!1,C.BY,!1,C.cs)
+C.i4=new H.tx("code")
+C.pM=H.K('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.cs)
+C.nE=new H.tx("tracer")
+C.CS=H.K('KZ')
+C.FM=new A.ES(C.nE,C.BM,!1,C.CS,!1,C.cs)
+C.kI=new H.tx("currentLine")
+C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.y0)
+C.kG=new H.tx("classTable")
+C.cz=H.K('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.cz,!1,C.y0)
+C.uk=new H.tx("last")
+C.rY=new A.ES(C.uk,C.BM,!1,C.nd,!1,C.cs)
+C.OO=new H.tx("flag")
+C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.cs)
+C.S4=new H.tx("busy")
+C.aj=new A.ES(C.S4,C.BM,!1,C.nd,!1,C.y0)
+C.TI=new H.tx("showConsole")
+C.NU=new A.ES(C.TI,C.BM,!1,C.nd,!1,C.cs)
+C.O9=new H.tx("pollPeriod")
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.y0)
+C.am=new H.tx("chromeTargets")
+C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.y0)
+C.A7=new H.tx("height")
+C.cD=new A.ES(C.A7,C.BM,!1,C.yE,!1,C.cs)
+C.U=new H.tx("callback")
+C.Fyq=H.K('Sa')
+C.k1=new A.ES(C.U,C.BM,!1,C.Fyq,!1,C.cs)
+C.TW=new H.tx("tagSelector")
+C.B3=new A.ES(C.TW,C.BM,!1,C.yE,!1,C.y0)
 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")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
+C.f0=new A.ES(C.Mc,C.BM,!1,C.BY,!1,C.cs)
+C.kV=new H.tx("link")
+C.RZ=new A.ES(C.kV,C.BM,!1,C.yE,!1,C.cs)
 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.lY,!1,C.ucP)
-C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
-C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
+C.B7=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.cs)
+C.Gp=I.uL([C.J19])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.Gp)
+C.YD=new H.tx("sampleRate")
+C.bl=new A.ES(C.YD,C.BM,!1,C.yE,!1,C.y0)
 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)
+C.Qc=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.cs)
+C.TO=new A.ES(C.kY,C.BM,!1,C.Ct,!1,C.cs)
 C.uG=new H.tx("linesReady")
-C.Df=new A.ES(C.uG,C.BM,!1,C.Ow,!1,C.esx)
-C.IBq=H.Kxv('T8')
-C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
+C.Df=new A.ES(C.uG,C.BM,!1,C.nd,!1,C.y0)
+C.Qp=new A.ES(C.U,C.BM,!1,C.wG,!1,C.cs)
 C.vb=new H.tx("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!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.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.rt=H.VM(new W.FkO("keydown"),[W.AD])
-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.Mq=new A.ES(C.vb,C.BM,!1,C.BY,!1,C.cs)
+C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.y0)
+C.RT=new P.a6(0)
+C.eL=new P.moY(!1)
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23895,77 +23149,80 @@
 }
 C.Vu=function(_, letter) { return letter.toUpperCase(); }
 C.xr=new P.byg(null,null)
-C.A3=new P.c5(null)
-C.cb=new P.ojF(null,null)
-C.EkO=new N.Ng("FINER",400)
-C.t4=new N.Ng("FINE",500)
+C.A3=new P.Mx(null)
+C.Sr=new P.ojF(null,null)
+C.Ab=new N.Ng("FINER",400)
+C.R5=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oOA=new N.Ng("OFF",2000)
+C.oO=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.Q5=I.uLC([1,6])
-C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
+C.Gb=H.J(I.uL([127,2047,65535,1114111]),[P.KN])
+C.jb=I.uL([1,6])
+C.rz=I.uL([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-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.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.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.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.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.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.Rj=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.Rj)
-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.WK=I.uL([C.SY,C.l4,C.Wn,C.ai,C.nZ])
+C.o5=I.uL([0,0,65490,45055,65535,34815,65534,18431])
+C.fW=H.J(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.I])
+C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
+C.bT=new H.tx("attribute")
+C.nx=I.uL([C.bT])
+C.lw=H.K('iv')
+C.fo=I.uL([C.lw])
+C.ip=I.uL(["==","!=","<=",">=","||","&&"])
+C.oP=I.uL(["as","in","this"])
+C.jx=I.uL([0,0,32722,12287,65534,34815,65534,18431])
+C.Jp=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.kg=I.uL([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
+C.ZJ=I.uL([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uL([0,0,32722,12287,65535,34815,65534,18431])
+C.ML=I.uL([40,41,91,93,123,125])
+C.bm=I.uL(["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.bm)
+C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.lyV=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.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+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.Y1)
+C.MEG=I.uL(["enumerate"])
 C.mB=new H.LPe(1,{enumerate:K.HZg()},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.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
-C.jUO=H.Kxv('xn')
-C.erP=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
+C.tq=H.K('Bo')
+C.eq=H.K('we')
+C.VLY=I.uL([C.eq])
+C.SM=new A.yM(!1,!1,!0,C.tq,!1,!0,C.VLY,null)
+C.iI=H.K('Sh')
+C.o2y=I.uL([C.iI])
+C.h5=new A.yM(!0,!0,!0,C.tq,!1,!1,C.o2y,null)
+C.Vm=H.K('A2')
+C.RN=I.uL([C.Vm])
+C.BK=new A.yM(!0,!0,!0,C.tq,!1,!1,C.RN,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
 C.FJ=new D.M9x("Pipe")
-C.BE=new H.tx("averageCollectionPeriodInMillis")
-C.IH=new H.tx("address")
-C.j2=new H.tx("app")
-C.US=new H.tx("architecture")
-C.Wq=new H.tx("asStringLiteral")
+C.T=new H.tx("averageCollectionPeriodInMillis")
+C.X=new H.tx("address")
+C.V=new H.tx("app")
+C.hb=new H.tx("architectureBits")
+C.W=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
-C.WC=new H.tx("bpt")
+C.M=new H.tx("bpt")
 C.hR=new H.tx("breakpoint")
-C.Ro=new H.tx("buttonClick")
+C.R=new H.tx("buttonClick")
 C.hN=new H.tx("bytes")
 C.Ka=new H.tx("call")
 C.bV=new H.tx("capacity")
 C.C0=new H.tx("change")
 C.eZ=new H.tx("changeSort")
+C.q3=new H.tx("children")
 C.OI=new H.tx("classes")
 C.Wt=new H.tx("clazz")
 C.I9=new H.tx("closeItem")
@@ -23977,6 +23234,7 @@
 C.p1=new H.tx("columns")
 C.yJ=new H.tx("connectStandalone")
 C.la=new H.tx("connectToVm")
+C.o9=new H.tx("count")
 C.Je=new H.tx("current")
 C.RG=new H.tx("currentPage")
 C.hJ=new H.tx("dartMetrics")
@@ -24011,7 +23269,7 @@
 C.VF=new H.tx("formattedExclusive")
 C.uU=new H.tx("formattedExclusiveTicks")
 C.YJ=new H.tx("formattedInclusive")
-C.eF=new H.tx("formattedInclusiveTicks")
+C.EF=new H.tx("formattedInclusiveTicks")
 C.oI=new H.tx("formattedLine")
 C.ST=new H.tx("formattedTotalCollectionTime")
 C.EI=new H.tx("functions")
@@ -24026,6 +23284,7 @@
 C.zS=new H.tx("hasDisassembly")
 C.YA=new H.tx("hasNoAllocations")
 C.Ge=new H.tx("hashLinkWorkaround")
+C.Xt=new H.tx("hidden")
 C.im=new H.tx("history")
 C.Ss=new H.tx("hits")
 C.k6=new H.tx("hoverText")
@@ -24052,8 +23311,8 @@
 C.bR=new H.tx("isDouble")
 C.ob=new H.tx("isError")
 C.dR=new H.tx("isFinal")
-C.WV=new H.tx("isFinalized")
-C.tA=new H.tx("isImplemented")
+C.yz=new H.tx("isFinalized")
+C.Ih=new H.tx("isImplemented")
 C.MY=new H.tx("isInlinable")
 C.Wg=new H.tx("isInt")
 C.tD=new H.tx("isList")
@@ -24073,7 +23332,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.kA=new H.tx("lastTokenPos")
+C.qa=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -24094,7 +23353,7 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.jo=new H.tx("objectClass")
+C.as=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
 C.Yp=new H.tx("owner")
@@ -24108,7 +23367,7 @@
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
 C.Jf=new H.tx("possibleBpt")
-C.rm=new H.tx("privateKey")
+C.yt=new H.tx("privateKey")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -24119,7 +23378,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.c86=new H.tx("registerCallback")
+C.L9=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -24142,14 +23401,16 @@
 C.Si=new H.tx("slotIsField")
 C.jM=new H.tx("socketOwner")
 C.rd=new H.tx("source")
-C.HO=new H.tx("stacktrace")
+C.Yh=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
 C.ks=new H.tx("stepInto")
 C.Om=new H.tx("stepOut")
 C.iC=new H.tx("stepOver")
+C.AF=new H.tx("style")
 C.Nv=new H.tx("subclass")
 C.Wo=new H.tx("subclasses")
 C.FZ=new H.tx("superclass")
+C.Bx=new H.tx("targetCPU")
 C.QF=new H.tx("targets")
 C.eO=new H.tx("timeStamp")
 C.hO=new H.tx("tipExclusive")
@@ -24157,6 +23418,7 @@
 C.HK=new H.tx("tipParent")
 C.je=new H.tx("tipTicks")
 C.Ef=new H.tx("tipTime")
+C.eM=new H.tx("title")
 C.QL=new H.tx("toString")
 C.RH=new H.tx("toStringAsFixed")
 C.SP=new H.tx("toggleBreakpoint")
@@ -24164,8 +23426,8 @@
 C.ID=new H.tx("toggleExpanded")
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
-C.Jl=new H.tx("totalCollectionTimeInSeconds")
-C.kr=new H.tx("totalSamplesInProfile")
+C.bo=new H.tx("totalCollectionTimeInSeconds")
+C.Kj=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -24176,7 +23438,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.Gy=new H.tx("userName")
+C.ct=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -24184,156 +23446,156 @@
 C.fj=new H.tx("variable")
 C.xw=new H.tx("variables")
 C.zn=new H.tx("version")
+C.qo=new H.tx("vmCid")
 C.Sk=new H.tx("vmMetrics")
 C.KS=new H.tx("vmName")
 C.MA=new H.tx("vmType")
 C.Uy=new H.tx("writeClosed")
-C.hP=H.Kxv('uz')
-C.V7=H.Kxv('NF')
-C.Qb=H.Kxv('J3')
-C.Mf=H.Kxv('G1')
-C.q0S=H.Kxv('Dg')
-C.Dl=H.Kxv('F1')
-C.mK=H.Kxv('Mb')
-C.UJ=H.Kxv('oa')
-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.V8=H.Kxv('ts')
-C.Ke=H.Kxv('EZ')
-C.Vx=H.Kxv('MJ')
-C.Vh=H.Kxv('Pz')
-C.rR=H.Kxv('wN')
-C.hM=H.Kxv('AK')
-C.kt=H.Kxv('Um')
-C.yS=H.Kxv('G6')
-C.z7=H.Kxv('Co')
-C.Sb=H.Kxv('kn')
-C.Vc=H.Kxv('a')
-C.Yc=H.Kxv('iP')
-C.kH=H.Kxv('NY')
-C.IZ=H.Kxv('oF')
-C.vw=H.Kxv('UK')
-C.Jo=H.Kxv('i7')
-C.ON=H.Kxv('ov')
-C.jR=H.Kxv('Be')
-C.uC=H.Kxv('Im')
-C.al=H.Kxv('es')
-C.OP=H.Kxv('UZ')
-C.PT=H.Kxv('CX')
-C.iD=H.Kxv('Vb')
-C.ce=H.Kxv('kK')
-C.dD=H.Kxv('av')
-C.FA=H.Kxv('Ya')
-C.PFz=H.Kxv('yyN')
-C.Th=H.Kxv('fI')
-C.cz=H.Kxv('Vf')
-C.tU=H.Kxv('L4')
-C.cK=H.Kxv('I5')
-C.jA=H.Kxv('Eg')
-C.K4=H.Kxv('hV')
-C.Mt=H.Kxv('hu')
-C.ca=H.Kxv('Z4')
-C.pJ=H.Kxv('Q6')
-C.Yy=H.Kxv('uE')
-C.WU=H.Kxv('lf')
-C.nC=H.Kxv('cQ')
-C.JX=H.Kxv('ys')
-C.u9=H.Kxv('yc')
-C.Yxm=H.Kxv('Pg')
-C.il=H.Kxv('xI')
-C.lp=H.Kxv('LU')
-C.u4=H.Kxv('VZ')
-C.oG=H.Kxv('ds')
-C.EG=H.Kxv('Oz')
-C.nw=H.Kxv('eo')
-C.OG=H.Kxv('eW')
-C.km=H.Kxv('fl')
-C.jV=H.Kxv('rF')
-C.rC=H.Kxv('qV')
-C.OZ=H.Kxv('Ce')
-C.Tq=H.Kxv('vj')
-C.ou=H.Kxv('ak')
-C.JW=H.Kxv('Ww')
-C.CT=H.Kxv('St')
-C.wH=H.Kxv('zM')
-C.Mz=H.Kxv('uL')
-C.LT=H.Kxv('md')
-C.Wh=H.Kxv('H8')
-C.Zj=H.Kxv('U1')
-C.FG=H.Kxv('qh')
-C.bC=H.Kxv('D2')
-C.Nw=H.Kxv('vr')
-C.kq=H.Kxv('NT')
-C.a8=H.Kxv('Zx')
-C.Wd=H.Kxv('Hi')
-C.YZ=H.Kxv('zt')
-C.Fn=H.Kxv('qn')
-C.DD=H.Kxv('Zn')
-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.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.wk=H.Kxv('nJ')
-C.Bi=H.Kxv('Tk')
-C.te=H.Kxv('BS')
-C.ms=H.Kxv('Bm')
-C.ws=H.Kxv('Pa')
-C.qJ=H.Kxv('pG')
-C.pK=H.Kxv('Rk')
-C.lE=H.Kxv('DK')
-C.fU=H.Kxv('I2')
-C.Az=H.Kxv('Gk')
-C.GX=H.Kxv('c8')
-C.R9=H.Kxv('f7')
-C.QP=H.Kxv('vi')
-C.X8=H.Kxv('Ti')
-C.Lg=H.Kxv('JI')
-C.Ju=H.Kxv('Ly')
-C.mq=H.Kxv('qk')
-C.XW=H.Kxv('uV')
-C.XWY=H.Kxv('uEY')
-C.oT=H.Kxv('VY')
-C.jK=H.Kxv('el')
+C.hP=H.K('uz')
+C.V7=H.K('NF')
+C.Qb=H.K('J3')
+C.Mf=H.K('G1')
+C.Dl=H.K('F1')
+C.mK=H.K('Mb')
+C.UJ=H.K('oa')
+C.E0=H.K('aI')
+C.Y3=H.K('CY')
+C.QJ=H.K('WG')
+C.ra=H.K('Nn')
+C.j4=H.K('IW')
+C.V8=H.K('ts')
+C.Ke=H.K('EZ')
+C.Vx=H.K('MJ')
+C.Vh=H.K('Pz')
+C.HC=H.K('F0')
+C.rR=H.K('wN')
+C.hM=H.K('AK')
+C.kt=H.K('Um')
+C.yS=H.K('G6')
+C.Sb=H.K('kn')
+C.AP=H.K('a')
+C.Yc=H.K('iP')
+C.kH=H.K('NY')
+C.IZ=H.K('oF')
+C.vw=H.K('UK')
+C.Jo=H.K('i7')
+C.QG=H.K('hh')
+C.ON=H.K('ov')
+C.jR=H.K('Be')
+C.uC=H.K('Im')
+C.al=H.K('es')
+C.PT=H.K('CX')
+C.iD=H.K('Vb')
+C.ce=H.K('kK')
+C.dD=H.K('av')
+C.FA=H.K('Ya')
+C.T1=H.K('Wy')
+C.Th=H.K('fI')
+C.tU=H.K('L4')
+C.yT=H.K('FK')
+C.cK=H.K('I5')
+C.jA=H.K('Eg')
+C.K4=H.K('hV')
+C.Mt=H.K('hu')
+C.hc=H.K('CP')
+C.ca=H.K('Z4')
+C.pJ=H.K('Q6')
+C.Yy=H.K('uE')
+C.JX=H.K('ys')
+C.iN=H.K('yc')
+C.CR=H.K('G0')
+C.il=H.K('xI')
+C.lp=H.K('LU')
+C.u4=H.K('VZ')
+C.oG=H.K('ds')
+C.EG=H.K('Oz')
+C.nw=H.K('eo')
+C.OG=H.K('eW')
+C.hD=H.K('lM')
+C.km=H.K('fl')
+C.jV=H.K('rF')
+C.rC=H.K('qV')
+C.OZ=H.K('Ce')
+C.Ho=H.K('zt')
+C.Tq=H.K('vj')
+C.ou=H.K('ak')
+C.JW=H.K('Ww')
+C.CT=H.K('St')
+C.wH=H.K('zM')
+C.Mz=H.K('uL')
+C.LT=H.K('md')
+C.Wh=H.K('H8')
+C.Zj=H.K('U1')
+C.FG=H.K('qh')
+C.bC=H.K('D2')
+C.Nw=H.K('vr')
+C.kq=H.K('NT')
+C.a8=H.K('Zx')
+C.Wd=H.K('Hi')
+C.Fn=H.K('qn')
+C.DD=H.K('Zn')
+C.Ev=H.K('Un')
+C.Ey=H.K('wM')
+C.pF=H.K('WS')
+C.qZ=H.K('DE')
+C.jw=H.K('xc')
+C.NW=H.K('ye')
+C.pi=H.K('FB')
+C.Xv=H.K('n5')
+C.KO=H.K('ZP')
+C.he=H.K('qM')
+C.Wz=H.K('pR')
+C.tc=H.K('Ma')
+C.Io=H.K('Qh')
+C.Qt=H.K('NK')
+C.wk=H.K('nJ')
+C.Bi=H.K('Tk')
+C.te=H.K('BS')
+C.ms=H.K('Bm')
+C.ws=H.K('Pa')
+C.It=H.K('IH')
+C.qJ=H.K('pG')
+C.pK=H.K('Rk')
+C.lE=H.K('DK')
+C.fU=H.K('I2')
+C.Az=H.K('Gk')
+C.GX=H.K('c8')
+C.R9=H.K('f7')
+C.J0=H.K('vi')
+C.X8=H.K('Ti')
+C.Lg=H.K('JI')
+C.Ju=H.K('Ly')
+C.mq=H.K('qk')
+C.XW=H.K('uV')
+C.oT=H.K('VY')
+C.jK=H.K('el')
 C.xM=new P.u5F(!1)
-C.NA=new P.Uf(C.fQ,P.RN())
-C.Xk=new P.Uf(C.fQ,P.Dk())
-C.F6=new P.Uf(C.fQ,P.VbA())
-C.Rt=new P.Uf(C.fQ,P.wLZ())
-C.Sq=new P.Uf(C.fQ,P.zci())
-C.mc=new P.Uf(C.fQ,P.OjX())
-C.uo=new P.Uf(C.fQ,P.uy1())
-C.pj=new P.Uf(C.fQ,P.W7())
-C.lk=new P.Uf(C.fQ,P.qKH())
-C.zf=new P.Uf(C.fQ,P.xd())
-C.Yl=new P.Uf(C.fQ,P.pl())
-C.Zc=new P.Uf(C.fQ,P.yA())
-C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
-$.libraries_to_load = {}
+C.rj=new P.Ls(C.fQ,P.CDt())
+C.Xk=new P.Ls(C.fQ,P.Dkr())
+C.pm=new P.Ls(C.fQ,P.tLD())
+C.TP=new P.Ls(C.fQ,P.wLZ())
+C.Sq=new P.Ls(C.fQ,P.zci())
+C.QE=new P.Ls(C.fQ,P.vxv())
+C.mc=new P.Ls(C.fQ,P.Wk())
+C.uo=new P.Ls(C.fQ,P.hI())
+C.pj=new P.Ls(C.fQ,P.eF())
+C.Fj=new P.Ls(C.fQ,P.AIG())
+C.Gu=new P.Ls(C.fQ,P.iy())
+C.Yl=new P.Ls(C.fQ,P.O5z())
+C.Zc=new P.Ls(C.fQ,P.yA())
+C.z3=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null,null)
+init.isHunkLoaded=function(a){return!!$dart_deferred_initializers[a]}
+init.initializeLoadedHunk=function(a){$dart_deferred_initializers[a](S0u,$)}
+init.deferredLibraryUris={}
+init.deferredLibraryHashes={}
 $.VzC=null
 $.tye=1
-$.H9="$cachedFunction"
+$.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
-$.hG=null
+$.Zg=null
 $.OK=0
-$.mJs=null
+$.bf=null
 $.P4=null
 $.lcs=!1
 $.dZ=null
@@ -24342,7 +23604,7 @@
 $.q4=null
 $.vv=null
 $.Bv=null
-$.Kh=null
+$.Pi=null
 $.NR=null
 $.oK=null
 $.S6=null
@@ -24351,7 +23613,7 @@
 $.v5=!1
 $.X3=C.fQ
 $.Cb=null
-$.Km=0
+$.Kc=0
 $.Ji=null
 $.Qz=null
 $.EM=null
@@ -24361,113 +23623,120 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.Nc=0
+$.dL=0
 $.Oo=null
 $.Td=!1
-$.jq1=0
+$.qF=0
 $.ljh=1
-$.ls=2
+$.H2=2
 $.rf=null
 $.ok=!1
-$.HE=!1
-$.M6=null
+$.DG=!1
+$.MU=null
 $.UG=!0
 $.RQ="objects/"
-$.vU=null
-$.Xa=null
-$.ax=null
-$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.V7,O.NF,{created:O.eqi},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.KTC},C.j4,D.IW,{created:D.dmb},C.V8,O.ts,{created:O.wy},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.hM,O.AK,{created:O.rV},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.VHR},C.z7,A.Co,{created:A.Xii},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.JX,O.ys,{created:O.Jt},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.dH},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.vle},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.zga},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.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.Wd,O.Hi,{created:O.Uo},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.O3},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.hGU},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.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.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}]
+$.v8=null
+$.Hg=null
+$.hm=null
+$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.V7,O.NF,{created:O.eqi},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8h},C.Dl,V.F1,{created:V.JT8},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.zr},C.V8,O.ts,{created:O.wy},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.hM,O.AK,{created:O.Rzb},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.t4},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.T5i},C.jR,F.Be,{created:F.FeK},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.osd},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cFd},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.JX,O.ys,{created:O.RIs},C.CR,Y.G0,{created:Y.Ifw},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.zga},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.iLU},C.a8,A.Zx,{created:A.zC},C.Wd,O.Hi,{created:O.kQ},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.l5},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.iO},C.KO,F.ZP,{created:F.hGU},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.kgI},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.WF},C.te,N.BS,{created:N.p71},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.It,E.IH,{created:E.O0h},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.E5W},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.fRK},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oHO}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","AW",function(){return H.J(new P.nj(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","xq","bN",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","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",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.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","HH","clJ",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($,"_completer","IQ","Ib",function(){return H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[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","AG",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"POLL_PERIODS","Bw","yO",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","OL",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","wb",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($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return H.Za("_$dart_dartObject")})
+I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return H.Za("_$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","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","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","dY","RZ",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
+I.$lazy($,"_freeColor","nK","Su",function(){return[255,255,255,255]})
+I.$lazy($,"_pageSeparationColor","Uw","v2",function(){return[0,0,0,255]})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.A(P.I,N.TJ)})
+I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","HS","Nc",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","fZ","EN",function(){return new L.MdQ().$0()})
 I.$lazy($,"_logger","y7Y","Nd",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","BT","lQ",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","Ej","vu",function(){return P.L5(null,null,null,P.qU,A.So)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Snm",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","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","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","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","FR","ek",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.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(),"|",new K.w28()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
+I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.I,L.Tv)})
+I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_OBSERVATION_BLACKLIST","Il","js",function(){var z=P.Ca(null,null,null,null)
+z.FV(0,C.nx)
+return z})
+I.$lazy($,"_PROPERTY_NAME_BLACKLIST","x9","c0",function(){var z=P.Ca(null,null,null,null)
+z.FV(0,[C.q3,C.Yb,C.Xt,C.AF,C.eM,C.OI])
+return z})
+I.$lazy($,"_typesByName","ly","lC",function(){return P.L5(null,null,null,P.I,P.UU)})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.I,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Bm("ShadowDOMPolyfill")})
+I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.ev()
+return z!=null?J.Tf(z,"ShadowCSS"):null})
+I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.yM(!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($,"_WebComponents","rW","ev",function(){return J.Tf($.Xw(),"WebComponents")})
+I.$lazy($,"_Polymer","kz","uj",function(){return J.Tf($.Xw(),"Polymer")})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_onReady","T8g","j6",function(){return H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null])})
+I.$lazy($,"_observeLog","WH","FX",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","mf","Uk",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","zG",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.Tf($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","RO",function(){return P.B([C.yE,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.nd,new Z.Ra(),C.yw,new Z.wJY(),C.hc,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","RTI",function(){return P.B(["+",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(),"|",new K.w25()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.B(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",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($,"_currentIsolateMatcher","tV","Gi",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.r2("function")})
+I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.r2("closure function")})
+I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.r2("getter function")})
+I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.r2("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.r2("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.r2("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.r2("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","aC",function(){return new D.r2("static initializer")})
+I.$lazy($,"kMethodExtractor","Pc","kL",function(){return new D.r2("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.r2("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.r2("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","Ps",function(){return new D.r2("Collected")})
+I.$lazy($,"kNative","dQ","Nk",function(){return new D.r2("Native")})
+I.$lazy($,"kTag","Oq","PY",function(){return new D.r2("Tag")})
+I.$lazy($,"kReused","Gh","dh",function(){return new D.r2("Reused")})
+I.$lazy($,"kUNKNOWN","XK","h4",function(){return new D.r2("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-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","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","fT0",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])})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
+I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_ownerStagingDocument","kR","p2",function(){return H.J(new P.nj(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","fT0",function(){return new M.DOe().$0()})
+I.$lazy($,"_instanceExtension","nB","nR",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_expando","fF","rw",function(){return H.J(new P.nj("template_binding"),[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.dX,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.dX,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.dX]}]},{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:"vQ",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",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{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:"N5B",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",{func:"c0r",args:[W.AD]},{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:"hNI",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:"T2k",void:true,args:[P.qU,L.nm]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.nm]},"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","targets",];$=null
+
+init.metadata=[{func:"I0",ret:P.I},{func:"kl",void:true},"object","sender","e",{func:"WD",args:[P.I]},{func:"f9",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.I,args:[P.KN]},"bytes",{func:"ju",ret:P.I,args:[null]},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"Se",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"LE",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"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:"rl",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"ms",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"Lr",ret:P.OH,args:[P.JBS,P.e4y,P.JBS,P.a,P.BpP]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"oo",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"kl",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:"Zb",void:true,args:[P.JBS,P.e4y,P.JBS,P.I]},"line",{func:"xM",void:true,args:[P.I]},{func:"Nf",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.w]},"specification","zoneValues",{func:"BT",ret:P.SQ,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},"b",{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"qC",ret:U.rN,args:[P.I]},{func:"ZU",args:[U.rN,null],named:{globals:[P.w,P.I,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"dR",ret:P.KN,args:[D.af,D.af]},"invocation","fractionDigits",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.I,null]},{func:"TS",args:[null,P.I]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"zZ",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.f5]},"obj","i","responseText",{func:"vB",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.I,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.z2]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.I]},"text",{func:"fn",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"pt",void:true,args:[W.ea,null,W.KV]},{func:"x6",args:[D.kx]},{func:"MN",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"Qe",void:true,args:[P.EH]},{func:"xe",args:[{func:"kl",void:true}]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"Qk",void:true,opt:[null]},{func:"yV",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:"bb",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each",0,{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"SP",ret:P.KN,args:[P.I]},{func:"u8",ret:P.CP,args:[P.I]},{func:"N4",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.I],opt:[null]},"xhr","func",{func:"PK",args:[W.vn]},{func:"bB",void:true,args:[W.v3]},{func:"Me",args:[D.af]},{func:"IS",ret:O.na},"response","st",{func:"Mg",void:true,args:[D.vO]},"newProfile",{func:"xo",ret:P.I,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"YE",ret:P.QV,args:[{func:"WD",args:[P.I]}]},{func:"IA",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.I]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IMM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.z2]},{func:"zs",ret:P.I,args:[P.I]},"url",{func:"nxg",ret:P.I,args:[P.CP]},"time",{func:"FJ",ret:P.I,args:[P.I],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:"Bd",args:[L.Tv,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"cC",void:true,args:[P.I,P.I]},{func:"aA",void:true,args:[P.WO,P.w,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes",{func:"df",void:true,args:[{func:"kl",void:true}],opt:[P.a6]},"wait","jsElem","extendee",{func:"t7",args:[null,P.I,P.I]},"timer",{func:"F6",args:[P.kWp]},"k",{func:"EW",args:[null,W.KV,P.SQ]},{func:"Nwc",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"D8",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.rN,U.rN]},{func:"qo",args:[U.rN]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"No",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"PzC",void:true,args:[[P.WO,P.KN]]},"counters",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","newBpts",{func:"NuY",ret:P.I,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script",{func:"T2k",void:true,args:[P.I,L.nm]},{func:"Ys",args:[P.Wy]},{func:"Kg",args:[P.I,L.nm]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"uA",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.I]},"ref","ifValue",{func:"nEN",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Xv",ret:P.I,args:[P.a]},{func:"i8",ret:P.I,args:[[P.WO,P.a]]},"values","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -24498,7 +23767,7 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-function init(){I.p={}
+function init(){I.p=Object.create(null)
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
 var w=x.length
@@ -24525,93 +23794,95 @@
 var l="function("+p+"){"+n+"}"
 if(u)b.push(m+"$reflectable("+l+");\n")
 else b.push(m+l+";\n")}}return x}I.p.$generateAccessor=generateAccessor
-function defineClass(a,b,c){var y=[]
-var x="function "+b+"("
+function defineClass(a,b){var y=[]
+var x="function "+a+"("
 var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
+for(var v=0;v<b.length;v++){if(v!=0)x+=", "
+var u=generateAccessor(b[v],y,a)
 var t="parameter_"+u
 x+=t
 w+="this."+u+" = "+t+";\n"}x+=") {\n"+w+"}\n"
-x+=b+".builtin$cls=\""+a+"\";\n"
-x+="$desc=$collectedClasses."+b+";\n"
+x+=a+".builtin$cls=\""+a+"\";\n"
+x+="$desc=$collectedClasses."+a+";\n"
 x+="if($desc instanceof Array) $desc = $desc[1];\n"
-x+=b+".prototype = $desc;\n"
-if(typeof defineClass.name!="string"){x+=b+".name=\""+b+"\";\n"}x+=y.join("")
+x+=a+".prototype = $desc;\n"
+if(typeof defineClass.name!="string"){x+=a+".name=\""+a+"\";\n"}x+=y.join("")
 return x}var z=function(){function tmp(){}var y=Object.prototype.hasOwnProperty
 return function(a,b){tmp.prototype=b.prototype
 var x=new tmp()
 var w=a.prototype
-for(var v in w)if(y.call(w,v))x[v]=w[v]
-x.constructor=a
+for(var v in w){if(y.call(w,v)){x[v]=w[v]}}x.constructor=a
 a.prototype=x
 return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
+I.$finishClasses=function(a,b,c){var y=Object.create(null)
 var x=init.allClasses
-var w=Object.prototype.hasOwnProperty
-if(typeof dart_precompiled=="function"){var v=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
-var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
+var w
+var v=Object.prototype.hasOwnProperty
+if(typeof dart_precompiled=="function"){w=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
+var t=[]}for(var s in a){var r=a[s]
 if(r instanceof Array)r=r[1]
-var q=r["^"],p,o=s,n=q
-if(typeof q=="string"){var m=q.split("/")
-if(m.length==2){o=m[0]
-n=m[1]}}var l=n.split(";")
-n=l[1]==""?[]:l[1].split(",")
-p=l[0]
-m=p.split(":")
-if(m.length==2){p=m[0]
-var k=m[1]
-if(k)r.$signature=function(d){return function(){return init.metadata[d]}}(k)}if(p&&p.indexOf("+")>0){l=p.split("+")
-p=l[0]
-var j=a[l[1]]
-if(j instanceof Array)j=j[1]
-for(var i in j){if(w.call(j,i)&&!w.call(r,i))r[i]=j[i]}}if(typeof dart_precompiled!="function"){u+=defineClass(o,s,n)
-t.push(s)}if(p)y[s]=p}}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
-var v=new Function("$collectedClasses",u)(a)
-u=null}for(var h=0;h<v.length;h++){var g=v[h]
-var s=g.name
+var q=r["^"],p,o=q
+var n=o.split(";")
+o=n[1]==""?[]:n[1].split(",")
+p=n[0]
+split=p.split(":")
+if(split.length==2){p=split[0]
+var m=split[1]
+if(m)r.$signature=function(d){return function(){return init.metadata[d]}}(m)}if(p&&p.indexOf("+")>0){n=p.split("+")
+p=n[0]
+var l=a[n[1]]
+if(l instanceof Array)l=l[1]
+for(var k in l){if(v.call(l,k)&&!v.call(r,k))r[k]=l[k]}}if(typeof dart_precompiled!="function"){u+=defineClass(s,o)
+t.push(s)}if(p)y[s]=p}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
+var w=new Function("$collectedClasses",u)(a)
+u=null}for(var j=0;j<w.length;j++){var i=w[j]
+var s=i.name
 var r=a[s]
-var f=b
-if(r instanceof Array){f=r[0]||b
-r=r[1]}x[s]=g
-f[s]=g}v=null
-var e={}
+var h=b
+if(r instanceof Array){h=r[0]||b
+r=r[1]}x[s]=i
+h[s]=i}w=null
+var g=init.finishedClasses
+function finishClass(a6){if(g[a6])return
+g[a6]=true
+var f=y[a6]
+if(!f||typeof f!="string")return
+finishClass(f)
+var e=x[f]
+if(!e)e=c[f]
+var d=x[a6]
+var a0=z(d,e)
+if(Object.prototype.hasOwnProperty.call(a0,"%")){var a1=a0["%"].split(";")
+if(a1[0]){var a2=a1[0].split("|")
+for(var a3=0;a3<a2.length;a3++){init.interceptorsByTag[a2[a3]]=d
+init.leafTags[a2[a3]]=true}}if(a1[1]){a2=a1[1].split("|")
+if(a1[2]){var a4=a1[2].split("|")
+for(var a3=0;a3<a4.length;a3++){var a5=x[a4[a3]]
+a5.$nativeSuperclassTag=a2[0]}}for(a3=0;a3<a2.length;a3++){init.interceptorsByTag[a2[a3]]=d
+init.leafTags[a2[a3]]=false}}}}for(var s in y)finishClass(s)};(function(){init.allClasses=Object.create(null)
 init.interceptorsByTag=Object.create(null)
-init.leafTags={}
-function finishClass(a9){var d=Object.prototype.hasOwnProperty
-if(d.call(e,a9))return
-e[a9]=true
-var a0=y[a9]
-if(!a0||typeof a0!="string")return
-finishClass(a0)
-var a1=x[a9]
-var a2=x[a0]
-if(!a2)a2=c[a0]
-var a3=z(a1,a2)
-if(d.call(a3,"%")){var a4=a3["%"].split(";")
-if(a4[0]){var a5=a4[0].split("|")
-for(var a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=true}}if(a4[1]){a5=a4[1].split("|")
-if(a4[2]){var a7=a4[2].split("|")
-for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
-a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){var y={}
+init.leafTags=Object.create(null)
+init.finishedClasses=Object.create(null)})()
+I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies=Object.create(null)
+init.lazies[c]=d
+var y={}
 var x={}
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-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]}}}}
+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]}}}}
 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]
-function ForceEfficientMap(){}ForceEfficientMap.prototype=this
-new ForceEfficientMap()}Isolate.prototype=a.prototype
+var v=init.lazies
+for(var u in v){this[v[u]]=null}function ForceEfficientMap(){}ForceEfficientMap.prototype=this
+new ForceEfficientMap()
+for(var u in v){var t=v[u]
+this[t]=y[t]}}Isolate.prototype=a.prototype
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.uLC=a.uLC
+Isolate.uL=a.uL
 return Isolate}}
 !function(){function intern(a){var u={}
 u[a]=1
@@ -24628,5 +23899,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.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.VQk(),b)},[])}else{(function(b){H.wW(E.VQk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
index 1eb2c59..a08897a 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html
@@ -1,8 +1,8 @@
-<!DOCTYPE html><html style="height: 100%"><head><script src="packages/web_components/dart_support.js"></script>
-
+<!DOCTYPE html><html style="height: 100%"><head>
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
-  <script src="packages/web_components/platform.js"></script>
+  <script src="packages/web_components/webcomponents.min.js"></script>
+<script src="packages/web_components/dart_support.js"></script>
   
   
   
@@ -289,7 +289,7 @@
 
 </style>
 
-<script src="packages/polymer/src/js/polymer/polymer.js"></script>
+<script src="packages/polymer/src/js/polymer/polymer.min.js"></script>
 
 <script>
 // TODO(sigmund): remove this script tag (dartbug.com/19650). This empty
@@ -298,262 +298,9 @@
 
 <!-- unminified for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
-<script src="src/js/polymer/polymer.concat.js"></script>
+<script src="src/js/polymer/polymer.js"></script>
 -->
-<script type="text/javascript" src="https://www.google.com/jsapi"></script><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+<script type="text/javascript" src="https://www.google.com/jsapi"></script><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
 
 
@@ -615,260 +362,7 @@
 </polymer-element>
 
 <polymer-element name="object-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ nameIsEmpty }}">
       <a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.vmType }}</em></a>
     </template>
@@ -882,260 +376,7 @@
 
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -1288,260 +529,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       nav {
         position: fixed;
@@ -1887,260 +875,7 @@
 
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -2171,260 +906,7 @@
 
 
 <polymer-element name="class-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style><span><a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a></span></template>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><span><a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a></span></template>
 </polymer-element>
 
 
@@ -2436,260 +918,7 @@
 
 <polymer-element name="class-tree" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .table {
         border-collapse: collapse!important;
@@ -2812,260 +1041,7 @@
 
 <polymer-element name="error-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -3208,260 +1184,7 @@
 
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ ref.isStatic] }}">static</template>
       <template if="{{ ref.isFinal }}">final</template>
@@ -3485,260 +1208,7 @@
 
 
 <polymer-element name="function-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><!-- These comments are here to allow newlines.
      --><template if="{{ ref.isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; ref.parent == null &amp;&amp; ref.owningClass != null }}"><!--
        --><class-ref ref="{{ ref.owningClass] }}"></class-ref>.</template><!--
@@ -3755,260 +1225,7 @@
 
 
 <polymer-element name="library-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ nameIsEmpty }}">
       <a on-click="{{ goto }}" _href="{{ url }}">unnamed</a>
     </template>
@@ -4177,260 +1394,7 @@
 
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a on-click="{{ goto }}" title="{{ hoverText }}" _href="{{ url }}">{{ name }}</a>
 </template>
 </polymer-element>
@@ -4440,260 +1404,7 @@
 
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -4878,260 +1589,7 @@
 
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a on-click="{{ goto }}" _href="{{ url }}">*{{ name }}</a>
@@ -5156,260 +1614,7 @@
 
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -5599,260 +1804,7 @@
 
 <polymer-element name="debugger-page" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .container {
         height: 100%;
@@ -5905,260 +1857,7 @@
 
 <polymer-element name="debugger-stack" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ stack == null }}">
       Loading stack frames
     </template>
@@ -6178,260 +1877,7 @@
 
 <polymer-element name="debugger-frame" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .frameOuter {
         position: relative;
@@ -6523,260 +1969,7 @@
 
 <polymer-element name="debugger-console" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textBox {
         position: absolute;
@@ -6792,260 +1985,7 @@
 
 <polymer-element name="debugger-input" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textBox {
         font: 400 16px 'Montserrat', sans-serif;
@@ -7064,260 +2004,7 @@
 
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -7345,260 +2032,7 @@
 
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -7690,260 +2124,7 @@
 
 <polymer-element name="flag-list" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
@@ -7980,260 +2161,7 @@
 
 <polymer-element name="flag-item" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span style="color:#aaa">// {{ flag['comment'] }}</span>
     <div style="padding: 3px 0">
       <b>{{ flag['name'] }}</b>
@@ -8258,260 +2186,7 @@
 
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -8628,260 +2303,7 @@
 
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .hover {
       position: fixed;
@@ -8922,260 +2344,7 @@
 
 <polymer-element name="io-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -9234,260 +2403,7 @@
 
 <polymer-element name="io-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ ref.type == 'Socket' }}">
       <io-socket-ref ref="{{ ref }}"></io-socket-ref>
     </template>
@@ -9508,260 +2424,7 @@
 
 <polymer-element name="io-http-server-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -9788,520 +2451,14 @@
 
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-http-server-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10355,520 +2512,14 @@
 
 <polymer-element name="io-http-server-connection-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-http-server-connection-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -10902,520 +2553,14 @@
 
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-socket-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -11442,260 +2587,7 @@
 
 <polymer-element name="io-socket-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -11791,520 +2683,14 @@
 
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-web-socket-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -12331,260 +2717,7 @@
 
 <polymer-element name="io-web-socket-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -12610,520 +2743,14 @@
 
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
 <polymer-element name="io-random-access-file-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13150,260 +2777,7 @@
 
 <polymer-element name="io-random-access-file-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13437,260 +2811,7 @@
 
 <polymer-element name="io-process-list-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -13717,260 +2838,7 @@
 
 <polymer-element name="io-process-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ small }}">
       <a on-click="{{ goto }}" _href="{{ url }}">{{ name }}</a>
     </template>
@@ -13982,260 +2850,7 @@
 
 <polymer-element name="io-process-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -14316,260 +2931,7 @@
 
 
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
 </template>
 </polymer-element>
@@ -14585,260 +2947,7 @@
 
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="flex-row">
       <div class="flex-item-10-percent">
         <img src="packages/observatory/src/elements/img/isolate_icon.png">
@@ -14946,260 +3055,7 @@
         white-space: pre;
       }
     </style>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -15300,260 +3156,7 @@
 
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -15699,260 +3302,7 @@
 
 <polymer-element name="inbound-reference" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div>
       from <any-service-ref ref="{{ source }}"></any-service-ref>
       <template if="{{ slotIsArrayIndex }}">via [{{ slot }}]</template>
@@ -15991,260 +3341,7 @@
 
 <polymer-element name="object-common" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="memberList">
 
       <div class="memberItem">
@@ -16340,260 +3437,7 @@
 
 <polymer-element name="context-ref" extends="service-ref">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <a on-click="{{ goto }}" _href="{{ url }}"><em>Context</em> ({{ ref.length }})</a>
       <curly-block callback="{{ expander() }}">
@@ -16623,260 +3467,7 @@
 
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -17080,260 +3671,7 @@
 
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -17470,260 +3808,7 @@
 
 <polymer-element name="metrics-page" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       ul li:hover:not(.selected) {
         background-color: #FFF3E3;
@@ -17783,260 +3868,7 @@
 
 <polymer-element name="metric-details" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <div class="content-centered">
       <div class="memberList">
         <div class="memberItem">
@@ -18095,260 +3927,7 @@
 
 <polymer-element name="metrics-graph" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .graph {
         min-height: 600px;
@@ -18377,260 +3956,7 @@
 
 <polymer-element name="object-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ object.isolate }}"></isolate-nav-menu>
@@ -18667,260 +3993,7 @@
 
 <polymer-element name="context-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ context.isolate }}"></isolate-nav-menu>
@@ -18989,260 +4062,7 @@
 
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
@@ -19508,260 +4328,7 @@
 
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -19952,260 +4519,7 @@
 
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -20246,260 +4560,7 @@
 
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -20565,260 +4626,7 @@
 
 <polymer-element name="trace-view" extends="observatory-element">
    <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ tracer != null }}">
       <div class="memberList">
@@ -20846,260 +4654,7 @@
 
 <polymer-element name="map-viewer" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ map.length > 0 }}">
       <curly-block callback="{{ expander() }}">
@@ -21131,260 +4686,7 @@
 
 <polymer-element name="list-viewer" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
 
     <template if="{{ list.length > 0 }}">
       <curly-block callback="{{ expander() }}">
@@ -21430,260 +4732,7 @@
 
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -21707,260 +4756,7 @@
 
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-control></nav-control>
@@ -21991,260 +4787,7 @@
         background: #ff0000;
       }
     </style>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <span>
       <template if="{{ isCurrentTarget }}">
         <a on-click="{{ connectToVm }}" _href="{{ gotoLink('/vm') }}">{{ target.name }} (Connected)</a>
@@ -22261,260 +4804,7 @@
 
 <polymer-element name="vm-connect" extends="observatory-element">
   <template>
-    <style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <style>
       .textbox {
         width: 20em;
@@ -22582,260 +4872,7 @@
 
 
 <polymer-element name="vm-ref" extends="service-ref">
-  <template><style>/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered-big {
-  padding-left: 5%;
-  padding-right: 5%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.memberSmall {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 12px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
+  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
     <a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
index 9e8e93a..d47babe 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
+++ b/runtime/bin/vmservice/observatory/deployed/web/index_devtools.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/debugger.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/object_common.dart"],["observatory","lib/src/elements/context_ref.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/object_view.dart"],["observatory","lib/src/elements/context_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
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 908d076..b0e84c5 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
@@ -1,60 +1,39 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
+(function($){
+function dart(){this.x=0
+delete this.x
+}var A=new dart
 var B=new dart
-delete B.x
 var C=new dart
-delete C.x
 var D=new dart
-delete D.x
 var E=new dart
-delete E.x
 var F=new dart
-delete F.x
 var G=new dart
-delete G.x
 var H=new dart
-delete H.x
 var J=new dart
-delete J.x
 var K=new dart
-delete K.x
 var L=new dart
-delete L.x
 var M=new dart
-delete M.x
 var N=new dart
-delete N.x
 var O=new dart
-delete O.x
 var P=new dart
-delete P.x
 var Q=new dart
-delete Q.x
 var R=new dart
-delete R.x
 var S=new dart
-delete S.x
 var T=new dart
-delete T.x
 var U=new dart
-delete U.x
 var V=new dart
-delete V.x
 var W=new dart
-delete W.x
 var X=new dart
-delete X.x
 var Y=new dart
-delete Y.x
 var Z=new dart
-delete Z.x
 function I(){}
 init()
 $=I.p
-var $$={}
+var $$=Object.create(null)
 ;(function(a){"use strict"
-function map(b){b={x:b}
+function map(b){b=Object.create(null)
+b.x=0
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
 if(h==="^")continue
@@ -80,46 +59,48 @@
 var c=b.$methodsWithOptionalArguments
 if(!c){b.$methodsWithOptionalArguments=c={}}c[a1]=a0}else{var a2=g[a1]
 if(a1!=="^"&&a2!=null&&a2.constructor===Array&&a1!=="<>"){addStubs(b,a2,a1,false,g,[])}else{b[a0=a1]=a2}}}$$[h]=[n,b]
-j.push(h)}}}function addStubs(b3,b4,b5,b6,b7,b8){var h,g=[b7[b5]=b3[b5]=h=b4[0]]
-h.$stubName=b5
-b8.push(b5)
-for(var f=0;f<b4.length;f+=2){h=b4[f+1]
-if(typeof h!="function")break
-h.$stubName=b4[f+2]
-g.push(h)
-if(h.$stubName){b7[h.$stubName]=b3[h.$stubName]=h
-b8.push(h.$stubName)}}for(var e=0;e<g.length;f++,e++){g[e].$callName=b4[f+1]}var d=b4[++f]
-b4=b4.slice(++f)
-var c=b4[0]
-var b=c>>1
-var a0=(c&1)===1
-var a1=c===3
-var a2=c===1
-var a3=b4[1]
-var a4=a3>>1
-var a5=(a3&1)===1
-var a6=b+a4!=g[0].length
-var a7=b4[2]
-var a8=2*a4+b+3
-var a9=b4.length>a8
-if(d){h=tearOff(g,b4,b6,b5,a6)
-b3[b5].$getter=h
-h.$getterStub=true
-if(b6)init.globalFunctions[b5]=h
-b7[d]=b3[d]=h
-g.push(h)
-if(d)b8.push(d)
-h.$stubName=d
-h.$callName=null
-if(a6)init.interceptedNames[d]=true}if(a9){for(var e=0;e<g.length;e++){g[e].$reflectable=1
-g[e].$reflectionInfo=b4}var b0=b6?init.mangledGlobalNames:init.mangledNames
-var b1=b4[a8]
-var b2=b1
-if(d)b0[d]=b2
-if(a1){b2+="="}else if(!a2){b2+=":"+b+":"+a4}b0[b5]=b2
-g[0].$reflectionName=b2
-g[0].$metadataIndex=a8+1
-if(a4)b3[b1+"*"]=g[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
+j.push(h)}}}function addStubs(b4,b5,b6,b7,b8,b9){var h=0,g=b5[h],f
+if(typeof g=="string"){f=b5[++h]}else{f=g
+g=b6}var e=[b8[b6]=b4[b6]=b4[g]=f]
+f.$stubName=b6
+b9.push(b6)
+for(;h<b5.length;h+=2){f=b5[h+1]
+if(typeof f!="function")break
+f.$stubName=b5[h+2]
+e.push(f)
+if(f.$stubName){b8[f.$stubName]=b4[f.$stubName]=f
+b9.push(f.$stubName)}}for(var d=0;d<e.length;h++,d++){e[d].$callName=b5[h+1]}var c=b5[++h]
+b5=b5.slice(++h)
+var b=b5[0]
+var a0=b>>1
+var a1=(b&1)===1
+var a2=b===3
+var a3=b===1
+var a4=b5[1]
+var a5=a4>>1
+var a6=(a4&1)===1
+var a7=a0+a5!=e[0].length
+var a8=b5[2]
+var a9=2*a5+a0+3
+var b0=b5.length>a9
+if(c){f=tearOff(e,b5,b7,b6,a7)
+b4[b6].$getter=f
+f.$getterStub=true
+if(b7)init.globalFunctions[b6]=f
+b8[c]=b4[c]=f
+e.push(f)
+if(c)b9.push(c)
+f.$stubName=c
+f.$callName=null
+if(a7)init.interceptedNames[c]=true}if(b0){for(var d=0;d<e.length;d++){e[d].$reflectable=1
+e[d].$reflectionInfo=b5}var b1=b7?init.mangledGlobalNames:init.mangledNames
+var b2=b5[a9]
+var b3=b2
+if(c)b1[c]=b3
+if(a2){b3+="="}else if(!a3){b3+=":"+a0+":"+a5}b1[b6]=b3
+e[0].$reflectionName=b3
+e[0].$metadataIndex=a9+1
+if(a5)b4[b2+"*"]=e[0]}}function tearOffGetterNoCsp(b,c,d,e){return e?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"(x) {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(b,c,d,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+d+z+++"() {"+"if (c === null) c = H.qmC("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(b,c,d,H,null)}function tearOffGetterCsp(b,c,d,e){var h=null
 return e?function(f){if(h===null)h=H.qmC(this,b,c,false,[f],d)
 return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qmC(this,b,c,false,[],d)
 return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
@@ -153,11 +134,11 @@
 x.push([q,p,j,i,o,k,l,n])}})([["","",,H,{
 "^":"",
 FK2:{
-"^":"a;tT>"}}],["","",,J,{
+"^":"a;tT:Q>"}}],["","",,J,{
 "^":"",
-x:function(a){return void 0},
-uM:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-aN:function(a){var z,y,x,w
+t:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+MZ: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
@@ -165,162 +146,167 @@
 if(!0===y)return a
 x=Object.getPrototypeOf(a)
 if(y===x)return z.i
-if(z.e===x)throw H.b(P.nO("Return interceptor for "+H.d(y(a,z))))}w=H.Am(a)
+if(z.e===x)throw H.b(P.nO("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.Sx
+if(y==null||y===Object.prototype)return C.ZQ
 else return C.vB}return w},
-e1g:function(a){var z,y,x,w
-z=$.AuW
+TZ:function(a){var z,y,x,w
+z=$.uv
 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},
-Dc:function(a){var z,y,x
-z=J.e1g(a)
+for(z=y.length,x=J.t(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
+if(x.m(a,y[w]))return w}return},
+Fb:function(a){var z,y,x
+z=J.TZ(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+1
 if(x>=y.length)return H.e(y,x)
 return y[x]},
-KE:function(a,b){var z,y,x
-z=J.e1g(a)
+YC:function(a,b){var z,y,x
+z=J.TZ(a)
 if(z==null)return
-y=$.AuW
+y=$.uv
 x=z+2
 if(x>=y.length)return H.e(y,x)
 return y[x][b]},
 Gv:{
 "^":"a;",
-n:function(a,b){return a===b},
-giO:function(a){return H.wP(a)},
-bu:[function(a){return H.a5(a)},"$0","gCR",0,0,73],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,74],
+m:function(a,b){return a===b},
+giO:function(a){return H.eQ(a)},
+X:["fN",function(a){return H.a5(a)},"$0","gCR",0,0,0],
+P:["bi",function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gkh",2,0,null,75],
 gbx:function(a){return new H.cu(H.wO(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|PushManager|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gCR",0,0,73],
+X:[function(a){return String(a)},"$0","gCR",0,0,0],
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.Ow},
+gbx:function(a){return C.nd},
 $isSQ:true},
 CDU:{
 "^":"Gv;",
-n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gCR",0,0,73],
+m:function(a,b){return null==b},
+X:[function(a){return"null"},"$0","gCR",0,0,0],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gkh",2,0,null,74]},
+P:[function(a,b){return this.bi(a,b)},"$1","gkh",2,0,null,75]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
-gbx:function(a){return C.Bc}},
+gbx:function(a){return C.Ho}},
 iCW:{
 "^":"Ue1;"},
 kdQ:{
 "^":"Ue1;",
-bu:[function(a){return String(a)},"$0","gCR",0,0,73]},
-Q:{
+X:[function(a){return String(a)},"$0","gCR",0,0,0]},
+G:{
 "^":"Gv;",
+uy:function(a,b){if(!!a.immutable$list)throw H.b(P.f(b))},
+PP:function(a,b){if(!!a.fixed$length)throw H.b(P.f(b))},
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-W4:function(a,b){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("removeAt"))
+W4:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0||b>=a.length)throw H.b(P.D(b,null,null))
+this.PP(a,"removeAt")
 return a.splice(b,1)[0]},
-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"))
+aP:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0||b>a.length)throw H.b(P.D(b,null,null))
+this.PP(a,"insert")
 a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(a,b,c)},
+UG:function(a,b,c){this.PP(a,"insertAll")
+H.FR(a,b,c)},
 Rz:function(a,b){var z
-if(!!a.fixed$length)H.vh(P.f("remove"))
-for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
+this.PP(a,"remove")
+for(z=0;z<a.length;++z)if(J.mG(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.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],
+ev:function(a,b){return H.J(new H.U5(a,b),[H.u3(H.J(new H.ii(),[H.u3(a,0)]),0)])},
+Ft:[function(a,b){return H.J(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,"G")},31],
 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:"xP",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},30],
+for(z=J.Nx(b);z.D();)this.h(a,z.gk())},
+V1:function(a){this.sv(a,0)},
+aN:function(a,b){var z,y
+z=a.length
+for(y=0;y<z;++y){b.$1(a[y])
+if(z!==a.length)throw H.b(P.a4(a))}},
+ez:[function(a,b){return H.J(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"G")},31],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
-y.fixed$length=init
+y.fixed$length=Array
 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.wb(),[H.u3(a,0)]),0))},
+eR:function(a,b){return H.c1(a,b,null,H.u3(H.J(new H.ii(),[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.wb(),[H.u3(a,0)])
-H.xF(a,b,c)
+D6:function(a,b,c){if(b<0||b>a.length)throw H.b(P.ve(b,0,a.length,null,null))
+if(c<b||c>a.length)throw H.b(P.ve(c,b,a.length,null,null))
+if(b===c)return H.J([],[H.u3(a,0)])
+return H.J(a.slice(b,c),[H.u3(a,0)])},
+Mu:function(a,b,c){var z=H.J(new H.ii(),[H.u3(a,0)])
+P.iZ(b,c,a.length,null,null,null)
 return H.c1(a,b,c,H.u3(z,0))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 oq:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("removeRange"))
+this.PP(a,"removeRange")
 z=a.length
-if(b<0||b>z)throw H.b(P.TE(b,0,z))
-if(c<b||c>z)throw H.b(P.TE(c,b,z))
+if(b<0||b>z)throw H.b(P.ve(b,0,z,null,null))
+if(c<b||c>z)throw H.b(P.ve(c,b,z,null,null))
 H.tb(a,c,a,b,z-c)
-this.sB(a,z-(c-b))},
+this.sv(a,z-(c-b))},
 Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+GT:function(a,b){this.uy(a,"sort")
 H.ig(a,b)},
 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.lO(a,b,a.length-1)},
+Pk:function(a,b,c){return H.EHn(a,b,c==null?a.length-1:c)},
 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
+for(z=0;z<a.length;++z)if(J.mG(a[z],b))return!0
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
+X:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,0],
 tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.u3(a,0)])
-else{z=H.VM(a.slice(),[H.u3(a,0)])
-z.fixed$length=init
+if(b)return H.J(a.slice(),[H.u3(a,0)])
+else{z=H.J(a.slice(),[H.u3(a,0)])
+z.fixed$length=Array
 return z}},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.u3(a,0))
+Oe:function(a){var z=P.fM(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)])},
-giO:function(a){return H.wP(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
+gu:function(a){return H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)])},
+giO:function(a){return H.eQ(a)},
+gv:function(a){return a.length},
+sv:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0)throw H.b(P.D(b,null,null))
+this.PP(a,"set length")
 a.length=b},
-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))
+p:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 return a[b]},
-u:function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
-if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
+q:function(a,b,c){this.uy(a,"indexed set")
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 a[b]=c},
-$isQ:true,
+$isG:true,
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
-P:{
+F:{
 "^":"Gv;",
 iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a<b)return-1
 else if(a>b)return 1
 else if(a===b){if(a===0){z=this.gzP(b)
@@ -330,7 +316,7 @@
 return 1}else return-1},
 gzP:function(a){return a===0?1/a<0:a<0},
 gG0:function(a){return isNaN(a)},
-gzr:function(a){return isFinite(a)},
+gx8:function(a){return isFinite(a)},
 JV:function(a,b){return a%b},
 Vy:function(a){return Math.abs(a)},
 yu:function(a){var z
@@ -341,42 +327,43 @@
 RE:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
 Sy:[function(a,b){var z,y
-if(typeof b!=="number")H.vh(P.u(b))
+H.eI(b)
 z=J.Wx(b)
-if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
+if(z.w(b,0)||z.A(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gVz",2,0,14,75],
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
+return y},"$1","gfE",2,0,16,76],
+WZ:function(a,b){H.eI(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"
-else return""+a},"$0","gCR",0,0,73],
+X:[function(a){if(a===0&&1/a<0)return"-0.0"
+else return""+a},"$0","gCR",0,0,0],
 giO:function(a){return a&0x1FFFFFFF},
-J:function(a){return-a},
-g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+G:function(a){return-a},
+g:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+T:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+S:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+R:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
+V:function(a,b){var z
+if(typeof b!=="number")throw H.b(P.p(b))
 z=a%b
 if(z===0)return 0
 if(z>0)return z
 if(b<0)return z-b
 else return z+b},
-Z:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else{if(typeof b!=="number")H.vh(P.u(b))
+W:function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
+else{if(typeof b!=="number")H.vh(P.p(b))
 return this.yu(a/b)}},
 BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
-O:function(a,b){if(b<0)throw H.b(P.u(b))
+L:function(a,b){if(b<0)throw H.b(P.p(b))
 return b>31?0:a<<b>>>0},
 iK:function(a,b){return b>31?0:a<<b>>>0},
-m:function(a,b){var z
-if(b<0)throw H.b(P.u(b))
+l:function(a,b){var z
+if(b<0)throw H.b(P.p(b))
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
@@ -384,94 +371,104 @@
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
-PK:function(a,b){if(b<0)throw H.b(P.u(b))
+bf:function(a,b){if(b<0)throw H.b(P.p(b))
 return b>31?0:a>>>b},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+i:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+s:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+w:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+A:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+B:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
+C:function(a,b){if(typeof b!=="number")throw H.b(P.p(b))
 return a>=b},
-gbx:function(a){return C.WU},
-$islf:true,
-static:{"^":"SAz,HS"}},
+gbx:function(a){return C.yT},
+$isFK:true,
+static:{"^":"SAz,N6l"}},
 imn:{
-"^":"P;",
+"^":"F;",
 gbx:function(a){return C.yw},
-$isVf:true,
-$islf:true,
+$isCP:true,
+$isFK:true,
 $isKN:true},
-VA7:{
-"^":"P;",
-gbx:function(a){return C.cz},
-$isVf:true,
-$islf:true},
-O:{
+VA:{
+"^":"F;",
+gbx:function(a){return C.hc},
+$isCP:true,
+$isFK:true},
+E:{
 "^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
+O2:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b<0)throw H.b(P.D(b,null,null))
+if(b>=a.length)throw H.b(P.D(b,null,null))
 return a.charCodeAt(b)},
-dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+ww:function(a,b,c){H.Yx(b)
+H.m1(c)
+if(c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 return H.ZT(a,b,c)},
-dd:function(a,b){return this.dm(a,b,0)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
+dd:function(a,b){return this.ww(a,b,0)},
+wL:function(a,b,c){var z,y
+if(c<0||c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 z=a.length
-y=b.length
-if(c+z>y)return
-for(x=0;x<z;++x){w=c+x
-if(w<0)H.vh(P.N(w))
-if(w>=y)H.vh(P.N(w))
-w=b.charCodeAt(w)
-if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
-g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
+if(c+z>b.length)return
+for(y=0;y<z;++y)if(this.O2(b,c+y)!==this.O2(a,y))return
+return new H.Vo(c,b,a)},
+g:function(a,b){if(typeof b!=="string")throw H.b(P.p(b))
 return a+b},
 C1:function(a,b){var z,y
+H.Yx(b)
 z=b.length
 y=a.length
 if(z>y)return!1
 return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.Gu(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
+h8:function(a,b,c){H.Yx(c)
+return H.AD(a,b,c)},
+Fr:function(a,b){if(b==null)H.vh(P.p(null))
 if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Yr)
-else throw H.b("String.split(Pattern) UNIMPLEMENTED")},
-Ys:function(a,b,c){var z
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
+else if(!!J.t(b).$isVR&&b.gIa().exec('').length-2===0)return a.split(b.gYr())
+else return this.vA(a,b)},
+vA:function(a,b){var z,y,x,w,v,u,t
+z=H.J([],[P.I])
+for(y=J.Nx(J.qv(b,a)),x=0,w=1;y.D();){v=y.gk()
+u=J.y1(v)
+t=v.gwQ()
+w=J.D5(t,u)
+if(J.mG(w,0)&&J.mG(x,u))continue
+z.push(this.Nj(a,x,u))
+x=t}if(J.UN(x,a.length)||J.vU(w,0))z.push(this.yn(a,x))
+return z},
+Qi:function(a,b,c){var z
+H.m1(c)
+if(c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 z=c+b.length
 if(z>a.length)return!1
 return b===a.substring(c,z)},
-nC:function(a,b){return this.Ys(a,b,0)},
+nC:function(a,b){return this.Qi(a,b,0)},
 Nj:function(a,b,c){var z
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
+if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.p(b))
 if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
+if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.p(c))
 z=J.Wx(b)
-if(z.C(b,0))throw H.b(P.N(b))
-if(z.D(b,c))throw H.b(P.N(b))
-if(J.xZ(c,a.length))throw H.b(P.N(c))
+if(z.w(b,0))throw H.b(P.D(b,null,null))
+if(z.A(b,c))throw H.b(P.D(b,null,null))
+if(J.vU(c,a.length))throw H.b(P.D(c,null,null))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 bS:function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-if(this.j(z,0)===133){x=J.mm(z,1)
+if(this.O2(z,0)===133){x=J.mm(z,1)
 if(x===y)return""}else x=0
 w=y-1
-v=this.j(z,w)===133?J.r9(z,w):y
+v=this.O2(z,w)===133?J.r9(z,w):y
 if(x===0&&v===y)return z
 return z.substring(x,v)},
-U:function(a,b){var z,y
-if(typeof b!=="number")return H.s(b)
+R:function(a,b){var z,y
+if(typeof b!=="number")return H.o(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
 if(b!==b>>>0)throw H.b(C.Eq)
@@ -479,80 +476,74 @@
 b=b>>>1
 if(b===0)break
 z+=z}return y},
-YX:function(a,b,c){var z=b-a.length
+Zp: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)},
+return this.R(c,z)+a},
+gNq:function(a){return new J.mN(a)},
 XU:function(a,b,c){var z,y,x,w
-if(b==null)H.vh(P.u(null))
-if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
+if(b==null)H.vh(P.p(null))
+if(c<0||c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
+z=J.t(b)
 if(!!z.$isVR){y=b.UZ(a,c)
-return y==null?-1:y.pX.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
+return y==null?-1:y.a.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
 return-1},
 OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
-c=a.length
+if(c==null)c=a.length
+else if(c<0||c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 z=b.length
+if(typeof c!=="number")return c.g()
 y=a.length
 if(c+z>y)c=y-z
 return a.lastIndexOf(b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-eM:function(a,b,c){if(b==null)H.vh(P.u(null))
-if(c>a.length)throw H.b(P.TE(c,0,a.length))
+eM:function(a,b,c){if(b==null)H.vh(P.p(null))
+if(c>a.length)throw H.b(P.ve(c,0,a.length,null,null))
 return H.m2(a,b,c)},
 tg:function(a,b){return this.eM(a,b,0)},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:function(a,b){var z
-if(typeof b!=="string")throw H.b(P.u(b))
+if(typeof b!=="string")throw H.b(P.p(b))
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gCR",0,0,73],
+X:[function(a){return a},"$0","gCR",0,0,0],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
 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.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))
+gbx:function(a){return C.yE},
+gv:function(a){return a.length},
+p:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p(b))
+if(b>=a.length||b<0)throw H.b(P.D(b,null,null))
 return a[b]},
-$isqU:true,
+$isI:true,
 static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
 default:return!1}},mm:function(a,b){var z,y
-for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
-y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
-for(z=a.length;b>0;b=y){y=b-1
-if(y>=z)H.vh(P.N(y))
-x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b}}},
-IA:{
-"^":"w2Y;vF",
-gB:function(a){return this.vF.length},
-t:function(a,b){var z,y
-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))
-if(y.F(b,z.length))H.vh(P.N(b))
-return z.charCodeAt(b)},
+for(z=a.length;b<z;){y=C.yo.O2(a,b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y
+for(;b>0;b=z){z=b-1
+y=C.yo.O2(a,z)
+if(y!==32&&y!==13&&!J.Ga(y))break}return b}}},
+mN:{
+"^":"w2Y;Q",
+gv:function(a){return this.Q.length},
+p:function(a,b){return C.yo.O2(this.Q,b)},
 $asw2Y:function(){return[P.KN]},
 $asark:function(){return[P.KN]},
-$aseD:function(){return[P.KN]},
+$asE9h:function(){return[P.KN]},
 $asWO:function(){return[P.KN]},
 $asQV:function(){return[P.KN]}}}],["","",,H,{
 "^":"",
 dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
+init.globalState.e.bL()
 return z},
-cv:function(){--init.globalState.Xz.kv},
+cv:function(){--init.globalState.e.a},
 wW:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
@@ -561,31 +552,31 @@
 if(b==null){b=[]
 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.dl(0,0,1,null,null,null,null,null,null,null,null,null,a)
+if(!J.t(y).$isWO)throw H.b(P.p("Arguments to main must be a List: "+H.d(y)))
+y=new H.pq(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++
+if(init.globalState.r===!0)return
+y=init.globalState.Q++
 x=P.L5(null,null,null,P.KN,H.HX)
-w=P.Ls(null,null,null,P.KN)
+w=P.fM(null,null,null,P.KN)
 v=new H.HX(0,null,!1)
-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))
+u=new H.Du(y,x,w,new I(),v,new H.iV(H.Uh()),new H.iV(H.Uh()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(null,null,null,null))
 w.h(0,0)
 u.ac(0,v)
-init.globalState.Nr=u
-init.globalState.N0=u
+init.globalState.d=u
+init.globalState.c=u
 y=H.G3()
 x=H.KT(y,[y]).Zg(a)
-if(x)u.vV(0,new H.mP(z,a))
+if(x)u.vV(0,new H.Fx(z,a))
 else{y=H.KT(y,[y,y]).Zg(a)
-if(y)u.vV(0,new H.Fx(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
+if(y)u.vV(0,new H.PKK(z,a))
+else u.vV(0,a)}init.globalState.e.bL()},
 yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.cL()
 if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.cL()
+if(init.globalState.r===!0)return H.cL()
 return},
 cL:function(){var z,y
 z=new Error().stack
@@ -596,580 +587,576 @@
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=H.Hhn(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.Hhn(y.t(z,"msg"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hhn(y.t(z,"replyTo"))
-y=init.globalState.Hg++
+switch(y.p(z,"command")){case"start":init.globalState.a=y.p(z,"id")
+x=y.p(z,"functionName")
+w=x==null?init.globalState.cx:H.WL(x)
+v=y.p(z,"args")
+u=H.Ln(y.p(z,"msg"))
+t=y.p(z,"isSpawnUri")
+s=y.p(z,"startPaused")
+r=H.Ln(y.p(z,"replyTo"))
+y=init.globalState.Q++
 q=P.L5(null,null,null,P.KN,H.HX)
-p=P.Ls(null,null,null,P.KN)
+p=P.fM(null,null,null,P.KN)
 o=new H.HX(0,null,!1)
-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))
+n=new H.Du(y,q,p,new I(),o,new H.iV(H.Uh()),new H.iV(H.Uh()),!1,!1,[],P.fM(null,null,null,null),null,null,!1,!0,P.fM(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"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
+init.globalState.e.Q.B7(0,new H.IY(n,new H.xn(w,v,u,t,s,r),"worker-start"))
+init.globalState.c=n
+init.globalState.e.bL()
 break
 case"spawn-worker":break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
+case"message":if(y.p(z,"port")!=null)J.H4(y.p(z,"port"),y.p(z,"msg"))
+init.globalState.e.bL()
 break
-case"close":init.globalState.XC.Rz(0,$.qv().t(0,a))
+case"close":init.globalState.ch.Rz(0,$.AW().p(0,a))
 a.terminate()
-init.globalState.Xz.bL()
+init.globalState.e.bL()
 break
-case"log":H.yb(y.t(z,"msg"))
+case"log":H.yb(y.p(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))
+case"print":if(init.globalState.r===!0){y=init.globalState.z
+q=H.GyL(P.B(["command","print","msg",z],null,null))
 y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
+self.postMessage(q)}else P.FL(y.p(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+case"error":throw H.b(y.p(z,"msg"))}},"$2","dM",4,0,null,3,4],
 yb: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))
+if(init.globalState.r===!0){y=init.globalState.z
+x=H.GyL(P.B(["command","log","msg",a],null,null))
 y.toString
 self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
-z=new H.oP(w,null)
+z=new H.XO(w,null)
 throw H.b(P.eG(z))}},
+WL:function(a){return init.globalFunctions[a]()},
 Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.H9=$.H9+("_"+y)
+z=init.globalState.c
+y=z.Q
+$.z7=$.z7+("_"+y)
 $.Mr=$.Mr+("_"+y)
-y=z.er
-x=init.globalState.N0.jO
-w=z.Qy
-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)
-init.globalState.Xz.Rk.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+y=z.d
+x=init.globalState.c.Q
+w=z.e
+J.H4(f,["spawned",new H.VU(y,x),w,z.f])
+x=new H.Vg(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.e.Q.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.oV())
-z.dZ=new H.m3(null)
-return z.h7(a)}else{z=new H.fL(new H.oV())
-z.dZ=new H.m3(null)
+if(init.globalState.x===!0){z=new H.Bjm(0,new H.cx())
+z.Q=new H.fP(null)
+return z.h7(a)}else{z=new H.fL(new H.cx())
+z.Q=new H.fP(null)
 return z.h7(a)}},
-Hhn:function(a){if(init.globalState.ji===!0)return new H.EU(null).QS(a)
+Ln:function(a){if(init.globalState.x===!0)return new H.hq(null).ug(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"},
-mP:{
-"^":"TpZ:76;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
 Fx:{
-"^":"TpZ:76;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-dl:{
-"^":"a;Hg,NO,hJ,N0,Nr,Xz,Ws,EF,ji,i2<,rj,XC,w2<",
+"^":"r:77;Q,a",
+$0:function(){this.a.$1(this.Q.a)}},
+PKK:{
+"^":"r:77;Q,a",
+$0:function(){this.a.$2(this.Q.a,null)}},
+pq:{
+"^":"a;Q,a,b,c,d,e,f,r,x,i2:y<,z,ch,w2:cx<",
 N8:function(a){var z,y,x
 z=self.window==null
 y=self.Worker
 x=z&&!!self.postMessage
-this.EF=x
+this.r=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
-this.ji=y
-this.Ws=z&&!x
-y=H.IY
-x=H.VM(new P.nd(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.wX(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()
-this.rj=z
+this.x=y
+this.f=z&&!x
+this.e=new H.ae(P.NZ2(null,H.IY),0)
+this.y=P.L5(null,null,null,P.KN,H.Du)
+this.ch=P.L5(null,null,null,P.KN,null)
+if(this.r===!0){z=new H.JH()
+this.z=z
 self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
 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<,er<,Qy,PX,xF?,UF<,Vp<,bm,QC,fB,P0,pa,ir",
-oz:function(a,b){if(!this.Qy.n(0,a))return
-if(this.bm.h(0,b)&&!this.UF)this.UF=!0
+static:{wI:[function(a){return H.GyL(P.B(["command","print","msg",a],null,null))},"$1","UB",2,0,null,2]}},
+Du:{
+"^":"a;jO:Q>,a,b,En:c<,WE:d<,e,f,xF:r?,RW:x<,C9:y<,z,ch,cx,cy,db,dx",
+V0:function(a,b){if(!this.e.m(0,a))return
+if(this.z.h(0,b)&&!this.x)this.x=!0
 this.CX()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.bm
+cK:function(a){var z,y,x,w,v,u
+if(!this.x)return
+z=this.z
 z.Rz(0,a)
-if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.Q===0){for(z=this.y;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
-y=init.globalState.Xz.Rk
-w=y.QN
-v=y.E3
+y=init.globalState.e.Q
+w=y.a
+v=y.Q
 u=v.length
 w=(w-1&u-1)>>>0
-y.QN=w
+y.a=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.Bq)y.OO();++y.Z1}this.UF=!1}this.CX()},
-Ma:function(a){var z=this.QC
+if(w===y.b)y.OO();++y.c}this.x=!1}this.CX()},
+Ma:function(a){var z=this.ch
 if(z==null){z=[]
-this.QC=z}if(J.kE(z,a))return
-this.QC.push(a)},
-IB:function(a){var z=this.QC
+this.ch=z}if(J.kE(z,a))return
+this.ch.push(a)},
+IB:function(a){var z=this.ch
 if(z==null)return
 J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
+JZ:function(a,b){if(!this.f.m(0,a))return
+this.db=b},
 ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.P0
+z=J.t(b)
+if(!z.m(b,0))y=z.m(b,1)&&!this.cy
 else y=!0
 if(y){J.H4(a,null)
-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=H.VM(new P.nd(null,0,0,0),[null])
-z.Eo(null,null)
-this.fB=z}z.B7(0,y)},
+return}y=new H.BZ(a)
+if(z.m(b,2)){init.globalState.e.Q.B7(0,new H.IY(this,y,"ping"))
+return}z=this.cx
+if(z==null){z=P.NZ2(null,null)
+this.cx=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
+if(!this.f.m(0,a))return
+z=J.t(b)
+if(!z.m(b,0))y=z.m(b,1)&&!this.cy
 else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
+if(y){this.f7()
+return}if(z.m(b,2)){z=init.globalState.e
 y=this.gIm()
-z.Rk.B7(0,new H.IY(this,y,"kill"))
-return}z=this.fB
-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())},
+z.Q.B7(0,new H.IY(this,y,"kill"))
+return}z=this.cx
+if(z==null){z=P.NZ2(null,null)
+this.cx=z}z.B7(0,this.gIm())},
 hk:function(a,b){var z,y
-z=this.ir
-if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
+z=this.dx
+if(z.Q===0){if(this.db===!0&&this===init.globalState.d)return
 if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
-y.fixed$length=init
-y[0]=J.AG(a)
-y[1]=b==null?null:J.AG(b)
-for(z=H.VM(new P.zQ(z,z.HU,null,null),[null]),z.Qx=z.vY.HH;z.G();)J.H4(z.fD,y)},
+y.fixed$length=Array
+y[0]=J.Lz(a)
+y[1]=b==null?null:J.Lz(b)
+for(z=H.J(new P.zQ(z,z.f,null,null),[null]),z.b=z.Q.d;z.D();)J.H4(z.c,y)},
 vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
+z=init.globalState.c
+init.globalState.c=this
+$=this.c
 y=null
-this.P0=!0
+this.cy=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.oP(v,null)
+w=new H.XO(v,null)
 this.hk(x,w)
-if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.P0=!1
-init.globalState.N0=z
+if(this.db===!0){this.f7()
+if(this===init.globalState.d)throw v}}finally{this.cy=!1
+init.globalState.c=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],
+if(this.cx!=null)for(;u=this.cx,!u.gl0(u);)this.cx.AR().$0()}return y},"$1","gZ2",2,0,78,79],
 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.p(a,0)){case"pause":this.V0(z.p(a,1),z.p(a,2))
 break
-case"resume":this.NR(z.t(a,1))
+case"resume":this.cK(z.p(a,1))
 break
-case"add-ondone":this.Ma(z.t(a,1))
+case"add-ondone":this.Ma(z.p(a,1))
 break
-case"remove-ondone":this.IB(z.t(a,1))
+case"remove-ondone":this.IB(z.p(a,1))
 break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
+case"set-errors-fatal":this.JZ(z.p(a,1),z.p(a,2))
 break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
+case"ping":this.ZC(z.p(a,1),z.p(a,2))
 break
-case"kill":this.w1(z.t(a,1),z.t(a,2))
+case"kill":this.w1(z.p(a,1),z.p(a,2))
 break
-case"getErrors":this.ir.h(0,z.t(a,1))
+case"getErrors":this.dx.h(0,z.p(a,1))
 break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
+case"stopErrors":this.dx.Rz(0,z.p(a,1))
 break}},
-Ie:function(a){return this.A4.t(0,a)},
-ac:function(a,b){var z=this.A4
+iQ:function(a){return this.a.p(0,a)},
+ac:function(a,b){var z=this.a
 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.Dm()},
-Dm:[function(){var z,y
-z=this.fB
+z.q(0,a,b)},
+CX:function(){if(this.a.Q-this.b.Q>0||this.x||!this.r)init.globalState.y.q(0,this.Q,this)
+else this.f7()},
+f7:[function(){var z,y
+z=this.cx
 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.Ff.BG()
+for(z=this.a,y=z.gUQ(z),y=H.J(new H.MH(null,J.Nx(y.Q),y.a),[H.u3(y,0),H.u3(y,1)]);y.D();)y.Q.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.Ff,null)
-this.QC=null}},"$0","gIm",0,0,17],
-$isaX:true},
-NYh:{
-"^":"TpZ:17;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-wX:{
-"^":"a;Rk>,kv",
-mj:function(){var z=this.Rk
-if(z.QN===z.Bq)return
+this.b.V1(0)
+init.globalState.y.Rz(0,this.Q)
+this.dx.V1(0)
+z=this.ch
+if(z!=null){for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.H4(z.c,null)
+this.ch=null}},"$0","gIm",0,0,1],
+$isDu:true},
+BZ:{
+"^":"r:1;Q",
+$0:[function(){J.H4(this.Q,null)},"$0",null,0,0,null,"call"]},
+ae:{
+"^":"a;Rk:Q>,a",
+mj:function(){var z=this.Q
+if(z.a===z.b)return
 return z.AR()},
-d5:function(){var z,y,x
+xB: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."))
+if(z==null){if(init.globalState.d!=null&&init.globalState.y.NZ(0,init.globalState.d.Q)&&init.globalState.f===!0&&init.globalState.d.a.Q===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
-x=H.GyL(P.EF(["command","close"],null,null))
+if(y.r===!0&&y.y.Q===0&&y.e.a===0){y=y.z
+x=H.GyL(P.B(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-nT:function(){if(self.window!=null)new H.Rm(this).$0()
-else for(;this.d5(););},
+IV:function(){if(self.window!=null)new H.Rm(this).$0()
+else for(;this.xB(););},
 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)
+if(init.globalState.r!==!0)this.IV()
+else try{this.IV()}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-w=init.globalState.rj
-v=H.GyL(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
+y=new H.XO(x,null)
+w=init.globalState.z
+v=H.GyL(P.B(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"TpZ:17;a",
-$0:[function(){if(!this.a.d5())return
-P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:1;Q",
+$0:[function(){if(!this.Q.xB())return
+P.cH(C.RT,this)},"$0",null,0,0,null,"call"]},
 IY:{
-"^":"a;od*,xh,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gVp().push(this)
-return}J.QT(this.od,this.xh)},"$0","gpE",0,0,17],
+"^":"a;od:Q*,a,G1:b>",
+Fn:[function(a){if(this.Q.gRW()){this.Q.gC9().push(this)
+return}J.QT(this.Q,this.a)},"$0","gpE",0,0,1],
 $isIY:true},
 JH:{
 "^":"a;"},
-jl3:{
-"^":"TpZ:76;a,b,c,d,e,f",
-$0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
-$isEH:true},
-zX:{
-"^":"TpZ:17;a,b,c,d,e",
+xn:{
+"^":"r:77;Q,a,b,c,d,e",
+$0:[function(){H.Di(this.Q,this.a,this.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"]},
+Vg:{
+"^":"r:1;Q,a,b,c,d",
 $0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
+this.d.sxF(!0)
+if(this.c!==!0)this.Q.$1(this.b)
+else{z=this.Q
 y=H.G3()
 x=H.KT(y,[y,y]).Zg(z)
-if(x)z.$2(this.b,this.c)
+if(x)z.$2(this.a,this.b)
 else{y=H.KT(y,[y]).Zg(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
+if(y)z.$1(this.a)
+else z.$0()}}},"$0",null,0,0,null,"call"]},
 Iy4:{
 "^":"a;",
-$ispW:true,
-$ishq:true},
-Kg:{
-"^":"Iy4;kx,AJ",
+$isbCx:true,
+$isXY:true},
+VU:{
+"^":"Iy4;a,Q",
 wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.AJ
-x=init.globalState.i2.t(0,y)
+y=this.Q
+x=init.globalState.y.p(0,y)
 if(x==null)return
-w=this.kx
-if(w.geL())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
+w=this.a
+if(w.gGl())return
+v=init.globalState.c!=null&&init.globalState.c.Q!==y
 z.a=b
 if(v)z.a=H.GyL(b)
-if(x.ger()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
+if(x.gWE()===w){x.Ds(z.a)
+return}y=init.globalState.e
 w="receive "+H.d(b)
-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).$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",
+y.Q.B7(0,new H.IY(x,new H.cR(z,this,v),w))},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isVU&&J.mG(this.a,b.a)},
+giO:function(a){return J.iF(this.a)},
+$isVU:true,
+$isbCx:true,
+$isXY:true},
+cR:{
+"^":"r:77;Q,a,b",
 $0:[function(){var z,y
-z=this.b.kx
-if(!z.geL()){if(this.c){y=this.a
-y.a=H.Hhn(y.a)}J.Pc(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+z=this.a.a
+if(!z.gGl()){if(this.b){y=this.Q
+y.a=H.Ln(y.a)}J.ocJ(z,this.Q.a)}},"$0",null,0,0,null,"call"]},
 bM:{
-"^":"Iy4;Bi,ma,AJ",
+"^":"Iy4;a,b,Q",
 wR:function(a,b){var z,y
-z=H.GyL(P.EF(["command","message","port",this,"msg",b],null,null))
-if(init.globalState.EF===!0){init.globalState.rj.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.Bi)
+z=H.GyL(P.B(["command","message","port",this,"msg",b],null,null))
+if(init.globalState.r===!0){init.globalState.z.toString
+self.postMessage(z)}else{y=init.globalState.ch.p(0,this.a)
 if(y!=null)y.postMessage(z)}},
-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)},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isbM&&J.mG(this.a,b.a)&&J.mG(this.Q,b.Q)&&J.mG(this.b,b.b)},
 giO:function(a){var z,y,x
-z=J.Eh(this.Bi,16)
-y=J.Eh(this.AJ,8)
-x=this.ma
-if(typeof x!=="number")return H.s(x)
+z=J.o3(this.a,16)
+y=J.o3(this.Q,8)
+x=this.b
+if(typeof x!=="number")return H.o(x)
 return(z^y^x)>>>0},
 $isbM:true,
-$ispW:true,
-$ishq:true},
+$isbCx:true,
+$isXY:true},
 HX:{
-"^":"a;a7>,Oy,eL<",
-mY:function(a){return this.Oy.$1(a)},
-BG:function(){this.eL=!0
-this.Oy=null},
+"^":"a;TU:Q>,a,Gl:b<",
+mY:function(a){return this.a.$1(a)},
+BG:function(){this.b=!0
+this.a=null},
 xO:function(a){var z,y
-if(this.eL)return
-this.eL=!0
-this.Oy=null
-z=init.globalState.N0
-y=this.a7
-z.A4.Rz(0,y)
-z.fW.Rz(0,y)
+if(this.b)return
+this.b=!0
+this.a=null
+z=init.globalState.c
+y=this.Q
+z.a.Rz(0,y)
+z.b.Rz(0,y)
 z.CX()},
-yU:function(a,b){if(this.eL)return
+yU:function(a,b){if(this.b)return
 this.mY(b)},
 $isHX:true,
 static:{"^":"tye"}},
-RS:{
-"^":"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.$iskuS)return["capability",a.a7]
-throw H.b("Capability not serializable: "+a.bu(0))}},
+Bjm:{
+"^":"jP1;a,Q",
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.a,a.Q,J.iF(a.a)]
+if(!!a.$isbM)return["sendport",a.a,a.Q,a.b]
+throw H.b("Illegal underlying port "+a.X(0))},
+yf:function(a){if(!!a.$isiV)return["capability",a.Q]
+throw H.b("Capability not serializable: "+a.X(0))},
+Ms:function(a){var z=!!a.$isr?a.$name:null
+if(z==null)throw H.b(P.f("only top-level functions can be sent."))
+return["function",z]}},
 fL:{
-"^":"ooy;dZ",
-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.$iskuS)return new H.kuS(a.a7)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-EU:{
-"^":"fPc;Bw",
+"^":"ooy;Q",
+DE:function(a){if(!!a.$isVU)return new H.VU(a.a,a.Q)
+if(!!a.$isbM)return new H.bM(a.a,a.b,a.Q)
+throw H.b("Illegal underlying port "+a.X(0))},
+yf:function(a){if(!!a.$isiV)return new H.iV(a.Q)
+throw H.b("Capability not serializable: "+a.X(0))},
+Ms:function(a){var z=!!a.$isr?a.$name:null
+if(z==null)throw H.b(P.f("only top-level functions can be sent."))
+return H.WL(z)}},
+hq:{
+"^":"fPc;Q",
 Vf:function(a){var z,y,x,w,v,u
 z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-w=z.t(a,3)
-if(J.xC(y,init.globalState.NO)){v=init.globalState.i2.t(0,x)
+y=z.p(a,1)
+x=z.p(a,2)
+w=z.p(a,3)
+if(J.mG(y,init.globalState.a)){v=init.globalState.y.p(0,x)
 if(v==null)return
-u=v.Ie(w)
+u=v.iQ(w)
 if(u==null)return
-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;At",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.At.push(b)
+return new H.VU(u,x)}else return new H.bM(y,w,x)},
+Op:function(a){return new H.iV(J.Tf(a,1))},
+Bz:function(a){return H.WL(J.Tf(a,1))}},
+fP:{
+"^":"a;Q",
+p:function(a,b){return b.__MessageTraverser__attached_info__},
+q:function(a,b,c){this.Q.push(b)
 b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.At=[]},
+CH:function(a){this.Q=[]},
 F4:function(){var z,y,x
-for(z=this.At.length,y=0;y<z;++y){x=this.At
+for(z=this.Q.length,y=0;y<z;++y){x=this.Q
 if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.At=null}},
-oV:{
+x[y].__MessageTraverser__attached_info__=null}this.Q=null}},
+cx:{
 "^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
+p:function(a,b){return},
+q:function(a,b,c){},
 CH:function(a){},
 F4:function(){}},
 HU5:{
 "^":"a;",
 h7:function(a){var z
-if(H.vM(a))return this.Wp(a)
-this.dZ.CH(0)
+if(H.vM(a))return this.nl(a)
+this.Q.CH(0)
 z=null
-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)
+try{z=this.I2(a)}finally{this.Q.F4()}return z},
+I2:function(a){var z
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.nl(a)
+z=J.t(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isT8)return this.TI(a)
-if(!!z.$ispW)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$isw)return this.w5(a)
+if(!!z.$isbCx)return this.DE(a)
+if(!!z.$isXY)return this.yf(a)
+if(!!z.$isEH)return this.Ms(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
 "^":"HU5;",
-Wp:function(a){return a},
+nl:function(a){return a},
 wb:function(a){var z,y,x,w
-z=this.dZ.t(0,a)
+z=this.Q.p(0,a)
 if(z!=null)return z
 y=J.U6(a)
-x=y.gB(a)
+x=y.gv(a)
 z=Array(x)
-z.fixed$length=init
-this.dZ.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.B3(y.t(a,w))
+z.fixed$length=Array
+this.Q.q(0,a,z)
+for(w=0;w<x;++w)z[w]=this.I2(y.p(a,w))
 return z},
-TI:function(a){var z,y
+w5:function(a){var z,y
 z={}
-y=this.dZ.t(0,a)
+y=this.Q.p(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.dZ.u(0,a,y)
+this.Q.q(0,a,y)
 J.Me(a,new H.RK(z,this))
 return z.a},
+Ms:function(a){return H.vh(P.nO(null))},
 DE:function(a){return H.vh(P.nO(null))},
 yf:function(a){return H.vh(P.nO(null))}},
 RK:{
-"^":"TpZ:81;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.B3(a),z.B3(b))},"$2",null,4,0,null,79,80,"call"],
-$isEH:true},
-hz:{
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.a
+J.H9(this.Q.a,z.I2(a),z.I2(b))}},
+jP1:{
 "^":"HU5;",
-Wp:function(a){return a},
+nl:function(a){return a},
 wb:function(a){var z,y
-z=this.dZ.t(0,a)
+z=this.Q.p(0,a)
 if(z!=null)return["ref",z]
-y=this.uP++
-this.dZ.u(0,a,y)
+y=this.a++
+this.Q.q(0,a,y)
 return["list",y,this.IP(a)]},
-TI:function(a){var z,y,x
-z=this.dZ.t(0,a)
+w5:function(a){var z,y,x
+z=this.Q.p(0,a)
 if(z!=null)return["ref",z]
-y=this.uP++
-this.dZ.u(0,a,y)
+y=this.a++
+this.Q.q(0,a,y)
 x=J.RE(a)
 return["map",y,this.IP(J.qA(x.gvc(a))),this.IP(J.qA(x.gUQ(a)))]},
 IP:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=z.gB(a)
+y=z.gv(a)
 x=[]
-C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.B3(z.t(a,w))
+C.Nm.sv(x,y)
+for(w=0;w<y;++w){v=this.I2(z.p(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))}},
+yf:function(a){return H.vh(P.nO(null))},
+Ms:function(a){return H.vh(P.nO(null))}},
 fPc:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
-this.Bw=P.YM(null,null,null,null,null)
+ug:function(a){if(H.ZR(a))return a
+this.Q=P.YM(null,null,null,null,null)
 return this.H6(a)},
 H6:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
-switch(z.t(a,0)){case"ref":y=z.t(a,1)
-return this.Bw.t(0,y)
-case"list":return this.vo(a)
+switch(z.p(a,0)){case"ref":y=z.p(a,1)
+return this.Q.p(0,y)
+case"list":return this.GC(a)
 case"map":return this.p1(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
+case"function":return this.Bz(a)
 default:return this.fp(a)}},
-vo:function(a){var z,y,x,w,v
+GC:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.Bw.u(0,y,x)
+y=z.p(a,1)
+x=z.p(a,2)
+this.Q.q(0,y,x)
 z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
+w=z.gv(x)
+if(typeof w!=="number")return H.o(w)
 v=0
-for(;v<w;++v)z.u(x,v,this.H6(z.t(x,v)))
+for(;v<w;++v)z.q(x,v,this.H6(z.p(x,v)))
 return x},
 p1:function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
-x=y.t(a,1)
-this.Bw.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
+x=y.p(a,1)
+this.Q.q(0,x,z)
+w=y.p(a,2)
+v=y.p(a,3)
 y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
+u=y.gv(w)
+if(typeof u!=="number")return H.o(u)
 t=J.U6(v)
 s=0
-for(;s<u;++s)z.u(0,this.H6(y.t(w,s)),this.H6(t.t(v,s)))
+for(;s<u;++s)z.q(0,this.H6(y.p(w,s)),this.H6(t.p(v,s)))
 return z},
 fp:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
-"^":"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
+"^":"a;Q,a,b",
+Gv:function(){if(self.setTimeout!=null){if(this.a)throw H.b(P.f("Timer in event loop cannot be canceled."))
+if(this.b==null)return
 H.cv()
-var z=this.Iw
-if(this.bf)self.clearTimeout(z)
+var z=this.b
+if(this.Q)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
-this.Iw=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
+this.b=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.e.a
+this.b=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.r===!0
 else z=!1
-if(z){this.Iw=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.TD=!0}else if(self.setTimeout!=null){++init.globalState.Xz.kv
-this.Iw=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
+if(z){this.b=1
+z=init.globalState.e
+y=init.globalState.c
+z.Q.B7(0,new H.IY(y,new H.Av(this,b),"timer"))
+this.a=!0}else if(self.setTimeout!=null){++init.globalState.e.a
+this.b=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},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+return z},jW:function(a,b){var z=new H.Oe(!1,!1,null)
 z.WI(a,b)
 return z}}},
 Av:{
-"^":"TpZ:17;a,b",
-$0:[function(){this.a.Iw=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:1;Q,a",
+$0:[function(){this.Q.b=null
+this.a.$0()},"$0",null,0,0,null,"call"]},
 vt:{
-"^":"TpZ:17;c,d",
-$0:[function(){this.c.Iw=null
+"^":"r:1;Q,a",
+$0:[function(){this.Q.b=null
 H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+this.a.$0()},"$0",null,0,0,null,"call"]},
 DH:{
-"^":"TpZ:76;a,b",
-$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-kuS:{
-"^":"a;a7>",
+"^":"r:77;Q,a",
+$0:[function(){this.a.$1(this.Q)},"$0",null,0,0,null,"call"]},
+iV:{
+"^":"a;TU:Q>",
 giO:function(a){var z,y,x
-z=this.a7
+z=this.Q
 y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(y)
+x=y.l(z,0)
+y=y.W(z,4294967296)
+if(typeof y!=="number")return H.o(y)
 z=x^y
 z=(~z>>>0)+(z<<15>>>0)&4294967295
 z=((z^z>>>12)>>>0)*5&4294967295
 z=((z^z>>>4)>>>0)*2057&4294967295
 return(z^z>>>16)>>>0},
-n:function(a,b){var z,y
+m:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$iskuS){z=this.a7
-y=b.a7
+if(!!J.t(b).$isiV){z=this.Q
+y=b.Q
 return z==null?y==null:z===y}return!1},
-$iskuS:true,
-$ishq:true}}],["","",,H,{
+$isiV:true,
+$isXY:true}}],["","",,H,{
 "^":"",
-Gp:function(a,b){var z
+wVW:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},
+if(z!=null)return z}return!!J.t(a).$isXj},
 d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
-z=J.AG(a)
-if(typeof z!=="string")throw H.b(P.u(a))
+z=J.Lz(a)
+if(typeof z!=="string")throw H.b(P.p(a))
 return z},
-wP:function(a){var z=a.$identityHash
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a,null,null))},"$1","kk",2,0,3],
+nN:[function(a){throw H.b(P.rr(a,null,null))},"$1","UR",2,0,5],
 BU:function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.kk()
-if(typeof a!=="string")H.vh(P.u(a))
+if(c==null)c=H.UR()
+H.Yx(a)
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
 if(2>=y)return H.e(z,2)
@@ -1187,31 +1174,31 @@
 w=z[1]
 y=J.U6(w)
 v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
+while(!0){u=y.gv(w)
+if(typeof u!=="number")return H.o(u)
 if(!(v<u))break
-y.j(w,0)
-if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
+y.O2(w,0)
+if(y.O2(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
 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.kk()
+H.Yx(a)
+if(b==null)b=H.UR()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
-if(isNaN(z)){y=J.rr(a)
+if(isNaN(z)){y=J.Q7(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
 return b.$1(a)}return z},
 lh:function(a){var z,y
-z=C.w2(J.x(a))
+z=C.w2(J.t(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
-if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.j(z,0)===36)z=C.yo.yn(z,1)
+if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.yo.O2(z,0)===36)z=C.yo.yn(z,1)
 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],
-Xe:function(){var z,y
+Qn:[function(){return Date.now()},"$0","EY",0,0,6],
+w4:function(){var z,y
 if($.xG!=null)return
 $.xG=1000
-$.hG=H.EY()
+$.Zg=H.EY()
 if(typeof window=="undefined")return
 z=window
 if(z==null)return
@@ -1219,7 +1206,7 @@
 if(y==null)return
 if(typeof y.now!="function")return
 $.xG=1000000
-$.hG=new H.ww(y)},
+$.Zg=new H.ww(y)},
 RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
@@ -1231,44 +1218,45 @@
 z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.u3(a,0)]
-for(;y.G();){x=y.Ff
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
+for(;y.D();){x=y.c
+if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.p(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)},
-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))
+z.push(56320+(x&1023))}else throw H.b(P.p(x))}return H.RF(z)},
+LY:function(a){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
+if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.p(y))
+if(y<0)throw H.b(P.p(y))
 if(y>65535)return H.Cq(a)}return H.RF(a)},
 mx:function(a){var z
-if(typeof a!=="number")return H.s(a)
+if(typeof a!=="number")return H.o(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+return String.fromCharCode((55296|C.CD.wG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.ve(a,0,1114111,null,null))},
 fu:function(a,b,c,d,e,f,g,h){var z,y,x,w
-if(typeof a!=="number"||Math.floor(a)!==a)H.vh(P.u(a))
-if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(typeof d!=="number"||Math.floor(d)!==d)H.vh(P.u(d))
-if(typeof e!=="number"||Math.floor(e)!==e)H.vh(P.u(e))
-if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
-z=J.bI(b,1)
+H.m1(a)
+H.m1(b)
+H.m1(c)
+H.m1(d)
+H.m1(e)
+H.m1(f)
+H.m1(g)
+z=J.D5(b,1)
 y=h?Date.UTC(a,z,c,d,e,f,g):new Date(a,z,c,d,e,f,g).valueOf()
 if(isNaN(y)||y<-8640000000000000||y>8640000000000000)return
 x=J.Wx(a)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
+if(x.B(a,0)||x.w(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
 return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.rq)
+o2:function(a){if(a.date===void 0)a.date=new Date(a.Q)
 return a.date},
-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},
-VKg:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+KL:function(a){return a.a?H.o2(a).getUTCHours()+0:H.o2(a).getHours()+0},
+ch:function(a){return a.a?H.o2(a).getUTCMinutes()+0:H.o2(a).getMinutes()+0},
+Sw:function(a){return a.a?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.p(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))
+wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.p(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1278,19 +1266,19 @@
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+return J.DZ(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
 eC:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
-if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
+if(c!=null&&!c.gl0(c)){y=J.t(a)["call*"]
 if(y==null)return H.zo(a,b,c)
 x=H.zh(y)
-if(x==null||!x.Mo)return H.zo(a,b,c)
-b=b!=null?P.F(b,!0,null):[]
-w=x.Rv
+if(x==null||!x.e)return H.zo(a,b,c)
+b=b!=null?P.z(b,!0,null):[]
+w=x.c
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
+for(u=x.d,t=0;t<u;++t){s=t+w
+v.q(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1300,10 +1288,16 @@
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
 return y.apply(a,r)},
-s:function(a){throw H.b(P.u(a))},
-e:function(a,b){if(a==null)J.q8(a)
-if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},
+o:function(a){throw H.b(P.p(a))},
+e:function(a,b){if(a==null)J.wS(a)
+if(typeof b!=="number"||Math.floor(b)!==b)H.o(b)
+throw H.b(P.D(b,null,null))},
+eI:function(a){if(typeof a!=="number")throw H.b(P.p(a))
+return a},
+m1:function(a){if(typeof a!=="number"||Math.floor(a)!==a)throw H.b(P.p(a))
+return a},
+Yx:function(a){if(typeof a!=="string")throw H.b(P.p(a))
+return a},
 b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -1311,10 +1305,10 @@
 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","p3",0,0,null],
+tM:[function(){return J.Lz(this.dartException)},"$0","nRV",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)
+z=new H.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
 if("dartException" in a)return z.$1(a.dartException)
@@ -1325,11 +1319,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=$.Up()
+u=$.bN()
 t=$.PH()
 s=$.D1()
 r=$.BN()
-q=$.Kr()
+q=$.Y9()
 p=$.W6()
 $.PB()
 o=$.eA()
@@ -1350,27 +1344,27 @@
 if(v){v=m==null?null:m.method
 return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.KY()
-return z.$1(new P.OY(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
+return z.$1(new P.OY(!1,null,null,null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.KY()
 return a},
 CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.wP(a)},
+else return H.eQ(a)},
 dJ:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},
-El:[function(a,b,c,d,e,f,g){var z=J.x(c)
-if(z.n(c,0))return H.dB(b,new H.TL(a))
-else if(z.n(c,1))return H.dB(b,new H.uZ(a,d))
-else if(z.n(c,2))return H.dB(b,new H.OQ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.Qx(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
-else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,5,6,7,8,9,10,11],
+b.q(0,a[y],a[x])}return b},
+El:[function(a,b,c,d,e,f,g){var z=J.t(c)
+if(z.m(c,0))return H.dB(b,new H.TL(a))
+else if(z.m(c,1))return H.dB(b,new H.uZ(a,d))
+else if(z.m(c,2))return H.dB(b,new H.OQ(a,d,e))
+else if(z.m(c,3))return H.dB(b,new H.Qx(a,d,e,f))
+else if(z.m(c,4))return H.dB(b,new H.RM(a,d,e,f,g))
+else throw H.b(P.eG("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,7,8,9,10,11,12,13],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.El)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.c,H.El)
 a.$identity=z
 return z},
 HA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -1378,8 +1372,8 @@
 z.$stubName
 y=z.$callName
 z.$reflectionInfo=c
-x=H.zh(z).AM
-w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.v(null,null,null,null).constructor.prototype)
+x=H.zh(z).f
+w=d?Object.create(new H.Bp().constructor.prototype):Object.create(new H.q(null,null,null,null).constructor.prototype)
 w.$initialize=w.constructor
 if(d)v=function(){this.$initialize()}
 else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
@@ -1390,7 +1384,7 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.CW(a,z,t)
+s=H.SD(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
@@ -1400,7 +1394,7 @@
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.CW(a,o,t)
+if(n!=null){m=d?o:H.SD(a,o,t)
 w[n]=m}}w["call*"]=s
 return v},
 vq:function(a,b,c,d){var z=H.DVi
@@ -1411,23 +1405,23 @@
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 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.Kv(a,b)
+SD:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.HfE(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=$.mJs
+if(y===0){w=$.bf
 if(w==null){w=H.Iq("self")
-$.mJs=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+$.bf=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=$.mJs
+v=$.bf
 if(v==null){v=H.Iq("self")
-$.mJs=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
 return new Function(v+H.d(w)+"}")()},
@@ -1444,7 +1438,7 @@
 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)}},
-Kv:function(a,b){var z,y,x,w,v,u,t,s
+HfE:function(a,b){var z,y,x,w,v,u,t,s
 z=H.bO()
 y=$.P4
 if(y==null){y=H.Iq("receiver")
@@ -1462,29 +1456,30 @@
 t=$.OK
 $.OK=J.WB(t,1)
 return new Function(y+H.d(t)+"}")()},
-qmC:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
+qmC:function(a,b,c,d,e,f){b.fixed$length=Array
+c.fixed$length=Array
 return H.HA(a,b,c,!!d,e,f)},
 aE:function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gv(b))))},
 Go:function(a,b){var z
-if(a!=null)z=typeof a==="object"&&J.x(a)[b]
+if(a!=null)z=typeof a==="object"&&J.t(a)[b]
 else z=!0
 if(z)return a
 H.aE(a,b)},
 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.tu(z)
+if(b==null||b.length===0)return new H.Hsk(z)
 return new H.KEA(z,b,null)},
 G3:function(){return C.Kn},
-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
+Uh:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+Za:function(a){return init.getIsolateTag(a)},
+K:function(a){return new H.cu(a,null)},
+J: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.Y9(a["$as"+H.d(b)],H.oX(a))},
+IM:function(a,b){return H.Z9(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)
@@ -1492,30 +1487,30 @@
 Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
+else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.X(a)
 else return},
 ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
-else z.IN+=", "
+else z.Q+=", "
 v=a[y]
 if(v!=null)w=!1
 u=H.Ko(v,c)
-z.IN+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-wO:function(a){var z=J.x(a).constructor.builtin$cls
+z.Q+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+wO:function(a){var z=J.t(a).constructor.builtin$cls
 if(a==null)return z
 return z+H.ia(a.$builtinTypeInfo,0,null)},
-Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+Z9: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},
 RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
-y=J.x(a)
+y=J.t(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
+return H.hv(H.Z9(y[d],z),c)},
 hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
@@ -1526,7 +1521,7 @@
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
 z=H.oX(a)
-a=J.x(a)
+a=J.t(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
 return H.t1(y,b)},
@@ -1547,7 +1542,7 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},
+return H.hv(H.Z9(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
@@ -1562,7 +1557,7 @@
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
+z.fixed$length=Array
 y=z
 for(z=y.length,x=0;x<z;++x){w=y[x]
 if(!Object.hasOwnProperty.call(a,w))return!1
@@ -1594,9 +1589,9 @@
 ml:function(a,b,c){return a.apply(b,c)},
 U6j:function(a){var z=$.dZ
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-bl:function(a){return H.wP(a)},
-bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
-Am:function(a){var z,y,x,w,v,u
+wzi:function(a){return H.eQ(a)},
+iwd:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.dZ.$1(a)
 y=$.q4[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1622,15 +1617,13 @@
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
 return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.uM(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
+B1:function(a,b){var z=Object.getPrototypeOf(a)
+Object.defineProperty(z,init.dispatchPropertyName,{value:J.Qu(b,z,null,null),enumerable:false,writable:true,configurable:true})
 return b},
-Va:function(a){return J.uM(a,!1,null,!!a.$isXj)},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
 ow:function(a,b,c){var z=b.prototype
-if(init.leafTags[a]===true)return J.uM(z,!1,null,!!z.$isXj)
-else return J.uM(z,c,null,null)},
+if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
+else return J.Qu(z,c,null,null)},
 XD:function(){if(!0===$.Bv)return
 $.Bv=!0
 H.Z1()},
@@ -1667,71 +1660,71 @@
 $.x7=new H.rh(t)},
 ud:function(a,b){return a(b)||b},
 ZT:function(a,b,c){var z,y,x,w,v
-z=H.VM([],[P.Od])
+z=H.J([],[P.Od])
 y=b.length
 x=a.length
 for(;!0;){w=C.yo.XU(b,a,c)
 if(w===-1)break
-z.push(new H.tQ(w,b,a))
+z.push(new H.Vo(w,b,a))
 v=w+x
 if(v===y)break
 else c=w===v?c+1:v}return z},
-m2:function(a,b,c){var z,y
+m2:function(a,b,c){var z
 if(typeof b==="string")return C.yo.XU(a,b,c)!==-1
-else{z=J.x(b)
+else{z=J.t(b)
 if(!!z.$isVR){z=C.yo.yn(a,c)
-y=b.Yr
-return y.test(z)}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
-Gu:function(a,b,c){var z,y,x,w
+return b.a.test(H.Yx(z))}else return J.pO(z.dd(b,C.yo.yn(a,c)))}},
+AD:function(a,b,c){var z,y,x,w
+H.Yx(c)
 if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
-w=z.IN+=w
-z.IN=w+c}return z.IN}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+w=z.Q+=w
+z.Q=w+c}w=z.Q
+return w.charCodeAt(0)==0?w:w}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)},
-gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+gl0:function(a){return J.mG(this.gv(this),0)},
+gor:function(a){return!J.mG(this.gv(this),0)},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 K2:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.K2()},
+q:function(a,b,c){return this.K2()},
 Rz:function(a,b){return this.K2()},
 V1:function(a){return this.K2()},
 FV:function(a,b){return this.K2()},
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 LPe:{
-"^":"ysD;B>,M2,md",
+"^":"ysD;v:Q>,a,b",
 NZ:function(a,b){if(typeof b!=="string")return!1
 if("__proto__"===b)return!1
-return this.M2.hasOwnProperty(b)},
-t:function(a,b){if(!this.NZ(0,b))return
+return this.a.hasOwnProperty(b)},
+p:function(a,b){if(!this.NZ(0,b))return
 return this.Uf(b)},
-Uf:function(a){return this.M2[a]},
+Uf:function(a){return this.a[a]},
 aN:function(a,b){var z,y,x
-z=this.md
+z=this.b
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.Uf(x))}},
-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))},
+gvc:function(a){return H.J(new H.AV(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(this.b,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},
-Ns:{
-"^":"mW;Nt",
-gA:function(a){return J.mY(this.Nt.md)}},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.Uf(a)},"$1",null,2,0,null,81,"call"]},
+AV:{
+"^":"mW;Q",
+gu:function(a){return J.Nx(this.Q.b)}},
 LI:{
-"^":"a;r9,yl,Jt,TX,Y2,Ok",
-gWa:function(){return this.r9},
-gUA:function(){return this.Jt===0},
+"^":"a;Q,a,b,c,d,e",
+gWa:function(){return this.Q},
+gUA:function(){return this.b===0},
 gnd:function(){var z,y,x,w
-if(this.Jt===1)return C.xD
-z=this.TX
-y=z.length-this.Y2.length
+if(this.b===1)return C.xD
+z=this.c
+y=z.length-this.d.length
 if(y===0)return C.xD
 x=[]
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
@@ -1739,99 +1732,96 @@
 x.fixed$length=!0
 return x},
 gVm:function(){var z,y,x,w,v,u,t,s
-if(this.Jt!==0)return P.Fl(P.IN,null)
-z=this.Y2
+if(this.b!==0)return P.A(P.IN,null)
+z=this.d
 y=z.length
-x=this.TX
+x=this.c
 w=x.length-y
-if(y===0)return P.Fl(P.IN,null)
+if(y===0)return P.A(P.IN,null)
 v=P.L5(null,null,null,P.IN,null)
 for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
 t=z[u]
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
-v.u(0,new H.tx(t),x[s])}return v},
+v.q(0,new H.tx(t),x[s])}return v},
 static:{"^":"hAw,eHF,De4"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[a+this.hG+3]
+"^":"a;Q,Rn:a>,b,c,d,e,f,r",
+XL:function(a){var z=this.a[a+this.d+3]
 return init.metadata[z]},
-BX:function(a,b){var z=this.Rv
-if(typeof b!=="number")return b.C()
+BX:function(a,b){var z=this.c
+if(typeof b!=="number")return b.w()
 if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
+return this.a[3+b-z]},
+Fk:function(a){var z=this.c
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
+if(!this.e||this.d===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
+KE:function(a){var z=this.c
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.XL(a)
+if(!this.e||this.d===1)return this.XL(a)
 return this.XL(this.e4(a-z))},
 e4:function(a){var z,y,x,w,v,u
 z={}
-if(this.NE==null){y=this.hG
-this.NE=Array(y)
-x=P.Fl(P.qU,P.KN)
-for(w=this.Rv,v=0;v<y;++v){u=w+v
-x.u(0,this.XL(u),u)}z.a=0
+if(this.r==null){y=this.d
+this.r=Array(y)
+x=P.A(P.I,P.KN)
+for(w=this.c,v=0;v<y;++v){u=w+v
+x.q(0,this.XL(u),u)}z.a=0
 y=x.gvc(x).br(0)
+C.Nm.uy(y,"sort")
 H.ig(y,null)
-H.bQ(y,new H.V5(z,this,x))}z=this.NE
+C.Nm.aN(y,new H.V5(z,this,x))}z=this.r
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4A,FV,OcN,H6",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,Tj,H6",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
-z.fixed$length=init
+z.fixed$length=Array
 z=z
 y=z[0]
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 V5:{
-"^":"TpZ:3;a,b,c",
+"^":"r:5;Q,a,b",
 $1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
+z=this.a.r
+y=this.Q.a++
+x=this.b.p(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
+z[y]=x}},
 ww:{
-"^":"TpZ:76;a",
-$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return C.CD.yu(Math.floor(1000*this.Q.now()))}},
 Cj:{
-"^":"TpZ:82;a,b,c",
-$2:function(a,b){var z=this.a
+"^":"r:82;Q,a,b",
+$2:function(a,b){var z=this.Q
 z.b=z.b+"$"+H.d(a)
-this.c.push(a)
-this.b.push(b);++z.a},
-$isEH:true},
+this.b.push(a)
+this.a.push(b);++z.a}},
 u8:{
-"^":"TpZ:82;a,b",
-$2:function(a,b){var z=this.b
-if(z.NZ(0,a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
+"^":"r:82;Q,a",
+$2:function(a,b){var z=this.a
+if(z.NZ(0,a))z.q(0,a,b)
+else this.Q.a=!0}},
 Zr:{
-"^":"a;zj,TX,v7,Wb,Xr,lT",
+"^":"a;Q,a,b,c,d,e",
 qS:function(a){var z,y,x
-z=new RegExp(this.zj).exec(a)
+z=new RegExp(this.Q).exec(a)
 if(z==null)return
-y={}
-x=this.TX
+y=Object.create(null)
+x=this.a
 if(x!==-1)y.arguments=z[x+1]
-x=this.v7
+x=this.b
 if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Wb
+x=this.c
 if(x!==-1)y.expr=z[x+1]
-x=this.Xr
+x=this.d
 if(x!==-1)y.method=z[x+1]
-x=this.lT
+x=this.e
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,Ai",cM:function(a){var z,y,x,w,v,u
+static:{"^":"lm,xq,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=[]
@@ -1843,20 +1833,20 @@
 return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
 try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
 W0:{
-"^":"XS;yy,Xr",
-bu:[function(a){var z=this.Xr
-if(z==null)return"NullError: "+H.d(this.yy)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,73],
+"^":"XS;Q,a",
+X:[function(a){var z=this.a
+if(z==null)return"NullError: "+H.d(this.Q)
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gCR",0,0,0],
 $isJS:true,
 $isXS:true},
 u0:{
-"^":"XS;yy,Xr,lT",
-bu:[function(a){var z,y
-z=this.Xr
-if(z==null)return"NoSuchMethodError: "+H.d(this.yy)
-y=this.lT
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.yy)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.yy)+")"},"$0","gCR",0,0,73],
+"^":"XS;Q,a,b",
+X:[function(a){var z,y
+z=this.a
+if(z==null)return"NoSuchMethodError: "+H.d(this.Q)
+y=this.b
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.Q)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.Q)+")"},"$0","gCR",0,0,0],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1865,119 +1855,114 @@
 z=z?null:b.receiver
 return new H.u0(a,y,z)}}},
 vV:{
-"^":"XS;yy",
-bu:[function(a){var z=this.yy
-return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,73]},
-Hk:{
-"^":"TpZ:12;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-oP:{
-"^":"a;Np,j0",
-bu:[function(a){var z,y
-z=this.j0
+"^":"XS;Q",
+X:[function(a){var z=this.Q
+return C.yo.gl0(z)?"Error":"Error: "+z},"$0","gCR",0,0,0]},
+Am:{
+"^":"r:14;Q",
+$1:function(a){if(!!J.t(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.Q
+return a}},
+XO:{
+"^":"a;Q,a",
+X:[function(a){var z,y
+z=this.a
 if(z!=null)return z
-z=this.Np
+z=this.Q
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
-this.j0=z
-return z},"$0","gCR",0,0,73]},
+this.a=z
+return z},"$0","gCR",0,0,0]},
 TL:{
-"^":"TpZ:76;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return this.Q.$0()}},
 uZ:{
-"^":"TpZ:76;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
 OQ:{
-"^":"TpZ:76;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:function(){return this.Q.$2(this.a,this.b)}},
 Qx:{
-"^":"TpZ:76;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
+"^":"r:77;Q,a,b,c",
+$0:function(){return this.Q.$3(this.a,this.b,this.c)}},
 RM:{
-"^":"TpZ:76;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-TpZ:{
+"^":"r:77;Q,a,b,c,d",
+$0:function(){return this.Q.$4(this.a,this.b,this.c,this.d)}},
+r:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gCR",0,0,73],
+X:[function(a){return"Closure"},"$0","gCR",0,0,0],
+$isr:true,
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
-"^":"TpZ;"},
-v:{
-"^":"Bp;tx,J6,lT,JL",
-n:function(a,b){if(b==null)return!1
+"^":"r;"},
+q:{
+"^":"Bp;Q,a,b,c",
+m:function(a,b){if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.tx===b.tx&&this.J6===b.J6&&this.lT===b.lT},
+if(!J.t(b).$isq)return!1
+return this.Q===b.Q&&this.a===b.a&&this.b===b.b},
 giO:function(a){var z,y
-z=this.lT
-if(z==null)y=H.wP(this.tx)
-else y=typeof z!=="object"?J.v1(z):H.wP(z)
-return J.UN(y,H.wP(this.J6))},
-$isv:true,
-static:{"^":"mJs,P4",DVi:function(a){return a.tx},HY:function(a){return a.lT},bO:function(){var z=$.mJs
+z=this.b
+if(z==null)y=H.eQ(this.Q)
+else y=typeof z!=="object"?J.v1(z):H.eQ(z)
+return J.y5(y,H.eQ(this.a))},
+$isq:true,
+static:{"^":"bf,P4",DVi:function(a){return a.Q},HY:function(a){return a.b},bO:function(){var z=$.bf
 if(z==null){z=H.Iq("self")
-$.mJs=z}return z},Iq:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
+$.bf=z}return z},Iq:function(a){var z,y,x,w,v
+z=new H.q("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
+y.fixed$length=Array
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}}}},
 Pe:{
-"^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
 $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))}}},
-Eqv:{
-"^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{S3:function(a){return new H.Eqv(a)}}},
+bb:{
+"^":"XS;G1:Q>",
+X:[function(a){return"RuntimeError: "+H.d(this.Q)},"$0","gCR",0,0,0],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
-"^":"lbp;dw,Iq,is,vL",
+"^":"lbp;Q,a,b,c",
 Zg:function(a){var z=this.LC(a)
 return z==null?!1:H.J4(z,this.za())},
-LC:function(a){var z=J.x(a)
+LC:function(a){var z=J.t(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
 z={func:"dynafunc"}
-y=this.dw
-x=J.x(y)
+y=this.Q
+x=J.t(y)
 if(!!x.$isNG)z.void=true
 else if(!x.$isi6)z.ret=y.za()
-y=this.Iq
+y=this.a
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
+y=this.b
 if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.vL
-if(y!=null){w={}
+y=this.c
+if(y!=null){w=Object.create(null)
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
 w[t]=y[t].za()}z.named=w}return z},
-bu:[function(a){var z,y,x,w,v,u,t,s
-z=this.Iq
+X:[function(a){var z,y,x,w,v,u,t,s
+z=this.a
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
 x+=H.d(u)}else{x="("
-w=!1}z=this.is
+w=!1}z=this.b
 if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
 for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
 if(w)x+=", "
-x+=H.d(u)}x+="]"}else{z=this.vL
+x+=H.d(u)}x+="]"}else{z=this.c
 if(z!=null){x=(w?x+", ":x)+"{"
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gCR",0,0,73],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.Q))},"$0","gCR",0,0,0],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -1985,84 +1970,81 @@
 return z}}},
 i6:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gCR",0,0,73],
+X:[function(a){return"dynamic"},"$0","gCR",0,0,0],
 za:function(){return},
 $isi6:true},
-tu:{
-"^":"lbp;oc>",
+Hsk:{
+"^":"lbp;oc:Q>",
 za:function(){var z,y
-z=this.oc
+z=this.Q
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gCR",0,0,73]},
+X:[function(a){return this.Q},"$0","gCR",0,0,0]},
 KEA:{
-"^":"lbp;oc>,re,Et",
+"^":"lbp;oc:Q>,a,b",
 za:function(){var z,y
-z=this.Et
+z=this.b
 if(z!=null)return z
-z=this.oc
+z=this.Q
 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.Ff.za())
-this.Et=y
+for(z=this.a,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)y.push(z.c.za())
+this.b=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.ZG(this.re,", ")+">"},"$0","gCR",0,0,73]},
+X:[function(a){return H.d(this.Q)+"<"+J.ZG(this.a,", ")+">"},"$0","gCR",0,0,0]},
 cu:{
-"^":"a;VX,UX",
-bu:[function(a){var z,y
-z=this.UX
+"^":"a;Q,a",
+X:[function(a){var z,y
+z=this.a
 if(z!=null)return z
-y=this.VX.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.UX=y
-return y},"$0","gCR",0,0,73],
-giO:function(a){return J.v1(this.VX)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.VX,b.VX)},
+y=this.Q.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
+this.a=y
+return y},"$0","gCR",0,0,0],
+giO:function(a){return J.v1(this.Q)},
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$iscu&&J.mG(this.Q,b.Q)},
 $iscu:true,
-$isLz:true},
+$isUU:true},
 dC:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q(a)}},
 VX:{
-"^":"TpZ:83;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
+"^":"r:83;Q",
+$2:function(a,b){return this.Q(a,b)}},
 rh:{
-"^":"TpZ:3;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
+"^":"r:5;Q",
+$1:function(a){return this.Q(a)}},
 VR:{
-"^":"a;zO,Yr,HN,mV",
-gHc:function(){var z=this.HN
+"^":"a;Q,Yr:a<,b,c",
+X:[function(a){return"RegExp/"+this.Q+"/"},"$0","gCR",0,0,0],
+gHc:function(){var z=this.b
 if(z!=null)return z
-z=this.Yr
-z=H.v4(this.zO,z.multiline,!z.ignoreCase,!0)
-this.HN=z
+z=this.a
+z=H.Vq(this.Q,z.multiline,!z.ignoreCase,!0)
+this.b=z
 return z},
-gIa:function(){var z=this.mV
+gIa:function(){var z=this.c
 if(z!=null)return z
-z=this.Yr
-z=H.v4(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.mV=z
+z=this.a
+z=H.Vq(this.Q+"|()",z.multiline,!z.ignoreCase,!0)
+this.c=z
 return z},
-ik:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Yr.exec(a)
+ik:function(a){var z=this.a.exec(H.Yx(a))
 if(z==null)return
 return H.yx(this,z)},
-B0:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Yr.test(a)},
+zD:function(a){return this.a.test(H.Yx(a))},
 e5:function(a){var z,y
 z=this.ik(a)
-if(z!=null){y=z.pX
+if(z!=null){y=z.a
 if(0>=y.length)return H.e(y,0)
 return y[0]}return},
-dm:function(a,b,c){if(c>b.length)throw H.b(P.TE(c,0,b.length))
+ww:function(a,b,c){H.Yx(b)
+H.m1(c)
+if(c>b.length)throw H.b(P.ve(c,0,b.length,null,null))
 return new H.KW(this,b,c)},
-dd:function(a,b){return this.dm(a,b,0)},
+dd:function(a,b){return this.ww(a,b,0)},
 UZ:function(a,b){var z,y
 z=this.gHc()
 z.lastIndex=b
@@ -2078,191 +2060,200 @@
 w=x-1
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
-C.Nm.sB(y,w)
+C.Nm.sv(y,w)
 return H.yx(this,y)},
 wL:function(a,b,c){var z
-if(c>=0){z=J.q8(b)
-if(typeof z!=="number")return H.s(z)
+if(c>=0){z=J.wS(b)
+if(typeof z!=="number")return H.o(z)
 z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
+if(z)throw H.b(P.ve(c,0,J.wS(b),null,null))
 return this.Oj(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
 $iswL:true,
-static:{v4:function(a,b,c,d){var z,y,x,w,v
+static:{Vq:function(a,b,c,d){var z,y,x,w,v
+H.Yx(a)
 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.cD("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
+throw H.b(P.rr("Illegal RegExp pattern: "+a+", "+v,null,null))}}},
 EK:{
-"^":"a;zO,pX",
-t:function(a,b){var z=this.pX
+"^":"a;Q,a",
+gJ:function(a){return this.a.index},
+gwQ:function(){var z,y
+z=this.a
+y=z.index
+if(0>=z.length)return H.e(z,0)
+z=J.wS(z[0])
+if(typeof z!=="number")return H.o(z)
+return y+z},
+p:function(a,b){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-fw:function(a,b){},
+NE:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
-z.fw(a,b)
+z.NE(a,b)
 return z}}},
 KW:{
-"^":"mW;ve,BZ,wQ",
-gA:function(a){return new H.Pb(this.ve,this.BZ,this.wQ,null)},
+"^":"mW;Q,a,b",
+gu:function(a){return new H.Pb(this.Q,this.a,this.b,null)},
 $asmW:function(){return[P.Od]},
 $asQV:function(){return[P.Od]}},
 Pb:{
-"^":"a;UW,BZ,Ij,Jz",
-gl:function(){return this.Jz},
-G:function(){var z,y,x,w,v
-z=this.BZ
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w,v
+z=this.a
 if(z==null)return!1
-y=this.Ij
-if(y<=z.length){x=this.UW.UZ(z,y)
-if(x!=null){this.Jz=x
-z=x.pX
+y=this.b
+if(y<=z.length){x=this.Q.UZ(z,y)
+if(x!=null){this.c=x
+z=x.a
 y=z.index
 if(0>=z.length)return H.e(z,0)
-w=J.q8(z[0])
-if(typeof w!=="number")return H.s(w)
+w=J.wS(z[0])
+if(typeof w!=="number")return H.o(w)
 v=y+w
-this.Ij=z.index===v?v+1:v
-return!0}}this.Jz=null
-this.BZ=null
+this.b=z.index===v?v+1:v
+return!0}}this.c=null
+this.a=null
 return!1}},
-tQ:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
+Vo:{
+"^":"a;J:Q>,a,b",
+gwQ:function(){return this.Q+this.b.length},
+p:function(a,b){if(!J.mG(b,0))H.vh(P.D(b,null,null))
+return this.b},
 $isOd:true}}],["","",,X,{
 "^":"",
 hV:{
-"^":"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},
+"^":"LPc;LD,kX,RZ,ij,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gO9:function(a){return a.LD},
+sO9:function(a,b){a.LD=this.ct(a,C.S4,a.LD,b)},
+gFR:function(a){return a.kX},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-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.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
+sFR:function(a,b){a.kX=this.ct(a,C.U,a.kX,b)},
+gph:function(a){return a.RZ},
+sph:function(a,b){a.RZ=this.ct(a,C.hf,a.RZ,b)},
+gih:function(a){return a.ij},
+sih:function(a,b){a.ij=this.ct(a,C.mJ,a.ij,b)},
+pp:[function(a,b,c,d){var z=a.LD
 if(z===!0)return
-if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
-this.LY(a,null).wM(new X.jE(a))}},"$3","gYi",6,0,84,49,50,85],
+if(a.kX!=null){a.LD=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.IB(a))}},"$3","gNa",6,0,84,52,55,85],
 static:{zy: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.IF=!1
-a.Qw=null
-a.cw="action"
-a.oX=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX=null
+a.RZ="action"
+a.ij=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Gx.LX(a)
 C.Gx.XI(a)
 return a}}},
 LPc:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true},
-jE:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-z.IF=J.NB(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["","",,G,{
+IB:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+z.LD=J.Q5(z,C.S4,z.LD,!1)},"$0",null,0,0,null,"call"]}}],["","",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Xw(),"google"),"visualization")
+z=J.Tf(J.Tf($.Xw(),"google"),"visualization")
 $.NR=z
-return z},"$1","vN",2,0,12,13],
-DUC:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,14,15],
+WY:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
-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)+"%"},
+return C.xr.kV(z)},
+QX:function(a){if(a==null)return P.Xo(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.x4(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)},
-avE:[function(a){var z,y,x
+le:[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)
+if(z.w(a,1000))return z.X(a)
+y=z.V(a,1000)
+a=z.W(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","OA",2,0,14],
+for(;z=J.Wx(a),z.A(a,1000);){x=G.o1(z.V(a,1000),3)+","+x
+a=z.W(a,1000)}return!z.m(a,0)?H.d(a)+","+x:x},"$1","nI",2,0,16],
 J8:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.RE(a*1000))
 y=C.jn.BU(z,3600000)
-z=C.jn.Y(z,3600000)
+z=C.jn.V(z,3600000)
 x=C.jn.BU(z,60000)
-z=C.jn.Y(z,60000)
+z=C.jn.V(z,60000)
 w=C.jn.BU(z,1000)
-z=C.jn.Y(z,1000)
+z=C.jn.V(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)},
-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","AFV",2,0,14,15],
+O3:[function(a){var z=J.Wx(a)
+if(z.w(a,1024))return H.d(a)+"B"
+else if(z.w(a,1048576))return C.CD.Sy(z.S(a,1024),1)+"KB"
+else if(z.w(a,1073741824))return C.CD.Sy(z.S(a,1048576),1)+"MB"
+else if(z.w(a,1099511627776))return C.CD.Sy(z.S(a,1073741824),1)+"GB"
+else return C.CD.Sy(z.S(a,1099511627776),1)+"TB"},"$1","nQ",2,0,16,17],
 M5:function(a){var z,y,x,w
 if(a==null)return"-"
-z=J.Dv(J.vX(a,1000))
+z=J.NQ(J.lX(a,1000))
 y=C.jn.BU(z,3600000)
-z=C.jn.Y(z,3600000)
+z=C.jn.V(z,3600000)
 x=C.jn.BU(z,60000)
-w=C.jn.BU(C.jn.Y(z,60000),1000)
+w=C.jn.BU(C.jn.V(z,60000),1000)
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
 return""+w+"s"},
 mL:{
-"^":"Pi;wc,fN,Z6,Nv,m2<,bn,HJ,n4,cC,Vg,fn",
-gwv:function(a){return this.Nv},
+"^":"Piz;Q,a,b,c,m2:d<,e,f,r,x,cy$,db$",
+gwv:function(a){return this.c},
 swv:function(a,b){var z,y
-if(J.xC(this.Nv,b))return
-if(this.Nv!=null){J.U2(this.cC)
-J.of(this.Nv)}if(b!=null){N.QM("").To("Registering new VM callbacks")
-b.gEH().ml(this.gAQ())
+if(J.mG(this.c,b))return
+if(this.c!=null){J.U2(this.x)
+J.tw(this.c)}if(b!=null){N.QM("").To("Registering new VM callbacks")
+b.ghX().ml(this.gEX())
 z=J.RE(b)
 z.giG(b).ml(this.gm6())
 y=b.gG2()
-H.VM(new P.Ln(y),[H.u3(y,0)]).yI(this.gtb())
-J.Sr(z.gRk(b)).yI(this.gR7())
-z=b.gLi()
-H.VM(new P.Ln(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)},
-KO:function(a){var z,y
-$.Kh=this
-z=this.wc
-z.push(new G.t9(this,null,null,null,null))
-z.push(new G.eq(this,null,null,null,null))
+H.J(new P.rk(y),[H.u3(y,0)]).yI(this.glQ())
+J.HL(z.gRk(b)).yI(this.gPF())
+z=b.gXs()
+H.J(new P.rk(z),[H.u3(z,0)]).yI(this.geO())}this.c=b},
+gvK:function(){return this.x},
+svK:function(a){this.x=F.Wi(this,C.c6,this.x,a)},
+qB:function(a){var z,y
+$.Pi=this
+z=this.Q
+z.push(new G.iJ(this,null,null,null,null))
+z.push(new G.AX(this,null,null,null,null))
 z.push(new G.ki(this,null,null,null,null))
-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.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.push(new G.lO(this,null,null,null,null))
+z.push(G.xR(this))
+z.push(new G.lS(this,null,null,null,null))
+z=this.b
+z.a=this
+y=H.J(new W.vG(window,"popstate",!1),[null])
+H.J(new W.Ov(0,y.Q,y.a,W.Yt(z.gTk()),y.b),[H.u3(y,0)]).P6()
 z.VA()},
-pZ:function(a){J.Ei(this.cC,new G.xE(a,new G.cE()))},
+pZ:function(a){J.OP(this.x,new G.xE(a,new G.cE()))},
 rG:[function(a){var z=J.RE(a)
 switch(z.gfG(a)){case"IsolateCreated":break
 case"IsolateShutdown":this.pZ(z.god(a))
@@ -2270,2931 +2261,2339 @@
 case"BreakpointResolved":z.god(a).Xb()
 break
 case"BreakpointReached":case"IsolateInterrupted":case"ExceptionThrown":this.pZ(z.god(a))
-J.bi(this.cC,a)
+J.dH(this.x,a)
 break
 case"GC":break
-default:N.QM("").hh("Unrecognized event: "+H.d(a))
-break}},"$1","gR7",2,0,86,87],
-kj:[function(a){this.n4=a
-this.aX("error/",null)},"$1","gtb",2,0,88,23],
-m0:[function(a){this.n4=a
-if(J.xC(J.Iz(a),"NetworkException")){this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")}else this.aX("error/",null)},"$1","geO",2,0,89,90],
+default:N.QM("").YX("Unrecognized event: "+H.d(a))
+break}},"$1","gPF",2,0,86,87],
+Iu:[function(a){this.r=a
+this.aX("error/",null)},"$1","glQ",2,0,88,24],
+m0:[function(a){this.r=a
+if(J.mG(J.Iz(a),"NetworkException")){this.swv(0,null)
+this.b.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.Ms(b,C.xM)
+z=b==null?P.A(null,null):P.WX(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($.ax==null)$.ax=Z.JQ()}else if(y.n(x,"off")){y=$.ax
-if(y!=null){y.RV.Gv()
-$.ax=null}}}y=$.ax
-if(y!=null){y.NP.CH(0)
-J.U2(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(y.p(z,"trace")!=null){x=y.p(z,"trace")
+y=J.t(x)
+if(y.m(x,"on")){if($.hm==null)$.hm=Z.JQ()}else if(y.m(x,"off")){y=$.hm
+if(y!=null){y.Q.Gv()
+$.hm=null}}}y=$.hm
+if(y!=null){y.a.CH(0)
+J.U2(y.b)}y=this.f
+if(y!=null)J.La(y,$.hm)
+for(y=this.Q,w=0;w<y.length;++w){v=y[w]
 if(v.VU(a)){this.yN(v)
 y=R.tB(z)
-u=v.fz
-if(v.gnz(v)&&!J.xC(u,y)){u=new T.qI(v,C.Zg,u,y)
+u=v.b
+if(v.gnz(v)&&!J.mG(u,y)){u=new T.qI(v,C.Z,u,y)
 u.$builtinTypeInfo=[null]
-v.nq(v,u)}v.fz=y
+v.SZ(v,u)}v.b=y
 v.Q0(a)
 return}}throw H.b(P.a9())},
 yN:function(a){var z,y,x,w
-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.ak()}catch(y){x=H.Ru(y)
+if(J.mG(this.a,a))return
+if(this.a!=null){N.QM("").To("Uninstalling page: "+H.d(this.a))
+this.a.oV()
+J.Ul(this.e)}N.QM("").To("Installing page: "+H.d(a))
+try{a.zw()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").hh("Failed to install page: "+H.d(z))}x=this.bn
-x.appendChild(a.gyF())
+N.QM("").YX("Failed to install page: "+H.d(z))}x=this.e
+x.appendChild(a.gaG())
 w=W.r3("trace-view",null)
-this.HJ=w
-J.La(w,$.ax)
-x.appendChild(this.HJ)
+this.f=w
+J.La(w,$.hm)
+x.appendChild(this.f)
 x=a
-w=this.fN
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
+w=this.a
+if(this.gnz(this)&&!J.mG(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
-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","gAQ",2,0,91,92],
-H5:[function(a){var z,y
-if(!J.xC(this.Nv,a))return
+this.SZ(this,w)}this.a=x},
+vW:function(){J.OP(this.x,new G.z5())},
+rY:[function(a){if(!!J.t(a).$isKM)this.d.h(0,a.k2)
+this.vW()},"$1","gEX",2,0,91,92],
+T0:[function(a){var z,y
+if(!J.mG(this.c,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.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.nm),P.L5(null,null,null,P.qU,L.nm),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=this.x
+y=new D.Mk(null,null,null,null,null,null,null,null,null,null,null,!1,null,null,null,null,null)
+y.x=F.Wi(y,C.qR,null,"VMDisconnected")
+J.dH(z,y)},"$1","gm6",2,0,91,92],
+Ty:function(a){var z=this.d.b
+z=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),z,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 this.swv(0,z)
-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)
+this.qB(!1)},
+E0:function(a){var z=new U.dS(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),P.L5(null,null,null,P.I,P.A5),0,"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,D.bv),null,null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.ZH()
 this.swv(0,z)
-this.KO(!0)},
-static:{"^":"Kh<"}},
+this.qB(!0)},
+static:{"^":"Pi<"}},
 cE:{
-"^":"TpZ:93;",
+"^":"r:93;",
 $1:function(a){var z=J.RE(a)
-return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
-$isEH:true},
+return J.mG(z.gfG(a),"IsolateInterrupted")||J.mG(z.gfG(a),"BreakpointReached")||J.mG(z.gfG(a),"ExceptionThrown")}},
 xE:{
-"^":"TpZ:12;a,b",
-$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},
+"^":"r:14;Q,a",
+$1:[function(a){return J.mG(J.wg(a),this.Q)&&this.a.$1(a)===!0},"$1",null,2,0,null,94,"call"]},
 z5:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xC(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mG(J.Ts(a),"VMDisconnected")},"$1",null,2,0,null,94,"call"]},
 Kf:{
-"^":"a;Yb",
-goH:function(a){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")])},
-Id:function(a,b){var z=[]
+"^":"a;Q",
+goH:function(a){return this.Q.nQ("getNumberOfColumns")},
+gzU:function(a){return this.Q.nQ("getNumberOfRows")},
+Ai:function(){var z=this.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])},
+QS: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])])}},
-yD:{
-"^":"a;vR,bG",
-Am:function(a,b){var z=P.jT(this.bG)
-this.vR.V7("draw",[b.Yb,z])}},
+this.Q.Z("addRow",[H.J(new P.GD(z),[null])])}},
+qu:{
+"^":"a;Q,a",
+Am:function(a,b){var z=P.jT(this.a)
+this.Q.Z("draw",[b.Q,z])}},
 yVe:{
 "^":"d3;",
 bo:function(a,b){var z
-if(b!==this.wa("/vm-connect/")&&this.By.Nv==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
-b=this.wa("/vm-connect/")}z=this.BE
+if(b!==this.wa("/vm-connect/")&&this.a.c==null){if(window.confirm("Connection with VM has been lost. Proceeding will lose current page.")!==!0)return
+b=this.wa("/vm-connect/")}z=this.b
 if(z==null?b!=null:z!==b){N.QM("").To("Navigated to "+H.d(b))
 window.history.pushState(b,document.title,b)
-this.BE=b}this.UJ(b)},
+this.b=b}this.UJ(b)},
 UJ:function(a){var z,y,x
-if(J.Qe(a).nC(a,"#"))a=C.yo.yn(a,1)
+if(J.NH(a).nC(a,"#"))a=C.yo.yn(a,1)
 if(C.yo.nC(a,"/"))a=C.yo.yn(a,1)
 if(C.yo.tg(a,"---")){z=a.split("---")
 y=z.length
 if(0>=y)return H.e(z,0)
 a=z[0]
-if(y>1&&!J.xC(z[1],"")){if(1>=z.length)return H.e(z,1)
+if(y>1&&!J.mG(z[1],"")){if(1>=z.length)return H.e(z,1)
 x=z[1]}else x=null}else x=null
-this.By.aX(a,x)},
+this.a.aX(a,x)},
 Cz:function(a,b,c){var z,y,x
-z=J.Vs(c).dA.getAttribute("href")
+z=J.Vs(c).Q.getAttribute("href")
 y=J.RE(a)
-x=y.gEV(a)
-if(typeof x!=="number")return x.D()
-if(x>0||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gYK(a)===!0)return
+x=y.gpL(a)
+if(typeof x!=="number")return x.A()
+if(x>0||y.gNl(a)===!0||y.gAE(a)===!0||y.gqx(a)===!0||y.gw4(a)===!0)return
 this.bo(0,z)
 y.e6(a)}},
-ng:{
-"^":"yVe;Zz,By,BE,ro,XY,cU",
+OR:{
+"^":"yVe;Q,a,b,dx$,dy$,fr$",
 VA:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.Zz
+if(window.location.hash===""||window.location.hash==="#")z="#"+this.Q
 window.history.pushState(z,document.title,z)
 this.UJ(window.location.hash)},
-fH:[function(a){this.UJ(window.location.hash)},"$1","gnt",2,0,95,13],
+Sk:[function(a){this.UJ(window.location.hash)},"$1","gTk",2,0,95,15],
 wa:function(a){return"#"+H.d(a)}},
-Tj:{
-"^":"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)},
-$isTj:true},
-by:{
-"^":"Tj;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.mo(this)).OA(new G.Go5())},
+MQ:{
+"^":"Piz;iJ:Q>,aG:a<",
+gFL:function(a){return this.a},
+sFL:function(a,b){this.a=F.Wi(this,C.GP,this.a,b)},
+gl6:function(a){return this.b},
+sl6:function(a,b){this.b=F.Wi(this,C.Z,this.b,b)},
+oV:function(){this.a=F.Wi(this,C.GP,this.a,null)},
+$isMQ:true},
+lS:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("service-view",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
+Q0:function(a){if(J.mG(a,""))return
+this.Q.c.cv(a).ml(new G.GL(this)).OA(new G.mo())},
 VU:function(a){return!0}},
+GL:{
+"^":"r:14;Q",
+$1:[function(a){J.h9(this.Q.a,a)},"$1",null,2,0,null,96,"call"]},
 mo:{
-"^":"TpZ:12;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-Go5:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-t9:{
-"^":"Tj;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)}},
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+iJ:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("class-tree",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){a=J.ZZ(a,11)
-this.i6.Nv.cv(a).ml(new G.Hb(this)).OA(new G.ZaW())},
+this.Q.c.cv(a).ml(new G.Ms(this)).OA(new G.Bl())},
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
-Hb:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
-ZaW:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-eq:{
-"^":"Tj;i6,yF,fz,Vg,fn",
-ak:function(){if(this.yF==null){var z=W.r3("debugger-page",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
+Ms:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.a
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,8,"call"]},
+Bl:{
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+AX:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("debugger-page",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){a=J.ZZ(a,9)
-this.i6.Nv.cv(a).ml(new G.B3(this)).OA(new G.lL())},
+this.Q.c.cv(a).ml(new G.Hz(this)).OA(new G.lL())},
 VU:function(a){return J.co(a,"debugger/")},
-static:{"^":"MR"}},
-B3:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.Rp(z,a)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
+static:{"^":"MRr"}},
+Hz:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.a
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,8,"call"]},
 lL:{
-"^":"TpZ:12;",
-$1:[function(a){N.QM("").hh("Unexpected debugger error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-Sy:{
-"^":"Tj;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)}},
+"^":"r:14;",
+$1:[function(a){N.QM("").YX("Unexpected debugger error: "+H.d(a))},"$1",null,2,0,null,4,"call"]},
+lO:{
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("service-view",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.i6.n4
-z.Ll=J.NB(z,C.td,z.Ll,y)},
+z=H.Go(this.a,"$isTi")
+y=this.Q.r
+z.RZ=J.Q5(z,C.td,z.RZ,y)},
 VU:function(a){return J.co(a,"error/")}},
 ki:{
-"^":"Tj;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)}},
+"^":"MQ;Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("vm-connect",null)
+this.a=F.Wi(this,C.GP,this.a,z)}},
 Q0:function(a){},
 VU:function(a){return J.co(a,"vm-connect/")}},
 JM:{
-"^":"Tj;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
+"^":"MQ;cX:c@,d,Q,a,b,cy$,db$",
+zw:function(){if(this.a==null){var z=W.r3("metrics-page",null)
+z=F.Wi(this,C.GP,this.a,z)
+this.a=z
 H.Go(z,"$isqn")
-z.GC=J.NB(z,C.EP,z.GC,this)}},
-ZW:function(a,b){var z
+z.RZ=J.Q5(z,C.EP,z.RZ,this)}},
+TG:function(a,b){var z
 if(b.gmw()!=null){if(J.cj(b.gmw()).gVs()===a)return
-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.gJb().push(b)
+C.Nm.Rz(b.gmw().gfj(),b)
+b.smw(null)}if(J.mG(a,0))return
+z=this.d.p(0,a)
+if(z!=null){z.gfj().push(b)
 b.smw(z)
 return}throw H.b(P.a9())},
 Q0:function(a){var z,y,x
-z=this.i6.Nv
-y=$.clJ().e5(a)
+z=this.Q.c
+y=$.AG().e5(a)
 x=J.U6(y)
-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)},
+z.cv(x.Nj(y,0,J.D5(x.gv(y),1))).ml(new G.VP(this))},
+VU:function(a){return $.NP().a.test(H.Yx(a))},
 LS:function(a){var z,y,x,w,v
-for(z=this.K3,y=0;x=$.c3(),y<5;++y){x=x[y]
+for(z=this.d,y=0;x=$.yO(),y<5;++y){x=x[y]
 w=[]
 w.$builtinTypeInfo=[D.YX]
 v=new P.a6(x*1000)
-w=new D.W1(w,v,null)
-w.Cb=P.SZ(v,w.gia(w))
-z.u(0,x,w)}},
-static:{"^":"lZ,HH,Bw",Gi:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.W1),a,null,null,null,null)
+w=new D.xx(w,v,null)
+w.b=P.SZ(v,w.gia(w))
+z.q(0,x,w)}},
+static:{"^":"lZ,M2,Bw",xR:function(a){var z=new G.JM(null,P.L5(null,null,null,P.KN,D.xx),a,null,null,null,null)
 z.LS(a)
 return z}}},
-YhF:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=H.Go(this.a.yF,"$isqn")
-z.OM=J.NB(z,C.rB,z.OM,a)},"$1",null,2,0,null,97,"call"],
-$isEH:true},
+VP:{
+"^":"r:14;Q",
+$1:[function(a){var z=H.Go(this.Q.a,"$isqn")
+z.ij=J.Q5(z,C.rB,z.ij,a)},"$1",null,2,0,null,97,"call"]},
 V3:{
-"^":"a;IU",
-cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
+"^":"a;Q",
+cv:function(a){return G.WY(this.Q+"."+H.d(a))}},
 KF:{
-"^":"TpZ:3;",
+"^":"r:5;",
 $1:[function(a){var z,y,x,w
-z=C.xr.iQ(a)
+z=C.xr.kV(a)
 if(z==null)return z
 y=J.U6(z)
 x=0
-while(!0){w=y.gB(z)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(z)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-y.u(z,x,L.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,98,"call"],
-$isEH:true},
+y.q(z,x,L.K9(y.p(z,x)));++x}return z},"$1",null,2,0,null,98,"call"]},
 XN:{
-"^":"TpZ:12;",
-$1:[function(a){},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-nD:{
-"^":"d3;wo,bq>,TY,ro,XY,cU",
+"^":"r:14;",
+$1:[function(a){},"$1",null,2,0,null,4,"call"]},
+uh:{
+"^":"d3;Q,bq:a>,b,dx$,dy$,fr$",
 k6:function(){return"ws://"+H.d(window.location.host)+"/ws"},
-TP:function(a){var z=this.Xk(a)
+J8:function(a){var z=this.Xk(a)
 if(z!=null)return z
 z=new L.Z5(0,!1,null,a)
-z.oc=a
+z.b=a
 return z},
 Xk:function(a){var z,y
 z={}
 z.a=null
-y=this.bq
+y=this.a
 y.aN(y,new G.pJO(z,a))
 return z.a},
 h:function(a,b){var z,y
 if(b.gA9()===!0)return
-z=this.bq
+z=this.a
 if(z.tg(z,b))return
 z.h(0,b)
 this.TV()
 this.TV()
-y=this.wo.IU+".history"
+y=this.Q.Q+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
 Rz:function(a,b){var z,y
-z=this.bq
+z=this.a
 z.Rz(0,b)
 this.TV()
 this.TV()
-y=this.wo.IU+".history"
+y=this.Q.Q+".history"
 $.Vy().setItem(y,C.xr.KP(z))},
-TV:function(){var z=this.bq
+TV:function(){var z=this.a
 z.GT(z,new G.jQ())},
 A7:function(){var z,y,x,w,v
-z=this.bq
+z=this.a
 z.V1(z)
-y=G.DUC(this.wo.IU+".history")
+y=G.WY(this.Q.Q+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
-while(!0){v=x.gB(y)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=x.gv(y)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-x.u(y,w,L.K9(x.t(y,w)));++w}z.FV(0,y)
+x.q(y,w,L.K9(x.p(y,w)));++w}z.FV(0,y)
 this.TV()},
-lK:function(){this.A7()
-var z=this.TP(this.k6())
-this.TY=z
+vs:function(){this.A7()
+var z=this.J8(this.k6())
+this.b=z
 this.h(0,z)},
 static:{"^":"lGN"}},
 pJO:{
-"^":"TpZ:12;a,b",
-$1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
-$isEH:true},
+"^":"r:14;Q,a",
+$1:function(a){if(J.mG(a.gw8(),this.a)&&J.mG(a.gA9(),!1))this.Q.a=a}},
 jQ:{
-"^":"TpZ:99;",
-$2:function(a,b){return J.FW(b.geX(),a.geX())},
-$isEH:true},
+"^":"r:99;",
+$2:function(a,b){return J.FW(b.gEH(),a.gEH())}},
 Y2:{
-"^":"Pi;eT>,yt<,ks>,oH>",
-gyX:function(a){return this.PU},
-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.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;")},
+"^":"Piz;eT:Q>,yt:a<,wd:b>,oH:c>",
+gyX:function(a){return this.d},
+gty:function(){return this.e},
+goE:function(a){return this.f},
+soE:function(a,b){var z=J.mG(this.f,b)
+this.f=b
+if(!z){z=this.d
+if(b===!0){this.d=F.Wi(this,C.Ek,z,"\u21b3")
+this.Pz()}else{this.d=F.Wi(this,C.Ek,z,"\u2192")
+this.aY()}}},
+r8:function(){this.soE(0,this.f!==!0)
+return this.f},
+k7:function(a){if(!this.Nh())this.e=F.Wi(this,C.Pn,this.e,"visibility:hidden;")},
 $isY2:true},
-ih:{
-"^":"Pi;vp>,Vg,fn",
-G7:function(a){var z,y
-z=this.vp
+iY:{
+"^":"Piz;zU:Q>,cy$,db$",
+rT:function(a){var z,y
+z=this.Q
 y=J.w1(z)
 y.V1(z)
-a.Pz(0)
-y.FV(z,a.ks)},
+a.Pz()
+y.FV(z,a.b)},
 lo:function(a){var z,y,x
-z=this.vp
+z=this.Q
 y=J.U6(z)
-x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.Mx(x))
+x=y.p(z,a)
+if(x.r8()===!0)y.UG(z,y.OY(z,x)+1,J.OD(x))
 else this.nm(x)},
 nm:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gks(a))
+y=J.wS(z.gwd(a))
 if(y===0)return
-for(x=0;x<y;++x)if(J.IL(J.UQ(z.gks(a),x))===!0)this.nm(J.UQ(z.gks(a),x))
+for(x=0;x<y;++x)if(J.IL(J.Tf(z.gwd(a),x))===!0)this.nm(J.Tf(z.gwd(a),x))
 z.soE(a,!1)
-z=this.vp
+z=this.Q
 w=J.U6(z)
 v=w.OY(z,a)+1
 w.oq(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,xy<",
-static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,16]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
+Ktd:{
+"^":"a;ph:Q>,xy:a<",
+static:{hg:[function(a){return a!=null?J.Lz(a):"<null>"},"$1","J1",2,0,18]}},
+E8:{
+"^":"a;UQ:Q>",
+$isE8:true},
 Vz:{
-"^":"Pi;oH>,vp>,zz<",
-sxp:function(a){this.pT=a
+"^":"Piz;oH:Q>,zU:a>,GD:b<",
+sxp:function(a){this.c=a
 F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.Rj},
-sT3:function(a){this.Rj=a
+gxp:function(){return this.c},
+gT3:function(){return this.d},
+sT3:function(a){this.d=a
 F.Wi(this,C.JB,0,1)},
-Ey:function(a,b){var z=this.vp
+wA:["k5",function(a,b){var z=this.a
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.hI(z[a]),b)},
-ca:[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],
+return J.Tf(J.U8(z[a]),b)}],
+oa:[function(a,b){var z=this.wA(a,this.c)
+return J.FW(this.wA(b,this.c),z)},"$2","gMG",4,0,100],
+iJ8:[function(a,b){return J.FW(this.wA(a,this.c),this.wA(b,this.c))},"$2","gfL",4,0,100],
 Jd:function(a){var z,y
-H.Xe()
+H.w4()
 $.Ji=$.xG
-new P.VV(null,null).D5(0)
-z=this.zz
-if(this.Rj){y=this.gMG()
+new P.VV(null,null).wE(0)
+z=this.b
+if(this.d){y=this.gMG()
+C.Nm.uy(z,"sort")
 H.ig(z,y)}else{y=this.gfL()
+C.Nm.uy(z,"sort")
 H.ig(z,y)}},
-Ai:function(){C.Nm.sB(this.vp,0)
-C.Nm.sB(this.zz,0)},
-Id:function(a,b){var z=this.vp
-this.zz.push(z.length)
+Ai:function(){C.Nm.sv(this.a,0)
+C.Nm.sv(this.b,0)},
+QS:function(a,b){var z=this.a
+this.b.push(z.length)
 z.push(b)},
 Gu:function(a,b){var z,y
-z=this.vp
+z=this.a
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.hI(z[a]),b)
-z=this.oH
+y=J.Tf(J.U8(z[a]),b)
+z=this.Q
 if(b>=z.length)return H.e(z,b)
 return z[b].gxy().$1(y)},
-ra:[function(a){var z
-if(!J.xC(a,this.pT)){z=this.oH
+YU:[function(a){var z
+if(!J.mG(a,this.c)){z=this.Q
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.WB(J.Yq(z[a]),"\u2003")}z=this.oH
+return J.WB(J.ZC(z[a]),"\u2003")}z=this.Q
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Yq(z[a])
-return J.WB(z,this.Rj?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,101]}}],["","",,E,{
+z=J.ZC(z[a])
+return J.WB(z,this.d?"\u25bc":"\u25b2")},"$1","gCO",2,0,16,101]}}],["","",,E,{
 "^":"",
-Jz:[function(){var z,y,x
-z=P.EF([C.aP,new E.em(),C.NK,new E.Lb(),C.IH,new E.QA(),C.cg,new E.Cv(),C.j2,new E.ed(),C.Zg,new E.wa(),C.Wq,new E.Or(),C.ET,new E.YL(),C.BE,new E.wf(),C.WC,new E.Oa(),C.hR,new E.emv(),C.S4,new E.Lbd(),C.Ro,new E.QAa(),C.hN,new E.CvS(),C.AV,new E.edy(),C.bV,new E.waE(),C.C0,new E.Ore(),C.eZ,new E.YLa(),C.bk,new E.wfa(),C.lH,new E.Oaa(),C.am,new E.e0(),C.oE,new E.e1(),C.kG,new E.e2(),C.OI,new E.e3(),C.Wt,new E.e4(),C.I9,new E.e5(),C.To,new E.e6(),C.mM,new E.e7(),C.aw,new E.e8(),C.XA,new E.e9(),C.i4,new E.e10(),C.mJ,new E.e11(),C.qt,new E.e12(),C.p1,new E.e13(),C.yJ,new E.e14(),C.la,new E.e15(),C.yL,new E.e16(),C.nr,new E.e17(),C.bJ,new E.e18(),C.ox,new E.e19(),C.Je,new E.e20(),C.kI,new E.e21(),C.vY,new E.e22(),C.Rs,new E.e23(),C.hJ,new E.e24(),C.yC,new E.e25(),C.Lw,new E.e26(),C.eR,new E.e27(),C.LS,new E.e28(),C.iE,new E.e29(),C.f4,new E.e30(),C.VK,new E.e31(),C.aH,new E.e32(),C.aK,new E.e33(),C.GP,new E.e34(),C.mw,new E.e35(),C.vs,new E.e36(),C.Gr,new E.e37(),C.TU,new E.e38(),C.Fe,new E.e39(),C.tP,new E.e40(),C.yh,new E.e41(),C.Zb,new E.e42(),C.u7,new E.e43(),C.p8,new E.e44(),C.qR,new E.e45(),C.ld,new E.e46(),C.ne,new E.e47(),C.B0,new E.e48(),C.r1,new E.e49(),C.mr,new E.e50(),C.Ek,new E.e51(),C.Pn,new E.e52(),C.YT,new E.e53(),C.h7,new E.e54(),C.R3,new E.e55(),C.cJ,new E.e56(),C.WQ,new E.e57(),C.fV,new E.e58(),C.jU,new E.e59(),C.OO,new E.e60(),C.Mc,new E.e61(),C.FP,new E.e62(),C.kF,new E.e63(),C.UD,new E.e64(),C.Aq,new E.e65(),C.DS,new E.e66(),C.C9,new E.e67(),C.VF,new E.e68(),C.uU,new E.e69(),C.YJ,new E.e70(),C.eF,new E.e71(),C.oI,new E.e72(),C.ST,new E.e73(),C.QH,new E.e74(),C.qX,new E.e75(),C.rE,new E.e76(),C.nf,new E.e77(),C.EI,new E.e78(),C.JB,new E.e79(),C.RY,new E.e80(),C.d4,new E.e81(),C.cF,new E.e82(),C.ft,new E.e83(),C.dr,new E.e84(),C.SI,new E.e85(),C.zS,new E.e86(),C.YA,new E.e87(),C.Ge,new E.e88(),C.A7,new E.e89(),C.He,new E.e90(),C.im,new E.e91(),C.Ss,new E.e92(),C.k6,new E.e93(),C.oj,new E.e94(),C.PJ,new E.e95(),C.Yb,new E.e96(),C.q2,new E.e97(),C.d2,new E.e98(),C.kN,new E.e99(),C.uO,new E.e100(),C.fn,new E.e101(),C.yB,new E.e102(),C.eJ,new E.e103(),C.iG,new E.e104(),C.Py,new E.e105(),C.pC,new E.e106(),C.uu,new E.e107(),C.qs,new E.e108(),C.XH,new E.e109(),C.XJ,new E.e110(),C.tJ,new E.e111(),C.F8,new E.e112(),C.fy,new E.e113(),C.C1,new E.e114(),C.Nr,new E.e115(),C.nL,new E.e116(),C.a0,new E.e117(),C.Yg,new E.e118(),C.bR,new E.e119(),C.ai,new E.e120(),C.ob,new E.e121(),C.dR,new E.e122(),C.MY,new E.e123(),C.Wg,new E.e124(),C.tD,new E.e125(),C.QS,new E.e126(),C.C7,new E.e127(),C.nZ,new E.e128(),C.Of,new E.e129(),C.Vl,new E.e130(),C.pY,new E.e131(),C.XL,new E.e132(),C.LA,new E.e133(),C.Iw,new E.e134(),C.tz,new E.e135(),C.AT,new E.e136(),C.Lk,new E.e137(),C.GS,new E.e138(),C.rB,new E.e139(),C.bz,new E.e140(),C.Jx,new E.e141(),C.b5,new E.e142(),C.z6,new E.e143(),C.SY,new E.e144(),C.Lc,new E.e145(),C.hf,new E.e146(),C.uk,new E.e147(),C.Zi,new E.e148(),C.TN,new E.e149(),C.GI,new E.e150(),C.Wn,new E.e151(),C.ur,new E.e152(),C.VN,new E.e153(),C.EV,new E.e154(),C.VI,new E.e155(),C.eh,new E.e156(),C.SA,new E.e157(),C.uG,new E.e158(),C.kV,new E.e159(),C.vp,new E.e160(),C.cc,new E.e161(),C.DY,new E.e162(),C.Lx,new E.e163(),C.M3,new E.e164(),C.wT,new E.e165(),C.JK,new E.e166(),C.SR,new E.e167(),C.t6,new E.e168(),C.rP,new E.e169(),C.qi,new E.e170(),C.pX,new E.e171(),C.kB,new E.e172(),C.LH,new E.e173(),C.a2,new E.e174(),C.VD,new E.e175(),C.NN,new E.e176(),C.UX,new E.e177(),C.YS,new E.e178(),C.pu,new E.e179(),C.uw,new E.e180(),C.BJ,new E.e181(),C.c6,new E.e182(),C.td,new E.e183(),C.Gn,new E.e184(),C.zO,new E.e185(),C.vg,new E.e186(),C.Yp,new E.e187(),C.YV,new E.e188(),C.If,new E.e189(),C.Ys,new E.e190(),C.zm,new E.e191(),C.EP,new E.e192(),C.nX,new E.e193(),C.BV,new E.e194(),C.xP,new E.e195(),C.XM,new E.e196(),C.Ic,new E.e197(),C.yG,new E.e198(),C.uI,new E.e199(),C.O9,new E.e200(),C.ba,new E.e201(),C.tW,new E.e202(),C.CG,new E.e203(),C.Jf,new E.e204(),C.Wj,new E.e205(),C.vb,new E.e206(),C.UL,new E.e207(),C.AY,new E.e208(),C.QK,new E.e209(),C.AO,new E.e210(),C.Xd,new E.e211(),C.I7,new E.e212(),C.kY,new E.e213(),C.Wm,new E.e214(),C.vK,new E.e215(),C.Tc,new E.e216(),C.GR,new E.e217(),C.KX,new E.e218(),C.ja,new E.e219(),C.mn,new E.e220(),C.Dj,new E.e221(),C.ir,new E.e222(),C.dx,new E.e223(),C.ni,new E.e224(),C.X2,new E.e225(),C.F3,new E.e226(),C.UY,new E.e227(),C.Aa,new E.e228(),C.nY,new E.e229(),C.tg,new E.e230(),C.HD,new E.e231(),C.iU,new E.e232(),C.eN,new E.e233(),C.ue,new E.e234(),C.nh,new E.e235(),C.L2,new E.e236(),C.vm,new E.e237(),C.Gs,new E.e238(),C.bE,new E.e239(),C.YD,new E.e240(),C.PX,new E.e241(),C.N8,new E.e242(),C.FQ,new E.e243(),C.EA,new E.e244(),C.oW,new E.e245(),C.KC,new E.e246(),C.tf,new E.e247(),C.TI,new E.e248(),C.da,new E.e249(),C.Jd,new E.e250(),C.Y4,new E.e251(),C.Si,new E.e252(),C.pH,new E.e253(),C.Ve,new E.e254(),C.jM,new E.e255(),C.rd,new E.e256(),C.rX,new E.e257(),C.W5,new E.e258(),C.uX,new E.e259(),C.nt,new E.e260(),C.IT,new E.e261(),C.li,new E.e262(),C.PM,new E.e263(),C.ks,new E.e264(),C.Om,new E.e265(),C.iC,new E.e266(),C.Nv,new E.e267(),C.Wo,new E.e268(),C.FZ,new E.e269(),C.TW,new E.e270(),C.xS,new E.e271(),C.pD,new E.e272(),C.QF,new E.e273(),C.mi,new E.e274(),C.zz,new E.e275(),C.eO,new E.e276(),C.hO,new E.e277(),C.ei,new E.e278(),C.HK,new E.e279(),C.je,new E.e280(),C.Ef,new E.e281(),C.QL,new E.e282(),C.RH,new E.e283(),C.SP,new E.e284(),C.Q1,new E.e285(),C.ID,new E.e286(),C.dA,new E.e287(),C.bc,new E.e288(),C.nE,new E.e289(),C.ep,new E.e290(),C.hB,new E.e291(),C.J2,new E.e292(),C.hx,new E.e293(),C.zU,new E.e294(),C.OU,new E.e295(),C.bn,new E.e296(),C.mh,new E.e297(),C.Fh,new E.e298(),C.yv,new E.e299(),C.LP,new E.e300(),C.jh,new E.e301(),C.zd,new E.e302(),C.Db,new E.e303(),C.aF,new E.e304(),C.l4,new E.e305(),C.fj,new E.e306(),C.xw,new E.e307(),C.zn,new E.e308(),C.RJ,new E.e309(),C.Sk,new E.e310(),C.KS,new E.e311(),C.MA,new E.e312(),C.YE,new E.e313(),C.Uy,new E.e314()],null,null)
-y=P.EF([C.aP,new E.e315(),C.NK,new E.e316(),C.cg,new E.e317(),C.Zg,new E.e318(),C.S4,new E.e319(),C.AV,new E.e320(),C.bk,new E.e321(),C.lH,new E.e322(),C.am,new E.e323(),C.oE,new E.e324(),C.kG,new E.e325(),C.Wt,new E.e326(),C.mM,new E.e327(),C.aw,new E.e328(),C.XA,new E.e329(),C.i4,new E.e330(),C.mJ,new E.e331(),C.yL,new E.e332(),C.nr,new E.e333(),C.bJ,new E.e334(),C.kI,new E.e335(),C.vY,new E.e336(),C.yC,new E.e337(),C.VK,new E.e338(),C.aH,new E.e339(),C.GP,new E.e340(),C.vs,new E.e341(),C.Gr,new E.e342(),C.Fe,new E.e343(),C.tP,new E.e344(),C.yh,new E.e345(),C.Zb,new E.e346(),C.p8,new E.e347(),C.ld,new E.e348(),C.ne,new E.e349(),C.B0,new E.e350(),C.mr,new E.e351(),C.YT,new E.e352(),C.cJ,new E.e353(),C.WQ,new E.e354(),C.jU,new E.e355(),C.OO,new E.e356(),C.Mc,new E.e357(),C.QH,new E.e358(),C.rE,new E.e359(),C.nf,new E.e360(),C.ft,new E.e361(),C.Ge,new E.e362(),C.A7,new E.e363(),C.He,new E.e364(),C.oj,new E.e365(),C.d2,new E.e366(),C.uO,new E.e367(),C.fn,new E.e368(),C.yB,new E.e369(),C.Py,new E.e370(),C.uu,new E.e371(),C.qs,new E.e372(),C.rB,new E.e373(),C.z6,new E.e374(),C.hf,new E.e375(),C.uk,new E.e376(),C.Zi,new E.e377(),C.TN,new E.e378(),C.ur,new E.e379(),C.EV,new E.e380(),C.VI,new E.e381(),C.eh,new E.e382(),C.SA,new E.e383(),C.uG,new E.e384(),C.kV,new E.e385(),C.vp,new E.e386(),C.SR,new E.e387(),C.t6,new E.e388(),C.kB,new E.e389(),C.UX,new E.e390(),C.YS,new E.e391(),C.c6,new E.e392(),C.td,new E.e393(),C.zO,new E.e394(),C.Yp,new E.e395(),C.YV,new E.e396(),C.If,new E.e397(),C.Ys,new E.e398(),C.EP,new E.e399(),C.nX,new E.e400(),C.BV,new E.e401(),C.XM,new E.e402(),C.Ic,new E.e403(),C.O9,new E.e404(),C.tW,new E.e405(),C.Wj,new E.e406(),C.vb,new E.e407(),C.QK,new E.e408(),C.Xd,new E.e409(),C.kY,new E.e410(),C.vK,new E.e411(),C.Tc,new E.e412(),C.GR,new E.e413(),C.KX,new E.e414(),C.ja,new E.e415(),C.Dj,new E.e416(),C.X2,new E.e417(),C.UY,new E.e418(),C.Aa,new E.e419(),C.nY,new E.e420(),C.tg,new E.e421(),C.HD,new E.e422(),C.iU,new E.e423(),C.eN,new E.e424(),C.Gs,new E.e425(),C.bE,new E.e426(),C.YD,new E.e427(),C.PX,new E.e428(),C.FQ,new E.e429(),C.tf,new E.e430(),C.TI,new E.e431(),C.Jd,new E.e432(),C.pH,new E.e433(),C.Ve,new E.e434(),C.jM,new E.e435(),C.rd,new E.e436(),C.rX,new E.e437(),C.uX,new E.e438(),C.nt,new E.e439(),C.IT,new E.e440(),C.PM,new E.e441(),C.ks,new E.e442(),C.Om,new E.e443(),C.iC,new E.e444(),C.Nv,new E.e445(),C.FZ,new E.e446(),C.TW,new E.e447(),C.pD,new E.e448(),C.mi,new E.e449(),C.zz,new E.e450(),C.dA,new E.e451(),C.nE,new E.e452(),C.hx,new E.e453(),C.zU,new E.e454(),C.OU,new E.e455(),C.zd,new E.e456(),C.RJ,new E.e457(),C.YE,new E.e458()],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.Wd,C.Mt,C.V7,C.Mt,C.V8,C.Mt,C.hM,C.Mt,C.JX,C.Mt,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.z7,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.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.Wd,P.EF([C.rB,C.RU],null,null),C.V7,P.EF([C.S4,C.aj,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz,C.rE,C.B7,C.FQ,C.OS],null,null),C.V8,P.EF([C.rB,C.RU,C.mi,C.eQ],null,null),C.hM,P.EF([C.rB,C.RU,C.TI,C.NU],null,null),C.JX,P.EF([C.NK,C.ZX,C.rB,C.RU,C.bz,C.Bk,C.rX,C.Wp],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.z7,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.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.NK,"activeFrame",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.FQ,"scriptHeight",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.TI,"showConsole",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.rX,"stack",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.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)
+E24:[function(){var z,y,x
+z=P.B([C.S,new E.L(),C.N,new E.Q(),C.X,new E.O(),C.P,new E.Y(),C.V,new E.em(),C.Z,new E.Lb(),C.W,new E.QA(),C.ET,new E.Cv(),C.T,new E.ed(),C.M,new E.wa(),C.hR,new E.Or(),C.S4,new E.YL(),C.R,new E.wf(),C.hN,new E.Oa(),C.U,new E.emv(),C.bV,new E.Lbd(),C.C0,new E.QAa(),C.eZ,new E.CvS(),C.bk,new E.edy(),C.lH,new E.waE(),C.am,new E.Ore(),C.oE,new E.YLa(),C.kG,new E.wfa(),C.OI,new E.Oaa(),C.Wt,new E.e0(),C.I9,new E.e1(),C.To,new E.e2(),C.mM,new E.e3(),C.aw,new E.e4(),C.XA,new E.e5(),C.i4,new E.e6(),C.mJ,new E.e7(),C.qt,new E.e8(),C.p1,new E.e9(),C.yJ,new E.e10(),C.la,new E.e11(),C.yL,new E.e12(),C.nr,new E.e13(),C.bJ,new E.e14(),C.ox,new E.e15(),C.Je,new E.e16(),C.kI,new E.e17(),C.vY,new E.e18(),C.Rs,new E.e19(),C.hJ,new E.e20(),C.yC,new E.e21(),C.Lw,new E.e22(),C.eR,new E.e23(),C.LS,new E.e24(),C.iE,new E.e25(),C.f4,new E.e26(),C.VK,new E.e27(),C.aH,new E.e28(),C.aK,new E.e29(),C.GP,new E.e30(),C.mw,new E.e31(),C.vs,new E.e32(),C.Gr,new E.e33(),C.TU,new E.e34(),C.Fe,new E.e35(),C.tP,new E.e36(),C.yh,new E.e37(),C.Zb,new E.e38(),C.u7,new E.e39(),C.p8,new E.e40(),C.qR,new E.e41(),C.ld,new E.e42(),C.ne,new E.e43(),C.B0,new E.e44(),C.r1,new E.e45(),C.mr,new E.e46(),C.Ek,new E.e47(),C.Pn,new E.e48(),C.YT,new E.e49(),C.h7,new E.e50(),C.R3,new E.e51(),C.cJ,new E.e52(),C.WQ,new E.e53(),C.fV,new E.e54(),C.jU,new E.e55(),C.OO,new E.e56(),C.Mc,new E.e57(),C.FP,new E.e58(),C.kF,new E.e59(),C.UD,new E.e60(),C.Aq,new E.e61(),C.DS,new E.e62(),C.C9,new E.e63(),C.VF,new E.e64(),C.uU,new E.e65(),C.YJ,new E.e66(),C.EF,new E.e67(),C.oI,new E.e68(),C.ST,new E.e69(),C.QH,new E.e70(),C.qX,new E.e71(),C.rE,new E.e72(),C.nf,new E.e73(),C.EI,new E.e74(),C.JB,new E.e75(),C.RY,new E.e76(),C.d4,new E.e77(),C.cF,new E.e78(),C.ft,new E.e79(),C.dr,new E.e80(),C.SI,new E.e81(),C.zS,new E.e82(),C.YA,new E.e83(),C.Ge,new E.e84(),C.A7,new E.e85(),C.He,new E.e86(),C.im,new E.e87(),C.Ss,new E.e88(),C.k6,new E.e89(),C.oj,new E.e90(),C.PJ,new E.e91(),C.Yb,new E.e92(),C.q2,new E.e93(),C.d2,new E.e94(),C.kN,new E.e95(),C.uO,new E.e96(),C.fn,new E.e97(),C.yB,new E.e98(),C.eJ,new E.e99(),C.iG,new E.e100(),C.Py,new E.e101(),C.pC,new E.e102(),C.uu,new E.e103(),C.qs,new E.e104(),C.XH,new E.e105(),C.XJ,new E.e106(),C.tJ,new E.e107(),C.F8,new E.e108(),C.fy,new E.e109(),C.C1,new E.e110(),C.Nr,new E.e111(),C.nL,new E.e112(),C.a0,new E.e113(),C.Yg,new E.e114(),C.bR,new E.e115(),C.ai,new E.e116(),C.ob,new E.e117(),C.dR,new E.e118(),C.MY,new E.e119(),C.Wg,new E.e120(),C.tD,new E.e121(),C.QS,new E.e122(),C.C7,new E.e123(),C.nZ,new E.e124(),C.Of,new E.e125(),C.Vl,new E.e126(),C.pY,new E.e127(),C.XL,new E.e128(),C.LA,new E.e129(),C.Iw,new E.e130(),C.tz,new E.e131(),C.AT,new E.e132(),C.Lk,new E.e133(),C.GS,new E.e134(),C.rB,new E.e135(),C.bz,new E.e136(),C.Jx,new E.e137(),C.b5,new E.e138(),C.z6,new E.e139(),C.SY,new E.e140(),C.Lc,new E.e141(),C.hf,new E.e142(),C.uk,new E.e143(),C.Zi,new E.e144(),C.TN,new E.e145(),C.GI,new E.e146(),C.Wn,new E.e147(),C.ur,new E.e148(),C.VN,new E.e149(),C.EV,new E.e150(),C.VI,new E.e151(),C.eh,new E.e152(),C.SA,new E.e153(),C.uG,new E.e154(),C.kV,new E.e155(),C.vp,new E.e156(),C.cc,new E.e157(),C.DY,new E.e158(),C.Lx,new E.e159(),C.M3,new E.e160(),C.wT,new E.e161(),C.JK,new E.e162(),C.SR,new E.e163(),C.t6,new E.e164(),C.rP,new E.e165(),C.qi,new E.e166(),C.pX,new E.e167(),C.kB,new E.e168(),C.LH,new E.e169(),C.a2,new E.e170(),C.VD,new E.e171(),C.NN,new E.e172(),C.UX,new E.e173(),C.YS,new E.e174(),C.pu,new E.e175(),C.uw,new E.e176(),C.BJ,new E.e177(),C.c6,new E.e178(),C.td,new E.e179(),C.Gn,new E.e180(),C.zO,new E.e181(),C.vg,new E.e182(),C.Yp,new E.e183(),C.YV,new E.e184(),C.If,new E.e185(),C.Ys,new E.e186(),C.zm,new E.e187(),C.EP,new E.e188(),C.nX,new E.e189(),C.BV,new E.e190(),C.xP,new E.e191(),C.XM,new E.e192(),C.Ic,new E.e193(),C.yG,new E.e194(),C.uI,new E.e195(),C.O9,new E.e196(),C.ba,new E.e197(),C.tW,new E.e198(),C.CG,new E.e199(),C.Jf,new E.e200(),C.Wj,new E.e201(),C.vb,new E.e202(),C.UL,new E.e203(),C.AY,new E.e204(),C.QK,new E.e205(),C.AO,new E.e206(),C.Xd,new E.e207(),C.I7,new E.e208(),C.kY,new E.e209(),C.Wm,new E.e210(),C.vK,new E.e211(),C.Tc,new E.e212(),C.GR,new E.e213(),C.KX,new E.e214(),C.ja,new E.e215(),C.mn,new E.e216(),C.Dj,new E.e217(),C.ir,new E.e218(),C.dx,new E.e219(),C.ni,new E.e220(),C.X2,new E.e221(),C.F3,new E.e222(),C.UY,new E.e223(),C.Aa,new E.e224(),C.nY,new E.e225(),C.tg,new E.e226(),C.HD,new E.e227(),C.iU,new E.e228(),C.eN,new E.e229(),C.ue,new E.e230(),C.nh,new E.e231(),C.L2,new E.e232(),C.vm,new E.e233(),C.Gs,new E.e234(),C.bE,new E.e235(),C.YD,new E.e236(),C.PX,new E.e237(),C.N8,new E.e238(),C.FQ,new E.e239(),C.EA,new E.e240(),C.oW,new E.e241(),C.KC,new E.e242(),C.tf,new E.e243(),C.TI,new E.e244(),C.da,new E.e245(),C.Jd,new E.e246(),C.Y4,new E.e247(),C.Si,new E.e248(),C.pH,new E.e249(),C.Ve,new E.e250(),C.jM,new E.e251(),C.rd,new E.e252(),C.rX,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.nE,new E.e285(),C.ep,new E.e286(),C.hB,new E.e287(),C.J2,new E.e288(),C.hx,new E.e289(),C.zU,new E.e290(),C.OU,new E.e291(),C.bn,new E.e292(),C.mh,new E.e293(),C.Fh,new E.e294(),C.yv,new E.e295(),C.LP,new E.e296(),C.jh,new E.e297(),C.zd,new E.e298(),C.Db,new E.e299(),C.aF,new E.e300(),C.l4,new E.e301(),C.fj,new E.e302(),C.xw,new E.e303(),C.zn,new E.e304(),C.RJ,new E.e305(),C.Sk,new E.e306(),C.KS,new E.e307(),C.MA,new E.e308(),C.YE,new E.e309(),C.Uy,new E.e310()],null,null)
+y=P.B([C.S,new E.e311(),C.N,new E.e312(),C.P,new E.e313(),C.Z,new E.e314(),C.S4,new E.e315(),C.U,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.FQ,new E.e425(),C.tf,new E.e426(),C.TI,new E.e427(),C.Jd,new E.e428(),C.pH,new E.e429(),C.Ve,new E.e430(),C.jM,new E.e431(),C.rd,new E.e432(),C.rX,new E.e433(),C.uX,new E.e434(),C.nt,new E.e435(),C.IT,new E.e436(),C.PM,new E.e437(),C.ks,new E.e438(),C.Om,new E.e439(),C.iC,new E.e440(),C.Nv,new E.e441(),C.FZ,new E.e442(),C.TW,new E.e443(),C.pD,new E.e444(),C.mi,new E.e445(),C.zz,new E.e446(),C.dA,new E.e447(),C.nE,new E.e448(),C.hx,new E.e449(),C.zU,new E.e450(),C.OU,new E.e451(),C.zd,new E.e452(),C.RJ,new E.e453(),C.YE,new E.e454()],null,null)
+x=P.B([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.Wd,C.Mt,C.V7,C.Mt,C.V8,C.Mt,C.hM,C.Mt,C.JX,C.Mt,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.It,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.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.B([C.K4,P.B([C.S4,C.aj,C.U,C.Qp,C.mJ,C.Dx,C.hf,C.BT],null,null),C.yS,P.B([C.UX,C.Pt],null,null),C.OG,P.A(null,null),C.nw,P.B([C.rB,C.xY,C.bz,C.Bk],null,null),C.ou,P.B([C.XA,C.dq,C.yB,C.vZ,C.tg,C.DC],null,null),C.oT,P.B([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.B([C.i4,C.aJ],null,null),C.XW,P.A(null,null),C.kH,P.B([C.nr,C.BO],null,null),C.Lg,P.B([C.S4,C.aj,C.U,C.Qp,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz],null,null),C.Wd,P.B([C.rB,C.RU],null,null),C.V7,P.B([C.S4,C.aj,C.B0,C.iH,C.r1,C.nP,C.mr,C.iz,C.rE,C.B7,C.FQ,C.Ow],null,null),C.V8,P.B([C.rB,C.RU,C.mi,C.VB],null,null),C.hM,P.B([C.rB,C.RU,C.TI,C.NU],null,null),C.JX,P.B([C.N,C.ZX,C.rB,C.RU,C.bz,C.Bk,C.rX,C.Wp],null,null),C.Bi,P.A(null,null),C.KO,P.B([C.yh,C.tO],null,null),C.wk,P.B([C.U,C.k1,C.eh,C.IP,C.Aa,C.k5,C.mi,C.nH],null,null),C.jA,P.B([C.S4,C.aj,C.U,C.Qp,C.YT,C.LC,C.hf,C.BT,C.UY,C.n6],null,null),C.Jo,P.A(null,null),C.Az,P.B([C.WQ,C.on],null,null),C.Vx,P.B([C.OO,C.Cf],null,null),C.Qb,P.B([C.Mc,C.f0],null,null),C.lE,P.B([C.QK,C.P9],null,null),C.te,P.B([C.nf,C.wR],null,null),C.iD,P.B([C.QH,C.C4,C.qX,C.dO,C.PM,C.Jr],null,null),C.Ju,P.B([C.kG,C.Pr,C.rB,C.xY,C.Zi,C.vC,C.TN,C.K1,C.vb,C.Mq,C.UL,C.bG],null,null),C.uC,P.B([C.uO,C.KK,C.kY,C.rT],null,null),C.Wz,P.A(null,null),C.Ke,P.B([C.fn,C.Kk],null,null),C.pF,P.A(null,null),C.Wh,P.B([C.yL,C.j5],null,null),C.It,P.B([C.vp,C.o0],null,null),C.qZ,P.A(null,null),C.Zj,P.B([C.oj,C.GT],null,null),C.he,P.B([C.vp,C.o0],null,null),C.dD,P.B([C.pH,C.xV],null,null),C.hP,P.B([C.Wj,C.Ah],null,null),C.tc,P.B([C.vp,C.o0],null,null),C.rR,P.A(null,null),C.oG,P.B([C.jU,C.bw],null,null),C.mK,P.A(null,null),C.IZ,P.B([C.vp,C.o0],null,null),C.FG,P.A(null,null),C.pJ,P.B([C.Ve,C.X4],null,null),C.tU,P.B([C.qs,C.MN],null,null),C.DD,P.B([C.vp,C.o0],null,null),C.Yy,P.A(null,null),C.Xv,P.B([C.YE,C.Wl],null,null),C.ce,P.B([C.aH,C.Ei,C.He,C.fz,C.vb,C.Mq,C.UL,C.bG,C.Dj,C.kA,C.Gs,C.Wq,C.bE,C.Dh,C.YD,C.bl,C.TW,C.B3,C.xS,C.hd,C.zz,C.mb],null,null),C.UJ,P.A(null,null),C.ca,P.B([C.bJ,C.UI,C.ox,C.Rh],null,null),C.Io,P.B([C.rB,C.RU],null,null),C.j4,P.B([C.rB,C.RU],null,null),C.EG,P.B([C.rB,C.RU],null,null),C.CT,P.B([C.rB,C.RU],null,null),C.mq,P.B([C.rB,C.RU],null,null),C.Tq,P.B([C.SR,C.S9,C.t6,C.Hk,C.rP,C.Nt],null,null),C.lp,P.A(null,null),C.PT,P.B([C.EV,C.V0],null,null),C.fU,P.B([C.kB,C.nq,C.LH,C.oB,C.EP,C.db],null,null),C.pi,P.B([C.rB,C.xY,C.kB,C.nq,C.LH,C.oB],null,null),C.Fn,P.B([C.rB,C.xY,C.bz,C.Bk,C.EP,C.GO,C.tf,C.q6],null,null),C.Ey,P.B([C.XA,C.dq,C.uk,C.rY],null,null),C.km,P.B([C.rB,C.RU,C.bz,C.Bk,C.uk,C.rY],null,null),C.vw,P.B([C.uk,C.rY,C.EV,C.V0],null,null),C.LT,P.B([C.Ys,C.Cg],null,null),C.NW,P.A(null,null),C.ms,P.B([C.P,C.TE,C.uk,C.rY,C.kV,C.RZ],null,null),C.FA,P.B([C.P,C.TE,C.kV,C.RZ],null,null),C.Qt,P.B([C.ld,C.Gw],null,null),C.a8,P.B([C.p8,C.uc,C.ld,C.Gw],null,null),C.JW,P.B([C.S,C.oh,C.U,C.Qp,C.hf,C.BT],null,null),C.Mf,P.B([C.uk,C.rY],null,null),C.rC,P.B([C.uO,C.JT,C.td,C.Zk,C.XM,C.Tt,C.tg,C.DC],null,null),C.kq,P.B([C.td,C.Zk],null,null),C.Dl,P.B([C.VK,C.lW],null,null),C.Mz,P.B([C.O9,C.q9,C.ba,C.yV],null,null),C.Nw,P.B([C.S4,C.aj,C.VI,C.w6],null,null),C.ON,P.B([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.cD,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.B([C.tW,C.Qc,C.CG,C.Ml],null,null),C.Th,P.B([C.PX,C.jz],null,null),C.wH,P.B([C.yh,C.lJ],null,null),C.pK,P.B([C.ne,C.bp],null,null),C.R9,P.B([C.kY,C.TO,C.Wm,C.QW],null,null),C.OZ,P.A(null,null),C.il,P.B([C.uu,C.NJ,C.kY,C.TO,C.Wm,C.QW],null,null),C.QJ,P.B([C.B0,C.iH,C.vp,C.Rz],null,null),C.u4,P.B([C.B0,C.iH,C.SR,C.hS],null,null),C.X8,P.B([C.Z,C.b7,C.td,C.Zk,C.Gn,C.az],null,null),C.kt,P.B([C.nE,C.FM],null,null),C.Y3,P.B([C.bk,C.NS,C.lH,C.M6,C.zU,C.OS],null,null),C.bC,P.B([C.am,C.JD,C.oE,C.py,C.uX,C.VM],null,null),C.ws,P.B([C.pD,C.Gz],null,null),C.cK,P.A(null,null),C.jK,P.B([C.yh,C.tO,C.RJ,C.BP],null,null)],null,null),z,P.B([C.S,"active",C.N,"activeFrame",C.X,"address",C.P,"anchor",C.V,"app",C.Z,"args",C.W,"asStringLiteral",C.ET,"assertsEnabled",C.T,"averageCollectionPeriodInMillis",C.M,"bpt",C.hR,"breakpoint",C.S4,"busy",C.R,"buttonClick",C.hN,"bytes",C.U,"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.FQ,"scriptHeight",C.EA,"scripts",C.oW,"selectExpr",C.KC,"selectMetric",C.tf,"selectedMetric",C.TI,"showConsole",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.rX,"stack",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.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)
+$.Yv=new O.mO(y)
 $.qe=new O.ut(y)
-$.M6=[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(),new E.e546(),new E.e547(),new E.e548(),new E.e549(),new E.e550(),new E.e551(),new E.e552(),new E.e553(),new E.e554()]
+$.MU=[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(),new E.e546(),new E.e547(),new E.e548(),new E.e549(),new E.e550()]
 $.UG=!0
-F.E2()},"$0","jk",0,0,17],
+F.E2()},"$0","VQk",0,0,1],
+L:{
+"^":"r:14;",
+$1:[function(a){return J.Jp9(a)},"$1",null,2,0,null,65,"call"]},
+Q:{
+"^":"r:14;",
+$1:[function(a){return J.Em(a)},"$1",null,2,0,null,65,"call"]},
+O:{
+"^":"r:14;",
+$1:[function(a){return a.gYu()},"$1",null,2,0,null,65,"call"]},
+Y:{
+"^":"r:14;",
+$1:[function(a){return J.FS(a)},"$1",null,2,0,null,65,"call"]},
 em:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.j1(a)},"$1",null,2,0,null,65,"call"]},
 Lb:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Em(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.BI(a)},"$1",null,2,0,null,65,"call"]},
 QA:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gYu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ot(a)},"$1",null,2,0,null,65,"call"]},
 Cv:{
-"^":"TpZ:12;",
-$1:[function(a){return J.FS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gA3()},"$1",null,2,0,null,65,"call"]},
 ed:{
-"^":"TpZ:12;",
-$1:[function(a){return J.r0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.goX()},"$1",null,2,0,null,65,"call"]},
 wa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.D8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gqr()},"$1",null,2,0,null,65,"call"]},
 Or:{
-"^":"TpZ:12;",
-$1:[function(a){return J.mN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gYZ()},"$1",null,2,0,null,65,"call"]},
 YL:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gA3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zL(a)},"$1",null,2,0,null,65,"call"]},
 wf:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqZ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aAQ(a)},"$1",null,2,0,null,65,"call"]},
 Oa:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqr()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gET()},"$1",null,2,0,null,65,"call"]},
 emv:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gQ1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WT(a)},"$1",null,2,0,null,65,"call"]},
 Lbd:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCs()},"$1",null,2,0,null,65,"call"]},
 QAa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.XB(a)},"$1",null,2,0,null,65,"call"]},
 CvS:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gfj()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.n9(a)},"$1",null,2,0,null,65,"call"]},
 edy:{
-"^":"TpZ:12;",
-$1:[function(a){return J.WT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.rp(a)},"$1",null,2,0,null,65,"call"]},
 waE:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkV()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.BS2(a)},"$1",null,2,0,null,65,"call"]},
 Ore:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LL(a)},"$1",null,2,0,null,65,"call"]},
 YLa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.n9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.h3(a)},"$1",null,2,0,null,65,"call"]},
 wfa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.K0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.AJ(a)},"$1",null,2,0,null,65,"call"]},
 Oaa:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hn(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pP(a)},"$1",null,2,0,null,65,"call"]},
 e0:{
-"^":"TpZ:12;",
-$1:[function(a){return J.HP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUP()},"$1",null,2,0,null,65,"call"]},
 e1:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.RC(a)},"$1",null,2,0,null,65,"call"]},
 e2:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yz(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSf()},"$1",null,2,0,null,65,"call"]},
 e3:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu5()},"$1",null,2,0,null,65,"call"]},
 e4:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gwz()},"$1",null,2,0,null,65,"call"]},
 e5:{
-"^":"TpZ:12;",
-$1:[function(a){return J.RC(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.L6(a)},"$1",null,2,0,null,65,"call"]},
 e6:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tX(a)},"$1",null,2,0,null,65,"call"]},
 e7:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu5()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zF(a)},"$1",null,2,0,null,65,"call"]},
 e8:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gwz()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.lK(a)},"$1",null,2,0,null,65,"call"]},
 e9:{
-"^":"TpZ:12;",
-$1:[function(a){return J.E3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Al(a)},"$1",null,2,0,null,65,"call"]},
 e10:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Nk(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Mh(a)},"$1",null,2,0,null,65,"call"]},
 e11:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yI(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nC(a)},"$1",null,2,0,null,65,"call"]},
 e12:{
-"^":"TpZ:12;",
-$1:[function(a){return J.SM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xe(a)},"$1",null,2,0,null,65,"call"]},
 e13:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ux(a)},"$1",null,2,0,null,65,"call"]},
 e14:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.OT(a)},"$1",null,2,0,null,65,"call"]},
 e15:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ev(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Okq(a)},"$1",null,2,0,null,65,"call"]},
 e16:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xe(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gk()},"$1",null,2,0,null,65,"call"]},
 e17:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ux(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.h6(a)},"$1",null,2,0,null,65,"call"]},
 e18:{
-"^":"TpZ:12;",
-$1:[function(a){return J.OT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.kc(a)},"$1",null,2,0,null,65,"call"]},
 e19:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ok(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.P3(a)},"$1",null,2,0,null,65,"call"]},
 e20:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gpG()},"$1",null,2,0,null,65,"call"]},
 e21:{
-"^":"TpZ:12;",
-$1:[function(a){return J.h6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOF()},"$1",null,2,0,null,65,"call"]},
 e22:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jr(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TG(a)},"$1",null,2,0,null,65,"call"]},
 e23:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOs()},"$1",null,2,0,null,65,"call"]},
 e24:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gpG()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gN0()},"$1",null,2,0,null,65,"call"]},
 e25:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gOF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSL()},"$1",null,2,0,null,65,"call"]},
 e26:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.guH()},"$1",null,2,0,null,65,"call"]},
 e27:{
-"^":"TpZ:12;",
-$1:[function(a){return a.guh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mP(a)},"$1",null,2,0,null,65,"call"]},
 e28:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fe(a)},"$1",null,2,0,null,65,"call"]},
 e29:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dn(a)},"$1",null,2,0,null,65,"call"]},
 e30:{
-"^":"TpZ:12;",
-$1:[function(a){return a.guH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.y3(a)},"$1",null,2,0,null,65,"call"]},
 e31:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.YH(a)},"$1",null,2,0,null,65,"call"]},
 e32:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NC(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.k0(a)},"$1",null,2,0,null,65,"call"]},
 e33:{
-"^":"TpZ:12;",
-$1:[function(a){return J.H2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yr(a)},"$1",null,2,0,null,65,"call"]},
 e34:{
-"^":"TpZ:12;",
-$1:[function(a){return J.y3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.lk(a)},"$1",null,2,0,null,65,"call"]},
 e35:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hg(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gLK()},"$1",null,2,0,null,65,"call"]},
 e36:{
-"^":"TpZ:12;",
-$1:[function(a){return J.k0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gw2()},"$1",null,2,0,null,65,"call"]},
 e37:{
-"^":"TpZ:12;",
-$1:[function(a){return J.rw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.w8(a)},"$1",null,2,0,null,65,"call"]},
 e38:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wt(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ht(a)},"$1",null,2,0,null,65,"call"]},
 e39:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gej()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pp(a)},"$1",null,2,0,null,65,"call"]},
 e40:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gw2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qf(a)},"$1",null,2,0,null,65,"call"]},
 e41:{
-"^":"TpZ:12;",
-$1:[function(a){return J.w8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,65,"call"]},
 e42:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ht(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.um(a)},"$1",null,2,0,null,65,"call"]},
 e43:{
-"^":"TpZ:12;",
-$1:[function(a){return J.kv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.io(a)},"$1",null,2,0,null,65,"call"]},
 e44:{
-"^":"TpZ:12;",
-$1:[function(a){return J.a3(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UE(a)},"$1",null,2,0,null,65,"call"]},
 e45:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ts(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ak(a)},"$1",null,2,0,null,65,"call"]},
 e46:{
-"^":"TpZ:12;",
-$1:[function(a){return J.um(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IL(a)},"$1",null,2,0,null,65,"call"]},
 e47:{
-"^":"TpZ:12;",
-$1:[function(a){return J.io(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nb(a)},"$1",null,2,0,null,65,"call"]},
 e48:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gty()},"$1",null,2,0,null,65,"call"]},
 e49:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Gl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ua(a)},"$1",null,2,0,null,65,"call"]},
 e50:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gMX()},"$1",null,2,0,null,65,"call"]},
 e51:{
-"^":"TpZ:12;",
-$1:[function(a){return J.nb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkE()},"$1",null,2,0,null,65,"call"]},
 e52:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gty()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.E1(a)},"$1",null,2,0,null,65,"call"]},
 e53:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IR(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Nb(a)},"$1",null,2,0,null,65,"call"]},
 e54:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gtJ()},"$1",null,2,0,null,65,"call"]},
 e55:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gki()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.vE(a)},"$1",null,2,0,null,65,"call"]},
 e56:{
-"^":"TpZ:12;",
-$1:[function(a){return J.LY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dw(a)},"$1",null,2,0,null,65,"call"]},
 e57:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QZ(a)},"$1",null,2,0,null,65,"call"]},
 e58:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gtJ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WX7(a)},"$1",null,2,0,null,65,"call"]},
 e59:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ec(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QvL(a)},"$1",null,2,0,null,65,"call"]},
 e60:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PK(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZd()},"$1",null,2,0,null,65,"call"]},
 e61:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TM(a)},"$1",null,2,0,null,65,"call"]},
 e62:{
-"^":"TpZ:12;",
-$1:[function(a){return J.WX(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xo(a)},"$1",null,2,0,null,65,"call"]},
 e63:{
-"^":"TpZ:12;",
-$1:[function(a){return J.IP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkA()},"$1",null,2,0,null,65,"call"]},
 e64:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZd()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gAX()},"$1",null,2,0,null,65,"call"]},
 e65:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.ga3()},"$1",null,2,0,null,65,"call"]},
 e66:{
-"^":"TpZ:12;",
-$1:[function(a){return J.xo(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcQ()},"$1",null,2,0,null,65,"call"]},
 e67:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gS7()},"$1",null,2,0,null,65,"call"]},
 e68:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gP3()},"$1",null,2,0,null,65,"call"]},
 e69:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gan()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wm(a)},"$1",null,2,0,null,65,"call"]},
 e70:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gcQ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.bu(a)},"$1",null,2,0,null,65,"call"]},
 e71:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gS7()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.iq(a)},"$1",null,2,0,null,65,"call"]},
 e72:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gmE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zN(a)},"$1",null,2,0,null,65,"call"]},
 e73:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.m4(a)},"$1",null,2,0,null,65,"call"]},
 e74:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bu(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjV()},"$1",null,2,0,null,65,"call"]},
 e75:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eU(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCO()},"$1",null,2,0,null,65,"call"]},
 e76:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yf(a)},"$1",null,2,0,null,65,"call"]},
 e77:{
-"^":"TpZ:12;",
-$1:[function(a){return J.m4(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.i2U(a)},"$1",null,2,0,null,65,"call"]},
 e78:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gmu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ay(a)},"$1",null,2,0,null,65,"call"]},
 e79:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZD()},"$1",null,2,0,null,65,"call"]},
 e80:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gRl()},"$1",null,2,0,null,65,"call"]},
 e81:{
-"^":"TpZ:12;",
-$1:[function(a){return J.tw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvN()},"$1",null,2,0,null,65,"call"]},
 e82:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUa()},"$1",null,2,0,null,65,"call"]},
 e83:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gMp()},"$1",null,2,0,null,65,"call"]},
 e84:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gRl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Er(a)},"$1",null,2,0,null,65,"call"]},
 e85:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gX1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Jv(a)},"$1",null,2,0,null,65,"call"]},
 e86:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUa()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.z8(a)},"$1",null,2,0,null,65,"call"]},
 e87:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMp()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,65,"call"]},
 e88:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Er(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gc1()},"$1",null,2,0,null,65,"call"]},
 e89:{
-"^":"TpZ:12;",
-$1:[function(a){return J.OB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aW(a)},"$1",null,2,0,null,65,"call"]},
 e90:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YQ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.hW(a)},"$1",null,2,0,null,65,"call"]},
 e91:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Xf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu0()},"$1",null,2,0,null,65,"call"]},
 e92:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gc1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.eS(a)},"$1",null,2,0,null,65,"call"]},
 e93:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gaj()},"$1",null,2,0,null,65,"call"]},
 e94:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.giq()},"$1",null,2,0,null,65,"call"]},
 e95:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu0()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gPb()},"$1",null,2,0,null,65,"call"]},
 e96:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tl(a)},"$1",null,2,0,null,65,"call"]},
 e97:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaj()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,65,"call"]},
 e98:{
-"^":"TpZ:12;",
-$1:[function(a){return a.giq()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.US(a)},"$1",null,2,0,null,65,"call"]},
 e99:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gBm()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gNI()},"$1",null,2,0,null,65,"call"]},
 e100:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ir(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGA()},"$1",null,2,0,null,65,"call"]},
 e101:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gKt()},"$1",null,2,0,null,65,"call"]},
 e102:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NDJ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gp2()},"$1",null,2,0,null,65,"call"]},
 e103:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gNI()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.oH(a)},"$1",null,2,0,null,65,"call"]},
 e104:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gva()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,65,"call"]},
 e105:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gKt()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvo()},"$1",null,2,0,null,65,"call"]},
 e106:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gp2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.glO()},"$1",null,2,0,null,65,"call"]},
 e107:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ns(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjS()},"$1",null,2,0,null,65,"call"]},
 e108:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ew(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.v9(a)},"$1",null,2,0,null,65,"call"]},
 e109:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gBF()},"$1",null,2,0,null,65,"call"]},
 e110:{
-"^":"TpZ:12;",
-$1:[function(a){return a.glO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUB()},"$1",null,2,0,null,65,"call"]},
 e111:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gFY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gRh()},"$1",null,2,0,null,65,"call"]},
 e112:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.id(a)},"$1",null,2,0,null,65,"call"]},
 e113:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gBF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gni()},"$1",null,2,0,null,65,"call"]},
 e114:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkU()},"$1",null,2,0,null,65,"call"]},
 e115:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gRs()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzx()},"$1",null,2,0,null,65,"call"]},
 e116:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ix(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.FN(a)},"$1",null,2,0,null,65,"call"]},
 e117:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gMA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gt3()},"$1",null,2,0,null,65,"call"]},
 e118:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gcE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.or(a)},"$1",null,2,0,null,65,"call"]},
 e119:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzx()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxL()},"$1",null,2,0,null,65,"call"]},
 e120:{
-"^":"TpZ:12;",
-$1:[function(a){return J.FN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSO()},"$1",null,2,0,null,65,"call"]},
 e121:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gt3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,65,"call"]},
 e122:{
-"^":"TpZ:12;",
-$1:[function(a){return J.or(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.GGs(a)},"$1",null,2,0,null,65,"call"]},
 e123:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gho()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gOC()},"$1",null,2,0,null,65,"call"]},
 e124:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSO()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pO(a)},"$1",null,2,0,null,65,"call"]},
 e125:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zo(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHh()},"$1",null,2,0,null,65,"call"]},
 e126:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gW1()},"$1",null,2,0,null,65,"call"]},
 e127:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gJE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.goF()},"$1",null,2,0,null,65,"call"]},
 e128:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.geh()},"$1",null,2,0,null,65,"call"]},
 e129:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gHh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHY()},"$1",null,2,0,null,65,"call"]},
 e130:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gW1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXM()},"$1",null,2,0,null,65,"call"]},
 e131:{
-"^":"TpZ:12;",
-$1:[function(a){return a.goF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gfo()},"$1",null,2,0,null,65,"call"]},
 e132:{
-"^":"TpZ:12;",
-$1:[function(a){return a.geh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gFo()},"$1",null,2,0,null,65,"call"]},
 e133:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gHY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gu7()},"$1",null,2,0,null,65,"call"]},
 e134:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gl2()},"$1",null,2,0,null,65,"call"]},
 e135:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl5()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wg(a)},"$1",null,2,0,null,65,"call"]},
 e136:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gFo()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.q0(a)},"$1",null,2,0,null,65,"call"]},
 e137:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gu7()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gi2()},"$1",null,2,0,null,65,"call"]},
 e138:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gl2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSS()},"$1",null,2,0,null,65,"call"]},
 e139:{
-"^":"TpZ:12;",
-$1:[function(a){return J.aT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kt(a)},"$1",null,2,0,null,65,"call"]},
 e140:{
-"^":"TpZ:12;",
-$1:[function(a){return J.KG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.q8(a)},"$1",null,2,0,null,65,"call"]},
 e141:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gi2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,65,"call"]},
 e142:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gEB()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ZC(a)},"$1",null,2,0,null,65,"call"]},
 e143:{
-"^":"TpZ:12;",
-$1:[function(a){return J.AW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.rn(a)},"$1",null,2,0,null,65,"call"]},
 e144:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.X7(a)},"$1",null,2,0,null,65,"call"]},
 e145:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Iz(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IR(a)},"$1",null,2,0,null,65,"call"]},
 e146:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gPE()},"$1",null,2,0,null,65,"call"]},
 e147:{
-"^":"TpZ:12;",
-$1:[function(a){return J.MQ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wS(a)},"$1",null,2,0,null,65,"call"]},
 e148:{
-"^":"TpZ:12;",
-$1:[function(a){return J.X7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcI()},"$1",null,2,0,null,65,"call"]},
 e149:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Kj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvU()},"$1",null,2,0,null,65,"call"]},
 e150:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gJW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ik(a)},"$1",null,2,0,null,65,"call"]},
 e151:{
-"^":"TpZ:12;",
-$1:[function(a){return J.q8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.f2(a)},"$1",null,2,0,null,65,"call"]},
 e152:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zY(a)},"$1",null,2,0,null,65,"call"]},
 e153:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.de(a)},"$1",null,2,0,null,65,"call"]},
 e154:{
-"^":"TpZ:12;",
-$1:[function(a){return J.jl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.t0(a)},"$1",null,2,0,null,65,"call"]},
 e155:{
-"^":"TpZ:12;",
-$1:[function(a){return J.f2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,65,"call"]},
 e156:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.cO(a)},"$1",null,2,0,null,65,"call"]},
 e157:{
-"^":"TpZ:12;",
-$1:[function(a){return J.de(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzM()},"$1",null,2,0,null,65,"call"]},
 e158:{
-"^":"TpZ:12;",
-$1:[function(a){return J.t0(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gn0()},"$1",null,2,0,null,65,"call"]},
 e159:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ds(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.giP()},"$1",null,2,0,null,65,"call"]},
 e160:{
-"^":"TpZ:12;",
-$1:[function(a){return J.cO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gmd()},"$1",null,2,0,null,65,"call"]},
 e161:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gIT()},"$1",null,2,0,null,65,"call"]},
 e162:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gn0()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pr(a)},"$1",null,2,0,null,65,"call"]},
 e163:{
-"^":"TpZ:12;",
-$1:[function(a){return a.giP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,65,"call"]},
 e164:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gfJ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.kv(a)},"$1",null,2,0,null,65,"call"]},
 e165:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gIT()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QD(a)},"$1",null,2,0,null,65,"call"]},
 e166:{
-"^":"TpZ:12;",
-$1:[function(a){return J.c7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jE(a)},"$1",null,2,0,null,65,"call"]},
 e167:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,65,"call"]},
 e168:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ol(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qx(a)},"$1",null,2,0,null,65,"call"]},
 e169:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Y7(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kv(a)},"$1",null,2,0,null,65,"call"]},
 e170:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PR(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LY4(a)},"$1",null,2,0,null,65,"call"]},
 e171:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Oh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,65,"call"]},
 e172:{
-"^":"TpZ:12;",
-$1:[function(a){return J.qx(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.PW(a)},"$1",null,2,0,null,65,"call"]},
 e173:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,65,"call"]},
 e174:{
-"^":"TpZ:12;",
-$1:[function(a){return J.GL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.DA(a)},"$1",null,2,0,null,65,"call"]},
 e175:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ZF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,65,"call"]},
 e176:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gDm()},"$1",null,2,0,null,65,"call"]},
 e177:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUY()},"$1",null,2,0,null,65,"call"]},
 e178:{
-"^":"TpZ:12;",
-$1:[function(a){return J.DA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gvK()},"$1",null,2,0,null,65,"call"]},
 e179:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Pf(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mk(a)},"$1",null,2,0,null,65,"call"]},
 e180:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gbA()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.t8(a)},"$1",null,2,0,null,65,"call"]},
 e181:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gL1()},"$1",null,2,0,null,65,"call"]},
 e182:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxQ()},"$1",null,2,0,null,65,"call"]},
 e183:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Jj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXP()},"$1",null,2,0,null,65,"call"]},
 e184:{
-"^":"TpZ:12;",
-$1:[function(a){return J.t8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gP2()},"$1",null,2,0,null,65,"call"]},
 e185:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gL1()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gxH()},"$1",null,2,0,null,65,"call"]},
 e186:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gxQ()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.qN(a)},"$1",null,2,0,null,65,"call"]},
 e187:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXP()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.mF(a)},"$1",null,2,0,null,65,"call"]},
 e188:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gEl()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.MT(a)},"$1",null,2,0,null,65,"call"]},
 e189:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gxH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,65,"call"]},
 e190:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gqH()},"$1",null,2,0,null,65,"call"]},
 e191:{
-"^":"TpZ:12;",
-$1:[function(a){return J.mF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UZ(a)},"$1",null,2,0,null,65,"call"]},
 e192:{
-"^":"TpZ:12;",
-$1:[function(a){return J.MT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WN(a)},"$1",null,2,0,null,65,"call"]},
 e193:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Lp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fi(a)},"$1",null,2,0,null,65,"call"]},
 e194:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gqH()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,65,"call"]},
 e195:{
-"^":"TpZ:12;",
-$1:[function(a){return J.eb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gU6()},"$1",null,2,0,null,65,"call"]},
 e196:{
-"^":"TpZ:12;",
-$1:[function(a){return J.AF(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.cj(a)},"$1",null,2,0,null,65,"call"]},
 e197:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fi(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.tC(a)},"$1",null,2,0,null,65,"call"]},
 e198:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Kl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jL(a)},"$1",null,2,0,null,65,"call"]},
 e199:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gU6()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.S5(a)},"$1",null,2,0,null,65,"call"]},
 e200:{
-"^":"TpZ:12;",
-$1:[function(a){return J.cj(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gj9()},"$1",null,2,0,null,65,"call"]},
 e201:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.x5(a)},"$1",null,2,0,null,65,"call"]},
 e202:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Yd(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ksQ(a)},"$1",null,2,0,null,65,"call"]},
 e203:{
-"^":"TpZ:12;",
-$1:[function(a){return J.L6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Q0(a)},"$1",null,2,0,null,65,"call"]},
 e204:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gj9()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.u5(a)},"$1",null,2,0,null,65,"call"]},
 e205:{
-"^":"TpZ:12;",
-$1:[function(a){return J.x5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ul(a)},"$1",null,2,0,null,65,"call"]},
 e206:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gUx()},"$1",null,2,0,null,65,"call"]},
 e207:{
-"^":"TpZ:12;",
-$1:[function(a){return J.CN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.WV(a)},"$1",null,2,0,null,65,"call"]},
 e208:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ql(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gm8()},"$1",null,2,0,null,65,"call"]},
 e209:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ul(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.IS(a)},"$1",null,2,0,null,65,"call"]},
 e210:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gUx()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pg(a)},"$1",null,2,0,null,65,"call"]},
 e211:{
-"^":"TpZ:12;",
-$1:[function(a){return J.id(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.ghL()},"$1",null,2,0,null,65,"call"]},
 e212:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gm8()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gCM()},"$1",null,2,0,null,65,"call"]},
 e213:{
-"^":"TpZ:12;",
-$1:[function(a){return J.BZ(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.At(a)},"$1",null,2,0,null,65,"call"]},
 e214:{
-"^":"TpZ:12;",
-$1:[function(a){return J.H1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ou(a)},"$1",null,2,0,null,65,"call"]},
 e215:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xp(a)},"$1",null,2,0,null,65,"call"]},
 e216:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCM()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.up(a)},"$1",null,2,0,null,65,"call"]},
 e217:{
-"^":"TpZ:12;",
-$1:[function(a){return J.At(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.n8(a)},"$1",null,2,0,null,65,"call"]},
 e218:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hfy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gua()},"$1",null,2,0,null,65,"call"]},
 e219:{
-"^":"TpZ:12;",
-$1:[function(a){return J.er(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gNS()},"$1",null,2,0,null,65,"call"]},
 e220:{
-"^":"TpZ:12;",
-$1:[function(a){return J.up(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.guh()},"$1",null,2,0,null,65,"call"]},
 e221:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.iL(a)},"$1",null,2,0,null,65,"call"]},
 e222:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gua()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.G2(a)},"$1",null,2,0,null,65,"call"]},
 e223:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gNS()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uW(a)},"$1",null,2,0,null,65,"call"]},
 e224:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzK()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,65,"call"]},
 e225:{
-"^":"TpZ:12;",
-$1:[function(a){return J.iL(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uN(a)},"$1",null,2,0,null,65,"call"]},
 e226:{
-"^":"TpZ:12;",
-$1:[function(a){return J.LM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.I1(a)},"$1",null,2,0,null,65,"call"]},
 e227:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uW(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jH(a)},"$1",null,2,0,null,65,"call"]},
 e228:{
-"^":"TpZ:12;",
-$1:[function(a){return J.W2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.jo(a)},"$1",null,2,0,null,65,"call"]},
 e229:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UT(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVc()},"$1",null,2,0,null,65,"call"]},
 e230:{
-"^":"TpZ:12;",
-$1:[function(a){return J.I1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.geH()},"$1",null,2,0,null,65,"call"]},
 e231:{
-"^":"TpZ:12;",
-$1:[function(a){return J.pU(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.i8(a)},"$1",null,2,0,null,65,"call"]},
 e232:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Tg(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGL()},"$1",null,2,0,null,65,"call"]},
 e233:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVc()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Hm(a)},"$1",null,2,0,null,65,"call"]},
 e234:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gpF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.nv(a)},"$1",null,2,0,null,65,"call"]},
 e235:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.UP(a)},"$1",null,2,0,null,65,"call"]},
 e236:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gGL()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zD(a)},"$1",null,2,0,null,65,"call"]},
 e237:{
-"^":"TpZ:12;",
-$1:[function(a){return J.X9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fx(a)},"$1",null,2,0,null,65,"call"]},
 e238:{
-"^":"TpZ:12;",
-$1:[function(a){return J.nv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,65,"call"]},
 e239:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UP(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.j8v(a)},"$1",null,2,0,null,65,"call"]},
 e240:{
-"^":"TpZ:12;",
-$1:[function(a){return J.UA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXR()},"$1",null,2,0,null,65,"call"]},
 e241:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zE(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.P5(a)},"$1",null,2,0,null,65,"call"]},
 e242:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Zs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.ll(a)},"$1",null,2,0,null,65,"call"]},
 e243:{
-"^":"TpZ:12;",
-$1:[function(a){return J.p5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.xi(a)},"$1",null,2,0,null,65,"call"]},
 e244:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXR()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ip(a)},"$1",null,2,0,null,65,"call"]},
 e245:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fY(a)},"$1",null,2,0,null,65,"call"]},
 e246:{
-"^":"TpZ:12;",
-$1:[function(a){return J.le(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.aX(a)},"$1",null,2,0,null,65,"call"]},
 e247:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bh(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,65,"call"]},
 e248:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ip(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Yj(a)},"$1",null,2,0,null,65,"call"]},
 e249:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Y5(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Cr(a)},"$1",null,2,0,null,65,"call"]},
 e250:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Ue(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.oN(a)},"$1",null,2,0,null,65,"call"]},
 e251:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Cs(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gV8()},"$1",null,2,0,null,65,"call"]},
 e252:{
-"^":"TpZ:12;",
-$1:[function(a){return J.dK(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Jq(a)},"$1",null,2,0,null,65,"call"]},
 e253:{
-"^":"TpZ:12;",
-$1:[function(a){return J.U8(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.TH(a)},"$1",null,2,0,null,65,"call"]},
 e254:{
-"^":"TpZ:12;",
-$1:[function(a){return J.oN(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gp8()},"$1",null,2,0,null,65,"call"]},
 e255:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gip()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.F9(a)},"$1",null,2,0,null,65,"call"]},
 e256:{
-"^":"TpZ:12;",
-$1:[function(a){return J.M2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.HB(a)},"$1",null,2,0,null,65,"call"]},
 e257:{
-"^":"TpZ:12;",
-$1:[function(a){return J.TH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.yI(a)},"$1",null,2,0,null,65,"call"]},
 e258:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gp8()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.H1(a)},"$1",null,2,0,null,65,"call"]},
 e259:{
-"^":"TpZ:12;",
-$1:[function(a){return J.F9(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.LF(a)},"$1",null,2,0,null,65,"call"]},
 e260:{
-"^":"TpZ:12;",
-$1:[function(a){return J.HB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Ff(a)},"$1",null,2,0,null,65,"call"]},
 e261:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fM(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.vI(a)},"$1",null,2,0,null,65,"call"]},
 e262:{
-"^":"TpZ:12;",
-$1:[function(a){return J.ay(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,65,"call"]},
 e263:{
-"^":"TpZ:12;",
-$1:[function(a){return J.jB(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gDo()},"$1",null,2,0,null,65,"call"]},
 e264:{
-"^":"TpZ:12;",
-$1:[function(a){return J.lA(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gLT()},"$1",null,2,0,null,65,"call"]},
 e265:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Hy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gAY()},"$1",null,2,0,null,65,"call"]},
 e266:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Pq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Xa(a)},"$1",null,2,0,null,65,"call"]},
 e267:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gDo()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,65,"call"]},
 e268:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gLT()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Zu(a)},"$1",null,2,0,null,65,"call"]},
 e269:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gAY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gm2()},"$1",null,2,0,null,65,"call"]},
 e270:{
-"^":"TpZ:12;",
-$1:[function(a){return J.j1(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.dY(a)},"$1",null,2,0,null,65,"call"]},
 e271:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Aw(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.OL(a)},"$1",null,2,0,null,65,"call"]},
 e272:{
-"^":"TpZ:12;",
-$1:[function(a){return J.l2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zB(a)},"$1",null,2,0,null,65,"call"]},
 e273:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gm2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gki()},"$1",null,2,0,null,65,"call"]},
 e274:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yO(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZn()},"$1",null,2,0,null,65,"call"]},
 e275:{
-"^":"TpZ:12;",
-$1:[function(a){return J.yq(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gGc()},"$1",null,2,0,null,65,"call"]},
 e276:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Xr(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVh()},"$1",null,2,0,null,65,"call"]},
 e277:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gzg()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZX()},"$1",null,2,0,null,65,"call"]},
 e278:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZn()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.PS(a)},"$1",null,2,0,null,65,"call"]},
 e279:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gvs()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.QI(a)},"$1",null,2,0,null,65,"call"]},
 e280:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVh()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SS(a)},"$1",null,2,0,null,65,"call"]},
 e281:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZX()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SG(a)},"$1",null,2,0,null,65,"call"]},
 e282:{
-"^":"TpZ:12;",
-$1:[function(a){return J.PS(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.fv(a)},"$1",null,2,0,null,65,"call"]},
 e283:{
-"^":"TpZ:12;",
-$1:[function(a){return J.As(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gVF()},"$1",null,2,0,null,65,"call"]},
 e284:{
-"^":"TpZ:12;",
-$1:[function(a){return J.YG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gkw()},"$1",null,2,0,null,65,"call"]},
 e285:{
-"^":"TpZ:12;",
-$1:[function(a){return J.SG(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.p6(a)},"$1",null,2,0,null,65,"call"]},
 e286:{
-"^":"TpZ:12;",
-$1:[function(a){return J.fv(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.uy(a)},"$1",null,2,0,null,65,"call"]},
 e287:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gVF()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.zH(a)},"$1",null,2,0,null,65,"call"]},
 e288:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gkw()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gdW()},"$1",null,2,0,null,65,"call"]},
 e289:{
-"^":"TpZ:12;",
-$1:[function(a){return J.p6(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gQR()},"$1",null,2,0,null,65,"call"]},
 e290:{
-"^":"TpZ:12;",
-$1:[function(a){return J.uy(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Gt(a)},"$1",null,2,0,null,65,"call"]},
 e291:{
-"^":"TpZ:12;",
-$1:[function(a){return J.zH(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gjW()},"$1",null,2,0,null,65,"call"]},
 e292:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gdW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,65,"call"]},
 e293:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gCY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gJk()},"$1",null,2,0,null,65,"call"]},
 e294:{
-"^":"TpZ:12;",
-$1:[function(a){return J.un(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,65,"call"]},
 e295:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gjW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSu()},"$1",null,2,0,null,65,"call"]},
 e296:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Sl(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gcs()},"$1",null,2,0,null,65,"call"]},
 e297:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gI2()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gFc()},"$1",null,2,0,null,65,"call"]},
 e298:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Q2(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.SW(a)},"$1",null,2,0,null,65,"call"]},
 e299:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSu()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gHD()},"$1",null,2,0,null,65,"call"]},
 e300:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gae()},"$1",null,2,0,null,65,"call"]},
 e301:{
-"^":"TpZ:12;",
-$1:[function(a){return a.ghW()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.U8(a)},"$1",null,2,0,null,65,"call"]},
 e302:{
-"^":"TpZ:12;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gYY()},"$1",null,2,0,null,65,"call"]},
 e303:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gPE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gZ3()},"$1",null,2,0,null,65,"call"]},
 e304:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSS()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.pU(a)},"$1",null,2,0,null,65,"call"]},
 e305:{
-"^":"TpZ:12;",
-$1:[function(a){return J.hI(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.wp(a)},"$1",null,2,0,null,65,"call"]},
 e306:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gYY()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gSn()},"$1",null,2,0,null,65,"call"]},
 e307:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gZ3()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gzz()},"$1",null,2,0,null,65,"call"]},
 e308:{
-"^":"TpZ:12;",
-$1:[function(a){return J.NV(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gv5()},"$1",null,2,0,null,65,"call"]},
 e309:{
-"^":"TpZ:12;",
-$1:[function(a){return J.wp(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.GH(a)},"$1",null,2,0,null,65,"call"]},
 e310:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gSn()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gaU()},"$1",null,2,0,null,65,"call"]},
 e311:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gTE()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e312:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gdr()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.zv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e313:{
-"^":"TpZ:12;",
-$1:[function(a){return J.bb(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e314:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gaU()},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e315:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.RX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e316:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.zv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e317:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Px(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e318:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.m8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e319:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e320:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e321:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ae(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Kw(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e322:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,65,68,"call"]},
 e323:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ed(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,65,68,"call"]},
 e324:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,65,68,"call"]},
 e325:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e326:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sUP(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e327:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.su5(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e328:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.swz(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e329:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e330:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.T5(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.aP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e331:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.FI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Jl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e332:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.i0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e333:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,65,68,"call"]},
 e334:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.LM(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e335:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qt(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e336:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.TP(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e337:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sOF(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e338:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Nh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.AE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e339:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.au(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sLK(b)},"$2",null,4,0,null,65,68,"call"]},
 e340:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Xu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,65,68,"call"]},
 e341:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ac(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e342:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e343:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sej(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Yz(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e344:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sw2(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.i2(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e345:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qr(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e346:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.P6(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e347:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Wy(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e348:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.vA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e349:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.BC(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e350:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pB(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e351:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NO(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e352:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sm(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e353:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.JG(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e354:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.JZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e355:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fR(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e356:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e357:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.vJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sZD(b)},"$2",null,4,0,null,65,68,"call"]},
 e358:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Nf(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e359:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Pl(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e360:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.C3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.f6(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e361:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sSE(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e362:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.AI(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,65,68,"call"]},
 e363:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.OE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e364:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.nA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e365:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fb(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e366:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.siq(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,65,68,"call"]},
 e367:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e368:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qy(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e369:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.x0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.uM(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e370:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sKt(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Vr(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e371:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.cV(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e372:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.mU(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cm(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e373:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Rp(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e374:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Bj(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e375:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.GZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.scI(b)},"$2",null,4,0,null,65,68,"call"]},
 e376:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.hS(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e377:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.mz(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e378:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e379:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.shX(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e380:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.cl(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.IX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e381:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.BL(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e382:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ql(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e383:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.xQ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e384:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Mh(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e385:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.MX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e386:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.A4(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e387:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wD(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.WI(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e388:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,65,68,"call"]},
 e389:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.rA(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e390:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.oJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,65,68,"call"]},
 e391:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.DF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,65,68,"call"]},
 e392:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.svK(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sP2(b)},"$2",null,4,0,null,65,68,"call"]},
 e393:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.h9(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,65,68,"call"]},
 e394:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sL1(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e395:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sXP(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e396:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sEl(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e397:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sxH(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,65,68,"call"]},
 e398:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.XF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e399:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.b0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e400:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.A1(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e401:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sqH(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e402:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.SF(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e403:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Qv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e404:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.R8(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e405:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Xg(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.jy(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e406:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.rL(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e407:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.CJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,65,68,"call"]},
 e408:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.P2(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,65,68,"call"]},
 e409:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.J0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e410:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.PP(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.TR(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e411:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.shL(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Co(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e412:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sCM(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e413:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Sj(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e414:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.tv(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.k4(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e415:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e416:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ME(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.bU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e417:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.kX(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e418:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.q0(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e419:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EJ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e420:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Eo(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,65,68,"call"]},
 e421:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.SO(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e422:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.B9(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e423:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.PN(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Rx(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e424:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sVc(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e425:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.By(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Rd(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e426:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.is(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e427:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.uH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ez(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e428:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ry(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Qd(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e429:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Rd(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e430:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.G7(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e431:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Ez(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sV8(b)},"$2",null,4,0,null,65,68,"call"]},
 e432:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.pq(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e433:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.fa(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.hw(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e434:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Cu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e435:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sip(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.xH(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e436:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EE(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e437:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.hw(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e438:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.EC(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e439:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Hn(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.FH(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e440:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.wu(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e441:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Tx(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,65,68,"call"]},
 e442:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.HT(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,65,68,"call"]},
 e443:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.jq(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ix(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e444:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.o8(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.WU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e445:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sDo(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e446:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sAY(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e447:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.H3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,65,68,"call"]},
 e448:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.TZ(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e449:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.t3(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sQR(b)},"$2",null,4,0,null,65,68,"call"]},
 e450:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.my(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e451:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sVF(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,65,68,"call"]},
 e452:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.La(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.Ja(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e453:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sCY(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.tQ(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e454:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.ZU(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:80;",
+$2:[function(a,b){J.w7(a,b)},"$2",null,4,0,null,65,68,"call"]},
 e455:{
-"^":"TpZ:81;",
-$2:[function(a,b){a.sjW(b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"]},
 e456:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.Fc(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"]},
 e457:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.NH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"]},
 e458:{
-"^":"TpZ:81;",
-$2:[function(a,b){J.tH(a,b)},"$2",null,4,0,null,63,66,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"]},
 e459:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"]},
 e460:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-element",C.Mz)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"]},
 e461:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"]},
 e462:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("any-service-ref",C.R9)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"]},
 e463:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-ref",C.OZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"]},
 e464:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"]},
 e465:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"]},
 e466:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"]},
 e467:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"]},
 e468:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"]},
 e469:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"]},
 e470:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"]},
 e471:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"]},
 e472:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"]},
 e473:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"]},
 e474:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"]},
 e475:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify",C.z7)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"]},
 e476:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"]},
 e477:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"]},
 e478:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"]},
 e479:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"]},
 e480:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("error-ref",C.Bi)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"]},
 e481:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"]},
 e482:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"]},
 e483:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"]},
 e484:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"]},
 e485:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"]},
 e486:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"]},
 e487:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("breakpoint-toggle",C.Nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"]},
 e488:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-page",C.hM)},"$0",null,0,0,null,"call"]},
 e489:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-stack",C.JX)},"$0",null,0,0,null,"call"]},
 e490:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-frame",C.V7)},"$0",null,0,0,null,"call"]},
 e491:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-console",C.Wd)},"$0",null,0,0,null,"call"]},
 e492:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-page",C.hM)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("debugger-input",C.V8)},"$0",null,0,0,null,"call"]},
 e493:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-stack",C.JX)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"]},
 e494:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-frame",C.V7)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"]},
 e495:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-console",C.Wd)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"]},
 e496:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("debugger-input",C.V8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"]},
 e497:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"]},
 e498:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"]},
 e499:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"]},
 e500:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"]},
 e501:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.It)},"$0",null,0,0,null,"call"]},
 e502:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"]},
 e503:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"]},
 e504:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-ref",C.mK)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"]},
 e505:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"]},
 e506:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"]},
 e507:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"]},
 e508:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"]},
 e509:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"]},
 e510:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"]},
 e511:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-list-view",C.IZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"]},
 e512:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"]},
 e513:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"]},
 e514:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"]},
 e515:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"]},
 e516:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"]},
 e517:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"]},
 e518:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"]},
 e519:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"]},
 e520:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"]},
 e521:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"]},
 e522:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"]},
 e523:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"]},
 e524:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"]},
 e525:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"]},
 e526:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"]},
 e527:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"]},
 e528:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"]},
 e529:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("inbound-reference",C.uC)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"]},
 e530:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-common",C.rC)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"]},
 e531:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("context-ref",C.XW)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"]},
 e532:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("instance-view",C.Ke)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"]},
 e533:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"]},
 e534:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"]},
 e535:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-page",C.Fn)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"]},
 e536:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metric-details",C.fU)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"]},
 e537:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("metrics-graph",C.pi)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"]},
 e538:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("object-view",C.kq)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"]},
 e539:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("context-view",C.kH)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"]},
 e540:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"]},
 e541:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"]},
 e542:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"]},
 e543:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"]},
 e544:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"]},
 e545:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"]},
 e546:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("trace-view",C.kt)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"]},
 e547:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("map-viewer",C.u4)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"]},
 e548:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("list-viewer",C.QJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"]},
 e549:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"]},
 e550:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e551:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e552:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e553:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e554:{
-"^":"TpZ:76;",
-$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["","",,B,{
+"^":"r:77;",
+$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"]}},1],["","",,B,{
 "^":"",
 G6:{
-"^":"Vfx;BW,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,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)},
-pA:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,19,102],
-static:{VHR: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.QD.LX(a)
-C.QD.XI(a)
+"^":"Vfx;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grs:function(a){return a.RZ},
+srs:function(a,b){a.RZ=this.ct(a,C.UX,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{t4:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.C8.LX(a)
+C.C8.XI(a)
 return a}}},
 Vfx:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 eW:{
-"^":"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:{vle: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.i3.LX(a)
-C.i3.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{rt:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YZz.LX(a)
+C.YZz.XI(a)
 return a}}}}],["","",,O,{
 "^":"",
-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.ks
+TY:{
+"^":"Y2;od:r>,Ru:x>,Q,a,b,c,d,e,f,cy$,db$",
+Pz:function(){var z,y,x,w,v,u,t
+z=this.b
 if(z.length>0)return
-for(y=this.Ru.gLT(),y=y.gA(y),x=this.od,w=this.yt+1;y.G();){v=y.Ff
+for(y=this.x.gLT(),y=y.gu(y),x=this.r,w=this.a+1;y.D();){v=y.c
 if(v.geh()===!0)continue
 u=[]
 u.$builtinTypeInfo=[G.Y2]
-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;")
+t=new O.TY(x,v,this,w,u,[],"\u2192","cursor: pointer;",!1,null,null)
+if(!t.Nh()){u=t.e
+if(t.gnz(t)&&!J.mG(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)}},
-cO:function(){},
-Nh:function(){return this.Ru.gLT().XG.length>0}},
+t.SZ(t,u)}t.e="visibility:hidden;"}z.push(t)}},
+aY:function(){},
+Nh:function(){return this.x.gLT().b.length>0}},
 eo:{
-"^":"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)},
+"^":"tuj;RZ,Hm:ij=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=R.tB([])
-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","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.CZ(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
+a.ij=new G.iY(z,null,null)
+z=a.RZ
+if(z!=null)this.zc(a,z.gDZ())},
+GU:[function(a,b){a.RZ.WR().ml(new O.nc(a))},"$1","guz",2,0,14,61],
+zc:function(a,b){var z,y,x,w,v,u,t,s,r,q
+try{w=a.RZ
+v=H.J([],[G.Y2])
+u=new O.TY(w,b,null,0,v,[],"\u2192","cursor: pointer;",!1,null,null)
 u.k7(null)
 z=u
-w=J.Mx(z)
-v=a.CA
+w=J.OD(z)
+v=a.RZ
 t=z
-s=H.VM([],[G.Y2])
+s=H.J([],[G.Y2])
 r=t!=null?t.gyt()+1:0
-s=new O.CZ(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
+s=new O.TY(v,b,t,r,s,[],"\u2192","cursor: pointer;",!1,null,null)
 s.k7(t)
 w.push(s)
-a.Hm.G7(z)}catch(q){w=H.Ru(q)
+a.ij.rT(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.oP(q,null)
-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.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+x=new H.XO(q,null)
+N.QM("").r0("_update",y,x)}if(J.mG(J.wS(a.ij.Q),1))a.ij.lo(0)
+this.ct(a,C.ep,null,a.ij)},
+ka:[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.V(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
+if(!J.mG(J.eS(w.gK(b)),"expand")&&!J.mG(w.gK(b),d))return
 z=J.Lp(d)
-if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
+if(!!J.t(z).$isIv)try{w=a.ij
+v=J.JC(z)
+if(typeof v!=="number")return v.T()
 w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(u,null)
-N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,2,106,107],
+x=new H.XO(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,4,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.fe.LX(a)
-C.fe.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.RD.LX(a)
+C.RD.XI(a)
 return a}}},
 tuj:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 nc:{
-"^":"TpZ:12;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,108,"call"],
-$isEH:true}}],["","",,Z,{
+"^":"r:14;Q",
+$1:[function(a){J.FU(this.Q,a)},"$1",null,2,0,null,108,"call"]}}],["","",,Z,{
 "^":"",
 ak:{
-"^":"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="+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],
-m4:[function(a,b){J.y9(a.Wf).wM(b)},"$1","gDX",2,0,19,102],
+"^":"Vct;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRu:function(a){return a.RZ},
+sRu:function(a,b){a.RZ=this.ct(a,C.XA,a.RZ,b)},
+gWt:function(a){return a.ij},
+sWt:function(a,b){a.ij=this.ct(a,C.yB,a.ij,b)},
+gCF:function(a){return a.TQ},
+sCF:function(a,b){a.TQ=this.ct(a,C.tg,a.TQ,b)},
+vV:[function(a,b){return a.RZ.cv("eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,109,110],
+jK:[function(a,b){return a.RZ.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gPe",2,0,111,112],
+Cq:[function(a,b){return a.RZ.cv("retained").ml(new Z.Rc(a))},"$1","ghN",2,0,111,113],
+SK:[function(a,b){a.ij=this.ct(a,C.yB,a.ij,null)
+a.TQ=this.ct(a,C.tg,a.TQ,null)
+J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
 static:{zga: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ka.LX(a)
 C.ka.XI(a)
 return a}}},
 Vct:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 Ob:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.ef=J.NB(z,C.yB,z.ef,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-SS:{
-"^":"TpZ:115;a",
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.yB,z.ij,a)},"$1",null,2,0,null,96,"call"]},
+Rc:{
+"^":"r:115;Q",
 $1:[function(a){var z,y
-z=this.a
-y=H.BU(a.gPE(),null,null)
-z.QI=J.NB(z,C.tg,z.QI,y)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,O,{
+z=this.Q
+y=H.BU(a.gHD(),null,null)
+z.TQ=J.Q5(z,C.tg,z.TQ,y)},"$1",null,2,0,null,96,"call"]}}],["","",,O,{
 "^":"",
 VY:{
-"^":"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","gLe",2,0,12,59],
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtT:function(a){return a.RZ},
+Qj:[function(a,b){this.rb(a,b)
+this.ct(a,C.i4,0,1)},"$1","gBj",2,0,14,61],
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.tWO.LX(a)
 C.tWO.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 Be:{
-"^":"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)},
+"^":"D13;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtT:function(a){return a.RZ},
+stT:function(a,b){a.RZ=this.ct(a,C.i4,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
+this.VM(a)
+z=a.RZ
 if(z==null)return
-J.SK(z).ml(new F.fS())},
-pA:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,19,102],
+J.SK(z).ml(new F.Bc())},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 lE:function(a,b){var z,y,x
-z=J.Vs(b).dA.getAttribute("data-jump-target")
+z=J.Vs(b).Q.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
@@ -5202,164 +4601,161 @@
 return x},
 YI:[function(a,b,c,d){var z=this.lE(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gVb",6,0,116,2,106,107],
+J.pP(z).h(0,"highlight")},"$3","gVb",6,0,116,4,106,107],
 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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,116,4,106,107],
+static:{FeK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ux.LX(a)
 C.ux.XI(a)
 return a}}},
 D13:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-fS:{
-"^":"TpZ:117;",
-$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"],
-$isEH:true}}],["","",,T,{
+Bc:{
+"^":"r:117;",
+$1:[function(a){a.QW()},"$1",null,2,0,null,85,"call"]}}],["","",,T,{
 "^":"",
 uV:{
-"^":"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],
-Po:[function(a,b,c){var z=a.tY
-if(b===!0)J.LE(z).ml(new T.zG(a)).wM(c)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){var z=a.RZ
+if(b===!0)J.LE(z).ml(new T.WW(a)).wM(c)
 else{z.sZ3(null)
-c.$0()}},"$2","gus",4,0,118,119,120],
+c.$0()}},"$2","gNe",4,0,118,119,120],
 static:{CvM: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.vS.LX(a)
 C.vS.XI(a)
 return a}}},
-zG:{
-"^":"TpZ:12;a",
+WW:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.a
+z=this.Q
 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}}],["","",,U,{
+z.RZ=y.ct(z,C.kY,z.RZ,a)
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,U,{
 "^":"",
 NY:{
-"^":"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],
+"^":"WZq;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+geo:function(a){return a.RZ},
+seo:function(a,b){a.RZ=this.ct(a,C.nr,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,122,120],
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.dZE.LX(a)
-C.dZE.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.oS.LX(a)
+C.oS.XI(a)
 return a}}},
 WZq:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true}}],["","",,R,{
 "^":"",
 JI:{
-"^":"SaM;tH,Ot,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.Ot},
-sO9:function(a,b){a.Ot=this.ct(a,C.S4,a.Ot,b)},
-gFR:function(a){return a.nx},
+"^":"SaM;LD,kX,RZ,ij,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+goE:function(a){return a.LD},
+soE:function(a,b){a.LD=this.ct(a,C.mr,a.LD,b)},
+gO9:function(a){return a.kX},
+sO9:function(a,b){a.kX=this.ct(a,C.S4,a.kX,b)},
+gFR:function(a){return a.RZ},
 Ki:function(a){return this.gFR(a).$0()},
 AV:function(a,b,c){return this.gFR(a).$2(b,c)},
-sFR:function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},
-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.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.Ot=this.ct(a,C.S4,a.Ot,!1)},"$0","goJ",0,0,17],
-AZ:[function(a,b,c,d){var z=a.Ot
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+tn:[function(a,b){var z=a.ij
+a.LD=this.ct(a,C.mr,a.LD,z)},"$1","ghy",2,0,20,61],
+Db:[function(a){var z=a.LD
+a.LD=this.ct(a,C.mr,z,z!==!0)
+a.kX=this.ct(a,C.S4,a.kX,!1)},"$0","gN2",0,0,1],
+AZ:[function(a,b,c,d){var z=a.kX
 if(z===!0)return
-if(a.nx!=null){a.Ot=this.ct(a,C.S4,z,!0)
-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.tH=!1
-a.Ot=!1
-a.nx=null
-a.oM=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+if(a.RZ!=null){a.kX=this.ct(a,C.S4,z,!0)
+this.AV(a,a.LD!==!0,this.gN2(a))}else{z=a.LD
+a.LD=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,84,52,55,85],
+static:{fRK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX=!1
+a.RZ=null
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.O0.LX(a)
 C.O0.XI(a)
 return a}}},
 SaM:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,H,{
 "^":"",
 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)
-if(z.C(b,d))for(y=J.bI(z.g(b,e),1),x=J.bI(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.bI(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+if(z.w(b,d))for(y=J.D5(z.g(b,e),1),x=J.D5(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.C(y,b);y=w.T(y,1),x=J.D5(x,1))C.Nm.q(c,x,z.p(a,y))
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.w(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.q(c,x,w.p(a,y))},
 TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
 for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
-if(J.xC(a[z],b))return z}return-1},
-lO:function(a,b,c){var z,y
-if(typeof c!=="number")return c.C()
+if(J.mG(a[z],b))return z}return-1},
+EHn:function(a,b,c){var z,y
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.xC(a[y],b))return y}return-1},
+if(J.mG(a[y],b))return y}return-1},
 ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
 else H.ZD(a,b,c,d)},
 w9:function(a,b,c,d){var z,y,x,w,v
-for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
+for(z=b+1,y=J.U6(a);z<=c;++z){x=y.p(a,z)
 w=z
-while(!0){if(!(w>b&&J.xZ(d.$2(y.t(a,w-1),x),0)))break
+while(!0){if(!(w>b&&J.vU(d.$2(y.p(a,w-1),x),0)))break
 v=w-1
-y.u(a,w,y.t(a,v))
-w=v}y.u(a,w,x)}},
+y.q(a,w,y.p(a,v))
+w=v}y.q(a,w,x)}},
 ZD:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e
 z=C.jn.BU(c-b+1,6)
 y=b+z
@@ -5368,355 +4764,379 @@
 v=w-z
 u=w+z
 t=J.U6(a)
-s=t.t(a,y)
-r=t.t(a,v)
-q=t.t(a,w)
-p=t.t(a,u)
-o=t.t(a,x)
-if(J.xZ(d.$2(s,r),0)){n=r
+s=t.p(a,y)
+r=t.p(a,v)
+q=t.p(a,w)
+p=t.p(a,u)
+o=t.p(a,x)
+if(J.vU(d.$2(s,r),0)){n=r
 r=s
-s=n}if(J.xZ(d.$2(p,o),0)){n=o
+s=n}if(J.vU(d.$2(p,o),0)){n=o
 o=p
-p=n}if(J.xZ(d.$2(s,q),0)){n=q
+p=n}if(J.vU(d.$2(s,q),0)){n=q
 q=s
-s=n}if(J.xZ(d.$2(r,q),0)){n=q
+s=n}if(J.vU(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(s,p),0)){n=p
+r=n}if(J.vU(d.$2(s,p),0)){n=p
 p=s
-s=n}if(J.xZ(d.$2(q,p),0)){n=p
+s=n}if(J.vU(d.$2(q,p),0)){n=p
 p=q
-q=n}if(J.xZ(d.$2(r,o),0)){n=o
+q=n}if(J.vU(d.$2(r,o),0)){n=o
 o=r
-r=n}if(J.xZ(d.$2(r,q),0)){n=q
+r=n}if(J.vU(d.$2(r,q),0)){n=q
 q=r
-r=n}if(J.xZ(d.$2(p,o),0)){n=o
+r=n}if(J.vU(d.$2(p,o),0)){n=o
 o=p
-p=n}t.u(a,y,s)
-t.u(a,w,q)
-t.u(a,x,o)
-t.u(a,v,t.t(a,b))
-t.u(a,u,t.t(a,c))
+p=n}t.q(a,y,s)
+t.q(a,w,q)
+t.q(a,x,o)
+t.q(a,v,t.p(a,b))
+t.q(a,u,t.p(a,c))
 m=b+1
 l=c-1
-if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
+if(J.mG(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.p(a,k)
 i=d.$2(j,r)
-h=J.x(i)
-if(h.n(i,0))continue
-if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
+h=J.t(i)
+if(h.m(i,0))continue
+if(h.w(i,0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else for(;!0;){i=d.$2(t.p(a,l),r)
 h=J.Wx(i)
-if(h.D(i,0)){--l
+if(h.A(i,0)){--l
 continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
+if(h.w(i,0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
 m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+break}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g
-break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.u6(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.xZ(d.$2(j,p),0))for(;!0;)if(J.xZ(d.$2(t.t(a,l),p),0)){--l
+break}}}}e=!0}else{for(k=m;k<=l;++k){j=t.p(a,k)
+if(J.UN(d.$2(j,r),0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else if(J.vU(d.$2(j,p),0))for(;!0;)if(J.vU(d.$2(t.p(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
-if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
+if(J.UN(d.$2(t.p(a,l),r),0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+m=f}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
+t.q(a,b,t.p(a,h))
+t.q(a,h,r)
 h=l+1
-t.u(a,c,t.t(a,h))
-t.u(a,h,p)
+t.q(a,c,t.p(a,h))
+t.q(a,h,p)
 H.ZE(a,b,m-2,d)
 H.ZE(a,l+2,c,d)
 if(e)return
-if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
-for(;J.xC(d.$2(t.t(a,l),p),0);)--l
-for(k=m;k<=l;++k){j=t.t(a,k)
-if(J.xC(d.$2(j,r),0)){if(k!==m){t.u(a,k,t.t(a,m))
-t.u(a,m,j)}++m}else if(J.xC(d.$2(j,p),0))for(;!0;)if(J.xC(d.$2(t.t(a,l),p),0)){--l
+if(m<y&&l>x){for(;J.mG(d.$2(t.p(a,m),r),0);)++m
+for(;J.mG(d.$2(t.p(a,l),p),0);)--l
+for(k=m;k<=l;++k){j=t.p(a,k)
+if(J.mG(d.$2(j,r),0)){if(k!==m){t.q(a,k,t.p(a,m))
+t.q(a,m,j)}++m}else if(J.mG(d.$2(j,p),0))for(;!0;)if(J.mG(d.$2(t.p(a,l),p),0)){--l
 if(l<k)break
 continue}else{g=l-1
-if(J.u6(d.$2(t.t(a,l),r),0)){t.u(a,k,t.t(a,m))
+if(J.UN(d.$2(t.p(a,l),r),0)){t.q(a,k,t.p(a,m))
 f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
+t.q(a,m,t.p(a,l))
+t.q(a,l,j)
 l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
+m=f}else{t.q(a,k,t.p(a,l))
+t.q(a,l,j)
 l=g}break}}H.ZE(a,m,l,d)}else H.ZE(a,m,l,d)},
 aL:{
 "^":"mW;",
-gA:function(a){return H.VM(new H.a7(this,this.gB(this),0,null),[H.W8(this,"aL",0)])},
+gu:function(a){return H.J(new H.a7(this,this.gv(this),0,null),[H.W8(this,"aL",0)])},
 aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
 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)},
-gqG:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
+if(z!==this.gv(this))throw H.b(P.a4(this))}},
+gl0:function(a){return J.mG(this.gv(this),0)},
+gtH:function(a){if(J.mG(this.gv(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.DU())
-return this.Zv(0,J.bI(this.gB(this),1))},
+grZ:function(a){if(J.mG(this.gv(this),0))throw H.b(H.DU())
+return this.Zv(0,J.D5(this.gv(this),1))},
 tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
-for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+for(;y<z;++y){if(J.mG(this.Zv(0,y),b))return!0
+if(z!==this.gv(this))throw H.b(P.a4(this))}return!1},
 Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=0
 for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
+if(z!==this.gv(this))throw H.b(P.a4(this))}return!1},
 zV:function(a,b){var z,y,x,w,v,u
-z=this.gB(this)
-if(b.length!==0){y=J.x(z)
-if(y.n(z,0))return""
+z=this.gv(this)
+if(b.length!==0){y=J.t(z)
+if(y.m(z,0))return""
 x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
+if(!y.m(z,this.gv(this)))throw H.b(P.a4(this))
 w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
+if(typeof z!=="number")return H.o(z)
 v=1
-for(;v<z;++v){w.IN+=b
+for(;v<z;++v){w.Q+=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))}return w.IN}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
+w.Q+=typeof u==="string"?u:H.d(u)
+if(z!==this.gv(this))throw H.b(P.a4(this))}y=w.Q
+return y.charCodeAt(0)==0?y:y}else{w=P.p9("")
+if(typeof z!=="number")return H.o(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))}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:"kY",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},30],
+w.Q+=typeof u==="string"?u:H.d(u)
+if(z!==this.gv(this))throw H.b(P.a4(this))}y=w.Q
+return y.charCodeAt(0)==0?y:y}},
+ev:function(a,b){return this.FX(this,b)},
+ez:[function(a,b){return H.J(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"xP",ret:P.QV,args:[{func:"Py",args:[a]}]}},this.$receiver,"aL")},31],
 es:function(a,b,c){var z,y,x
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
+z=this.gv(this)
+if(typeof z!=="number")return H.o(z)
 y=b
 x=0
 for(;x<z;++x){y=c.$2(y,this.Zv(0,x))
-if(z!==this.gB(this))throw H.b(P.a4(this))}return y},
+if(z!==this.gv(this))throw H.b(P.a4(this))}return y},
 eR:function(a,b){return H.c1(this,b,null,H.W8(this,"aL",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.W8(this,"aL",0)])
-C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
+if(b){z=H.J([],[H.W8(this,"aL",0)])
+C.Nm.sv(z,this.gv(this))}else{y=this.gv(this)
+if(typeof y!=="number")return H.o(y)
 y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.W8(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
+y.fixed$length=Array
+z=H.J(y,[H.W8(this,"aL",0)])}x=0
+while(!0){y=this.gv(this)
+if(typeof y!=="number")return H.o(y)
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y,x
-z=P.Ls(null,null,null,H.W8(this,"aL",0))
+Oe:function(a){var z,y,x
+z=P.fM(null,null,null,H.W8(this,"aL",0))
 y=0
-while(!0){x=this.gB(this)
-if(typeof x!=="number")return H.s(x)
+while(!0){x=this.gv(this)
+if(typeof x!=="number")return H.o(x)
 if(!(y<x))break
 z.h(0,this.Zv(0,y));++y}return z},
 $isyN:true},
 bX:{
-"^":"aL;Hb,ay,Hx",
+"^":"aL;Q,a,b",
 gUD:function(){var z,y
-z=J.q8(this.Hb)
-y=this.Hx
-if(y==null||J.xZ(y,z))return z
+z=J.wS(this.Q)
+y=this.b
+if(y==null||J.vU(y,z))return z
 return y},
-gdM:function(){var z,y
-z=J.q8(this.Hb)
-y=this.ay
-if(J.xZ(y,z))return z
+gAs:function(){var z,y
+z=J.wS(this.Q)
+y=this.a
+if(J.vU(y,z))return z
 return y},
-gB:function(a){var z,y,x
-z=J.q8(this.Hb)
-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.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)},
+gv:function(a){var z,y,x
+z=J.wS(this.Q)
+y=this.a
+if(J.u6(y,z))return 0
+x=this.b
+if(x==null||J.u6(x,z))return J.D5(z,y)
+return J.D5(x,y)},
+Zv:function(a,b){var z=J.WB(this.gAs(),b)
+if(J.UN(b,0)||J.u6(z,this.gUD()))throw H.b(P.Hj(b,this,"index",null,null))
+return J.i9(this.Q,z)},
 eR:function(a,b){var z,y
-if(J.u6(b,0))throw H.b(P.N(b))
-z=J.WB(this.ay,b)
-y=this.Hx
-if(y!=null&&J.J5(z,y)){y=new H.MB()
+if(J.UN(b,0))H.vh(P.ve(b,0,null,"count",null))
+z=J.WB(this.a,b)
+y=this.b
+if(y!=null&&J.u6(z,y)){y=new H.MB()
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}return H.c1(this.Hb,z,y,H.u3(this,0))},
-rh:function(a,b){var z,y,x
-if(b<0)throw H.b(P.N(b))
-z=this.Hx
-y=this.ay
-if(z==null)return H.c1(this.Hb,y,J.WB(y,b),H.u3(this,0))
+return y}return H.c1(this.Q,z,y,H.u3(this,0))},
+qZ:function(a,b){var z,y,x
+if(b<0)H.vh(P.ve(b,0,null,"count",null))
+z=this.b
+y=this.a
+if(z==null)return H.c1(this.Q,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))}},
+if(J.UN(z,x))return this
+return H.c1(this.Q,y,x,H.u3(this,0))}},
+tt:function(a,b){var z,y,x,w,v,u,t,s,r,q
+z=this.a
+y=this.Q
+x=J.U6(y)
+w=x.gv(y)
+v=this.b
+if(v!=null&&J.UN(v,w))w=v
+u=J.D5(w,z)
+if(J.UN(u,0))u=0
+if(b){t=H.J([],[H.u3(this,0)])
+C.Nm.sv(t,u)}else{if(typeof u!=="number")return H.o(u)
+s=Array(u)
+s.fixed$length=Array
+t=H.J(s,[H.u3(this,0)])}if(typeof u!=="number")return H.o(u)
+s=J.rv(z)
+r=0
+for(;r<u;++r){q=x.Zv(y,s.g(z,r))
+if(r>=t.length)return H.e(t,r)
+t[r]=q
+if(J.UN(x.gv(y),w))throw H.b(P.a4(this))}return t},
+br:function(a){return this.tt(a,!0)},
 Hd:function(a,b,c,d){var z,y,x
-z=this.ay
+z=this.a
 y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.Hx
-if(x!=null){if(J.u6(x,0))throw H.b(P.N(x))
-if(y.D(z,x))throw H.b(P.TE(z,0,x))}},
-static:{c1:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
+if(y.w(z,0))H.vh(P.ve(z,0,null,"start",null))
+x=this.b
+if(x!=null){if(J.UN(x,0))H.vh(P.ve(x,0,null,"end",null))
+if(y.A(z,x))throw H.b(P.ve(z,0,x,"start",null))}},
+static:{c1:function(a,b,c,d){var z=H.J(new H.bX(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
-"^":"a;Hb,bd,QX,Ff",
-gl:function(){return this.Ff},
-G:function(){var z,y,x,w
-z=this.Hb
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w
+z=this.Q
 y=J.U6(z)
-x=y.gB(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.Ff=null
-return!1}this.Ff=y.Zv(z,w);++this.QX
+x=y.gv(z)
+if(!J.mG(this.a,x))throw H.b(P.a4(z))
+w=this.b
+if(typeof x!=="number")return H.o(x)
+if(w>=x){this.c=null
+return!1}this.c=y.Zv(z,w);++this.b
 return!0}},
 i1:{
-"^":"mW;Hb,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.Hb),this.Oh)
+"^":"mW;Q,a",
+Mi:function(a){return this.a.$1(a)},
+gu:function(a){var z=new H.MH(null,J.Nx(this.Q),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.Hb)},
-gl0:function(a){return J.FN(this.Hb)},
-gqG:function(a){return this.Mi(J.bT(this.Hb))},
-grZ:function(a){return this.Mi(J.MQ(this.Hb))},
+gv:function(a){return J.wS(this.Q)},
+gl0:function(a){return J.FN(this.Q)},
+gtH:function(a){return this.Mi(J.bP(this.Q))},
+grZ:function(a){return this.Mi(J.rn(this.Q))},
 $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])
-return H.VM(new H.i1(a,b),[c,d])}}},
+static:{fR:function(a,b,c,d){if(!!J.t(a).$isyN)return H.J(new H.xy(a,b),[c,d])
+return H.J(new H.i1(a,b),[c,d])}}},
 xy:{
-"^":"i1;Hb,Oh",
+"^":"i1;Q,a",
 $isyN:true},
 MH:{
-"^":"Anv;Ff,CL,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-G:function(){var z=this.CL
-if(z.G()){this.Ff=this.Mi(z.gl())
-return!0}this.Ff=null
+"^":"Anv;Q,a,b",
+Mi:function(a){return this.b.$1(a)},
+D:function(){var z=this.a
+if(z.D()){this.Q=this.Mi(z.gk())
+return!0}this.Q=null
 return!1},
-gl:function(){return this.Ff},
+gk:function(){return this.Q},
 $asAnv:function(a,b){return[b]}},
 A8:{
-"^":"aL;ON,Oh",
-Mi:function(a){return this.Oh.$1(a)},
-gB:function(a){return J.q8(this.ON)},
-Zv:function(a,b){return this.Mi(J.i9(this.ON,b))},
+"^":"aL;Q,a",
+Mi:function(a){return this.a.$1(a)},
+gv:function(a){return J.wS(this.Q)},
+Zv:function(a,b){return this.Mi(J.i9(this.Q,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 U5:{
-"^":"mW;Hb,Oh",
-gA:function(a){var z=new H.vG(J.mY(this.Hb),this.Oh)
+"^":"mW;Q,a",
+gu:function(a){var z=new H.Mo(J.Nx(this.Q),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-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
+Mo:{
+"^":"Anv;Q,a",
+Mi:function(a){return this.a.$1(a)},
+D:function(){for(var z=this.Q;z.D();)if(this.Mi(z.gk())===!0)return!0
 return!1},
-gl:function(){return this.CL.gl()}},
-oA:{
-"^":"mW;Hb,Oh",
-gA:function(a){var z=new H.yY(J.mY(this.Hb),this.Oh,C.MS,null)
+gk:function(){return this.Q.gk()}},
+Fm:{
+"^":"mW;Q,a",
+gu:function(a){var z=new H.P8(J.Nx(this.Q),this.a,C.MS,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]}},
-yY:{
-"^":"a;CL,Oh,WL,Ff",
-Mi:function(a){return this.Oh.$1(a)},
-gl:function(){return this.Ff},
-G:function(){var z,y
-z=this.WL
+P8:{
+"^":"a;Q,a,b,c",
+Mi:function(a){return this.a.$1(a)},
+gk:function(){return this.c},
+D:function(){var z,y
+z=this.b
 if(z==null)return!1
-for(y=this.CL;!z.G();){this.Ff=null
-if(y.G()){this.WL=null
-z=J.mY(this.Mi(y.gl()))
-this.WL=z}else return!1}this.Ff=this.WL.gl()
+for(y=this.Q;!z.D();){this.c=null
+if(y.D()){this.b=null
+z=J.Nx(this.Mi(y.gk()))
+this.b=z}else return!1}this.c=this.b.gk()
 return!0}},
 AM:{
-"^":"mW;Hb,u3",
-eR:function(a,b){if(b<0)throw H.b(P.N(b))
-return H.ke(this.Hb,this.u3+b,H.u3(this,0))},
-gA:function(a){var z=this.Hb
-z=new H.b2(z.gA(z),this.u3)
+"^":"mW;Q,a",
+eR:function(a,b){var z=this.a
+if(z<0)H.vh(P.ve(z,0,null,"count",null))
+return H.J5(this.Q,z+b,H.u3(this,0))},
+gu:function(a){var z=this.Q
+z=new H.Lh(z.gu(z),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-jb:function(a,b,c){if(this.u3<0)throw H.b(P.KP(this.u3))},
+jb:function(a,b,c){var z=this.a
+if(z<0)H.vh(P.ve(z,0,null,"count",null))},
 static:{ke:function(a,b,c){var z
-if(!!a.$isyN){z=H.VM(new H.wB(a,b),[c])
+if(!!a.$isyN){z=H.J(new H.wB(a,b),[c])
 z.jb(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])
+return z}return H.J5(a,b,c)},J5:function(a,b,c){var z=H.J(new H.AM(a,b),[c])
 z.jb(a,b,c)
 return z}}},
 wB:{
-"^":"AM;Hb,u3",
-gB:function(a){var z,y
-z=this.Hb
-y=J.bI(z.gB(z),this.u3)
-if(J.J5(y,0))return y
+"^":"AM;Q,a",
+gv:function(a){var z,y
+z=this.Q
+y=J.D5(z.gv(z),this.a)
+if(J.u6(y,0))return y
 return 0},
 $isyN:true},
-b2:{
-"^":"Anv;CL,u3",
-G:function(){var z,y
-for(z=this.CL,y=0;y<this.u3;++y)z.G()
-this.u3=0
-return z.G()},
-gl:function(){return this.CL.gl()}},
+Lh:{
+"^":"Anv;Q,a",
+D:function(){var z,y
+for(z=this.Q,y=0;y<this.a;++y)z.D()
+this.a=0
+return z.D()},
+gk:function(){return this.Q.gk()}},
 MB:{
 "^":"mW;",
-gA:function(a){return C.MS},
+gu:function(a){return C.MS},
 aN:function(a,b){},
 gl0:function(a){return!0},
-gB:function(a){return 0},
-gqG:function(a){throw H.b(H.DU())},
+gv:function(a){return 0},
+gtH: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:"Uy",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))
+ev:function(a,b){return this},
+ez:[function(a,b){return C.Ar},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"kY",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"MB")},31],
+eR:function(a,b){if(b<0)H.vh(P.ve(b,0,null,"count",null))
 return this},
 tt:function(a,b){var z
-if(b)z=H.VM([],[H.u3(this,0)])
+if(b)z=H.J([],[H.u3(this,0)])
 else{z=Array(0)
-z.fixed$length=init
-z=H.VM(z,[H.u3(this,0)])}return z},
+z.fixed$length=Array
+z=H.J(z,[H.u3(this,0)])}return z},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){return P.Ls(null,null,null,H.u3(this,0))},
+Oe:function(a){return P.fM(null,null,null,H.u3(this,0))},
 $isyN:true},
 FuS:{
 "^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-wb:{
+D:function(){return!1},
+gk:function(){return}},
+ii:{
 "^":"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.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
+static:{Ck:function(a,b){var z
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)if(b.$1(z.c)===!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.Ff)
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)b=c.$2(b,z.c)
 return b},DQ:function(a,b){var z,y,x,w,v
 z=[]
 y=a.length
@@ -5726,57 +5146,54 @@
 x=a.length
 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])},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
+C.Nm.sv(a,x)
+for(w=0;w<z.length;++w)C.Nm.q(a,w,z[w])},Sz:function(a,b,c){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
 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.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))
-y=J.x(d)
+H.ZE(a,0,a.length-1,b)},qG:function(a,b,c,d,e){var z,y,x,w
+P.iZ(b,c,a.length,null,null,null)
+z=J.D5(c,b)
+if(J.mG(z,0))return
+if(J.UN(e,0))throw H.b(P.p(e))
+y=J.t(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
-H.tb(w,x,a,b,z)},IC:function(a,b,c){var z,y,x,w
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-z=J.x(c)
+x=0}if(J.vU(J.WB(x,z),J.wS(w)))throw H.b(H.ar())
+H.tb(w,x,a,b,z)},FR:function(a,b,c){var z,y,x,w
+P.wA(b,0,a.length,"index",null)
+z=J.t(c)
 if(!z.$isyN)c=z.tt(c,!1)
 z=J.U6(c)
-y=z.gB(c)
+y=z.gv(c)
 x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
+if(typeof y!=="number")return H.o(y)
+C.Nm.sv(a,x+y)
 x=a.length
-if(!!a.immutable$list)H.vh(P.f("set range"))
+C.Nm.uy(a,"set range")
 H.qG(a,b+y,x,a,b)
-for(z=z.gA(c);z.G();b=w){w=b+1
-C.Nm.u(a,b,z.gl())}},h8:function(a,b,c){var z,y
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-for(z=J.mY(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}}}},
+for(z=z.gu(c);z.D();b=w){w=b+1
+C.Nm.q(a,b,z.gk())}},h8:function(a,b,c){var z,y
+P.wA(b,0,a.length,"index",null)
+for(z=J.Nx(c);z.D();b=y){y=b+1
+C.Nm.q(a,b,z.gk())}}}},
 SU7:{
 "^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
+sv: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"))},
-xe:function(a,b,c){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"))},
 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"))}},
-JJ:{
+ReL:{
 "^":"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"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+sv: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"))},
-xe:function(a,b,c){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"))},
 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"))},
@@ -5785,7 +5202,7 @@
 Jd:function(a){return this.GT(a,null)},
 V1:function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 $isWO:true,
 $asWO:null,
@@ -5793,74 +5210,88 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+ReL;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 iK:{
-"^":"aL;ON",
-gB:function(a){return J.q8(this.ON)},
+"^":"aL;Q",
+gv:function(a){return J.wS(this.Q)},
 Zv:function(a,b){var z,y,x
-z=this.ON
+z=this.Q
 y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
+x=y.gv(z)
+if(typeof b!=="number")return H.o(b)
 return y.Zv(z,x-1-b)}},
 tx:{
-"^":"a;OB>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$istx&&J.xC(this.OB,b.OB)},
-giO:function(a){var z=J.v1(this.OB)
-if(typeof z!=="number")return H.s(z)
+"^":"a;OB:Q>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$istx&&J.mG(this.Q,b.Q)},
+giO:function(a){var z=J.v1(this.Q)
+if(typeof z!=="number")return H.o(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.OB)+"\")"},"$0","gCR",0,0,76],
+X:[function(a){return"Symbol(\""+H.d(this.Q)+"\")"},"$0","gCR",0,0,77],
 $istx:true,
 $isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,NpQ,fbV"}}}],["","",,H,{
 "^":"",
-kU:function(a){var z=H.VM(function(b,c){var y=[]
+kU:function(a){var z=H.J(function(b,c){var y=[]
 for(var x in b){if(c.call(b,x))y.push(x)}return y}(a,Object.prototype.hasOwnProperty),[null])
-z.fixed$length=init
+z.fixed$length=Array
 return z}}],["","",,P,{
 "^":"",
 xg:function(){var z,y,x
 z={}
-if(self.scheduleImmediate!=null)return P.vd()
+if(self.scheduleImmediate!=null)return P.Sx()
 if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
 x=self.document.createElement("span")
 z.a=null
 new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
-return new P.ha(z,y,x)}return P.K7()},
-ZV:[function(a){++init.globalState.Xz.kv
-self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
-Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
+return new P.ha(z,y,x)}else if(self.setImmediate!=null)return P.U9()
+return P.K7()},
+ZV:[function(a){++init.globalState.e.a
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,19],
+oA:[function(a){++init.globalState.e.a
+self.setImmediate(H.tR(new P.Ft(a),0))},"$1","U9",2,0,19],
+Bz:[function(a){P.YF(C.RT,a)},"$1","K7",2,0,19],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).Zg(a)
 if(z)return b.O8(a)
 else return b.cR(a)},
-DJ:function(a,b){var z=P.Dt(b)
-P.cH(C.ny,new P.w4(a,z))
+e4Q:function(a,b){var z=H.J(new P.Gc(0,$.X3,null),[b])
+P.cH(C.RT,new P.Sv(a,z))
 return z},
-Ne:function(a,b){var z,y,x,w,v
+Xo:function(a,b,c){var z,y
+a=a!=null?a:new P.LK()
+z=$.X3
+if(z!==C.fQ){y=z.WF(a,b)
+if(y!=null){a=J.w8(y)
+a=a!=null?a:new P.LK()
+b=y.gI4()}}z=H.J(new P.Gc(0,$.X3,null),[c])
+z.Nk(a,b)
+return z},
+hz:function(a,b){var z,y,x,w,v
 z={}
+y=H.J(new P.Gc(0,$.X3,null),[P.WO])
 z.a=null
-z.b=null
-z.c=0
+z.b=0
+z.c=null
 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.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)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
+x=new P.j7(z,b,y)
+for(w=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);w.D();)w.c.Rx(new P.oV(z,b,y,z.b++),x)
+x=z.b
+if(x===0){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(C.xD)
+return z}v=Array(x)
+v.fixed$length=Array
 z.a=v
-return v.MM},
+return y},
+nD:function(a,b,c){var z=$.X3.WF(b,c)
+if(z!=null){b=J.w8(z)
+b=b!=null?b:new P.LK()
+c=z.gI4()}a.ZL(b,c)},
 Cx:function(){var z,y
 for(;z=$.S6,z!=null;){$.mg=null
 y=z.gaw()
@@ -5870,175 +5301,184 @@
 BG:[function(){$.v5=!0
 try{P.Cx()}finally{$.mg=null
 $.v5=!1
-if($.S6!=null)$.zp().$1(P.yK())}},"$0","yK",0,0,17],
+if($.S6!=null)$.zp().$1(P.yK())}},"$0","yK",0,0,1],
+IA:function(a){var z,y
+if($.S6==null){z=new P.OM(a,null)
+$.k8=z
+$.S6=z
+if(!$.v5)$.zp().$1(P.yK())}else{y=new P.OM(a,null)
+$.k8.a=y
+$.k8=y}},
 rb:function(a){var z=$.X3
 if(C.fQ===z){P.ZK(null,null,C.fQ,a)
 return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
-if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=z}return z},
+if(c){z=H.J(new P.zW(b,a,0,null,null,null,null),[d])
+z.d=z
+z.c=z}else{z=H.J(new P.DL(b,a,0,null,null,null,null),[d])
+z.d=z
+z.c=z}return z},
 ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
-if(!!J.x(z).$isb8)return z
+if(!!J.t(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
+x=new H.XO(w,null)
 $.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],
-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
-y=new H.oP(x,null)
-c.$2(z,y)}},
+QEz:[function(a){},"$1","yy",2,0,20,21],
+Z0:[function(a,b){$.X3.hk(a,b)},function(a){return P.Z0(a,null)},null,"$2","$1","bx",2,2,22,23,24,25],
+ax:[function(){},"$0","No",0,0,1],
+FE:function(a,b,c){var z,y,x,w,v,u,t,s
+try{b.$1(a.$0())}catch(u){t=H.Ru(u)
+z=t
+y=new H.XO(u,null)
+x=$.X3.WF(z,y)
+if(x==null)c.$2(z,y)
+else{s=J.w8(x)
+w=s!=null?s:new P.LK()
+v=x.gI4()
+c.$2(w,v)}}},
 NX:function(a,b,c,d){var z=a.Gv()
-if(!!J.x(z).$isb8)z.wM(new P.ap(b,c,d))
+if(!!J.t(z).$isb8)z.wM(new P.ap(b,c,d))
 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.QX(b,c))
-else b.In(c)},
+if(!!J.t(z).$isb8)z.wM(new P.Ry(b,c))
+else b.HH(c)},
+iw:function(a,b,c){var z=$.X3.WF(b,c)
+if(z!=null){b=J.w8(z)
+b=b!=null?b:new P.LK()
+c=z.gI4()}a.UI(b,c)},
 cH:function(a,b){var z
-if(J.xC($.X3,C.fQ))return $.X3.uN(a,b)
+if(J.mG($.X3,C.fQ))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.fQ))return $.X3.Ud(a,b)
+if(J.mG($.X3,C.fQ))return $.X3.lB(a,b)
 z=$.X3
-return z.Ud(a,z.rO(b,!0))},
+return z.lB(a,z.oj(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.zw(z<0?0:z,b)},
+return H.jW(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-Cw:function(a){if(a.geT(a)==null)return
+HM:function(a){if(a.geT(a)==null)return
 return a.geT(a).gyL()},
 CK:[function(a,b,c,d,e){var z,y,x
-z=new P.OM(new P.FO(d,e),null)
-y=$.S6
-if(y==null){$.mg=z
-$.k8=z
-$.S6=z
-if(!$.v5)$.zp().$1(P.yK())}else{x=$.mg
-if(x==null){z.aw=y
-$.mg=z
-$.S6=z}else{z.aw=x.aw
-x.aw=z
-$.mg=z
-if(z.aw==null)$.k8=z}}},"$5","wLZ",10,0,25,26,27,28,23,24],
-Ki:[function(a,b,c,d){var z,y
-if(J.xC($.X3,c))return d.$0()
+z=new P.FO(d,e)
+y=new P.OM(z,null)
+x=$.S6
+if(x==null){P.IA(z)
+$.mg=$.k8}else{z=$.mg
+if(z==null){y.a=x
+$.mg=y
+$.S6=y}else{y.a=z.a
+z.a=y
+$.mg=y
+if(y.a==null)$.k8=y}}},"$5","wLZ",10,0,26,27,28,29,24,25],
+T8:[function(a,b,c,d){var z,y
+if(J.mG($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","qKH",8,0,29,26,27,28,30],
+return y}finally{$.X3=z}},"$4","AIG",8,0,30,27,28,29,31],
 vf:[function(a,b,c,d,e){var z,y
-if(J.xC($.X3,c))return d.$1(e)
+if(J.mG($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","pl",10,0,31,26,27,28,30,32],
+return y}finally{$.X3=z}},"$5","O5z",10,0,32,27,28,29,31,33],
 Mu:[function(a,b,c,d,e,f){var z,y
-if(J.xC($.X3,c))return d.$2(e,f)
+if(J.mG($.X3,c))return d.$2(e,f)
 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],
-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","VbA",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.fQ!==c)d=c.ce(d)
-if($.S6==null){z=new P.OM(d,null)
-$.k8=z
-$.S6=z
-if(!$.v5)$.zp().$1(P.yK())}else{y=new P.OM(d,null)
-$.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.fQ!==c?c.ce(e):e)},"$5","zci",10,0,38,26,27,28,39,40],
-HwS:[function(a,b,c,d,e){return P.dp(d,C.fQ!==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],
-E1:[function(a,b,c,d,e){var z,y
+return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,10,11],
+EeK:[function(a,b,c,d){return d},"$4","eF",8,0,35,27,28,29,31],
+Rt:[function(a,b,c,d){return d},"$4","tLD",8,0,36,27,28,29,31],
+bD:[function(a,b,c,d){return d},"$4","Dkr",8,0,37,27,28,29,31],
+WNs:[function(a,b,c,d,e){return},"$5","vxv",10,0,38,27,28,29,24,25],
+ZK:[function(a,b,c,d){var z=C.fQ!==c
+if(z)d=c.xi(d,!(!z||C.fQ.gF7()===c.gF7()))
+P.IA(d)},"$4","yA",8,0,39,27,28,29,31],
+h8X:[function(a,b,c,d,e){return P.YF(d,C.fQ!==c?c.ce(e):e)},"$5","zci",10,0,40,27,28,29,41,42],
+HwS:[function(a,b,c,d,e){return P.dp(d,C.fQ!==c?c.mS(e):e)},"$5","CDt",10,0,43,27,28,29,41,42],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,44,27,28,29,45],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,46],
+qc:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-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)
+if(d==null)d=C.z3
+else if(!J.t(d).$isyQ)throw H.b(P.p("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.t(c).$ism0?c.goe():P.YM(null,null,null,null,null)
 else{z=P.YM(null,null,null,null,null)
-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],
+z.FV(0,e)}y=new P.l7(null,null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.Ij(c,d,z)
+return y},"$5","Wk",10,0,47,27,28,29,48,49],
 th:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
 H.cv()
-z=this.a
+z=this.Q
 y=z.a
 z.a=null
-y.$0()},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+y.$0()},"$1",null,2,0,null,15,"call"]},
 ha:{
-"^":"TpZ:123;a,b,c",
-$1:function(a){var z,y;++init.globalState.Xz.kv
-this.a.a=a
-z=this.b
-y=this.c
-z.firstChild?z.removeChild(y):z.appendChild(y)},
-$isEH:true},
+"^":"r:123;Q,a,b",
+$1:function(a){var z,y;++init.globalState.e.a
+this.Q.a=a
+z=this.a
+y=this.b
+z.firstChild?z.removeChild(y):z.appendChild(y)}},
 C6:{
-"^":"TpZ:76;a",
+"^":"r:77;Q",
 $0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
+this.Q.$0()},"$0",null,0,0,null,"call"]},
+Ft:{
+"^":"r:77;Q",
+$0:[function(){H.cv()
+this.Q.$0()},"$0",null,0,0,null,"call"]},
 O6:{
-"^":"Ca;kc,I4",
-bu:[function(a){var z,y
-z="Uncaught Error: "+H.d(this.kc)
-y=this.I4
-return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,73],
+"^":"OH;Q,a",
+X:[function(a){var z,y
+z="Uncaught Error: "+H.d(this.Q)
+y=this.a
+return y!=null?z+("\nStack Trace:\n"+H.d(y)):z},"$0","gCR",0,0,0],
 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()
+if(!!J.t(a).$isXS)return a.gI4()
 return}}},
-Ln:{
-"^":"u2;BT"},
-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
+rk:{
+"^":"u2;Q"},
+JIw:{
+"^":"yU4;ru:x@,iE:y@,SJ:z@,r,Q,a,b,c,d,e,f",
+gz3:function(){return this.r},
+uO:function(a){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&1)===a},
-fc:function(){var z=this.ru
-if(typeof z!=="number")return z.w()
-this.ru=z^1},
-gh0:function(){var z=this.ru
+fc:function(){var z=this.x
+if(typeof z!=="number")return z.s()
+this.x=z^1},
+gbn:function(){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&2)!==0},
-Pa:function(){var z=this.ru
-if(typeof z!=="number")return z.k()
-this.ru=z|4},
-gYS:function(){var z=this.ru
+Pa:function(){var z=this.x
+if(typeof z!=="number")return z.j()
+this.x=z|4},
+gKH:function(){var z=this.x
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-jy:[function(){},"$0","gb9",0,0,17],
-ie:[function(){},"$0","gxl",0,0,17],
+lT:[function(){},"$0","gb9",0,0,1],
+ie:[function(){},"$0","gxl",0,0,1],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
-"^":"a;iE@,SJ@",
-gvq:function(a){var z=new P.Ln(this)
+"^":"a;iE:c@,SJ:d@",
+gvq:function(a){var z=new P.rk(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gUF:function(){return!1},
-WH:function(){var z=this.Kj
+gRW:function(){return!1},
+WH:function(){var z=this.f
 if(z!=null)return z
-z=P.Dt(null)
-this.Kj=z
+z=H.J(new P.Gc(0,$.X3,null),[null])
+this.f=z
 return z},
 pW:function(a){var z,y
 z=a.gSJ()
@@ -6048,209 +5488,223 @@
 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.v3()
+if((this.b&4)!==0){if(c==null)c=P.No()
 z=new P.to($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.q1()
 return z}z=$.X3
 y=d?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
+x=new P.JIw(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
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
+x.z=x
+x.y=x
+y=this.d
+x.z=y
+x.y=this
 y.siE(x)
-this.SJ=x
-x.ru=this.YM&1
-if(this.iE===x)P.ot(this.Ld)
+this.d=x
+x.x=this.b&1
+if(this.c===x)P.ot(this.Q)
 return x},
 rR:function(a){if(a.giE()===a)return
-if(a.gh0())a.Pa()
+if(a.gbn())a.Pa()
 else{this.pW(a)
-if((this.YM&2)===0&&this.iE===this)this.hg()}return},
-Pm:function(a){},
-Pl:function(a){},
-Pq:function(){if((this.YM&4)!==0)return new P.lj("Cannot add new events after calling close")
+if((this.b&2)===0&&this.c===this)this.hg()}return},
+EB:function(a){},
+ho:function(a){},
+Pq:function(){if((this.b&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())
+h:[function(a,b){if(this.b>=4)throw H.b(this.Pq())
 this.MW(b)},"$1","ght",2,0,function(){return H.oZ(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},124],
-fDe:[function(a,b){if(this.YM>=4)throw H.b(this.Pq())
-this.y7(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,125,22,23,24],
+fD:[function(a,b){var z
+a=a!=null?a:new P.LK()
+if(this.b>=4)throw H.b(this.Pq())
+z=$.X3.WF(a,b)
+if(z!=null){a=J.w8(z)
+a=a!=null?a:new P.LK()
+b=z.gI4()}this.y7(a,b)},function(a){return this.fD(a,null)},"JT","$2","$1","gXB",2,2,125,23,24,25],
 xO:function(a){var z,y
-z=this.YM
-if((z&4)!==0)return this.Kj
+z=this.b
+if((z&4)!==0)return this.f
 if(z>=4)throw H.b(this.Pq())
-this.YM=z|4
+this.b=z|4
 y=this.WH()
-this.PS()
+this.Dd()
 return y},
 Rg:function(a,b){this.MW(b)},
-MR:function(a,b){this.y7(a,b)},
-AN:function(){var z=this.Hz
-this.Hz=null
-this.YM&=4294967287
+UI:function(a,b){this.y7(a,b)},
+EC:function(){var z=this.e
+this.e=null
+this.b&=4294967287
 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"))
-y=this.iE
+C4:function(a){var z,y,x,w
+z=this.b
+if((z&2)!==0)throw H.b(P.s("Cannot fire new event. Controller is already firing an event"))
+y=this.c
 if(y===this)return
 x=z&1
-this.YM=z^3
+this.b=z^3
 for(;y!==this;)if(y.uO(x)){z=y.gru()
-if(typeof z!=="number")return z.k()
+if(typeof z!=="number")return z.j()
 y.sru(z|2)
 a.$1(y)
 y.fc()
 w=y.giE()
-if(y.gYS())this.pW(y)
+if(y.gKH())this.pW(y)
 z=y.gru()
 if(typeof z!=="number")return z.i()
 y.sru(z&4294967293)
 y=w}else y=y.giE()
-this.YM&=4294967293
-if(this.iE===this)this.hg()},
-hg:function(){if((this.YM&4)!==0&&this.Kj.YM===0)this.Kj.Xf(null)
-P.ot(this.Ro)}},
+this.b&=4294967293
+if(this.c===this)this.hg()},
+hg:function(){if((this.b&4)!==0&&this.f.Q===0)this.f.Xf(null)
+P.ot(this.a)}},
 zW:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
-MW:function(a){var z=this.iE
+"^":"WVu;Q,a,b,c,d,e,f",
+MW:function(a){var z=this.c
 if(z===this)return
-if(z.giE()===this){this.YM|=2
-this.iE.Rg(0,a)
-this.YM&=4294967293
-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.OR(this,a,b))},
-PS:function(){if(this.iE!==this)this.HI(new P.Bg(this))
-else this.Kj.Xf(null)}},
+if(z.giE()===this){this.b|=2
+this.c.Rg(0,a)
+this.b&=4294967293
+if(this.c===this)this.hg()
+return}this.C4(new P.tK(this,a))},
+y7:function(a,b){if(this.c===this)return
+this.C4(new P.hi(this,a,b))},
+Dd:function(){if(this.c!==this)this.C4(new P.Bg(this))
+else this.f.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")}},
-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")}},
+"^":"r;Q,a",
+$1:function(a){a.Rg(0,this.a)},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.Q,"zW")}},
+hi:{
+"^":"r;Q,a,b",
+$1:function(a){a.UI(this.a,this.b)},
+$signature:function(){return H.oZ(function(a){return{func:"KX",args:[[P.KA,a]]}},this.Q,"zW")}},
 Bg:{
-"^":"TpZ;a",
-$1:function(a){a.AN()},
-$isEH:true,
-$signature:function(){return H.oZ(function(a){return{func:"GJ",args:[[P.LR,a]]}},this.a,"zW")}},
+"^":"r;Q",
+$1:function(a){a.EC()},
+$signature:function(){return H.oZ(function(a){return{func:"Zj",args:[[P.JIw,a]]}},this.Q,"zW")}},
 DL:{
-"^":"WVu;Ld,Ro,YM,iE,SJ,Hz,Kj",
+"^":"WVu;Q,a,b,c,d,e,f",
 MW:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
+for(z=this.c;z!==this;z=z.giE()){y=new P.LV(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))},
-PS:function(){var z=this.iE
+for(z=this.c;z!==this;z=z.giE())z.C2(new P.Dn(a,b,null))},
+Dd:function(){var z=this.c
 if(z!==this)for(;z!==this;z=z.giE())z.C2(C.ZB)
-else this.Kj.Xf(null)}},
+else this.f.Xf(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
-"^":"TpZ:76;a,b",
+Sv:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y,x,w
-try{this.b.In(this.a.$0())}catch(x){w=H.Ru(x)
+try{this.a.HH(this.Q.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-this.b.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(x,null)
+P.nD(this.a,z,y)}},"$0",null,0,0,null,"call"]},
 j7:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a,b",
 $2:[function(a,b){var z,y,x
-z=this.a
-y=z.b
-z.b=null
-x=--z.c
-if(y!=null)if(x===0||this.b)z.a.w0(a,b)
-else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,126,127,"call"],
-$isEH:true},
-Tw:{
-"^":"TpZ:128;a,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=--z.c
-x=z.b
-if(x!=null){w=this.d
-if(w<0||w>=x.length)return H.e(x,w)
-x[w]=a
-if(y===0){z=z.a.MM
-if(z.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},
-A0:{
+z=this.Q
+y=z.a
+z.a=null
+x=--z.b
+if(y!=null)if(x===0||this.a)this.b.ZL(a,b)
+else{z.c=a
+z.d=b}else if(x===0&&!this.a)this.b.ZL(z.c,z.d)},"$2",null,4,0,null,126,127,"call"]},
+oV:{
+"^":"r:128;Q,a,b,c",
+$1:[function(a){var z,y,x
+z=this.Q
+y=--z.b
+x=z.a
+if(x!=null){z=this.c
+if(z<0||z>=x.length)return H.e(x,z)
+x[z]=a
+if(y===0)this.b.X2(x)}else if(y===0&&!this.a)this.b.ZL(z.c,z.d)},"$1",null,2,0,null,21,"call"]},
+A5:{
 "^":"a;",
-$isA0:true},
+$isA5:true},
 Pf0:{
 "^":"a;",
-$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)},"dS","$1","$0","gv6",0,2,129,22,20],
 w0:[function(a,b){var z
-if(a==null)throw H.b(P.u("Error must not be null"))
-z=this.MM
-if(z.YM!==0)throw H.b(P.w("Future already completed"))
-z.Nk(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,125,22,23,24]},
+a=a!=null?a:new P.LK()
+if(this.Q.Q!==0)throw H.b(P.s("Future already completed"))
+z=$.X3.WF(a,b)
+if(z!=null){a=J.w8(z)
+a=a!=null?a:new P.LK()
+b=z.gI4()}this.ZL(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,125,23,24,25],
+$isA5:true},
+Zf:{
+"^":"Pf0;Q",
+aM:[function(a,b){var z=this.Q
+if(z.Q!==0)throw H.b(P.s("Future already completed"))
+z.Xf(b)},function(a){return this.aM(a,null)},"dS","$1","$0","gv6",0,2,129,23,21],
+ZL:function(a,b){this.Q.Nk(a,b)}},
+Ia:{
+"^":"a;nV:Q@,yG:a>,b,FR:c>,d",
+Ki:function(a){return this.c.$0()},
+WF:function(a,b){return this.d.$2(a,b)},
+gt9:function(){return this.a.gt9()},
+gUF:function(){return(this.b&1)!==0},
+gLi:function(){return this.b===6},
+gyq:function(){return this.b===8},
+gdU:function(){return this.c},
+gTv:function(){return this.d},
+gp6:function(){return this.c},
+gco:function(){return this.c},
+static:{"^":"zX0,QZl,RVB,BGN,xB6,bXe,nG3,INV,vjM,bOD"}},
 Gc:{
-"^":"a;YM,t9<,O1,nV@,bH?,kO?,bv?,Nw?",
-gnr:function(){return this.YM>=4},
-ga5:function(){return this.YM===4},
-gAT:function(){return this.YM===8},
-sKl:function(a){if(a)this.YM=2
-else this.YM=0},
-gdU:function(){return this.YM===2?null:this.bH},
-gp6:function(){return this.YM===2?null:this.kO},
-gTv:function(){return this.YM===2?null:this.bv},
-gco:function(){return this.YM===2?null:this.Nw},
+"^":"a;Q,t9:a<,b",
+gAT:function(){return this.Q===8},
+sKl:function(a){if(a)this.Q=2
+else this.Q=0},
 Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
-this.xf(y)
-return y},
+z=H.J(new P.Gc(0,$.X3,null),[null])
+y=z.a
+if(y!==C.fQ){a=y.cR(a)
+if(b!=null)b=P.VH(b,y)}y=b==null?1:3
+this.xf(new P.Ia(null,z,y,a,b))
+return z},
 ml:function(a){return this.Rx(a,null)},
-pU:function(a,b){var z,y,x
-z=$.X3
-y=P.VH(a,z)
-x=H.VM(new P.Gc(0,z,null,null,null,$.X3.cR(b),y,null),[null])
-this.xf(x)
-return x},
+pU:function(a,b){var z,y
+z=H.J(new P.Gc(0,$.X3,null),[null])
+y=z.a
+if(y!==C.fQ){a=P.VH(a,y)
+if(b!=null)b=y.cR(b)}y=b==null?2:6
+this.xf(new P.Ia(null,z,y,b,a))
+return z},
 OA:function(a){return this.pU(a,null)},
 wM:function(a){var z,y
 z=$.X3
-y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
+y=new P.Gc(0,z,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-this.xf(y)
+if(z!==C.fQ)a=z.Al(a)
+this.xf(new P.Ia(null,y,8,a,null))
 return y},
-gDL:function(){return this.O1},
-gSt:function(){return this.O1},
-vd:function(a){this.YM=4
-this.O1=a},
-Is:function(a,b){this.YM=8
-this.O1=new P.Ca(a,b)},
-xf:function(a){if(this.YM>=4)this.t9.wr(new P.pS(this,a))
-else{a.snV(this.O1)
-this.O1=a}},
+eY:function(){if(this.Q!==0)throw H.b(P.s("Future already completed"))
+this.Q=1},
+gDL:function(){return this.b},
+gSt:function(){return this.b},
+vd:function(a){this.Q=4
+this.b=a},
+P9:function(a){this.Q=8
+this.b=a},
+Is:function(a,b){this.P9(new P.OH(a,b))},
+xf:function(a){if(this.Q>=4)this.a.wr(new P.pS(this,a))
+else{a.Q=this.b
+this.b=a}},
 ah:function(){var z,y,x
-z=this.O1
-this.O1=null
+z=this.b
+this.b=null
 for(y=null;z!=null;y=z,z=x){x=z.gnV()
 z.snV(y)}return y},
-In:function(a){var z,y
-z=J.x(a)
+HH:function(a){var z,y
+z=J.t(a)
 if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.ah()
@@ -6260,960 +5714,917 @@
 this.vd(a)
 P.HZ(this,z)},
 ZL:[function(a,b){var z=this.ah()
-this.Is(a,b)
-P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,21,22,23,24],
+this.P9(new P.OH(a,b))
+P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,22,23,24,25],
 Xf:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.YM
-if(z>=4&&z===8){if(this.YM!==0)H.vh(P.w("Future already completed"))
-this.YM=1
-this.t9.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.YM!==0)H.vh(P.w("Future already completed"))
-this.YM=1
-this.t9.wr(new P.eX(this,a))},
-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))},
-X8:function(a,b,c){this.Nk(a,b)},
-J9:function(a,b){this.Xf(a)},
+if(a==null);else{z=J.t(a)
+if(!!z.$isb8){if(!!z.$isGc){z=a.Q
+if(z>=4&&z===8){this.eY()
+this.a.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
+return}}this.eY()
+this.a.wr(new P.eX(this,a))},
+Nk:function(a,b){this.eY()
+this.a.wr(new P.ZL(this,a,b))},
 $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},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)
-if(a.YM>=4)P.HZ(a,b)
-else a.xf(b)},yE:function(a,b){var z
-do{z=b.gnV()
-b.snV(null)
-P.HZ(a,b)
-if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
+static:{"^":"ewM,RyO,C3n,oN1,NKU",k3:function(a,b){b.sKl(!0)
+a.Rx(new P.U7(b),new P.VL(b))},A9:function(a,b){var z
+b.sKl(!0)
+z=new P.Ia(null,b,0,null,null)
+if(a.Q>=4)P.HZ(a,z)
+else a.xf(z)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.e=a
 for(y=a;!0;){x={}
-if(!y.gnr())return
-w=z.e.gAT()
-if(w&&b==null){v=z.e.gSt()
-z.e.gt9().hk(J.w8(v),v.gI4())
-return}if(b==null)return
-if(b.gnV()!=null){P.yE(z.e,b)
-return}x.b=!0
-u=z.e.ga5()?z.e.gDL():null
-x.c=u
+w=y.gAT()
+if(b==null){if(w){v=z.e.gSt()
+z.e.gt9().hk(J.w8(v),v.gI4())}return}for(;b.gnV()!=null;b=u){u=b.gnV()
+b.snV(null)
+P.HZ(z.e,b)}x.b=!0
+t=w?null:z.e.gDL()
+x.c=t
 x.d=!1
 y=!w
-if(!y||b.gdU()!=null||b.gco()!=null){t=b.gt9()
-if(w&&!z.e.gt9().fC(t)){v=z.e.gSt()
+if(!y||b.gUF()||b.gyq()){s=b.gt9()
+if(w&&!z.e.gt9().fC(s)){v=z.e.gSt()
 z.e.gt9().hk(J.w8(v),v.gI4())
-return}s=$.X3
-if(s==null?t!=null:s!==t)$.X3=t
-else s=null
-if(y){if(b.gdU()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gco()!=null)new P.RT(z,x,w,b,t).$0()
-if(s!=null)$.X3=s
-b.sbH(null)
-b.skO(null)
-b.sbv(null)
-b.sNw(null)
+return}r=$.X3
+if(r==null?s!=null:r!==s)$.X3=s
+else r=null
+if(y){if(b.gUF())x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
+if(b.gyq())new P.YP(z,x,w,b,s).$0()
+if(r!=null)$.X3=r
 if(x.d)return
 if(x.b===!0){y=x.c
-y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
-if(y){r=x.c
-if(!!J.x(r).$isGc)if(r.YM>=4){b.sKl(!0)
-z.e=r
-y=r
-continue}else P.A9(r,b)
-else P.k3(r,b)
-return}}if(x.b===!0){q=b.ah()
-b.vd(x.c)}else{q=b.ah()
-v=x.c
-b.Is(J.w8(v),v.gI4())}z.e=b
-y=b
-b=q}}}},
+y=(t==null?y!=null:t!==y)&&!!J.t(y).$isb8}else y=!1
+if(y){q=x.c
+p=J.uW(b)
+if(!!J.t(q).$isGc)if(q.Q>=4){p.sKl(!0)
+z.e=q
+b=new P.Ia(null,p,0,null,null)
+y=q
+continue}else P.A9(q,p)
+else P.k3(q,p)
+return}}p=J.uW(b)
+b=p.ah()
+y=x.b
+x=x.c
+if(y===!0)p.vd(x)
+else p.P9(x)
+z.e=p
+y=p}}}},
 pS:{
-"^":"TpZ:76;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){P.HZ(this.Q,this.a)},"$0",null,0,0,null,"call"]},
 U7:{
-"^":"TpZ:12;a",
-$1:[function(a){this.a.X2(a)},"$1",null,2,0,null,20,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){this.Q.X2(a)},"$1",null,2,0,null,21,"call"]},
 VL:{
-"^":"TpZ:130;b",
-$2:[function(a,b){this.b.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
-$isEH:true},
+"^":"r:130;Q",
+$2:[function(a,b){this.Q.ZL(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"]},
 cX:{
-"^":"TpZ:76;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){P.A9(this.a,this.Q)},"$0",null,0,0,null,"call"]},
 eX:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.c.X2(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.Q.X2(this.a)},"$0",null,0,0,null,"call"]},
 ZL:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){this.Q.ZL(this.a,this.b)},"$0",null,0,0,null,"call"]},
 rq:{
-"^":"TpZ:131;b,d,e,f",
+"^":"r:131;Q,a,b,c",
 $0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gdU(),this.e)
+try{this.Q.c=this.c.FI(this.a.gdU(),this.b)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-this.b.c=new P.Ca(z,y)
-return!1}},
-$isEH:true},
+y=new H.XO(x,null)
+this.Q.c=new P.OH(z,y)
+return!1}}},
 RW:{
-"^":"TpZ:17;c,b,UI,bK",
+"^":"r:1;Q,a,b,c",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.c.e.gSt()
-r=this.UI
-y=r.gp6()
-x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+z=this.Q.e.gSt()
+y=!0
+r=this.b
+if(r.gLi()){x=r.gp6()
+try{y=this.c.FI(x,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.oP(q,null)
+v=new H.XO(q,null)
 r=J.w8(z)
 p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
+o=(r==null?p==null:r===p)?z:new P.OH(w,v)
+r=this.a
 r.c=o
 r.b=!1
-return}u=r.gTv()
-if(x===!0&&u!=null){try{r=u
+return}}u=r.gTv()
+if(y===!0&&u!=null){try{r=u
 p=H.G3()
 p=H.KT(p,[p,p]).Zg(r)
-n=this.bK
-m=this.b
+n=this.c
+m=this.a
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.oP(q,null)
+s=new H.XO(q,null)
 r=J.w8(z)
 p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
-r=this.b
+o=(r==null?p==null:r===p)?z:new P.OH(t,s)
+r=this.a
 r.c=o
 r.b=!1
-return}this.b.b=!0}else{r=this.b
+return}this.a.b=!0}else{r=this.a
 r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"TpZ:17;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
+r.b=!1}}},
+YP:{
+"^":"r:1;Q,a,b,c,d",
+$0:function(){var z,y,x,w,v,u,t
 z={}
 z.a=null
-try{z.a=this.w3.Gr(this.Rm.gco())}catch(w){v=H.Ru(w)
-y=v
-x=new H.oP(w,null)
-if(this.Gq){v=J.w8(this.c.e.gSt())
-u=y
-u=v==null?u==null:v===u
-v=u}else v=!1
-u=this.b
-if(v)u.c=this.c.e.gSt()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.sKl(!0)
-this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.ez(z,v))}},
-$isEH:true},
+try{w=this.d.Gr(this.c.gco())
+z.a=w
+v=w}catch(u){z=H.Ru(u)
+y=z
+x=new H.XO(u,null)
+if(this.b){z=J.w8(this.Q.e.gSt())
+v=y
+v=z==null?v==null:z===v
+z=v}else z=!1
+v=this.a
+if(z)v.c=this.Q.e.gSt()
+else v.c=new P.OH(y,x)
+v.b=!1
+return}if(!!J.t(v).$isb8){t=J.uW(this.c)
+t.sKl(!0)
+this.a.d=!0
+z.a.Rx(new P.jZ(this.Q,t),new P.ez(z,t))}}},
 jZ:{
-"^":"TpZ:12;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,132,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){P.HZ(this.Q.e,new P.Ia(null,this.a,0,null,null))},"$1",null,2,0,null,132,"call"]},
 ez:{
-"^":"TpZ:130;a,mG",
+"^":"r:130;Q,a",
 $2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){y=P.Dt(null)
+z=this.Q
+if(!J.t(z.a).$isGc){y=H.J(new P.Gc(0,$.X3,null),[null])
 z.a=y
-y.Is(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
-$isEH:true},
+y.Is(a,b)}P.HZ(z.a,new P.Ia(null,this.a,0,null,null))},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"]},
 OM:{
-"^":"a;FR>,aw@",
-Ki:function(a){return this.FR.$0()}},
-wS:{
+"^":"a;FR:Q>,aw:a@",
+Ki:function(a){return this.Q.$0()}},
+cb:{
 "^":"a;",
-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],
+ev:function(a,b){return H.J(new P.fk(b,this),[H.W8(this,"cb",0)])},
+ez:[function(a,b){return H.J(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],
+Ft:[function(a,b){return H.J(new P.Bgk(b,this),[H.W8(this,"cb",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},133],
 zV:function(a,b){var z,y,x
 z={}
-y=P.Dt(P.qU)
+y=H.J(new P.Gc(0,$.X3,null),[P.I])
 x=P.p9("")
 z.a=null
 z.b=!0
-z.a=this.KR(new P.dW3(z,this,b,y,x),!0,new P.Lp0(y,x),new P.QCh(y))
+z.a=this.X5(new P.QC(z,this,b,y,x),!0,new P.Rv(y,x),new P.Xr(y))
 return y},
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.DO(y),y.gFa())
+z.a=this.X5(new P.Sd(z,this,b,y),!0,new P.tG(y),y.gFa())
 return y},
 aN:function(a,b){var z,y
 z={}
-y=P.Dt(null)
+y=H.J(new P.Gc(0,$.X3,null),[null])
 z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
+z.a=this.X5(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gFa())
+z.a=this.X5(new P.BSd(z,this,b,y),!0,new P.dyj(y),y.gFa())
 return y},
-gB:function(a){var z,y
+gv:function(a){var z,y
 z={}
-y=P.Dt(P.KN)
+y=H.J(new P.Gc(0,$.X3,null),[P.KN])
 z.a=0
-this.KR(new P.PI(z),!0,new P.hh(z,y),y.gFa())
+this.X5(new P.B5(z),!0,new P.PI(z,y),y.gFa())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(P.SQ)
+y=H.J(new P.Gc(0,$.X3,null),[P.SQ])
 z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Da(y),y.gFa())
+z.a=this.X5(new P.qg(z,y),!0,new P.Da(y),y.gFa())
 return y},
 br:function(a){var z,y
-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())
+z=H.J([],[H.W8(this,"cb",0)])
+y=H.J(new P.Gc(0,$.X3,null),[[P.WO,H.W8(this,"cb",0)]])
+this.X5(new P.lv(this,z),!0,new P.VVy(z,y),y.gFa())
 return y},
-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())
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(this,"cb",0))
+y=H.J(new P.Gc(0,$.X3,null),[[P.Ol,H.W8(this,"cb",0)]])
+this.X5(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.mh(this,b,null)
+eR:function(a,b){var z=H.J(new P.pt(b,this),[null])
+z.qI(this,b,null)
 return z},
-gqG:function(a){var z,y
+gtH:function(a){var z,y
 z={}
-y=P.Dt(H.W8(this,"wS",0))
+y=H.J(new P.Gc(0,$.X3,null),[H.W8(this,"cb",0)])
 z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.xp(y),y.gFa())
+z.a=this.X5(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,"wS",0))
+y=H.J(new P.Gc(0,$.X3,null),[H.W8(this,"cb",0)])
 z.a=null
 z.b=!1
-this.KR(new P.UH(z,this),!0,new P.eI(z,y),y.gFa())
+this.X5(new P.UH(z,this),!0,new P.V9(z,y),y.gFa())
 return y},
-$iswS:true},
-dW3:{
-"^":"TpZ;a,b,c,d,e",
-$1:[function(a){var z,y,x,w,v
-x=this.a
-if(!x.b)this.e.KF(this.c)
+$iscb:true},
+QC:{
+"^":"r;Q,a,b,c,d",
+$1:[function(a){var z,y,x,w,v,u,t,s
+x=this.Q
+if(!x.b)this.d.KF(this.b)
 x.b=!1
-try{this.e.KF(a)}catch(w){v=H.Ru(w)
+try{this.d.KF(a)}catch(w){v=H.Ru(w)
 z=v
-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,"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(){this.UI.In(this.bK.IN)},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(w,null)
+x=x.a
+u=z
+t=y
+s=$.X3.WF(u,t)
+if(s!=null){u=J.w8(s)
+u=u!=null?u:new P.LK()
+t=s.gI4()}P.NX(x,this.c,u,t)}},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Xr:{
+"^":"r:14;Q",
+$1:[function(a){this.Q.yk(a)},"$1",null,2,0,null,4,"call"]},
+Rv:{
+"^":"r:77;Q,a",
+$0:[function(){var z=this.a.Q
+this.Q.HH(z.charCodeAt(0)==0?z:z)},"$0",null,0,0,null,"call"]},
 Sd:{
-"^":"TpZ;a,b,c,d",
+"^":"r;Q,a,b,c",
 $1:[function(a){var z,y
-z=this.a
-y=this.d
-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,"wS")}},
-LB:{
-"^":"TpZ:76;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-z2:{
-"^":"TpZ:135;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-DO:{
-"^":"TpZ:76;bK",
-$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
+z=this.Q
+y=this.c
+P.FE(new P.jv(this.b,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+jv:{
+"^":"r:77;Q,a",
+$0:function(){return J.mG(this.a,this.Q)}},
+bi:{
+"^":"r:135;Q,a",
+$1:function(a){if(a===!0)P.Bb(this.Q.a,this.a,!0)}},
+tG:{
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!1)},"$0",null,0,0,null,"call"]},
 lz:{
-"^":"TpZ;a,b,c,d",
-$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,"wS")}},
-Rl:{
-"^":"TpZ:76;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
+"^":"r;Q,a,b,c",
+$1:[function(a){P.FE(new P.Jb(this.b,a),new P.at(),P.TB(this.Q.a,this.c))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+Jb:{
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
 at:{
-"^":"TpZ:12;",
-$1:function(a){},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){}},
 M4:{
-"^":"TpZ:76;UI",
-$0:[function(){this.UI.In(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ee:{
-"^":"TpZ;a,b,c,d",
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(null)},"$0",null,0,0,null,"call"]},
+BSd:{
+"^":"r;Q,a,b,c",
 $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,"wS")}},
-WN:{
-"^":"TpZ:76;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
+z=this.Q
+y=this.c
+P.FE(new P.XPB(this.b,a),new P.h7d(z,y),P.TB(z.a,y))},"$1",null,2,0,null,134,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 XPB:{
-"^":"TpZ:135;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-Ia:{
-"^":"TpZ:76;bK",
-$0:[function(){this.bK.In(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:function(){return this.Q.$1(this.a)}},
+h7d:{
+"^":"r:135;Q,a",
+$1:function(a){if(a===!0)P.Bb(this.Q.a,this.a,!0)}},
+dyj:{
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!1)},"$0",null,0,0,null,"call"]},
+B5:{
+"^":"r:14;Q",
+$1:[function(a){++this.Q.a},"$1",null,2,0,null,15,"call"]},
 PI:{
-"^":"TpZ:12;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-hh:{
-"^":"TpZ:76;a,b",
-$0:[function(){this.b.In(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q.a)},"$0",null,0,0,null,"call"]},
 qg:{
-"^":"TpZ:12;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){P.Bb(this.Q.a,this.a,!1)},"$1",null,2,0,null,15,"call"]},
 Da:{
-"^":"TpZ:76;c",
-$0:[function(){this.c.In(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.HH(!0)},"$0",null,0,0,null,"call"]},
 lv:{
-"^":"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,"wS")}},
-Ul:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r;Q,a",
+$1:[function(a){this.a.push(a)},"$1",null,2,0,null,124,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.Q,"cb")}},
+VVy:{
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q)},"$0",null,0,0,null,"call"]},
 oY:{
-"^":"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,"wS")}},
+"^":"r;Q,a",
+$1:[function(a){this.a.h(0,a)},"$1",null,2,0,null,124,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.Q,"cb")}},
 yZ:{
-"^":"TpZ:76;c,d",
-$0:[function(){this.d.In(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){this.a.HH(this.Q)},"$0",null,0,0,null,"call"]},
 lU:{
-"^":"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,"wS")}},
+"^":"r;Q,a,b",
+$1:[function(a){P.Bb(this.Q.a,this.b,a)},"$1",null,2,0,null,21,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
 xp:{
-"^":"TpZ:76;d",
+"^":"r:77;Q",
 $0:[function(){var z,y,x,w
 try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-this.d.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
+y=new H.XO(w,null)
+P.nD(this.Q,z,y)}},"$0",null,0,0,null,"call"]},
 UH:{
-"^":"TpZ;a,b",
-$1:[function(a){var z=this.a
+"^":"r;Q,a",
+$1:[function(a){var z=this.Q
 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,"wS")}},
-eI:{
-"^":"TpZ:76;a,c",
+z.a=a},"$1",null,2,0,null,21,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"Pw",args:[a]}},this.a,"cb")}},
+V9:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y,x,w
-x=this.a
-if(x.b){this.c.In(x.a)
+x=this.Q
+if(x.b){this.a.HH(x.a)
 return}try{x=H.DU()
 throw H.b(x)}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
-this.c.ZL(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-MO:{
+y=new H.XO(w,null)
+P.nD(this.a,z,y)}},"$0",null,0,0,null,"call"]},
+yX:{
 "^":"a;",
-$isMO:true},
+$isyX:true},
 u2:{
 "^":"ezY;",
-k0:function(a,b,c,d){return this.BT.MI(a,b,c,d)},
-giO:function(a){return(H.wP(this.BT)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
+w3:function(a,b,c,d){return this.Q.MI(a,b,c,d)},
+giO:function(a){return(H.eQ(this.Q)^892482866)>>>0},
+m:function(a,b){if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isu2)return!1
-return b.BT===this.BT},
+if(!J.t(b).$isu2)return!1
+return b.Q===this.Q},
 $isu2:true},
-Bx:{
-"^":"KA;BT<",
-cZ:function(){return this.gBT().rR(this)},
-jy:[function(){this.gBT().Pm(this)},"$0","gb9",0,0,17],
-ie:[function(){this.gBT().Pl(this)},"$0","gxl",0,0,17]},
+yU4:{
+"^":"KA;z3:r<",
+cZ:function(){return this.gz3().rR(this)},
+lT:[function(){this.gz3().EB(this)},"$0","gb9",0,0,1],
+ie:[function(){this.gz3().ho(this)},"$0","gxl",0,0,1]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;dB,Tv<,EU,t9<,YM,Qe,fk",
+"^":"a;Q,Tv:a<,b,t9:c<,d,e,f",
 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
+this.a=P.VH(b,this.c)},
+Fv:[function(a,b){var z=this.d
 if((z&8)!==0)return
-this.YM=(z+128|4)>>>0
-if(b!=null)b.wM(this.gDQ(this))
-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
+this.d=(z+128|4)>>>0
+if(b!=null)b.wM(this.gbY(this))
+if(z<128&&this.f!=null)this.f.IO()
+if((z&4)===0&&(this.d&32)===0)this.Ge(this.gb9())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+QE:[function(a){var z=this.d
 if((z&8)!==0)return
 if(z>=128){z-=128
-this.YM=z
-if(z<128){if((z&64)!==0){z=this.fk
+this.d=z
+if(z<128){if((z&64)!==0){z=this.f
 z=!z.gl0(z)}else z=!1
-if(z)this.fk.t2(this)
-else{z=(this.YM&4294967291)>>>0
-this.YM=z
-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
+if(z)this.f.t2(this)
+else{z=(this.d&4294967291)>>>0
+this.d=z
+if((z&32)===0)this.Ge(this.gxl())}}}},"$0","gbY",0,0,1],
+Gv:function(){var z=(this.d&4294967279)>>>0
+this.d=z
+if((z&8)!==0)return this.e
 this.WN()
-return this.Qe},
-gUF:function(){return this.YM>=128},
-WN:function(){var z=(this.YM|8)>>>0
-this.YM=z
-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
+return this.e},
+gRW:function(){return this.d>=128},
+WN:function(){var z=(this.d|8)>>>0
+this.d=z
+if((z&64)!==0)this.f.IO()
+if((this.d&32)===0)this.f=null
+this.e=this.cZ()},
+Rg:["l5",function(a,b){var z=this.d
 if((z&8)!==0)return
 if(z<32)this.MW(b)
-else this.C2(H.VM(new P.fZ(b,null),[null]))},
-MR:function(a,b){var z=this.YM
+else this.C2(H.J(new P.LV(b,null),[null]))}],
+UI:["VG",function(a,b){var z=this.d
 if((z&8)!==0)return
 if(z<32)this.y7(a,b)
-else this.C2(new P.Dn(a,b,null))},
-AN:function(){var z=this.YM
+else this.C2(new P.Dn(a,b,null))}],
+EC:function(){var z=this.d
 if((z&8)!==0)return
 z=(z|2)>>>0
-this.YM=z
-if(z<32)this.PS()
+this.d=z
+if(z<32)this.Dd()
 else this.C2(C.ZB)},
-jy:[function(){},"$0","gb9",0,0,17],
-ie:[function(){},"$0","gxl",0,0,17],
+lT:[function(){},"$0","gb9",0,0,1],
+ie:[function(){},"$0","gxl",0,0,1],
 cZ:function(){return},
 C2:function(a){var z,y
-z=this.fk
+z=this.f
 if(z==null){z=new P.Qk(null,null,0)
-this.fk=z}z.h(0,a)
-y=this.YM
+this.f=z}z.h(0,a)
+y=this.d
 if((y&64)===0){y=(y|64)>>>0
-this.YM=y
-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.d=y
+if(y<128)this.f.t2(this)}},
+MW:function(a){var z=this.d
+this.d=(z|32)>>>0
+this.c.m1(this.Q,a)
+this.d=(this.d&4294967263)>>>0
 this.Iy((z&4)!==0)},
 y7:function(a,b){var z,y
-z=this.YM
-y=new P.Vo(this,a,b)
-if((z&1)!==0){this.YM=(z|16)>>>0
+z=this.d
+y=new P.x1(this,a,b)
+if((z&1)!==0){this.d=(z|16)>>>0
 this.WN()
-z=this.Qe
-if(!!J.x(z).$isb8)z.wM(y)
+z=this.e
+if(!!J.t(z).$isb8)z.wM(y)
 else y.$0()}else{y.$0()
 this.Iy((z&4)!==0)}},
-PS:function(){var z,y
+Dd: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)
+this.d=(this.d|16)>>>0
+y=this.e
+if(!!J.t(y).$isb8)y.wM(z)
 else z.$0()},
-Ge:function(a){var z=this.YM
-this.YM=(z|32)>>>0
+Ge:function(a){var z=this.d
+this.d=(z|32)>>>0
 a.$0()
-this.YM=(this.YM&4294967263)>>>0
+this.d=(this.d&4294967263)>>>0
 this.Iy((z&4)!==0)},
 Iy:function(a){var z,y
-if((this.YM&64)!==0){z=this.fk
+if((this.d&64)!==0){z=this.f
 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.fk
+if(z){z=(this.d&4294967231)>>>0
+this.d=z
+if((z&4)!==0)if(z<128){z=this.f
 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.fk=null
+if(z)this.d=(this.d&4294967291)>>>0}for(;!0;a=y){z=this.d
+if((z&8)!==0){this.f=null
 return}y=(z&4)!==0
 if(a===y)break
-this.YM=(z^32)>>>0
-if(y)this.jy()
+this.d=(z^32)>>>0
+if(y)this.lT()
 else this.ie()
-this.YM=(this.YM&4294967263)>>>0}z=this.YM
-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.d=(this.d&4294967263)>>>0}z=this.d
+if((z&64)!==0&&z<128)this.f.t2(this)},
+Cy:function(a,b,c,d,e){var z=this.c
+this.Q=z.cR(a)
 this.fm(0,b)
-this.EU=z.Al(c==null?P.v3():c)},
-$isMO:true,
-static:{"^":"Xx,kMJ,Q9e,Ir9,nav,lkp,JAK,N3S,bsZ",MG:function(a,b,c,d,e){var z,y
+this.b=z.Al(c==null?P.No():c)},
+$isyX:true,
+static:{"^":"Xx,kMJ,Q9e,Ir9,nav,Dr,JAK,N3S,bsZ",T6: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])
+y=H.J(new P.KA(null,null,null,z,y,null,null),[e])
 y.Cy(a,b,c,d,e)
 return y}}},
-Vo:{
-"^":"TpZ:17;a,b,c",
+x1:{
+"^":"r:1;Q,a,b",
 $0:[function(){var z,y,x,w,v,u
-z=this.a
-y=z.YM
+z=this.Q
+y=z.d
 if((y&8)!==0&&(y&16)===0)return
-z.YM=(y|32)>>>0
-y=z.Tv
+z.d=(y|32)>>>0
+y=z.a
 x=H.G3()
 x=H.KT(x,[x,x]).Zg(y)
-w=z.t9
-v=this.b
-u=z.Tv
-if(x)w.z8(u,v,this.c)
+w=z.c
+v=this.a
+u=z.a
+if(x)w.z8(u,v,this.b)
 else w.m1(u,v)
-z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.d=(z.d&4294967263)>>>0},"$0",null,0,0,null,"call"]},
 qB:{
-"^":"TpZ:17;a",
+"^":"r:1;Q",
 $0:[function(){var z,y
-z=this.a
-y=z.YM
+z=this.Q
+y=z.d
 if((y&16)===0)return
-z.YM=(y|42)>>>0
-z.t9.ww(z.EU)
-z.YM=(z.YM&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.d=(y|42)>>>0
+z.c.bH(z.b)
+z.d=(z.d&4294967263)>>>0},"$0",null,0,0,null,"call"]},
 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.MG(a,b,c,d,H.u3(this,0))}},
+"^":"cb;",
+X5:function(a,b,c,d){return this.w3(a,d,c,!0===b)},
+yI:function(a){return this.X5(a,null,null,null)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+w3:function(a,b,c,d){return P.T6(a,b,c,d,H.u3(this,0))}},
 fIm:{
-"^":"a;aw@"},
-fZ:{
-"^":"fIm;P>,aw",
-dP:function(a){a.MW(this.P)}},
+"^":"a;aw:Q@"},
+LV:{
+"^":"fIm;M:a>,Q",
+dP:function(a){a.MW(this.a)}},
 Dn:{
-"^":"fIm;kc>,I4<,aw",
-dP:function(a){a.y7(this.kc,this.I4)}},
+"^":"fIm;kc:a>,I4:b<,Q",
+dP:function(a){a.y7(this.a,this.b)}},
 yRf:{
 "^":"a;",
-dP:function(a){a.PS()},
+dP:function(a){a.Dd()},
 gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
+saw:function(a){throw H.b(P.s("No events after a done."))}},
 B3P:{
 "^":"a;",
-t2:function(a){var z=this.YM
+t2:function(a){var z=this.Q
 if(z===1)return
-if(z>=1){this.YM=1
-return}P.rb(new P.CR(this,a))
-this.YM=1},
-IO:function(){if(this.YM===1)this.YM=3}},
-CR:{
-"^":"TpZ:76;a,b",
+if(z>=1){this.Q=1
+return}P.rb(new P.lg(this,a))
+this.Q=1},
+IO:function(){if(this.Q===1)this.Q=3}},
+lg:{
+"^":"r:77;Q,a",
 $0:[function(){var z,y
-z=this.a
-y=z.YM
-z.YM=0
+z=this.Q
+y=z.Q
+z.Q=0
 if(y===3)return
-z.vG(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+z.vG(this.a)},"$0",null,0,0,null,"call"]},
 Qk:{
-"^":"B3P;zR,N6,YM",
-gl0:function(a){return this.N6==null},
-h:function(a,b){var z=this.N6
-if(z==null){this.N6=b
-this.zR=b}else{z.saw(b)
-this.N6=b}},
+"^":"B3P;a,b,Q",
+gl0:function(a){return this.b==null},
+h:function(a,b){var z=this.b
+if(z==null){this.b=b
+this.a=b}else{z.saw(b)
+this.b=b}},
 vG:function(a){var z,y
-z=this.zR
+z=this.a
 y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
+this.a=y
+if(y==null)this.b=null
 z.dP(a)},
-V1:function(a){if(this.YM===1)this.YM=3
-this.N6=null
-this.zR=null}},
+V1:function(a){if(this.Q===1)this.Q=3
+this.b=null
+this.a=null}},
 to:{
-"^":"a;t9<,YM,EU",
-gUF:function(){return this.YM>=4},
-q1:function(){if((this.YM&2)!==0)return
-this.t9.wr(this.gKS())
-this.YM=(this.YM|2)>>>0},
+"^":"a;t9:Q<,a,b",
+gRW:function(){return this.a>=4},
+q1:function(){if((this.a&2)!==0)return
+this.Q.wr(this.gLu())
+this.a=(this.a|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)},"WJ","$1","$0","gX0",0,2,136,22,137],
-QE:[function(a){var z=this.YM
+Fv:[function(a,b){this.a+=4
+if(b!=null)b.wM(this.gbY(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+QE:[function(a){var z=this.a
 if(z>=4){z-=4
-this.YM=z
-if(z<4&&(z&1)===0)this.q1()}},"$0","gDQ",0,0,17],
+this.a=z
+if(z<4&&(z&1)===0)this.q1()}},"$0","gbY",0,0,1],
 Gv:function(){return},
-PS:[function(){var z=(this.YM&4294967293)>>>0
-this.YM=z
+Dd:[function(){var z=(this.a&4294967293)>>>0
+this.a=z
 if(z>=4)return
-this.YM=(z|1)>>>0
-z=this.EU
-if(z!=null)this.t9.ww(z)},"$0","gKS",0,0,17],
-$isMO:true,
+this.a=(z|1)>>>0
+this.Q.bH(this.b)},"$0","gLu",0,0,1],
+$isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 ap:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){return this.a.ZL(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return this.Q.ZL(this.a,this.b)},"$0",null,0,0,null,"call"]},
 uR:{
-"^":"TpZ:138;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-QX:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.In(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w
+"^":"r:138;Q,a",
+$2:function(a,b){return P.NX(this.Q,this.a,a,b)}},
+Ry:{
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.HH(this.a)},"$0",null,0,0,null,"call"]},
+YR:{
+"^":"cb;",
+X5:function(a,b,c,d){var z,y,x,w
 b=!0===b
-z=H.W8(this,"og",0)
-y=H.W8(this,"og",1)
+z=H.W8(this,"YR",0)
+y=H.W8(this,"YR",1)
 x=$.X3
 w=b?1:0
-w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w=H.J(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
 w.Cy(a,d,c,b,y)
 w.JC(this,a,d,c,b,z,y)
 return w},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)},
 FC:function(a,b){b.Rg(0,a)},
-$aswS:function(a,b){return[b]}},
+$ascb:function(a,b){return[b]}},
 fB:{
-"^":"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
+"^":"KA;r,x,Q,a,b,c,d,e,f",
+Rg:function(a,b){if((this.d&2)!==0)return
+this.l5(this,b)},
+UI:function(a,b){if((this.d&2)!==0)return
+this.VG(a,b)},
+lT:[function(){var z=this.x
 if(z==null)return
-z.WJ(0)},"$0","gb9",0,0,17],
-ie:[function(){var z=this.lI
+z.yy(0)},"$0","gb9",0,0,1],
+ie:[function(){var z=this.x
 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.QE(0)},"$0","gxl",0,0,1],
+cZ:function(){var z=this.x
+if(z!=null){this.x=null
 z.Gv()}return},
-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],
+yi:[function(a){this.r.FC(a,this)},"$1","gwU",2,0,function(){return H.oZ(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},124],
+SW:[function(a,b){this.UI(a,b)},"$2","gPr",4,0,139,24,25],
+oZ:[function(){this.EC()},"$0","gos",0,0,1],
 JC:function(a,b,c,d,e,f,g){var z,y
 z=this.gwU()
 y=this.gPr()
-this.lI=this.m7.Sb.zC(z,this.gos(),y)},
+this.x=this.r.Q.zC(z,this.gos(),y)},
 $asKA:function(a,b){return[b]},
-$asMO:function(a,b){return[b]}},
+$asyX:function(a,b){return[b]}},
 fk:{
-"^":"og;VL,Sb",
-Ub:function(a){return this.VL.$1(a)},
+"^":"YR;a,Q",
+Ub:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Ub(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.MR(y,x)
-return}if(z===!0)J.wx(b,a)},
-$asog:function(a){return[a,a]},
-$aswS:null},
+x=new H.XO(w,null)
+P.iw(b,y,x)
+return}if(z===!0)J.aO(b,a)},
+$asYR:function(a){return[a,a]},
+$ascb:null},
 c9:{
-"^":"og;xj,Sb",
-Eh:function(a){return this.xj.$1(a)},
+"^":"YR;a,Q",
+Eh:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.Eh(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-b.MR(y,x)
-return}J.wx(b,z)}},
-AE:{
-"^":"og;yj,Sb",
-bZ:function(a){return this.yj.$1(a)},
+x=new H.XO(w,null)
+P.iw(b,y,x)
+return}J.aO(b,z)}},
+Bgk:{
+"^":"YR;a,Q",
+bZ:function(a){return this.a.$1(a)},
 FC:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.bZ(a));w.G();){z=w.gl()
-J.wx(b,z)}}catch(v){w=H.Ru(v)
+try{for(w=J.Nx(this.bZ(a));w.D();){z=w.gk()
+J.aO(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-b.MR(y,x)}}},
+x=new H.XO(v,null)
+P.iw(b,y,x)}}},
 pt:{
-"^":"og;Km,Sb",
-FC:function(a,b){var z=this.Km
-if(z>0){this.Km=z-1
+"^":"YR;a,Q",
+FC:function(a,b){var z=this.a
+if(z>0){this.a=z-1
 return}b.Rg(0,a)},
-mh:function(a,b,c){if(b<0)throw H.b(P.u(b))},
-$asog:function(a){return[a,a]},
-$aswS:null},
-dX:{
+qI:function(a,b,c){if(b<0)throw H.b(P.p(b))},
+$asYR:function(a){return[a,a]},
+$ascb:null},
+kWp:{
 "^":"a;"},
-Uf:{
-"^":"a;M5,ig>"},
+OH:{
+"^":"a;kc:Q>,I4:a<",
+X:[function(a){return J.Lz(this.Q)},"$0","gCR",0,0,0],
+$isXS:true},
+Ls:{
+"^":"a;Q,ig:a>"},
 n7:{
 "^":"a;"},
 yQ:{
-"^":"a;lR,cP,Jl,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)},
-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.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)},
-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)},
+"^":"a;Q,a,b,c,d,e,f,r,x,y,z,ch,cx",
+hk:function(a,b){return this.Q.$2(a,b)},
+Gr:function(a){return this.a.$1(a)},
+FI:function(a,b){return this.b.$2(a,b)},
+mg:function(a,b,c){return this.c.$3(a,b,c)},
+Al:function(a){return this.d.$1(a)},
+cR:function(a){return this.e.$1(a)},
+O8:function(a){return this.f.$1(a)},
+WF:function(a,b){return this.r.$2(a,b)},
+wr:function(a){return this.x.$1(a)},
+RK:function(a,b){return this.x.$2(a,b)},
+uN:function(a,b){return this.y.$2(a,b)},
+lB:function(a,b){return this.z.$2(a,b)},
+Ch:function(a,b){return this.ch.$1(b)},
+iT:function(a){return this.cx.$1$specification(a)},
 $isyQ:true},
 e4y:{
 "^":"a;"},
 JBS:{
 "^":"a;"},
 Id:{
-"^":"a;bk",
+"^":"a;Q",
 RK:function(a,b){var z,y
-z=this.bk.gOf()
-y=z.M5
-z.ig.$4(y,P.Cw(y),a,b)}},
+z=this.Q.gOf()
+y=z.Q
+z.a.$4(y,P.HM(y),a,b)}},
 m0:{
 "^":"a;",
-fC:function(a){return this.gF7()===a.gF7()},
+fC:function(a){return this===a||this.gF7()===a.gF7()},
 $ism0:true},
 l7:{
-"^":"m0;JY<,vr<,HG<,Tr<,kX<,c5<,Of<,x6<,Jy<,kP<,uI<,pB<,ye,eT>,Se<",
-gyL:function(){var z=this.ye
+"^":"m0;OS:Q<,W7:a<,HG:b<,O5:c<,FH:d<,c5:e<,a0:f<,Of:r<,jL:x<,Jy:y<,kP:z<,Gt:ch<,pB:cx<,cy,eT:db>,oe:dx<",
+gyL:function(){var z=this.cy
 if(z!=null)return z
 z=new P.Id(this)
-this.ye=z
+this.cy=z
 return z},
-gF7:function(){return this.pB.M5},
-ww:function(a){var z,y,x,w
+gF7:function(){return this.cx.Q},
+bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
 if(b)return new P.OJ(this,z)
 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.eP(this,z)
-else return new P.aQ(this,z)},
-mS:function(a){return this.rO(a,!0)},
+oj:function(a,b){var z=this.cR(a)
+if(b)return new P.CN(this,z)
+else return new P.eP(this,z)},
+mS:function(a){return this.oj(a,!0)},
 PT:function(a,b){var z=this.O8(a)
-if(b)return new P.N9(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)
+if(b)return new P.bY(this,z)
+else return new P.N9(this,z)},
+p:function(a,b){var z,y,x,w
+z=this.dx
+y=z.p(0,b)
 if(y!=null||z.NZ(0,b))return y
-x=this.eT
-if(x!=null){w=J.UQ(x,b)
-if(w!=null)z.u(0,b,w)
+x=this.db
+if(x!=null){w=J.Tf(x,b)
+if(w!=null)z.q(0,b,w)
 return w}return},
 hk:function(a,b){var z,y,x
-z=this.pB
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
-c6:function(a,b){var z,y,x
-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)},
+z=this.cx
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+M2:function(a,b){var z,y,x
+z=this.ch
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+iT:function(a){return this.M2(a,null)},
 Gr:function(a){var z,y,x
-z=this.vr
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.a
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 FI:function(a,b){var z,y,x
-z=this.JY
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
+z=this.Q
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 mg:function(a,b,c){var z,y,x
-z=this.HG
-y=z.M5
-x=P.Cw(y)
-return z.ig.$6(y,x,this,a,b,c)},
+z=this.b
+y=z.Q
+x=P.HM(y)
+return z.a.$6(y,x,this,a,b,c)},
 Al:function(a){var z,y,x
-z=this.Tr
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.c
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 cR:function(a){var z,y,x
-z=this.kX
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.d
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 O8:function(a){var z,y,x
-z=this.c5
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.e
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
+WF:function(a,b){var z,y,x
+z=this.f
+y=z.Q
+if(y===C.fQ)return
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 wr:function(a){var z,y,x
-z=this.Of
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,a)},
+z=this.r
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,a)},
 uN:function(a,b){var z,y,x
-z=this.x6
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
-Ud:function(a,b){var z,y,x
-z=this.Jy
-y=z.M5
-x=P.Cw(y)
-return z.ig.$5(y,x,this,a,b)},
+z=this.x
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
+lB:function(a,b){var z,y,x
+z=this.y
+y=z.Q
+x=P.HM(y)
+return z.a.$5(y,x,this,a,b)},
 Ch:function(a,b){var z,y,x
-z=this.kP
-y=z.M5
-x=P.Cw(y)
-return z.ig.$4(y,x,this,b)},
-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.Tr=z!=null?new P.Uf(this,z):this.eT.gTr()
-z=b.Xp
-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.uI=this.eT.guI()
-this.pB=this.eT.gpB()}},
+z=this.z
+y=z.Q
+x=P.HM(y)
+return z.a.$4(y,x,this,b)},
+Ij:function(a,b,c){var z
+this.a=this.db.gW7()
+this.Q=this.db.gOS()
+this.b=this.db.gHG()
+z=b.d
+this.c=z!=null?new P.Ls(this,z):this.db.gO5()
+z=b.e
+this.d=z!=null?new P.Ls(this,z):this.db.gFH()
+this.e=this.db.gc5()
+this.f=this.db.ga0()
+this.r=this.db.gOf()
+this.x=this.db.gjL()
+this.y=this.db.gJy()
+this.z=this.db.gkP()
+this.ch=this.db.gGt()
+this.cx=this.db.gpB()}},
 OJ:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.bH(this.a)},"$0",null,0,0,null,"call"]},
 Yn:{
-"^":"TpZ:76;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Gr(this.a)},"$0",null,0,0,null,"call"]},
+CN:{
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.m1(this.a,a)},"$1",null,2,0,null,33,"call"]},
 eP:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
-aQ:{
-"^":"TpZ:12;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.FI(this.a,a)},"$1",null,2,0,null,33,"call"]},
+bY:{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.z8(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 N9:{
-"^":"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},
-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},
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.mg(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 FO:{
-"^":"TpZ:76;a,b",
-$0:[function(){throw H.b(P.Uz(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){throw H.b(P.Uz(this.Q,this.a))},"$0",null,0,0,null,"call"]},
 R81:{
 "^":"m0;",
-gvr:function(){return C.lk},
-gJY:function(){return C.Yl},
-gHG:function(){return C.zf},
-gTr:function(){return C.pj},
-gkX:function(){return C.F6},
+gW7:function(){return C.Fj},
+gOS:function(){return C.Yl},
+gHG:function(){return C.Gu},
+gO5:function(){return C.pj},
+gFH:function(){return C.pm},
 gc5:function(){return C.Xk},
+ga0:function(){return C.QE},
 gOf:function(){return C.Zc},
-gx6:function(){return C.Sq},
-gJy:function(){return C.NA},
+gjL:function(){return C.Sq},
+gJy:function(){return C.rj},
 gkP:function(){return C.uo},
-guI:function(){return C.mc},
-gpB:function(){return C.Rt},
+gGt:function(){return C.mc},
+gpB:function(){return C.TP},
 geT:function(a){return},
-gSe:function(){return $.OL()},
+goe:function(){return $.wb()},
 gyL:function(){var z=$.Cb
 if(z!=null)return z
 z=new P.Id(this)
 $.Cb=z
 return z},
 gF7:function(){return this},
-ww:function(a){var z,y,x,w
+bH:function(a){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$0()
-return x}x=P.Ki(null,null,this,a)
+return x}x=P.T8(null,null,this,a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 m1:function(a,b){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$1(b)
 return x}x=P.vf(null,null,this,a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{if(C.fQ===$.X3){x=a.$2(b,c)
 return x}x=P.Mu(null,null,this,a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.oP(w,null)
+y=new H.XO(w,null)
 return P.CK(null,null,this,z,y)}},
 xi:function(a,b){if(b)return new P.hj(this,a)
 else return new P.MK(this,a)},
 ce:function(a){return this.xi(a,!0)},
-rO:function(a,b){if(b)return new P.pQ(this,a)
+oj: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.Ze(this,a)
-else return new P.dM(this,a)},
-t:function(a,b){return},
+mS:function(a){return this.oj(a,!0)},
+PT:function(a,b){if(b)return new P.SJ(this,a)
+else return new P.Ze(this,a)},
+p:function(a,b){return},
 hk:function(a,b){return P.CK(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)},
+M2:function(a,b){return P.qc(null,null,this,a,b)},
+iT:function(a){return this.M2(a,null)},
 Gr:function(a){if($.X3===C.fQ)return a.$0()
-return P.Ki(null,null,this,a)},
+return P.T8(null,null,this,a)},
 FI:function(a,b){if($.X3===C.fQ)return a.$1(b)
 return P.vf(null,null,this,a,b)},
 mg:function(a,b,c){if($.X3===C.fQ)return a.$2(b,c)
@@ -7221,48 +6632,43 @@
 Al:function(a){return a},
 cR:function(a){return a},
 O8:function(a){return a},
+WF:function(a,b){return},
 wr:function(a){P.ZK(null,null,this,a)},
 uN:function(a,b){return P.YF(a,b)},
-Ud:function(a,b){return P.dp(a,b)},
+lB:function(a,b){return P.dp(a,b)},
 Ch:function(a,b){H.qw(b)},
 static:{"^":"ln,Cb"}},
 hj:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.ww(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.bH(this.a)},"$0",null,0,0,null,"call"]},
 MK:{
-"^":"TpZ:76;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Gr(this.a)},"$0",null,0,0,null,"call"]},
 pQ:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.m1(this.a,a)},"$1",null,2,0,null,33,"call"]},
 Ky:{
-"^":"TpZ:12;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.FI(this.a,a)},"$1",null,2,0,null,33,"call"]},
+SJ:{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.z8(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]},
 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},
-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,{
+"^":"r:80;Q,a",
+$2:[function(a,b){return this.Q.mg(this.a,a,b)},"$2",null,4,0,null,10,11,"call"]}}],["","",,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])},
-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],
+B:function(a,b,c){return H.dJ(a,H.J(new P.YB(0,null,null,null,null,null,0),[b,c]))},
+A:function(a,b){return H.J(new P.YB(0,null,null,null,null,null,0),[a,b])},
+Ou4:[function(a,b){return J.mG(a,b)},"$2","bUo",4,0,50],
+T9:[function(a){return J.v1(a)},"$1","rm",2,0,51,52],
 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.jg(0,null,null,null,null),[d])},
+return z}b=P.rm()
+return P.c7(a,b,c,d,e)},
+Ca:function(a,b,c,d){return H.J(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"(...)"
+if(P.jO(a)){if(b==="("&&c===")")return"(...)"
 return b+"..."+c}z=[]
 y=$.Ex()
 y.push(a)
@@ -7270,37 +6676,39 @@
 y.pop()}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
-return y.IN},
+y=y.Q
+return y.charCodeAt(0)==0?y:y},
 WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
+if(P.jO(a))return b+"..."+c
 z=P.p9(b)
 y=$.Ex()
 y.push(a)
 try{z.We(a,", ")}finally{if(0>=y.length)return H.e(y,0)
 y.pop()}z.KF(c)
-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},
+y=z.gIN()
+return y.charCodeAt(0)==0?y:y},
+jO:function(a){var z,y
+for(z=0;y=$.Ex(),z<y.length;++z){y=y[z]
+if(a==null?y==null:a===y)return!0}return!1},
 T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
+z=a.gu(a)
 y=0
 x=0
 while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
+if(!z.D())return
+w=H.d(z.gk())
 b.push(w)
-y+=w.length+2;++x}if(!z.G()){if(x<=5)return
+y+=w.length+2;++x}if(!z.D()){if(x<=5)return
 if(0>=b.length)return H.e(b,0)
 v=b.pop()
 if(0>=b.length)return H.e(b,0)
-u=b.pop()}else{t=z.gl();++x
-if(!z.G()){if(x<=4){b.push(H.d(t))
+u=b.pop()}else{t=z.gk();++x
+if(!z.D()){if(x<=4){b.push(H.d(t))
 return}v=H.d(t)
 if(0>=b.length)return H.e(b,0)
 u=b.pop()
-y+=v.length+2}else{s=z.gl();++x
-for(;z.G();t=s,s=r){r=z.gl();++x
+y+=v.length+2}else{s=z.gk();++x
+for(;z.D();t=s,s=r){r=z.gk();++x
 if(x>100){while(!0){if(!(y>75&&x>3))break
 if(0>=b.length)return H.e(b,0)
 y-=b.pop().length+2;--x}b.push("...")
@@ -7315,19 +6723,23 @@
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
 b.push(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
+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.b6(0,null,null,null,null,null,0)
+z.$builtinTypeInfo=[d]
+return z},
+fd:function(a,b,c){var z,y,x,w,v
 z=[]
 y=J.U6(a)
-x=y.gB(a)
-for(w=0;w<x;++w){v=y.t(a,w)
-if(J.xC(b.$1(v),c))z.push(v)
-if(x!==y.gB(a))throw H.b(P.a4(a))}if(z.length!==y.gB(a)){y.zB(a,0,z.length,z)
-y.sB(a,z.length)}},
+x=y.gv(a)
+for(w=0;w<x;++w){v=y.p(a,w)
+if(J.mG(b.$1(v),c))z.push(v)
+if(x!==y.gv(a))throw H.b(P.a4(a))}if(z.length!==y.gv(a)){y.vg(a,0,z.length,z)
+y.sv(a,z.length)}},
 vW:function(a){var z,y
 z={}
-if(P.nH(a))return"{...}"
+if(P.jO(a))return"{...}"
 y=P.p9("")
 try{$.Ex().push(a)
 y.KF("{")
@@ -7335,107 +6747,108 @@
 J.Me(a,new P.LG(z,y))
 y.KF("}")}finally{z=$.Ex()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gIN()},
+z.pop()}z=y.gIN()
+return z.charCodeAt(0)==0?z:z},
 bA:{
-"^":"a;X5,Mb,cG,Cs,MV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.fG(this),[H.u3(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
+"^":"a;Q,a,b,c,d",
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
+gvc:function(a){return H.J(new P.fG(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.J(new P.fG(this),[H.u3(this,0)]),new P.oi(this),H.u3(this,0),H.u3(this,1))},
 NZ:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 return y==null?!1:y[b]!=null}else return this.KY(b)},
-KY:function(a){var z=this.Cs
+KY:["an",function(a){var z=this.c
 if(z==null)return!1
-return this.DF(z[this.rk(a)],a)>=0},
-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
+return this.DF(z[this.rk(a)],a)>=0}],
+FV:function(a,b){J.Me(b,new P.DJ(this))},
+p:function(a,b){var z,y,x,w
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)y=null
 else{x=z[b]
-y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.cG
+y=x===z?null:x}return y}else if(typeof b==="number"&&(b&0x3ffffff)===b){w=this.b
 if(w==null)y=null
 else{x=w[b]
 y=x===w?null:x}return y}else return this.c8(b)},
-c8:function(a){var z,y,x
-z=this.Cs
+c8:["d2",function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
-return x<0?null:y[x+1]},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+return x<0?null:y[x+1]}],
+q:function(a,b,c){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){z=P.r8()
-this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+this.a=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null){y=P.r8()
-this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
-Gk:function(a,b){var z,y,x,w
-z=this.Cs
+this.b=y}this.u9(y,b,c)}else this.Gk(b,c)},
+Gk:["eE",function(a,b){var z,y,x,w
+z=this.c
 if(z==null){z=P.r8()
-this.Cs=z}y=this.rk(a)
+this.c=z}y=this.rk(a)
 x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.MV=null}else{w=this.DF(x,a)
+if(x==null){P.cW(z,y,[a,b]);++this.Q
+this.d=null}else{w=this.DF(x,a)
 if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.MV=null}}},
-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{x.push(a,b);++this.Q
+this.d=null}}}],
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
-qg:function(a){var z,y,x
-z=this.Cs
+qg:["cS",function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
-if(x<0)return;--this.X5
-this.MV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.MV=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0}},
+if(x<0)return;--this.Q
+this.d=null
+return y.splice(x,2)[1]}],
+V1:function(a){if(this.Q>0){this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0}},
 aN:function(a,b){var z,y,x,w
 z=this.Nm()
 for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.MV)throw H.b(P.a4(this))}},
+b.$2(w,this.p(0,w))
+if(z!==this.d)throw H.b(P.a4(this))}},
 Nm:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.MV
+z=this.d
 if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.Mb
+y=Array(this.Q)
+y.fixed$length=Array
+x=this.a
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.cG
+s=this.b
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.c
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.MV=y
+for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.d=y
 return y},
-u9:function(a,b,c){if(a[b]==null){++this.X5
-this.MV=null}P.cW(a,b,c)},
+u9:function(a,b,c){if(a[b]==null){++this.Q
+this.d=null}P.cW(a,b,c)},
 H4:function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.MV=null
+delete a[b];--this.Q
+this.d=null
 return z}else return},
 rk:function(a){return J.v1(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
+for(y=0;y<z;y+=2)if(J.mG(a[y],b))return y
 return-1},
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{vL:function(a,b){var z=a[b]
 return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
 else a[b]=c},r8:function(){var z=Object.create(null)
@@ -7443,16 +6856,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
-ef:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.a,"bA")}},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
+DJ:{
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"lb",args:[a,b]}},this.Q,"bA")}},
 PL:{
-"^":"bA;X5,Mb,cG,Cs,MV",
+"^":"bA;Q,a,b,c,d",
 rk:function(a){return H.CU(a)&0x3ffffff},
 DF:function(a,b){var z,y,x
 if(a==null)return-1
@@ -7460,115 +6871,114 @@
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"bA;AH,dI,z4,X5,Mb,cG,Cs,MV",
-Xm:function(a,b){return this.AH.$2(a,b)},
-jP:function(a){return this.dI.$1(a)},
-Bc:function(a){return this.z4.$1(a)},
-t:function(a,b){if(this.Bc(b)!==!0)return
-return P.bA.prototype.c8.call(this,b)},
-u:function(a,b,c){P.bA.prototype.Gk.call(this,b,c)},
+"^":"bA;e,f,r,Q,a,b,c,d",
+Xm:function(a,b){return this.e.$2(a,b)},
+jP:function(a){return this.f.$1(a)},
+Bc:function(a){return this.r.$1(a)},
+p:function(a,b){if(this.Bc(b)!==!0)return
+return this.d2(b)},
+q:function(a,b,c){this.eE(b,c)},
 NZ:function(a,b){if(this.Bc(b)!==!0)return!1
-return P.bA.prototype.KY.call(this,b)},
+return this.an(b)},
 Rz:function(a,b){if(this.Bc(b)!==!0)return
-return P.bA.prototype.qg.call(this,b)},
+return this.cS(b)},
 rk:function(a){return this.jP(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.Xm(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-static:{uP:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
+return H.J(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"TpZ:12;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}},
 fG:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.X5},
-gl0:function(a){return this.ZD.X5===0},
-gA:function(a){var z=this.ZD
+"^":"mW;Q",
+gv:function(a){return this.Q.Q},
+gl0:function(a){return this.Q.Q===0},
+gu:function(a){var z=this.Q
 z=new P.EQ(z,z.Nm(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-tg:function(a,b){return this.ZD.NZ(0,b)},
+tg:function(a,b){return this.Q.NZ(0,b)},
 aN:function(a,b){var z,y,x,w
-z=this.ZD
+z=this.Q
 y=z.Nm()
 for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.MV)throw H.b(P.a4(z))}},
+if(y!==z.d)throw H.b(P.a4(z))}},
 $isyN:true},
 EQ:{
-"^":"a;ZD,MV,iY,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.MV
-y=this.iY
-x=this.ZD
-if(z!==x.MV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.iY=y+1
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x
+z=this.a
+y=this.b
+x=this.Q
+if(z!==x.d)throw H.b(P.a4(x))
+else if(y>=z.length){this.c=null
+return!1}else{this.c=z[y]
+this.b=y+1
 return!0}}},
 YB:{
-"^":"a;X5,Mb,cG,Cs,HH,Nz,HU",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(a){return H.VM(new P.i5(this),[H.u3(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
+"^":"a;Q,a,b,c,d,e,f",
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
+gvc:function(a){return H.J(new P.i5(this),[H.u3(this,0)])},
+gUQ:function(a){return H.fR(H.J(new P.i5(this),[H.u3(this,0)]),new P.a1(this),H.u3(this,0),H.u3(this,1))},
 NZ:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null)return!1
 return y[b]!=null}else return this.KY(b)},
-KY:function(a){var z=this.Cs
+KY:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
 FV:function(a,b){J.Me(b,new P.pk(this))},
-t:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+p:function(a,b){var z,y,x
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return
 y=z[b]
-return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+return y==null?null:y.gcF()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null)return
 y=x[b]
 return y==null?null:y.gcF()}else return this.c8(b)},
 c8:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
 return y[x].gcF()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+q:function(a,b,c){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){z=P.Jc()
-this.Mb=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+this.a=z}this.u9(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null){y=P.Jc()
-this.cG=y}this.u9(y,b,c)}else this.Gk(b,c)},
+this.b=y}this.u9(y,b,c)}else this.Gk(b,c)},
 Gk:function(a,b){var z,y,x,w
-z=this.Cs
+z=this.c
 if(z==null){z=P.Jc()
-this.Cs=z}y=this.rk(a)
+this.c=z}y=this.rk(a)
 x=z[y]
 if(x==null)z[y]=[this.x4(a,b)]
 else{w=this.DF(x,a)
 if(w>=0)x[w].scF(b)
 else x.push(this.x4(a,b))}},
 to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.p(0,b)
 z=c.$0()
-this.u(0,b,z)
+this.q(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)
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x,w
-z=this.Cs
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
@@ -7576,18 +6986,18 @@
 w=y.splice(x,1)[0]
 this.GS(w)
 return w.gcF()},
-V1:function(a){if(this.X5>0){this.Nz=null
-this.HH=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0
-this.HU=this.HU+1&67108863}},
+V1:function(a){if(this.Q>0){this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0
+this.f=this.f+1&67108863}},
 aN:function(a,b){var z,y
-z=this.HH
-y=this.HU
+z=this.d
+y=this.f
 for(;z!=null;){b.$2(z.gv8(z),z.gcF())
-if(y!==this.HU)throw H.b(P.a4(this))
+if(y!==this.f)throw H.b(P.a4(this))
 z=z.gtL()}},
 u9:function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.x4(b,c)
@@ -7601,289 +7011,287 @@
 return z.gcF()},
 x4:function(a,b){var z,y
 z=new P.dN(a,b,null,null)
-if(this.HH==null){this.Nz=z
-this.HH=z}else{y=this.Nz
-z.n8=y
+if(this.d==null){this.e=z
+this.d=z}else{y=this.e
+z.c=y
 y.stL(z)
-this.Nz=z}++this.X5
-this.HU=this.HU+1&67108863
+this.e=z}++this.Q
+this.f=this.f+1&67108863
 return z},
 GS:function(a){var z,y
 z=a.gn8()
 y=a.gtL()
-if(z==null)this.HH=y
+if(z==null)this.d=y
 else z.stL(y)
-if(y==null)this.Nz=z
-else y.sn8(z);--this.X5
-this.HU=this.HU+1&67108863},
+if(y==null)this.e=z
+else y.sn8(z);--this.Q
+this.f=this.f+1&67108863},
 rk:function(a){return J.v1(a)&0x3ffffff},
 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.nG(a[y]),b))return y
+for(y=0;y<z;++y)if(J.mG(J.nG(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 $isFo:true,
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{Jc:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
 pk:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"YB")}},
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"vPt",args:[a,b]}},this.Q,"YB")}},
 dN:{
-"^":"a;v8>,cF@,tL@,n8@"},
+"^":"a;v8:Q>,cF:a@,tL:b@,n8:c@"},
 i5:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.X5},
-gl0:function(a){return this.ZD.X5===0},
-gA:function(a){var z,y
-z=this.ZD
-y=new P.N6(z,z.HU,null,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.Q},
+gl0:function(a){return this.Q.Q===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.N6(z,z.f,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qx=z.HH
+y.b=z.d
 return y},
-tg:function(a,b){return this.ZD.NZ(0,b)},
+tg:function(a,b){return this.Q.NZ(0,b)},
 aN:function(a,b){var z,y,x
-z=this.ZD
-y=z.HH
-x=z.HU
+z=this.Q
+y=z.d
+x=z.f
 for(;y!=null;){b.$1(y.gv8(y))
-if(x!==z.HU)throw H.b(P.a4(z))
+if(x!==z.f)throw H.b(P.a4(z))
 y=y.gtL()}},
 $isyN:true},
 N6:{
-"^":"a;ZD,HU,Qx,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.ZD
-if(this.HU!==z.HU)throw H.b(P.a4(z))
-else{z=this.Qx
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gv8(z)
-this.Qx=this.Qx.gtL()
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z=this.Q
+if(this.a!==z.f)throw H.b(P.a4(z))
+else{z=this.b
+if(z==null){this.c=null
+return!1}else{this.c=z.gv8(z)
+this.b=this.b.gtL()
 return!0}}}},
 jg:{
-"^":"u3T;X5,Mb,cG,Cs,vw",
+"^":"u3T;Q,a,b,c,d",
 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.ij(),0,null)
+gu:function(a){var z=new P.cN(this,this.d0(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
 tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
+return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 return y==null?!1:y[b]!=null}else return this.PR(b)},
-PR:function(a){var z=this.Cs
+PR:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-Ie:function(a){var z
+iQ:function(a){var z
 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.GP(a)},
-GP:function(a){var z,y,x
-z=this.Cs
+return this.vR(a)},
+vR:function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.UQ(y,x)},
+return J.Tf(y,x)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.Mb=y
-z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+this.a=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.cG=y
+this.b=y
 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.yT()
-this.Cs=z}y=this.rk(b)
+z=this.c
+if(z==null){z=P.NC()
+this.c=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[b]
 else{if(this.DF(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.vw=null
+x.push(b)}++this.Q
+this.d=null
 return!0},
 FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
-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)
+for(z=J.Nx(b);z.D();)this.h(0,z.gk())},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return!1
 y=z[this.rk(a)]
 x=this.DF(y,a)
-if(x<0)return!1;--this.X5
-this.vw=null
+if(x<0)return!1;--this.Q
+this.d=null
 y.splice(x,1)
 return!0},
-V1:function(a){if(this.X5>0){this.vw=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0}},
-ij:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.vw
+V1:function(a){if(this.Q>0){this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0}},
+d0:function(){var z,y,x,w,v,u,t,s,r,q,p,o
+z=this.d
 if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.Mb
+y=Array(this.Q)
+y.fixed$length=Array
+x=this.a
 if(x!=null){w=Object.getOwnPropertyNames(x)
 v=w.length
 for(u=0,t=0;t<v;++t){y[u]=w[t];++u}}else u=0
-s=this.cG
+s=this.b
 if(s!=null){w=Object.getOwnPropertyNames(s)
 v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.Cs
+for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.c
 if(r!=null){w=Object.getOwnPropertyNames(r)
 v=w.length
 for(t=0;t<v;++t){q=r[w[t]]
 p=q.length
-for(o=0;o<p;++o){y[u]=q[o];++u}}}this.vw=y
+for(o=0;o<p;++o){y[u]=q[o];++u}}}this.d=y
 return y},
 bQ:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.vw=null
+a[b]=0;++this.Q
+this.d=null
 return!0},
-H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.vw=null
+H4:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.Q
+this.d=null
 return!0}else return!1},
 rk:function(a){return J.v1(a)&0x3ffffff},
 DF:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.xC(a[y],b))return y
+for(y=0;y<z;++y)if(J.mG(a[y],b))return y
 return-1},
 $isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{yT:function(){var z=Object.create(null)
+static:{NC:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
 cN:{
-"^":"a;vY,vw,iY,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.vw
-y=this.iY
-x=this.vY
-if(z!==x.vw)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.iY=y+1
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x
+z=this.a
+y=this.b
+x=this.Q
+if(z!==x.d)throw H.b(P.a4(x))
+else if(y>=z.length){this.c=null
+return!1}else{this.c=z[y]
+this.b=y+1
 return!0}}},
-D0:{
-"^":"u3T;X5,Mb,cG,Cs,HH,Nz,HU",
-iL:function(){var z=new P.D0(0,null,null,null,null,null,0)
+b6:{
+"^":"u3T;Q,a,b,c,d,e,f",
+iL:function(){var z=new P.b6(0,null,null,null,null,null,0)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gA:function(a){var z=H.VM(new P.zQ(this,this.HU,null,null),[null])
-z.Qx=z.vY.HH
+gu:function(a){var z=H.J(new P.zQ(this,this.f,null,null),[null])
+z.b=z.Q.d
 return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
+gv:function(a){return this.Q},
+gl0:function(a){return this.Q===0},
+gor:function(a){return this.Q!==0},
 tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.cG
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.b
 if(y==null)return!1
 return y[b]!=null}else return this.PR(b)},
-PR:function(a){var z=this.Cs
+PR:function(a){var z=this.c
 if(z==null)return!1
 return this.DF(z[this.rk(a)],a)>=0},
-Ie:function(a){var z
+iQ:function(a){var z
 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.GP(a)},
-GP:function(a){var z,y,x
-z=this.Cs
+else return this.vR(a)},
+vR:function(a){var z,y,x
+z=this.c
 if(z==null)return
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return
-return J.Nq(J.UQ(y,x))},
+return J.PK(J.Tf(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=this.d
+y=this.f
+for(;z!=null;){b.$1(z.gdA(z))
+if(y!==this.f)throw H.b(P.a4(this))
 z=z.gtL()}},
-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
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
+gtH:function(a){var z=this.d
+if(z==null)throw H.b(P.s("No elements"))
+return z.gdA(z)},
+grZ:function(a){var z=this.e
+if(z==null)throw H.b(P.s("No elements"))
+return z.gdA(z)},
 h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.Mb
+if(typeof b==="string"&&b!=="__proto__"){z=this.a
 if(z==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.Mb=y
-z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.cG
+this.a=y
+z=y}return this.bQ(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.b
 if(x==null){y=Object.create(null)
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
-this.cG=y
+this.b=y
 x=y}return this.bQ(x,b)}else return this.B7(0,b)},
 B7:function(a,b){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null){z=P.T2()
-this.Cs=z}y=this.rk(b)
+this.c=z}y=this.rk(b)
 x=z[y]
 if(x==null)z[y]=[this.yo(b)]
 else{if(this.DF(x,b)>=0)return!1
 x.push(this.yo(b))}return!0},
-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)
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.a,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.b,b)
 else return this.qg(b)},
 qg:function(a){var z,y,x
-z=this.Cs
+z=this.c
 if(z==null)return!1
 y=z[this.rk(a)]
 x=this.DF(y,a)
 if(x<0)return!1
 this.GS(y.splice(x,1)[0])
 return!0},
-uk:function(a,b){this.eJ(b,!0)},
-eJ:function(a,b){var z,y,x,w,v
-z=this.HH
-for(;z!=null;z=x){y=z.gGc(z)
+uk:function(a,b){this.YS(b,!0)},
+YS:function(a,b){var z,y,x,w,v
+z=this.d
+for(;z!=null;z=x){y=z.gdA(z)
 x=z.gtL()
-w=this.HU
+w=this.f
 v=a.$1(y)
-if(w!==this.HU)throw H.b(P.a4(this))
+if(w!==this.f)throw H.b(P.a4(this))
 if(b===v)this.Rz(0,y)}},
-V1:function(a){if(this.X5>0){this.Nz=null
-this.HH=null
-this.Cs=null
-this.cG=null
-this.Mb=null
-this.X5=0
-this.HU=this.HU+1&67108863}},
+V1:function(a){if(this.Q>0){this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=null
+this.Q=0
+this.f=this.f+1&67108863}},
 bQ:function(a,b){if(a[b]!=null)return!1
 a[b]=this.yo(b)
 return!0},
@@ -7896,26 +7304,26 @@
 return!0},
 yo:function(a){var z,y
 z=new P.tj(a,null,null)
-if(this.HH==null){this.Nz=z
-this.HH=z}else{y=this.Nz
-z.n8=y
+if(this.d==null){this.e=z
+this.d=z}else{y=this.e
+z.b=y
 y.stL(z)
-this.Nz=z}++this.X5
-this.HU=this.HU+1&67108863
+this.e=z}++this.Q
+this.f=this.f+1&67108863
 return z},
 GS:function(a){var z,y
 z=a.gn8()
 y=a.gtL()
-if(z==null)this.HH=y
+if(z==null)this.d=y
 else z.stL(y)
-if(y==null)this.Nz=z
-else y.sn8(z);--this.X5
-this.HU=this.HU+1&67108863},
+if(y==null)this.e=z
+else y.sn8(z);--this.Q
+this.f=this.f+1&67108863},
 rk:function(a){return J.v1(a)&0x3ffffff},
 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.Nq(a[y]),b))return y
+for(y=0;y<z;++y)if(J.mG(J.PK(a[y]),b))return y
 return-1},
 $isOl:true,
 $isyN:true,
@@ -7926,83 +7334,130 @@
 delete z["<non-identifier-key>"]
 return z}}},
 tj:{
-"^":"a;Gc>,tL@,n8@"},
+"^":"a;dA:Q>,tL:a@,n8:b@"},
 zQ:{
-"^":"a;vY,HU,Qx,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.vY
-if(this.HU!==z.HU)throw H.b(P.a4(z))
-else{z=this.Qx
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.Qx=this.Qx.gtL()
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z=this.Q
+if(this.a!==z.f)throw H.b(P.a4(z))
+else{z=this.b
+if(z==null){this.c=null
+return!1}else{this.c=z.gdA(z)
+this.b=this.b.gtL()
 return!0}}}},
-Ui:{
-"^":"w2Y;G4",
-gB:function(a){return this.G4.length},
-t:function(a,b){var z=this.G4
+Eb:{
+"^":"w2Y;Q",
+gv:function(a){return this.Q.length},
+p:function(a,b){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]}},
 u3T:{
 "^":"Vj5;",
-zH:function(a){var z=this.iL()
+Oe:function(a){var z=this.iL()
 z.FV(0,this)
 return z}},
-mW:{
+Et:{
 "^":"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:"MQ",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)])},
-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],
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"Et",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"Et")},31],
+ev:function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"Et",0)])},
+Ft:[function(a,b){return H.J(new H.Fm(this,b),[H.W8(this,"Et",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"PA",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"Et")},31],
 tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
+for(z=this.gu(this);z.D();)if(J.mG(z.gk(),b))return!0
 return!1},
 aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
 zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
+z=this.gu(this)
+if(!z.D())return""
 y=P.p9("")
-if(b===""){do{x=H.d(z.gl())
-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}}return y.IN},
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
 return!1},
-tt:function(a,b){return P.F(this,b,H.W8(this,"mW",0))},
+tt:function(a,b){return P.z(this,b,H.W8(this,"Et",0))},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z=P.Ls(null,null,null,H.W8(this,"mW",0))
+Oe:function(a){var z=P.fM(null,null,null,H.W8(this,"Et",0))
 z.FV(0,this)
 return z},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
+gv:function(a){var z,y
+z=this.gu(this)
+for(y=0;z.D();)++y
 return y},
-gl0:function(a){return!this.gA(this).G()},
+gl0:function(a){return!this.gu(this).D()},
+gor:function(a){return!this.gl0(this)},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"Et",0))},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
+grZ:function(a){var z,y
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
+return y},
+X:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,0],
+$isQV:true,
+$asQV:null},
+mW:{
+"^":"a;",
+ez:[function(a,b){return H.fR(this,b,H.W8(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"MQ",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"mW")},31],
+ev:["FX",function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"mW",0)])}],
+Ft:[function(a,b){return H.J(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:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+tg:function(a,b){var z
+for(z=this.gu(this);z.D();)if(J.mG(z.gk(),b))return!0
+return!1},
+aN:function(a,b){var z
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
+zV:function(a,b){var z,y,x
+z=this.gu(this)
+if(!z.D())return""
+y=P.p9("")
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
+Vr:function(a,b){var z
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
+return!1},
+tt:function(a,b){return P.z(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))
+z.FV(0,this)
+return z},
+gv:function(a){var z,y
+z=this.gu(this)
+for(y=0;z.D();)++y
+return y},
+gl0:function(a){return!this.gu(this).D()},
 gor:function(a){return this.gl0(this)!==!0},
 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()},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
 grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
 return y},
-Zv:function(a,b){var z,y,x,w
-if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-for(z=this.gA(this),y=b;z.G();){x=z.gl()
-w=J.x(y)
-if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,73],
+Zv:function(a,b){var z,y,x
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.hG("index"))
+if(b<0)H.vh(P.ve(b,0,null,"index",null))
+for(z=this.gu(this),y=0;z.D();){x=z.gk()
+if(b===y)return x;++y}throw H.b(P.Hj(b,this,"index",null,y))},
+X:[function(a){return P.B4(this,"(",")")},"$0","gCR",0,0,0],
 $isQV:true,
 $asQV:null},
 ark:{
-"^":"eD;"},
-eD:{
+"^":"E9h;"},
+E9h:{
 "^":"a+lD;",
 $isWO:true,
 $asWO:null,
@@ -8011,126 +7466,114 @@
 $asQV:null},
 lD:{
 "^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.W8(a,"lD",0)])},
-Zv:function(a,b){return this.t(a,b)},
+gu:function(a){return H.J(new H.a7(a,this.gv(a),0,null),[H.W8(a,"lD",0)])},
+Zv:function(a,b){return this.p(a,b)},
 aN:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<z;++y){b.$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return this.gB(a)===0},
+z=this.gv(a)
+for(y=0;y<z;++y){b.$1(this.p(a,y))
+if(z!==this.gv(a))throw H.b(P.a4(a))}},
+gl0:function(a){return this.gv(a)===0},
 gor:function(a){return!this.gl0(a)},
-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)},
+gtH:function(a){if(this.gv(a)===0)throw H.b(H.DU())
+return this.p(a,0)},
+grZ:function(a){if(this.gv(a)===0)throw H.b(H.DU())
+return this.p(a,this.gv(a)-1)},
 tg:function(a,b){var z,y
-z=this.gB(a)
-for(y=0;y<this.gB(a);++y){if(J.xC(this.t(a,y),b))return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
+z=this.gv(a)
+for(y=0;y<this.gv(a);++y){if(J.mG(this.p(a,y),b))return!0
+if(z!==this.gv(a))throw H.b(P.a4(a))}return!1},
 Vr:function(a,b){var z,y
-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
-if(this.gB(a)===0)return""
+z=this.gv(a)
+for(y=0;y<z;++y){if(b.$1(this.p(a,y))===!0)return!0
+if(z!==this.gv(a))throw H.b(P.a4(a))}return!1},
+zV:function(a,b){var z,y
+if(this.gv(a)===0)return""
 z=P.p9("")
 z.We(a,b)
-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:"fQO",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)},
+y=z.Q
+return y.charCodeAt(0)==0?y:y},
+ev:function(a,b){return H.J(new H.U5(a,b),[H.W8(a,"lD",0)])},
+ez:[function(a,b){return H.J(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:"JmR",args:[a]}]}},this.$receiver,"lD")},31],
+Ft:[function(a,b){return H.J(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:"hTl",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+eR:function(a,b){return H.c1(a,b,null,H.W8(a,"lD",0))},
 tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.W8(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
+if(b){z=H.J([],[H.W8(a,"lD",0)])
+C.Nm.sv(z,this.gv(a))}else{y=Array(this.gv(a))
+y.fixed$length=Array
+z=H.J(y,[H.W8(a,"lD",0)])}for(x=0;x<this.gv(a);++x){y=this.p(a,x)
 if(x>=z.length)return H.e(z,x)
 z[x]=y}return z},
 br:function(a){return this.tt(a,!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))
+Oe:function(a){var z,y
+z=P.fM(null,null,null,H.W8(a,"lD",0))
+for(y=0;y<this.gv(a);++y)z.h(0,this.p(a,y))
 return z},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
+h:function(a,b){var z=this.gv(a)
+this.sv(a,z+1)
+this.q(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.Ff
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.D();){y=z.c
+x=this.gv(a)
+this.sv(a,x+1)
+this.q(a,x,y)}},
 Rz:function(a,b){var z
-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)
+for(z=0;z<this.gv(a);++z)if(J.mG(this.p(a,z),b)){this.YW(a,z,this.gv(a)-1,a,z+1)
+this.sv(a,this.gv(a)-1)
 return!0}return!1},
-uk:function(a,b){P.Vi(a,b,!1)},
-V1:function(a){this.sB(a,0)},
+uk:function(a,b){P.fd(a,b,!1)},
+V1:function(a){this.sv(a,0)},
 GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
+H.ZE(a,0,this.gv(a)-1,b)},
 Jd:function(a){return this.GT(a,null)},
-fV:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-aM:function(a,b,c){var z,y,x,w
-this.fV(a,b,c)
-z=c-b
-y=H.VM([],[H.W8(a,"lD",0)])
-C.Nm.sB(y,z)
-for(x=0;x<z;++x){w=this.t(a,b+x)
-if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},
-Yc:function(a,b,c){this.fV(a,b,c)
-return H.c1(a,b,c,null)},
+Mu:function(a,b,c){P.iZ(b,c,this.gv(a),null,null,null)
+return H.c1(a,b,c,H.W8(a,"lD",0))},
 oq:function(a,b,c){var z
-this.fV(a,b,c)
+P.iZ(b,c,this.gv(a),null,null,null)
 z=c-b
-this.YW(a,b,this.gB(a)-z,a,c)
-this.sB(a,this.gB(a)-z)},
-YW:function(a,b,c,d,e){var z,y,x,w,v
-if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
-if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
+this.YW(a,b,this.gv(a)-z,a,c)
+this.sv(a,this.gv(a)-z)},
+YW:["as",function(a,b,c,d,e){var z,y,x,w,v
+P.iZ(b,c,this.gv(a),null,null,null)
 z=c-b
 if(z===0)return
-if(e<0)throw H.b(P.u(e))
-y=J.x(d)
+if(e<0)H.vh(P.ve(e,0,null,"skipCount",null))
+y=J.t(d)
 if(!!y.$isWO){x=e
 w=d}else{w=y.eR(d,e).tt(0,!1)
 x=0}y=J.U6(w)
-if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
-if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
-else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+if(x+z>y.gv(w))throw H.b(H.ar())
+if(x<b)for(v=z-1;v>=0;--v)this.q(a,b+v,y.p(w,x+v))
+else for(v=0;v<z;++v)this.q(a,b+v,y.p(w,x+v))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"vg","$4",null,"gam",6,2,null,141],
 XU:function(a,b,c){var z
-if(c>=this.gB(a))return-1
-for(z=c;z<this.gB(a);++z)if(J.xC(this.t(a,z),b))return z
+if(c>=this.gv(a))return-1
+for(z=c;z<this.gv(a);++z)if(J.mG(this.p(a,z),b))return z
 return-1},
 OY:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z
-c=this.gB(a)-1
-for(z=c;z>=0;--z)if(J.xC(this.t(a,z),b))return z
+if(c==null)c=this.gv(a)-1
+else{if(c<0)return-1
+if(c>=this.gv(a))c=this.gv(a)-1}for(z=c;z>=0;--z)if(J.mG(this.p(a,z),b))return z
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-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)
-this.u(a,b,c)},
+aP:function(a,b,c){P.wA(b,0,this.gv(a),"index",null)
+if(b===this.gv(a)){this.h(a,c)
+return}this.sv(a,this.gv(a)+1)
+this.YW(a,b+1,this.gv(a),a,b)
+this.q(a,b,c)},
 UG:function(a,b,c){var z,y
-if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.x(c)
+P.wA(b,0,this.gv(a),"index",null)
+z=J.t(c)
 if(!!z.$isyN)c=z.br(c)
-y=J.q8(c)
-this.sB(a,this.gB(a)+y)
-this.YW(a,b+y,this.gB(a),a,b)
+y=J.wS(c)
+this.sv(a,this.gv(a)+y)
+this.YW(a,b+y,this.gv(a),a,b)
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
-z=J.x(c)
-if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
-else for(z=z.gA(c);z.G();b=y){y=b+1
-this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,73],
+z=J.t(c)
+if(!!z.$isWO)this.vg(a,b,b+z.gv(c),c)
+else for(z=z.gu(c);z.D();b=y){y=b+1
+this.q(a,b,z.gk())}},
+X:[function(a){return P.WE(a,"[","]")},"$0","gCR",0,0,0],
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -8138,205 +7581,208 @@
 $asQV:null},
 ilb:{
 "^":"a+Yk;",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 Yk:{
 "^":"a;",
 aN:function(a,b){var z,y
-for(z=J.mY(this.gvc(this));z.G();){y=z.gl()
-b.$2(y,this.t(0,y))}},
+for(z=J.Nx(this.gvc(this));z.D();){y=z.gk()
+b.$2(y,this.p(0,y))}},
 FV:function(a,b){var z,y,x
-for(z=J.RE(b),y=z.gvc(b),y=y.gA(y);y.G();){x=y.gl()
-this.u(0,x,z.t(b,x))}},
+for(z=J.RE(b),y=z.gvc(b),y=y.gu(y);y.D();){x=y.gk()
+this.q(0,x,z.p(b,x))}},
 NZ:function(a,b){return J.kE(this.gvc(this),b)},
-gB:function(a){return J.q8(this.gvc(this))},
+gv:function(a){return J.wS(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.wU(this),[H.W8(this,"Yk",1)])},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-$isT8:true,
-$asT8:null},
+gUQ:function(a){return H.J(new P.wU(this),[H.W8(this,"Yk",1)])},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+$isw:true,
+$asw:null},
 wU:{
-"^":"mW;ZD",
-gB:function(a){var z=this.ZD
-return J.q8(z.gvc(z))},
-gl0:function(a){var z=this.ZD
+"^":"mW;Q",
+gv:function(a){var z=this.Q
+return J.wS(z.gvc(z))},
+gl0:function(a){var z=this.Q
 return J.FN(z.gvc(z))},
-gor:function(a){var z=this.ZD
+gor:function(a){var z=this.Q
 return J.pO(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.MQ(z.gvc(z)))},
-gA:function(a){var z=this.ZD
-z=new P.Uq(J.mY(z.gvc(z)),z,null)
+gtH:function(a){var z=this.Q
+return z.p(0,J.bP(z.gvc(z)))},
+grZ:function(a){var z=this.Q
+return z.p(0,J.rn(z.gvc(z)))},
+gu:function(a){var z=this.Q
+z=new P.Uq(J.Nx(z.gvc(z)),z,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $isyN:true},
 Uq:{
-"^":"a;MV,ZD,fD",
-G:function(){var z=this.MV
-if(z.G()){this.fD=this.ZD.t(0,z.gl())
-return!0}this.fD=null
+"^":"a;Q,a,b",
+D:function(){var z=this.Q
+if(z.D()){this.b=this.a.p(0,z.gk())
+return!0}this.b=null
 return!1},
-gl:function(){return this.fD}},
+gk:function(){return this.b}},
 KPM:{
 "^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify unmodifiable map"))},
 FV:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
 V1:function(a){throw H.b(P.f("Cannot modify unmodifiable map"))},
 Rz:function(a,b){throw H.b(P.f("Cannot modify unmodifiable map"))},
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 Pnf:{
 "^":"a;",
-t:function(a,b){return this.ZD.t(0,b)},
-u:function(a,b,c){this.ZD.u(0,b,c)},
-FV:function(a,b){this.ZD.FV(0,b)},
-V1:function(a){this.ZD.V1(0)},
-NZ:function(a,b){return this.ZD.NZ(0,b)},
-aN:function(a,b){this.ZD.aN(0,b)},
-gl0:function(a){return this.ZD.X5===0},
-gor:function(a){return this.ZD.X5!==0},
-gB:function(a){return this.ZD.X5},
-gvc:function(a){var z=this.ZD
-return H.VM(new P.i5(z),[H.u3(z,0)])},
-Rz:function(a,b){return this.ZD.Rz(0,b)},
-bu:[function(a){return P.vW(this.ZD)},"$0","gCR",0,0,73],
-gUQ:function(a){var z=this.ZD
+p:function(a,b){return this.Q.p(0,b)},
+q:function(a,b,c){this.Q.q(0,b,c)},
+FV:function(a,b){this.Q.FV(0,b)},
+V1:function(a){this.Q.V1(0)},
+NZ:function(a,b){return this.Q.NZ(0,b)},
+aN:function(a,b){this.Q.aN(0,b)},
+gl0:function(a){return this.Q.Q===0},
+gor:function(a){return this.Q.Q!==0},
+gv:function(a){return this.Q.Q},
+gvc:function(a){var z=this.Q
+return H.J(new P.i5(z),[H.u3(z,0)])},
+Rz:function(a,b){return this.Q.Rz(0,b)},
+X:[function(a){return P.vW(this.Q)},"$0","gCR",0,0,0],
+gUQ:function(a){var z=this.Q
 return z.gUQ(z)},
-$isT8:true,
-$asT8:null},
-A2:{
-"^":"Pnf+KPM;ZD",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
+Gj:{
+"^":"Pnf+KPM;Q",
+$isw:true,
+$asw:null},
 LG:{
-"^":"TpZ:81;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.Q
+if(!z.a)this.a.KF(", ")
 z.a=!1
-z=this.b
+z=this.a
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,141,66,"call"],
-$isEH:true},
-nd:{
-"^":"mW;E3,QN,Bq,Z1",
-gA:function(a){var z=new P.fO(this,this.Bq,this.Z1,this.QN,null)
+z.KF(b)}},
+Fw:{
+"^":"mW;Q,a,b,c",
+gu:function(a){var z=new P.KG(this,this.b,this.c,this.a,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
-z=this.Z1
-for(y=this.QN;y!==this.Bq;y=(y+1&this.E3.length-1)>>>0){x=this.E3
+z=this.c
+for(y=this.a;y!==this.b;y=(y+1&this.Q.length-1)>>>0){x=this.Q
 if(y<0||y>=x.length)return H.e(x,y)
 b.$1(x[y])
-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},
-gqG:function(a){var z,y
-z=this.QN
-if(z===this.Bq)throw H.b(H.DU())
-y=this.E3
+if(z!==this.c)H.vh(P.a4(this))}},
+gl0:function(a){return this.a===this.b},
+gv:function(a){return(this.b-this.a&this.Q.length-1)>>>0},
+gtH:function(a){var z,y
+z=this.a
+if(z===this.b)throw H.b(H.DU())
+y=this.Q
 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
+z=this.a
+y=this.b
 if(z===y)throw H.b(H.DU())
-z=this.E3
+z=this.Q
 x=z.length
 y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
-if(b){z=H.VM([],[H.u3(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}this.BR(z)
+if(b){z=H.J([],[H.u3(this,0)])
+C.Nm.sv(z,this.gv(this))}else{y=Array(this.gv(this))
+y.fixed$length=Array
+z=H.J(y,[H.u3(this,0)])}this.XX(z)
 return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){this.B7(0,b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
 z=b.length
-y=this.gB(this)
+y=this.gv(this)
 x=y+z
-w=this.E3
+w=this.Q
 v=w.length
-if(x>=v){u=P.uay(x)
-if(typeof u!=="number")return H.s(u)
+if(x>=v){u=P.uay(x+(x>>>1))
+if(typeof u!=="number")return H.o(u)
 w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.u3(this,0)])
-this.Bq=this.BR(t)
-this.E3=t
-this.QN=0
+w.fixed$length=Array
+t=H.J(w,[H.u3(this,0)])
+this.b=this.XX(t)
+this.Q=t
+this.a=0
+C.Nm.uy(t,"set range")
 H.qG(t,y,x,b,0)
-this.Bq+=z}else{x=this.Bq
+this.b+=z}else{x=this.b
 s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.Bq+=z}else{r=z-s
+if(z<s){C.Nm.uy(w,"set range")
+H.qG(w,x,x+z,b,0)
+this.b+=z}else{r=z-s
+C.Nm.uy(w,"set range")
 H.qG(w,x,x+s,b,0)
-x=this.E3
+x=this.Q
+C.Nm.uy(x,"set range")
 H.qG(x,0,r,b,s)
-this.Bq=r}}++this.Z1},
+this.b=r}}++this.c},
 Rz:function(a,b){var z,y
-for(z=this.QN;z!==this.Bq;z=(z+1&this.E3.length-1)>>>0){y=this.E3
+for(z=this.a;z!==this.b;z=(z+1&this.Q.length-1)>>>0){y=this.Q
 if(z<0||z>=y.length)return H.e(y,z)
-if(J.xC(y[z],b)){this.qg(z);++this.Z1
+if(J.mG(y[z],b)){this.qg(z);++this.c
 return!0}}return!1},
-eJ:function(a,b){var z,y,x,w
-z=this.Z1
-y=this.QN
-for(;y!==this.Bq;){x=this.E3
+YS:function(a,b){var z,y,x,w
+z=this.c
+y=this.a
+for(;y!==this.b;){x=this.Q
 if(y<0||y>=x.length)return H.e(x,y)
 x=a.$1(x[y])
-w=this.Z1
+w=this.c
 if(z!==w)H.vh(P.a4(this))
 if(b===x){y=this.qg(y)
-z=++this.Z1}else y=(y+1&this.E3.length-1)>>>0}},
-uk:function(a,b){this.eJ(b,!0)},
+z=++this.c}else y=(y+1&this.Q.length-1)>>>0}},
+uk:function(a,b){this.YS(b,!0)},
 V1:function(a){var z,y,x,w,v
-z=this.QN
-y=this.Bq
-if(z!==y){for(x=this.E3,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.Bq=0
-this.QN=0;++this.Z1}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,73],
+z=this.a
+y=this.b
+if(z!==y){for(x=this.Q,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
+x[z]=null}this.b=0
+this.a=0;++this.c}},
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
 AR:function(){var z,y,x,w
-z=this.QN
-if(z===this.Bq)throw H.b(H.DU());++this.Z1
-y=this.E3
+z=this.a
+if(z===this.b)throw H.b(H.DU());++this.c
+y=this.Q
 x=y.length
 if(z>=x)return H.e(y,z)
 w=y[z]
 y[z]=null
-this.QN=(z+1&x-1)>>>0
+this.a=(z+1&x-1)>>>0
 return w},
 B7:function(a,b){var z,y,x
-z=this.E3
-y=this.Bq
+z=this.Q
+y=this.b
 x=z.length
 if(y<0||y>=x)return H.e(z,y)
 z[y]=b
 x=(y+1&x-1)>>>0
-this.Bq=x
-if(this.QN===x)this.OO();++this.Z1},
+this.b=x
+if(this.a===x)this.OO();++this.c},
 qg:function(a){var z,y,x,w,v,u,t,s
-z=this.E3
+z=this.Q
 y=z.length
 x=y-1
-w=this.QN
-v=this.Bq
+w=this.a
+v=this.b
 if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
 if(t<0||t>=y)return H.e(z,t)
 v=z[t]
 if(u<0||u>=y)return H.e(z,u)
 z[u]=v}if(w>=y)return H.e(z,w)
 z[w]=null
-this.QN=(w+1&x)>>>0
+this.a=(w+1&x)>>>0
 return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.Bq=w
+this.b=w
 for(u=a;u!==w;u=s){s=(u+1&x)>>>0
 if(s<0||s>=y)return H.e(z,s)
 v=z[s]
@@ -8345,293 +7791,384 @@
 z[w]=null
 return a}},
 OO:function(){var z,y,x,w
-z=Array(this.E3.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.u3(this,0)])
-z=this.E3
-x=this.QN
+z=Array(this.Q.length*2)
+z.fixed$length=Array
+y=H.J(z,[H.u3(this,0)])
+z=this.Q
+x=this.a
 w=z.length-x
+C.Nm.uy(y,"set range")
 H.qG(y,0,w,z,x)
-z=this.QN
-x=this.E3
-H.qG(y,w,w+z,x,0)
-this.QN=0
-this.Bq=this.E3.length
-this.E3=y},
-BR:function(a){var z,y,x,w,v
-z=this.QN
-y=this.Bq
-x=this.E3
+x=this.a
+z=this.Q
+C.Nm.uy(y,"set range")
+H.qG(y,w,w+x,z,0)
+this.a=0
+this.b=this.Q.length
+this.Q=y},
+XX:function(a){var z,y,x,w,v
+z=this.a
+y=this.b
+x=this.Q
 if(z<=y){w=y-z
+C.Nm.uy(a,"set range")
 H.qG(a,0,w,x,z)
 return w}else{v=x.length-z
+C.Nm.uy(a,"set range")
 H.qG(a,0,v,x,z)
-z=this.Bq
-y=this.E3
+z=this.b
+y=this.Q
+C.Nm.uy(a,"set range")
 H.qG(a,v,v+z,y,0)
-return this.Bq+v}},
+return this.b+v}},
 Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.E3=H.VM(z,[b])},
+z.fixed$length=Array
+this.Q=H.J(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"TNe",uay:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
+static:{"^":"TNe",NZ2:function(a,b){var z=H.J(new P.Fw(null,0,0,0),[b])
+z.Eo(a,b)
+return z},uay:function(a){var z
+if(typeof a!=="number")return a.L()
+a=(a<<1>>>0)-1
 for(;!0;a=z){z=(a&a-1)>>>0
 if(z===0)return a}}}},
-fO:{
-"^":"a;dk,pP,Z1,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.dk
-if(this.Z1!==z.Z1)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.E3
+KG:{
+"^":"a;Q,a,b,c,d",
+gk:function(){return this.d},
+D:function(){var z,y,x
+z=this.Q
+if(this.b!==z.c)H.vh(P.a4(z))
+y=this.c
+if(y===this.a){this.d=null
+return!1}z=z.Q
 x=z.length
 if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
+this.d=z[y]
+this.c=(y+1&x-1)>>>0
 return!0}},
-lfu:{
+lf:{
 "^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
+gl0:function(a){return this.gv(this)===0},
+gor:function(a){return this.gv(this)!==0},
 V1:function(a){this.Ex(this.br(0))},
 FV:function(a,b){var z
-for(z=J.mY(b);z.G();)this.h(0,z.gl())},
+for(z=J.Nx(b);z.D();)this.h(0,z.gk())},
 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.Ff)},
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();)this.Rz(0,z.c)},
 uk:function(a,b){var z,y,x
 z=[]
-for(y=this.gA(this);y.G();){x=y.gl()
+for(y=this.gu(this);y.D();){x=y.gk()
 if(b.$1(x)===!0)z.push(x)}this.Ex(z)},
 tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.u3(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.u3(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+if(b){z=H.J([],[H.W8(this,"lf",0)])
+C.Nm.sv(z,this.gv(this))}else{y=Array(this.gv(this))
+y.fixed$length=Array
+z=H.J(y,[H.W8(this,"lf",0)])}for(y=this.gu(this),x=0;y.D();x=v){w=y.gk()
 v=x+1
 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:"xPo",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},
-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],
+ez:[function(a,b){return H.J(new H.xy(this,b),[H.W8(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.oZ(function(a){return{func:"fQO",ret:P.QV,args:[{func:"mLP",args:[a]}]}},this.$receiver,"lf")},31],
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
+ev:function(a,b){return H.J(new H.U5(this,b),[H.W8(this,"lf",0)])},
+Ft:[function(a,b){return H.J(new H.Fm(this,b),[H.W8(this,"lf",0),null])},"$1","git",2,0,function(){return H.oZ(function(a){return{func:"Gba",ret:P.QV,args:[{func:"E7T",ret:P.QV,args:[a]}]}},this.$receiver,"lf")},31],
 aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
+for(z=this.gu(this);z.D();)b.$1(z.gk())},
 zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
+z=this.gu(this)
+if(!z.D())return""
 y=P.p9("")
-if(b===""){do{x=H.d(z.gl())
-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}}return y.IN},
+if(b===""){do{x=H.d(z.gk())
+y.Q+=x}while(z.D())}else{y.KF(H.d(z.gk()))
+for(;z.D();){y.Q+=b
+x=H.d(z.gk())
+y.Q+=x}}x=y.Q
+return x.charCodeAt(0)==0?x:x},
 Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+for(z=this.gu(this);z.D();)if(b.$1(z.gk())===!0)return!0
 return!1},
-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()},
+eR:function(a,b){return H.ke(this,b,H.W8(this,"lf",0))},
+gtH:function(a){var z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+return z.gk()},
 grZ:function(a){var z,y
-z=this.gA(this)
-if(!z.G())throw H.b(H.DU())
-do y=z.gl()
-while(z.G())
+z=this.gu(this)
+if(!z.D())throw H.b(H.DU())
+do y=z.gk()
+while(z.D())
 return y},
 $isOl:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 Vj5:{
-"^":"lfu;"},
+"^":"lf;"},
 oz:{
-"^":"a;nl>,Bb>,T8>",
+"^":"a;G3:Q>,Bb:a>,T8:b>",
 $isoz:true},
 jp:{
-"^":"oz;P*,nl,Bb,T8",
+"^":"oz;M:c*,Q,a,b",
 $asoz:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
 oB:function(a){var z,y,x,w,v,u,t,s
-z=this.VR
+z=this.Q
 if(z==null)return-1
-y=this.fu
-for(x=y,w=x,v=null;!0;){v=this.R2(z.nl,a)
+y=this.a
+for(x=y,w=x,v=null;!0;){v=this.R2(z.Q,a)
 u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
+if(u.A(v,0)){u=z.a
 if(u==null)break
-v=this.R2(u.nl,a)
-if(J.xZ(v,0)){t=z.Bb
-z.Bb=t.T8
-t.T8=z
-if(t.Bb==null){z=t
-break}z=t}x.Bb=z
-s=z.Bb
+v=this.R2(u.Q,a)
+if(J.vU(v,0)){t=z.a
+z.a=t.b
+t.b=z
+if(t.a==null){z=t
+break}z=t}x.a=z
+s=z.a
 x=z
-z=s}else{if(u.C(v,0)){u=z.T8
+z=s}else{if(u.w(v,0)){u=z.b
 if(u==null)break
-v=this.R2(u.nl,a)
-if(J.u6(v,0)){t=z.T8
-z.T8=t.Bb
-t.Bb=z
-if(t.T8==null){z=t
-break}z=t}w.T8=z
-s=z.T8}else break
+v=this.R2(u.Q,a)
+if(J.UN(v,0)){t=z.b
+z.b=t.a
+t.a=z
+if(t.b==null){z=t
+break}z=t}w.b=z
+s=z.b}else break
 w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.VR=z
-y.T8=null
-y.Bb=null;++this.wq
+z=s}}w.b=z.a
+x.a=z.b
+z.a=y.b
+z.b=y.a
+this.Q=z
+y.b=null
+y.a=null;++this.d
 return v},
+Gj:function(a){var z,y
+for(z=a;y=z.a,y!=null;z=y){z.a=y.b
+y.b=z}return z},
 R8:function(a){var z,y
-for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},
+for(z=a;y=z.b,y!=null;z=y){z.b=y.a
+y.a=z}return z},
 qg:function(a){var z,y,x
-if(this.VR==null)return
-if(!J.xC(this.oB(a),0))return
-z=this.VR;--this.hm
-y=z.Bb
-if(y==null)this.VR=z.T8
-else{x=z.T8
+if(this.Q==null)return
+if(!J.mG(this.oB(a),0))return
+z=this.Q;--this.b
+y=z.a
+if(y==null)this.Q=z.b
+else{x=z.b
 y=this.R8(y)
-this.VR=y
-y.T8=x}++this.Z1
+this.Q=y
+y.b=x}++this.c
 return z},
-Oa:function(a,b){var z,y;++this.hm;++this.Z1
-if(this.VR==null){this.VR=a
-return}z=J.u6(b,0)
-y=this.VR
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.VR=a}},
+Oa:function(a,b){var z,y;++this.b;++this.c
+if(this.Q==null){this.Q=a
+return}z=J.UN(b,0)
+y=this.Q
+if(z){a.a=y
+a.b=y.b
+y.b=null}else{a.b=y
+a.a=y.a
+y.a=null}this.Q=a},
+gIn:function(){var z=this.Q
+if(z==null)return
+z=this.Gj(z)
+this.Q=z
+return z},
+gNz:function(){var z=this.Q
+if(z==null)return
+z=this.R8(z)
+this.Q=z
+return z}},
 Ba:{
-"^":"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)},
+"^":"vX1;e,f,Q,a,b,c,d",
+L4:function(a,b){return this.e.$2(a,b)},
+Bc:function(a){return this.f.$1(a)},
 R2:function(a,b){return this.L4(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
+p:function(a,b){var z
+if(b==null)throw H.b(P.p(b))
 if(this.Bc(b)!==!0)return
-if(this.VR!=null)if(J.xC(this.oB(b),0))return this.VR.P
-return},
+if(this.Q!=null)if(J.mG(this.oB(b),0)){z=this.Q
+return z.gM(z)}return},
 Rz:function(a,b){var z
 if(this.Bc(b)!==!0)return
 z=this.qg(b)
-if(z!=null)return z.P
+if(z!=null)return z.gM(z)
 return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
+q:function(a,b,c){var z
+if(b==null)throw H.b(P.p(b))
 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.QG(this))},
-gl0:function(a){return this.VR==null},
-gor:function(a){return this.VR!=null},
+if(J.mG(z,0)){this.Q.sM(0,c)
+return}this.Oa(H.J(new P.jp(c,b,null,null),[null,null]),z)},
+FV:function(a,b){C.Nm.aN(b,new P.pn(this))},
+gl0:function(a){return this.Q==null},
+gor:function(a){return this.Q!=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.Dd(this,[P.oz,z])
-for(;y.G();){x=y.gl()
+y=H.J(new P.HW(this,H.J([],[P.oz]),this.c,this.d,null),[z])
+y.ls(this,[P.oz,z])
+for(;y.D();){x=y.gk()
 z=J.RE(x)
-b.$2(z.gnl(x),z.gP(x))}},
-gB:function(a){return this.hm},
-V1:function(a){this.VR=null
-this.hm=0;++this.Z1},
-NZ:function(a,b){return this.Bc(b)===!0&&J.xC(this.oB(b),0)},
-gvc:function(a){return H.VM(new P.nF(this),[H.u3(this,0)])},
+b.$2(z.gG3(x),z.gM(x))}},
+gv:function(a){return this.b},
+V1:function(a){this.Q=null
+this.b=0;++this.c},
+NZ:function(a,b){return this.Bc(b)===!0&&J.mG(this.oB(b),0)},
+gvc:function(a){return H.J(new P.nF(this),[H.u3(this,0)])},
 gUQ:function(a){var z=new P.JO(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
-$asT8:null,
-$isT8:true,
+$asw:null,
+$isw:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.J(new P.Ba(z,y,null,H.J(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"TpZ:12;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"TpZ;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.a,"Ba")}},
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}},
+pn:{
+"^":"r;Q",
+$2:function(a,b){this.Q.q(0,a,b)},
+$signature:function(){return H.oZ(function(a,b){return{func:"VfV",args:[a,b]}},this.Q,"Ba")}},
 S6B:{
 "^":"a;",
-gl:function(){var z=this.Ju
+gk:function(){var z=this.d
 if(z==null)return
 return this.Gf(z)},
-Zq:function(a){var z
-for(z=this.x5;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.OC
-if(this.Z1!==z.Z1)throw H.b(P.a4(z))
-y=this.x5
-if(y.length===0){this.Ju=null
-return!1}if(z.wq!==this.wq&&this.Ju!=null){x=this.Ju
-C.Nm.sB(y,0)
-if(x==null)this.Zq(z.VR)
-else{z.oB(x.nl)
-this.Zq(z.VR.T8)}}if(0>=y.length)return H.e(y,0)
+V4:function(a){var z
+for(z=this.a;a!=null;){z.push(a)
+a=a.a}},
+D:function(){var z,y,x
+z=this.Q
+if(this.b!==z.c)throw H.b(P.a4(z))
+y=this.a
+if(y.length===0){this.d=null
+return!1}if(z.d!==this.c&&this.d!=null){x=this.d
+C.Nm.sv(y,0)
+if(x==null)this.V4(z.Q)
+else{z.oB(x.Q)
+this.V4(z.Q.b)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
-this.Ju=z
-this.Zq(z.T8)
+this.d=z
+this.V4(z.b)
 return!0},
-Dd:function(a,b){this.Zq(a.VR)}},
+ls:function(a,b){this.V4(a.Q)}},
 nF:{
-"^":"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.OC
-y=new P.DN(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.b},
+gl0:function(a){return this.Q.b===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.DN(z,H.J([],[P.oz]),z.c,z.d,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,0))
+y.ls(z,H.u3(this,0))
+return y},
+Oe:function(a){var z,y
+z=this.Q
+y=P.CH(z.e,z.f,H.u3(this,0))
+y.b=z.b
+y.Q=y.Gy(z.Q)
 return y},
 $isyN:true},
 JO:{
-"^":"mW;ZD",
-gB:function(a){return this.ZD.hm},
-gl0:function(a){return this.ZD.hm===0},
-gA:function(a){var z,y
-z=this.ZD
-y=new P.ZM(z,H.VM([],[P.oz]),z.Z1,z.wq,null)
+"^":"mW;Q",
+gv:function(a){return this.Q.b},
+gl0:function(a){return this.Q.b===0},
+gu:function(a){var z,y
+z=this.Q
+y=new P.ZM(z,H.J([],[P.oz]),z.c,z.d,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Dd(z,H.u3(this,1))
+y.ls(z,H.u3(this,1))
 return y},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
-Gf:function(a){return a.nl}},
+"^":"S6B;Q,a,b,c,d",
+Gf:function(a){return a.Q}},
 ZM:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
-Gf:function(a){return a.P},
+"^":"S6B;Q,a,b,c,d",
+Gf:function(a){return a.gM(a)},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;OC,x5,Z1,wq,Ju",
+"^":"S6B;Q,a,b,c,d",
 Gf:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["","",,P,{
+$asS6B:function(a){return[[P.oz,a]]}},
+zE:{
+"^":"UFN;e,f,Q,a,b,c,d",
+L4:function(a,b){return this.e.$2(a,b)},
+Bc:function(a){return this.f.$1(a)},
+R2:function(a,b){return this.L4(a,b)},
+gu:function(a){var z=new P.DN(this,H.J([],[P.oz]),this.c,this.d,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+z.ls(this,H.u3(this,0))
+return z},
+gv:function(a){return this.b},
+gl0:function(a){return this.Q==null},
+gor:function(a){return this.Q!=null},
+gtH:function(a){if(this.b===0)throw H.b(H.DU())
+return this.gIn().Q},
+grZ:function(a){if(this.b===0)throw H.b(H.DU())
+return this.gNz().Q},
+tg:function(a,b){return this.Bc(b)===!0&&J.mG(this.oB(b),0)},
+h:function(a,b){var z,y
+z=this.oB(b)
+if(J.mG(z,0))return!1
+y=new P.oz(b,null,null)
+y.$builtinTypeInfo=[null]
+this.Oa(y,z)
+return!0},
+Rz:function(a,b){if(this.Bc(b)!==!0)return!1
+return this.qg(b)!=null},
+FV:function(a,b){var z,y,x,w
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);z.D();){y=z.c
+x=this.oB(y)
+if(!J.mG(x,0)){w=new P.oz(y,null,null)
+w.$builtinTypeInfo=[null]
+this.Oa(w,x)}}},
+Ex:function(a){var z,y
+for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){y=z.c
+if(this.Bc(y)===!0)this.qg(y)}},
+iQ:function(a){if(this.Bc(a)!==!0)return
+if(!J.mG(this.oB(a),0))return
+return this.Q.Q},
+Gy:function(a){var z
+if(a==null)return
+z=new P.oz(a.Q,null,null)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+z.a=this.Gy(a.a)
+z.b=this.Gy(a.b)
+return z},
+V1:function(a){this.Q=null
+this.b=0;++this.c},
+Oe:function(a){var z=P.CH(this.e,this.f,H.u3(this,0))
+z.b=this.b
+z.Q=this.Gy(this.Q)
+return z},
+X:[function(a){return P.WE(this,"{","}")},"$0","gCR",0,0,0],
+static:{CH:function(a,b,c){return H.J(new P.zE(a,b,null,H.J(new P.oz(null,null,null),[c]),0,0,0),[c])}}},
+W8N:{
+"^":"vX1+Et;",
+$isQV:true,
+$asQV:null},
+UFN:{
+"^":"W8N+lf;",
+$isOl:true,
+$isyN:true,
+$isQV:true,
+$asQV:null},
+y8V:{
+"^":"r:14;Q",
+$1:function(a){var z=H.IU(a,this.Q)
+return z}}}],["","",,P,{
 "^":"",
 VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
 KH:function(a){var z
@@ -8642,478 +8179,475 @@
 return a},
 jc:function(a,b){var z,y,x,w
 x=a
-if(typeof x!=="string")throw H.b(P.u(a))
+if(typeof x!=="string")throw H.b(P.p(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y),null,null))}if(b==null)return P.KH(z)
+throw H.b(P.rr(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],
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,53,2],
 f1:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:function(a){var z,y,x,w,v,u
 if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.Q,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
 return a}z=Object.create(null)
 x=new P.r4(a,z,null)
 w=x.oD()
-for(v=this.a,y=0;y<w.length;++y){u=w[y]
-z[u]=v.$2(u,this.$1(a[u]))}x.PF=z
-return x},
-$isEH:true},
+for(v=this.Q,y=0;y<w.length;++y){u=w[y]
+z[u]=v.$2(u,this.$1(a[u]))}x.Q=z
+return x}},
 r4:{
-"^":"a;PF,LK,Mq",
-t:function(a,b){var z,y
-z=this.LK
-if(z==null)return this.Mq.t(0,b)
+"^":"a;Q,a,b",
+p:function(a,b){var z,y
+z=this.a
+if(z==null)return this.b.p(0,b)
 else if(typeof b!=="string")return
 else{y=z[b]
 return typeof y=="undefined"?this.fb(b):y}},
-gB:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+gv:function(a){var z
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z},
 gl0:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z===0},
 gor:function(a){var z
-if(this.LK==null){z=this.Mq
-z=z.gB(z)}else z=this.oD().length
+if(this.a==null){z=this.b
+z=z.gv(z)}else z=this.oD().length
 return z>0},
 gvc:function(a){var z
-if(this.LK==null){z=this.Mq
+if(this.a==null){z=this.b
 return z.gvc(z)}z=this.oD()
-return H.c1(z,0,null,H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0))},
+return H.c1(z,0,null,H.u3(H.J(new H.ii(),[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.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
+if(this.a==null){z=this.b
+return z.gUQ(z)}return H.fR(this.oD(),new P.Ni(this),null,null)},
+q:function(a,b,c){var z,y
+if(this.a==null)this.b.q(0,b,c)
+else if(this.NZ(0,b)){z=this.a
 z[b]=c
-y=this.PF
-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)
+y=this.Q
+if(y==null?z!=null:y!==z)y[b]=null}else this.XK().q(0,b,c)},
+FV:function(a,b){C.Nm.aN(b,new P.E5(this))},
+NZ:function(a,b){if(this.a==null)return this.b.NZ(0,b)
 if(typeof b!=="string")return!1
-return Object.prototype.hasOwnProperty.call(this.PF,b)},
+return Object.prototype.hasOwnProperty.call(this.Q,b)},
 to:function(a,b,c){var z
-if(this.NZ(0,b))return this.t(0,b)
+if(this.NZ(0,b))return this.p(0,b)
 z=c.$0()
-this.u(0,b,z)
+this.q(0,b,z)
 return z},
-Rz:function(a,b){if(this.LK!=null&&!this.NZ(0,b))return
-return this.tZ().Rz(0,b)},
+Rz:function(a,b){if(this.a!=null&&!this.NZ(0,b))return
+return this.XK().Rz(0,b)},
 V1:function(a){var z
-if(this.LK==null)this.Mq.V1(0)
-else{z=this.Mq
+if(this.a==null)this.b.V1(0)
+else{z=this.b
 if(z!=null)J.U2(z)
-this.LK=null
-this.PF=null
-this.Mq=P.Fl(null,null)}},
+this.a=null
+this.Q=null
+this.b=P.A(null,null)}},
 aN:function(a,b){var z,y,x,w
-if(this.LK==null)return this.Mq.aN(0,b)
+if(this.a==null)return this.b.aN(0,b)
 z=this.oD()
 for(y=0;y<z.length;++y){x=z[y]
-w=this.LK[x]
-if(typeof w=="undefined"){w=P.KH(this.PF[x])
-this.LK[x]=w}b.$2(x,w)
-if(z!==this.Mq)throw H.b(P.a4(this))}},
-bu:[function(a){return P.vW(this)},"$0","gCR",0,0,73],
-oD:function(){var z=this.Mq
-if(z==null){z=Object.keys(this.PF)
-this.Mq=z}return z},
-tZ:function(){var z,y,x,w,v
-if(this.LK==null)return this.Mq
-z=P.Fl(null,null)
+w=this.a[x]
+if(typeof w=="undefined"){w=P.KH(this.Q[x])
+this.a[x]=w}b.$2(x,w)
+if(z!==this.b)throw H.b(P.a4(this))}},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+oD:function(){var z=this.b
+if(z==null){z=Object.keys(this.Q)
+this.b=z}return z},
+XK:function(){var z,y,x,w,v
+if(this.a==null)return this.b
+z=P.A(null,null)
 y=this.oD()
 for(x=0;w=y.length,x<w;++x){v=y[x]
-z.u(0,v,this.t(0,v))}if(w===0)y.push(null)
-else C.Nm.sB(y,0)
-this.LK=null
-this.PF=null
-this.Mq=z
+z.q(0,v,this.p(0,v))}if(w===0)y.push(null)
+else C.Nm.sv(y,0)
+this.a=null
+this.Q=null
+this.b=z
 return z},
 fb:function(a){var z
-if(!Object.prototype.hasOwnProperty.call(this.PF,a))return
-z=P.KH(this.PF[a])
-return this.LK[a]=z},
+if(!Object.prototype.hasOwnProperty.call(this.Q,a))return
+z=P.KH(this.Q[a])
+return this.a[a]=z},
 $isFo:true,
 $asFo:function(){return[null,null]},
-$isT8:true,
-$asT8:function(){return[null,null]}},
-A5:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,140,"call"],
-$isEH:true},
+$isw:true,
+$asw:function(){return[null,null]}},
+Ni:{
+"^":"r:14;Q",
+$1:[function(a){return this.Q.p(0,a)},"$1",null,2,0,null,140,"call"]},
 E5:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-Uk:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,b)}},
+Ukr:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Uk;",
-$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Ukr;",
+$asUkr:function(){return[P.I,[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:{NM:function(a,b){return new P.Ud(a,b)}}},
+"^":"XS;Q,a",
+X:[function(a){if(this.a!=null)return"Converting object to an encodable object failed."
+else return"Converting object did not return an encodable object."},"$0","gCR",0,0,0],
+static:{Gy: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],
+"^":"Ud;Q,a",
+X:[function(a){return"Cyclic error in JSON stringify"},"$0","gCR",0,0,0],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Uk;Fs<,xq",
-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.N7(a,null)},
-gZE:function(){return C.cb},
-gP1:function(){return C.A3},
-$asUk:function(){return[P.a,P.qU]}},
+"^":"Ukr;Fs:Q<,a",
+cW:function(a,b){return P.jc(a,this.gHe().Q)},
+kV:function(a){return this.cW(a,null)},
+Co:function(a,b){var z=this.gZE()
+return P.EB(a,z.a,z.Q)},
+KP:function(a){return this.Co(a,null)},
+gZE:function(){return C.Sr},
+gHe:function(){return C.A3},
+$asUkr:function(){return[P.a,P.I]}},
 ojF:{
-"^":"wIe;UM,Wl",
-$aswIe:function(){return[P.a,P.qU]}},
-c5:{
-"^":"wIe;Fs<",
-$aswIe:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"a;xq,qR,SK",
-HT:function(a){return this.xq.$1(a)},
-Ip:function(a){var z,y,x,w,v,u,t
+"^":"wIe;Q,a",
+$aswIe:function(){return[P.a,P.I]}},
+Mx:{
+"^":"wIe;Fs:Q<",
+$aswIe:function(){return[P.I,P.a]}},
+Shx:{
+"^":"a;",
+HT:function(a){return this.a.$1(a)},
+vp:function(a){var z,y,x,w,v,u
 z=J.U6(a)
-y=z.gB(a)
-if(typeof y!=="number")return H.s(y)
-x=this.qR
+y=z.gv(a)
+if(typeof y!=="number")return H.o(y)
+x=0
 w=0
-v=0
-for(;v<y;++v){u=z.j(a,v)
-if(u>92)continue
-if(u<32){if(v>w){t=z.Nj(a,w,v)
-x.IN+=t}w=v+1
-t=H.mx(92)
-x.IN+=t
-switch(u){case 8:t=H.mx(98)
-x.IN+=t
+for(;w<y;++w){v=z.O2(a,w)
+if(v>92)continue
+if(v<32){if(w>x)this.pN(a,x,w)
+x=w+1
+this.NY(92)
+switch(v){case 8:this.NY(98)
 break
-case 9:t=H.mx(116)
-x.IN+=t
+case 9:this.NY(116)
 break
-case 10:t=H.mx(110)
-x.IN+=t
+case 10:this.NY(110)
 break
-case 12:t=H.mx(102)
-x.IN+=t
+case 12:this.NY(102)
 break
-case 13:t=H.mx(114)
-x.IN+=t
+case 13:this.NY(114)
 break
-default:t=H.mx(117)
-x.IN+=t
-t=H.mx(48)
-x.IN+=t
-t=H.mx(48)
-x.IN+=t
-t=u>>>4&15
-t=H.mx(t<10?48+t:87+t)
-x.IN+=t
-t=u&15
-t=H.mx(t<10?48+t:87+t)
-x.IN+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.IN+=t}w=v+1
-t=H.mx(92)
-x.IN+=t
-t=H.mx(u)
-x.IN+=t}}if(w===0)x.KF(a)
-else if(w<y)x.KF(z.Nj(a,w,y))},
-WD:function(a){var z,y,x,w
-for(z=this.SK,y=z.length,x=0;x<y;++x){w=z[x]
+default:this.NY(117)
+this.NY(48)
+this.NY(48)
+u=v>>>4&15
+this.NY(u<10?48+u:87+u)
+u=v&15
+this.NY(u<10?48+u:87+u)
+break}}else if(v===34||v===92){if(w>x)this.pN(a,x,w)
+x=w+1
+this.NY(92)
+this.NY(v)}}if(x===0)this.K6(a)
+else if(x<y)this.pN(a,x,y)},
+Jn:function(a){var z,y,x,w
+for(z=this.Q,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
-rl:function(a){var z,y,x,w
-if(!this.Jc(a)){this.WD(a)
+E5:function(a){var z=this.Q
+if(0>=z.length)return H.e(z,0)
+z.pop()},
+QD:function(a){var z,y,x,w
+if(this.tM(a))return
+this.Jn(a)
 try{z=this.HT(a)
-if(!this.Jc(z)){x=P.NM(a,null)
-throw H.b(x)}x=this.SK
+if(!this.tM(z)){x=P.Gy(a,null)
+throw H.b(x)}x=this.Q
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
-Jc:function(a){var z,y,x,w
-z={}
-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")
-return!0}else if(a==null){this.qR.KF("null")
-return!0}else if(typeof a==="string"){z=this.qR
-z.KF("\"")
-this.Ip(a)
-z.KF("\"")
-return!0}else{y=J.x(a)
-if(!!y.$isWO){this.WD(a)
-z=this.qR
-z.KF("[")
-if(y.gB(a)>0){this.rl(y.t(a,0))
-for(x=1;x<y.gB(a);++x){z.IN+=","
-this.rl(y.t(a,x))}}z.KF("]")
+throw H.b(P.Gy(a,y))}},
+tM:function(a){var z
+if(typeof a==="number"){if(!C.CD.gx8(a))return!1
+this.ID(a)
+return!0}else if(a===!0){this.K6("true")
+return!0}else if(a===!1){this.K6("false")
+return!0}else if(a==null){this.K6("null")
+return!0}else if(typeof a==="string"){this.K6("\"")
+this.vp(a)
+this.K6("\"")
+return!0}else{z=J.t(a)
+if(!!z.$isWO){this.Jn(a)
+this.lK(a)
 this.E5(a)
-return!0}else if(!!y.$isT8){this.WD(a)
-w=this.qR
-w.KF("{")
-z.a="\""
-y.aN(a,new P.tF(z,this))
-w.KF("}")
+return!0}else if(!!z.$isw){this.Jn(a)
+this.jw(a)
 this.E5(a)
 return!0}else return!1}},
-E5:function(a){var z=this.SK
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,No,HVe,Wk,BLm,KQz,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)
-return z.IN}}},
-tF:{
-"^":"TpZ:82;a,b",
-$2:[function(a,b){var z,y,x
-z=this.b
-y=z.qR
-x=this.a
-y.KF(x.a)
-x.a=",\""
-z.Ip(a)
-y.KF("\":")
-z.rl(b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true},
-u5F:{
-"^":"Ziv;QA",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"wIe;",
-Sw:function(a){var z,y,x
+lK:function(a){var z,y
+this.K6("[")
 z=J.U6(a)
-y=J.vX(z.gB(a),3)
-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.Nm.aM(y,0,x.o9)},
-$aswIe:function(){return[P.qU,[P.WO,P.KN]]}},
+if(z.gv(a)>0){this.QD(z.p(a,0))
+for(y=1;y<z.gv(a);++y){this.K6(",")
+this.QD(z.p(a,y))}}this.K6("]")},
+jw:function(a){var z={}
+this.K6("{")
+z.a="\""
+J.Me(a,new P.ti(z,this))
+this.K6("}")}},
+ti:{
+"^":"r:82;Q,a",
+$2:function(a,b){var z,y
+z=this.a
+y=this.Q
+z.K6(y.a)
+y.a=",\""
+z.vp(a)
+z.K6("\":")
+z.QD(b)}},
+tu:{
+"^":"Shx;b,Q,a",
+ID:function(a){this.b.KF(C.CD.X(a))},
+K6:function(a){var z=typeof a==="string"?a:H.d(a)
+this.b.Q+=z},
+pN:function(a,b,c){var z=J.Nj(a,b,c)
+this.b.Q+=z},
+NY:function(a){var z=H.mx(a)
+this.b.Q+=z},
+static:{EB:function(a,b,c){var z,y,x
+z=P.p9("")
+y=P.Jn()
+x=new P.tu(z,[],y)
+x.QD(a)
+y=z.Q
+return y.charCodeAt(0)==0?y:y}}},
+u5F:{
+"^":"Ziv;Q",
+goc:function(a){return"utf-8"},
+gZE:function(){return new P.E3()}},
+E3:{
+"^":"wIe;",
+ME:function(a,b,c){var z,y,x,w,v,u
+z=J.U6(a)
+y=z.gv(a)
+P.iZ(b,c,y,null,null,null)
+x=J.Wx(y)
+w=x.T(y,b)
+v=J.t(w)
+if(v.m(w,0))return new Uint8Array(0)
+v=v.R(w,3)
+if(typeof v!=="number"||Math.floor(v)!==v)H.vh(P.p("Invalid length "+H.d(v)))
+v=new Uint8Array(v)
+u=new P.Rw(0,0,v)
+if(u.Gx(a,b,y)!==y)u.O6(z.O2(a,x.T(y,1)),0)
+return new Uint8Array(v.subarray(0,C.Jm.i4(v,0,u.a,v.length)))},
+WJ:function(a){return this.ME(a,0,null)},
+$aswIe:function(){return[P.I,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;UfS,o9,Zj",
+"^":"a;Q,a,b",
 O6:function(a,b){var z,y,x,w,v
-z=this.Zj
-y=this.o9
+z=this.b
+y=this.a
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.o9=w
+this.a=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.o9=y
+this.a=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.o9=w
+this.a=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.o9=w+1
+this.a=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.o9=w
+this.a=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.o9=y
+this.a=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.o9=y+1
+this.a=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
 Gx:function(a,b,c){var z,y,x,w,v,u,t,s
-if(b!==c&&(J.Pp(a,J.bI(c,1))&64512)===55296)c=J.bI(c,1)
-if(typeof c!=="number")return H.s(c)
-z=this.Zj
+if(b!==c&&(J.IC(a,J.D5(c,1))&64512)===55296)c=J.D5(c,1)
+if(typeof c!=="number")return H.o(c)
+z=this.b
 y=z.length
-x=J.Qe(a)
+x=J.NH(a)
 w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.o9
+for(;w<c;++w){v=x.O2(a,w)
+if(v<=127){u=this.a
 if(u>=y)break
-this.o9=u+1
-z[u]=v}else if((v&64512)===55296){if(this.o9+3>=y)break
+this.a=u+1
+z[u]=v}else if((v&64512)===55296){if(this.a+3>=y)break
 t=w+1
-if(this.O6(v,x.j(a,t)))w=t}else if(v<=2047){u=this.o9
+if(this.O6(v,x.O2(a,t)))w=t}else if(v<=2047){u=this.a
 s=u+1
 if(s>=y)break
-this.o9=s
+this.a=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.o9=s+1
-z[s]=128|v&63}else{u=this.o9
+this.a=s+1
+z[s]=128|v&63}else{u=this.a
 if(u+2>=y)break
 s=u+1
-this.o9=s
+this.a=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.o9=u
+this.a=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.o9=u+1
+this.a=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;QA",
-Sw:function(a){var z,y
-z=P.p9("")
-y=new P.Dd(this.QA,z,!0,0,0,0)
-y.ME(a,0,J.q8(a))
-y.fZ()
-return z.IN},
-$aswIe:function(){return[[P.WO,P.KN],P.qU]}},
+"^":"wIe;Q",
+ME:function(a,b,c){var z,y,x,w
+z=J.wS(a)
+P.iZ(b,c,z,null,null,null)
+y=P.p9("")
+x=new P.Dd(this.Q,y,!0,0,0,0)
+x.ME(a,b,z)
+x.fZ()
+w=y.Q
+return w.charCodeAt(0)==0?w:w},
+WJ:function(a){return this.ME(a,0,null)},
+$aswIe:function(){return[[P.WO,P.KN],P.I]}},
 Dd:{
-"^":"a;QA,C4,YN,Dp,rw,pt",
+"^":"a;Q,a,b,c,d,e",
 xO:function(a){this.fZ()},
-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
-this.pt=0}},
+fZ:function(){if(this.d>0){if(!this.Q)throw H.b(P.rr("Unfinished UTF-8 octet sequence",null,null))
+this.a.KF(H.mx(65533))
+this.c=0
+this.d=0
+this.e=0}},
 ME:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.Dp
-y=this.rw
-x=this.pt
-this.Dp=0
-this.rw=0
-this.pt=0
-w=new P.wh(c)
+z=this.c
+y=this.d
+x=this.e
+this.c=0
+this.d=0
+this.e=0
+w=new P.b2(c)
 v=new P.yn(this,a,b,c)
-$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)
+$loop$0:for(u=this.a,t=!this.Q,s=J.U6(a),r=b;!0;r=n){$multibyte$2:{if(y>0){do{if(r===c)break $loop$0
+q=s.p(a,r)
 p=J.Wx(q)
-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
+if(p.i(q,192)!==128){if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.b=!1
 p=H.mx(65533)
-u.IN+=p
+u.Q+=p
 y=0
 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.cD("Overlong encoding of 0x"+C.jn.WZ(z,16),null,null))
+if(z<=C.Gb[p]){if(t)throw H.b(P.rr("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.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
-if(typeof o!=="number")return H.s(o)
+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))
+z=65533}if(!this.b||z!==65279){p=H.mx(z)
+u.Q+=p}this.b=!1}}for(;r<c;r=n){o=w.$2(a,r)
+if(J.vU(o,0)){this.b=!1
+if(typeof o!=="number")return H.o(o)
 n=r+o
 v.$2(r,n)
 if(n===c)break
 r=n}n=r+1
-q=s.t(a,r)
+q=s.p(a,r)
 p=J.Wx(q)
-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))
+if(p.w(q,0)){if(t)throw H.b(P.rr("Negative UTF-8 code unit: -0x"+J.u1(p.G(q),16),null,null))
 p=H.mx(65533)
-u.IN+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
+u.Q+=p}else{if(p.i(q,224)===192){z=p.i(q,31)
 y=1
 x=1
 continue $loop$0}if(p.i(q,240)===224){z=p.i(q,15)
 y=2
 x=2
-continue $loop$0}if(p.i(q,248)===240&&p.C(q,245)){z=p.i(q,7)
+continue $loop$0}if(p.i(q,248)===240&&p.w(q,245)){z=p.i(q,7)
 y=3
 x=3
-continue $loop$0}if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
-this.YN=!1
+continue $loop$0}if(t)throw H.b(P.rr("Bad UTF-8 encoding 0x"+p.WZ(q,16),null,null))
+this.b=!1
 p=H.mx(65533)
-u.IN+=p
+u.Q+=p
 z=65533
 y=0
-x=0}}break $loop$0}if(y>0){this.Dp=z
-this.rw=y
-this.pt=x}},
+x=0}}break $loop$0}if(y>0){this.c=z
+this.d=y
+this.e=x}},
 static:{"^":"ADi"}},
-wh:{
-"^":"TpZ:142;a",
+b2:{
+"^":"r:142;Q",
 $2:function(a,b){var z,y,x,w
-z=this.a
-for(y=J.U6(a),x=b;x<z;++x){w=y.t(a,x)
-if(J.mQ(w,127)!==w)return x-b}return z-b},
-$isEH:true},
+z=this.Q
+for(y=J.U6(a),x=b;x<z;++x){w=y.p(a,x)
+if(J.mQ(w,127)!==w)return x-b}return z-b}},
 yn:{
-"^":"TpZ:143;b,c,d,e",
-$2:function(a,b){var z,y,x
-z=a===0&&b===J.q8(this.c)
-y=this.b
-x=this.c
-if(z)y.C4.KF(P.HM(x))
-else y.C4.KF(P.HM(J.Fd(x,a,b)))},
-$isEH:true}}],["","",,P,{
+"^":"r:143;Q,a,b,c",
+$2:function(a,b){this.Q.a.KF(P.Qe(this.a,a,b))}}}],["","",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
-hl:function(a){var z,y,x,w,v
-if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
-if(typeof a==="string"){z=new P.Rn("")
-z.IN="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.yo.j(a,x)
-if(v<=31)if(v===10)w=z.IN+="\\n"
-else if(v===13)w=z.IN+="\\r"
-else if(v===9)w=z.IN+="\\t"
-else{w=z.IN+="\\x"
-if(v<16)z.IN=w+"0"
-else{z.IN=w+"1"
-v-=16}w=H.mx(v<10?48+v:87+v)
-w=z.IN+=w}else if(v===92)w=z.IN+="\\\\"
-else if(v===34)w=z.IN+="\\\""
-else{w=H.mx(v)
-w=z.IN+=w}}y=w+"\""
-z.IN=y
-return y}return"Instance of '"+H.lh(a)+"'"},
+DM:function(a,b,c){var z,y,x,w
+if(b<0)throw H.b(P.ve(b,0,J.wS(a),null,null))
+z=c==null
+if(!z&&c<b)throw H.b(P.ve(c,b,J.wS(a),null,null))
+y=J.Nx(a)
+for(x=0;x<b;++x)if(!y.D())throw H.b(P.ve(b,0,x,null,null))
+w=[]
+if(z)for(;y.D();)w.push(y.c)
+else for(x=b;x<c;++x){if(!y.D())throw H.b(P.ve(c,b,x,null,null))
+w.push(y.c)}return H.LY(w)},
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,54,52,55],
+hl:function(a){if(typeof a==="number"||typeof a==="boolean"||null==a)return J.Lz(a)
+if(typeof a==="string")return JSON.stringify(a)
+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],
-F:function(a,b,c){var z,y
-z=H.VM([],[c])
-for(y=J.mY(a);y.G();)z.push(y.gl())
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,56],
+xvm:[function(a){return H.CU(a)},"$1","mbf",2,0,57],
+z:function(a,b,c){var z,y
+z=H.J([],[c])
+for(y=J.Nx(a);y.D();)z.push(y.gk())
 if(b)return z
-z.fixed$length=init
+z.fixed$length=Array
 return z},
 FL:function(a){var z,y
 z=H.d(a)
 y=$.oK
 if(y==null)H.qw(z)
 else y.$1(z)},
-HM:function(a){return H.eT(a.constructor!==Array?P.F(a,!0,null):a)},
+Qe:function(a,b,c){var z,y
+if(a.constructor!==Array)return P.DM(a,b,c)
+z=a.length
+if(b<0||b>z)throw H.b(P.ve(b,0,z,null,null))
+if(c==null)c=z
+else if(c<b||c>z)throw H.b(P.ve(c,b,z,null,null))
+if(b<=0){if(typeof c!=="number")return c.w()
+y=c<z}else y=!0
+return H.LY(y?C.Nm.D6(a,b,c):a)},
 Y25:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a.gOB(a),b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a.gOB(a),b)}},
 CL:{
-"^":"TpZ:144;a",
-$2:function(a,b){var z=this.a
+"^":"r:144;Q",
+$2:function(a,b){var z=this.Q
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.ro(a))
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
+z.a.KF(P.hl(b));++z.b}},
 SQ:{
 "^":"a;",
 $isSQ:true},
@@ -9121,14 +8655,14 @@
 fRn:{
 "^":"a;"},
 iP:{
-"^":"a;rq<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.rq,b.rq)&&this.aL===b.aL},
-iM:function(a,b){return J.FW(this.rq,b.grq())},
-giO:function(a){return this.rq},
-bu:[function(a){var z,y,x,w,v,u,t,s
-z=this.aL
+"^":"a;rq:Q<,a",
+m:function(a,b){if(b==null)return!1
+if(!J.t(b).$isiP)return!1
+return J.mG(this.Q,b.Q)&&this.a===b.a},
+iM:function(a,b){return J.FW(this.Q,b.grq())},
+giO:function(a){return this.Q},
+X:[function(a){var z,y,x,w,v,u,t,s
+z=this.a
 y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
 x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
 w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
@@ -9137,18 +8671,17 @@
 t=P.h0(H.Sw(this))
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,73],
-h:function(a,b){return P.Wu(J.WB(this.rq,b.gVs()),this.aL)},
-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))},
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gCR",0,0,0],
+h:function(a,b){return P.Wu(J.WB(this.Q,b.gVs()),this.a)},
+gX3:function(){return H.KL(this)},
+gcO:function(){return H.ch(this)},
+gIv:function(){return H.Sw(this)},
+RM:function(a,b){if(J.vU(J.yH(a),8640000000000000))throw H.b(P.p(a))},
 $isiP:true,
-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)
+static:{"^":"Oj2,Vp,dfk,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)
 if(z!=null){y=new P.ci()
-x=z.pX
+x=z.a
 if(1>=x.length)return H.e(x,1)
 w=H.BU(x[1],null,null)
 if(2>=x.length)return H.e(x,2)
@@ -9162,25 +8695,25 @@
 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.Dv(J.vX(new P.Rq().$1(x[7]),1000))
+q=J.NQ(J.lX(new P.Rq().$1(x[7]),1000))
 if(q===1000){p=!0
 q=999}else p=!1
 o=x.length
 if(8>=o)return H.e(x,8)
 if(x[8]!=null){if(9>=o)return H.e(x,9)
 o=x[9]
-if(o!=null){n=J.xC(o,"-")?-1:1
+if(o!=null){n=J.mG(o,"-")?-1:1
 if(10>=x.length)return H.e(x,10)
 m=H.BU(x[10],null,null)
 if(11>=x.length)return H.e(x,11)
 l=y.$1(x[11])
-if(typeof m!=="number")return H.s(m)
+if(typeof m!=="number")return H.o(m)
 l=J.WB(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(s,n*l)}k=!0}else k=!1
+if(typeof l!=="number")return H.o(l)
+s=J.D5(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.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)
+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)
 z.RM(a,b)
 return z},Gq:function(a){var z,y
 z=Math.abs(a)
@@ -9193,170 +8726,194 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 ci:{
-"^":"TpZ:145;",
+"^":"r:145;",
 $1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
+return H.BU(a,null,null)}},
 Rq:{
-"^":"TpZ:146;",
+"^":"r:146;",
 $1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-Vf:{
-"^":"lf;",
-$isVf:true},
+return H.RR(a,null)}},
+CP:{
+"^":"FK;",
+$isCP:true},
 "+double":0,
 a6:{
-"^":"a;m5<",
-g:function(a,b){return P.ii(0,0,this.m5+b.gm5(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.m5-b.gm5(),0,0,0)},
-U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.yu(C.CD.RE(this.m5*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.zl())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.m5,b),0,0,0)},
-C:function(a,b){return this.m5<b.gm5()},
-D:function(a,b){return this.m5>b.gm5()},
-E:function(a,b){return this.m5<=b.gm5()},
-F:function(a,b){return this.m5>=b.gm5()},
-gVs:function(){return C.CD.BU(this.m5,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.m5===b.m5},
-giO:function(a){return this.m5&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.m5,b.gm5())},
-bu:[function(a){var z,y,x,w,v
+"^":"a;m5:Q<",
+g:function(a,b){return new P.a6(this.Q+b.gm5())},
+T:function(a,b){return new P.a6(this.Q-b.gm5())},
+R:function(a,b){if(typeof b!=="number")return H.o(b)
+return new P.a6(C.CD.yu(C.CD.RE(this.Q*b)))},
+W:function(a,b){if(J.mG(b,0))throw H.b(P.zl())
+if(typeof b!=="number")return H.o(b)
+return new P.a6(C.jn.W(this.Q,b))},
+w:function(a,b){return this.Q<b.gm5()},
+A:function(a,b){return this.Q>b.gm5()},
+B:function(a,b){return this.Q<=b.gm5()},
+C:function(a,b){return this.Q>=b.gm5()},
+gVs:function(){return C.jn.BU(this.Q,1000)},
+m:function(a,b){if(b==null)return!1
+if(!J.t(b).$isa6)return!1
+return this.Q===b.Q},
+giO:function(a){return this.Q&0x1FFFFFFF},
+iM:function(a,b){return C.jn.iM(this.Q,b.gm5())},
+X:[function(a){var z,y,x,w,v
 z=new P.DW()
-y=this.m5
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.BU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.BU(y,1000000),60))
-v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.BU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,73],
-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)},
+y=this.Q
+if(y<0)return"-"+new P.a6(-y).X(0)
+x=z.$1(C.jn.JV(C.jn.BU(y,60000000),60))
+w=z.$1(C.jn.JV(C.jn.BU(y,1000000),60))
+v=new P.P7().$1(C.jn.JV(y,1000000))
+return""+C.jn.BU(y,3600000000)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gCR",0,0,0],
+Vy:function(a){return new P.a6(Math.abs(this.Q))},
+G:function(a){return new P.a6(-this.Q)},
 $isa6:true,
-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)}}},
+static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,jS,IGB,DoM,CvD,MV,IJZ,xF,Wr,S84,rGr",xC: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)
-if(a>=10000)return"0"+H.d(a)
-if(a>=1000)return"00"+H.d(a)
-if(a>=100)return"000"+H.d(a)
-if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},
-$isEH:true},
+"^":"r:16;",
+$1:function(a){if(a>=100000)return""+a
+if(a>=10000)return"0"+a
+if(a>=1000)return"00"+a
+if(a>=100)return"000"+a
+if(a>=10)return"0000"+a
+return"00000"+a}},
 DW:{
-"^":"TpZ:14;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
+"^":"r:16;",
+$1:function(a){if(a>=10)return""+a
+return"0"+a}},
 XS:{
 "^":"a;",
-gI4:function(){return new H.oP(this.$thrownJsError,null)},
+gI4:function(){return new H.XO(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gCR",0,0,73]},
+X:[function(a){return"Throw of null."},"$0","gCR",0,0,0]},
 OY:{
-"^":"XS;G1>",
-bu:[function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gCR",0,0,73],
-static:{u:function(a){return new P.OY(a)}}},
+"^":"XS;Q,a,oc:b>,G1:c>",
+X:[function(a){var z,y
+if(!this.Q){z=this.c
+return z!=null?"Invalid arguments(s): "+H.d(z):"Invalid arguments(s)"}z=this.b
+y=z!=null?" ("+H.d(z)+")":""
+return H.d(this.c)+y+": "+H.d(P.hl(this.a))},"$0","gCR",0,0,0],
+static:{p:function(a){return new P.OY(!1,null,null,a)},hG:function(a){return new P.OY(!0,null,a,"Must not be null")}}},
 Sn:{
-"^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gCR",0,0,73],
-static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
+"^":"OY;J:d>,wQ:e<,Q,a,b,c",
+X:[function(a){var z,y,x,w,v
+if(!this.Q)return"RangeError: "+H.d(this.c)
+z=P.hl(this.a)
+y=this.d
+if(y==null){y=this.e
+x=y!=null?": Not less than or equal to "+H.d(y):""}else{w=this.e
+if(w==null)x=": Not greater than or equal to "+H.d(y)
+else{v=J.Wx(w)
+if(v.A(w,y))x=": Not in range "+H.d(y)+".."+H.d(w)+", inclusive."
+else x=v.w(w,y)?": Valid value range is empty":": Only valid value is "+H.d(y)}}return"RangeError: "+H.d(this.c)+" ("+H.d(z)+")"+x},"$0","gCR",0,0,0],
+static:{KP:function(a){return new P.Sn(null,null,!1,null,null,a)},D:function(a,b,c){return new P.Sn(null,null,!0,a,b,"Value not in range")},ve:function(a,b,c,d,e){return new P.Sn(b,c,!0,a,d,"Invalid value")},wA:function(a,b,c,d,e){if(a<b||a>c)throw H.b(P.ve(a,b,c,d,e))},iZ:function(a,b,c,d,e,f){var z=J.Wx(a)
+if(z.w(a,0)||z.A(a,c))throw H.b(P.ve(a,0,c,"start",f))
+if(b!=null){z=J.Wx(b)
+z=z.w(b,a)||z.A(b,c)}else z=!1
+if(z)throw H.b(P.ve(b,a,c,"end",f))}}},
+eY:{
+"^":"OY;d,v:e>,Q,a,b,c",
+gJ:function(a){return 0},
+gwQ:function(){return J.D5(this.e,1)},
+X:[function(a){var z,y,x
+z=P.hl(this.d)
+y="index should be less than "+H.d(this.e)
+x=this.a
+if(J.UN(x,0))y="index must not be negative"
+return"RangeError: "+H.d(this.c)+" ("+H.d(z)+"["+H.d(x)+"]): "+y},"$0","gCR",0,0,0],
+$isXS:true,
+static:{Hj:function(a,b,c,d,e){var z=e!=null?e:J.wS(b)
+return new P.eY(b,z,!0,a,c,"Index out of range")}}},
 Np:{
 "^":"XS;",
 static:{a9:function(){return new P.Np()}}},
 JS:{
-"^":"XS;uF,vI,mP,ae,wI",
-bu:[function(a){var z,y,x,w,v,u
+"^":"XS;Q,a,b,c,d",
+X:[function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
-for(y=this.mP,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
-v.IN+=", "}v=z.a
+for(y=this.b,x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
+v.Q+=", "}v=z.a
 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: ["+z.a.IN+"]"},"$0","gCR",0,0,73],
+v.Q+=typeof u==="string"?u:H.d(u)}this.c.aN(0,new P.CL(z))
+return"NoSuchMethodError : method not found: '"+this.a.X(0)+"'\nReceiver: "+H.d(P.hl(this.Q))+"\nArguments: ["+H.d(z.a)+"]"},"$0","gCR",0,0,0],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
-"^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){return"Unsupported operation: "+this.Q},"$0","gCR",0,0,0],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
-"^":"XS;G1>",
-bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,73],
+"^":"XS;G1:Q>",
+X:[function(a){var z=this.Q
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gCR",0,0,0],
 $isXS:true,
 static:{nO:function(a){return new P.rM(a)}}},
 lj:{
-"^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gCR",0,0,73],
-static:{w:function(a){return new P.lj(a)}}},
+"^":"XS;G1:Q>",
+X:[function(a){return"Bad state: "+this.Q},"$0","gCR",0,0,0],
+static:{s:function(a){return new P.lj(a)}}},
 UV:{
-"^":"XS;YA",
-bu:[function(a){var z=this.YA
+"^":"XS;Q",
+X:[function(a){var z=this.Q
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,73],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gCR",0,0,0],
 static:{a4:function(a){return new P.UV(a)}}},
 k5C:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gCR",0,0,73],
+X:[function(a){return"Out of Memory"},"$0","gCR",0,0,0],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gCR",0,0,73],
+X:[function(a){return"Stack Overflow"},"$0","gCR",0,0,0],
 gI4:function(){return},
 $isXS:true},
 t7:{
-"^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gCR",0,0,73],
+"^":"XS;Q",
+X:[function(a){return"Reading static variable '"+this.Q+"' during its initialization"},"$0","gCR",0,0,0],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
-"^":"a;G1>",
-bu:[function(a){var z=this.G1
+"^":"a;G1:Q>",
+X:[function(a){var z=this.Q
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gCR",0,0,73]},
+return"Exception: "+H.d(z)},"$0","gCR",0,0,0]},
 oe:{
-"^":"a;G1>,FF>,D7>",
-bu:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=this.G1
+"^":"a;G1:Q>,FF:a>,D7:b>",
+X:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
+z=this.Q
 y=z!=null&&""!==z?"FormatException: "+H.d(z):"FormatException"
-x=this.D7
-w=this.FF
+x=this.b
+w=this.a
 if(typeof w!=="string")return x!=null?y+(" (at offset "+H.d(x)+")"):y
-if(x!=null)if(!(x<0)){z=J.q8(w)
-if(typeof z!=="number")return H.s(z)
+if(x!=null)if(!(x<0)){z=J.wS(w)
+if(typeof z!=="number")return H.o(z)
 z=x>z}else z=!0
 else z=!1
 if(z)x=null
 if(x==null){z=J.U6(w)
-if(J.xZ(z.gB(w),78))w=z.Nj(w,0,75)+"..."
-return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.j(w,s)
+if(J.vU(z.gv(w),78))w=z.Nj(w,0,75)+"..."
+return y+"\n"+H.d(w)}for(z=J.U6(w),v=1,u=0,t=null,s=0;s<x;++s){r=z.O2(w,s)
 if(r===10){if(u!==s||t!==!0)++v
 u=s+1
 t=!1}else if(r===13){++v
 u=s+1
 t=!0}}y=v>1?y+(" (at line "+v+", character "+(x-u+1)+")\n"):y+(" (at character "+(x+1)+")\n")
-q=z.gB(w)
+q=z.gv(w)
 s=x
-while(!0){p=z.gB(w)
-if(typeof p!=="number")return H.s(p)
+while(!0){p=z.gv(w)
+if(typeof p!=="number")return H.o(p)
 if(!(s<p))break
-r=z.j(w,s)
+r=z.O2(w,s)
 if(r===10||r===13){q=s
 break}++s}p=J.Wx(q)
-if(J.xZ(p.W(q,u),78))if(x-u<75){o=u+75
+if(J.vU(p.T(q,u),78))if(x-u<75){o=u+75
 n=u
 m=""
-l="..."}else{if(J.u6(p.W(q,x),75)){n=p.W(q,75)
+l="..."}else{if(J.UN(p.T(q,x),75)){n=p.T(q,75)
 o=q
 l=""}else{n=x-36
 o=x+36
@@ -9364,33 +8921,33 @@
 n=u
 m=""
 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:{cD:function(a,b,c){return new P.oe(a,b,c)}}},
-Ep:{
+if(typeof n!=="number")return H.o(n)
+return y+m+k+l+"\n"+C.yo.R(" ",x-n+m.length)+"^\n"},"$0","gCR",0,0,0],
+static:{rr:function(a,b,c){return new P.oe(a,b,c)}}},
+eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,73],
-static:{zl:function(){return new P.Ep()}}},
-qo:{
-"^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gCR",0,0,73],
-t:function(a,b){var z=H.VKg(b,"expando$values")
-return z==null?null:H.VKg(z,this.V2())},
-u:function(a,b,c){var z=H.VKg(b,"expando$values")
+X:[function(a){return"IntegerDivisionByZeroException"},"$0","gCR",0,0,0],
+static:{zl:function(){return new P.eV()}}},
+nj:{
+"^":"a;oc:Q>",
+X:[function(a){return"Expando:"+H.d(this.Q)},"$0","gCR",0,0,0],
+p:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.By())},
+q:function(a,b,c){var z=H.of(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.VKg(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
+H.wV(b,"expando$values",z)}H.wV(z,this.By(),c)},
+By:function(){var z,y
+z=H.of(this,"expando$key")
+if(z==null){y=$.Kc
+$.Kc=y+1
 z="expando$key$"+y
 H.wV(this,"expando$key",z)}return z},
-static:{"^":"bZT,rly,Km"}},
+static:{"^":"bZT,rly,Kc"}},
 EH:{
 "^":"a;",
 $isEH:true},
 KN:{
-"^":"lf;",
+"^":"FK;",
 $isKN:true},
 "+int":0,
 QV:{
@@ -9407,24 +8964,24 @@
 $isQV:true,
 $asQV:null},
 "+List":0,
-T8:{
+w:{
 "^":"a;",
-$isT8:true,
-$asT8:null},
+$isw:true,
+$asw:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gCR",0,0,73]},
+X:[function(a){return"null"},"$0","gCR",0,0,0]},
 "+Null":0,
-lf:{
+FK:{
 "^":"a;",
-$islf:true},
+$isFK:true},
 "+num":0,
 a:{
 "^":";",
-n:function(a,b){return this===b},
-giO:function(a){return H.wP(this)},
-bu:[function(a){return H.a5(this)},"$0","gCR",0,0,73],
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
+m:function(a,b){return this===b},
+giO:function(a){return H.eQ(this)},
+X:["L7",function(a){return H.a5(this)},"$0","gCR",0,0,0],
+P:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.wO(this),null)},
 $isa:true},
 Od:{
@@ -9437,63 +8994,64 @@
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;n2,Mw",
-D5:function(a){var z,y
-z=this.n2==null
-if(!z&&this.Mw==null)return
-y=$.hG
-if(z)this.n2=y.$0()
-else{this.n2=J.bI(y.$0(),J.bI(this.Mw,this.n2))
-this.Mw=null}},
+"^":"a;Q,a",
+wE:[function(a){var z,y
+z=this.Q==null
+if(!z&&this.a==null)return
+y=$.Zg
+if(z)this.Q=y.$0()
+else{this.Q=J.D5(y.$0(),J.D5(this.a,this.Q))
+this.a=null}},"$0","gJ",0,0,1],
 CH:function(a){var z
-if(this.n2==null)return
-z=$.hG.$0()
-this.n2=z
-if(this.Mw!=null)this.Mw=z},
-giU:function(){var z,y
-z=this.n2
+if(this.Q==null)return
+z=$.Zg.$0()
+this.Q=z
+if(this.a!=null)this.a=z},
+gTY:function(){var z,y
+z=this.Q
 if(z==null)return 0
-y=this.Mw
-return y==null?J.bI($.hG.$0(),this.n2):J.bI(y,z)},
+y=this.a
+return y==null?J.D5($.Zg.$0(),this.Q):J.D5(y,z)},
 static:{"^":"Ji"}},
-qU:{
+I:{
 "^":"a;",
-$isqU:true},
+$isI:true},
 "+String":0,
-ysG:{
-"^":"a;Y4,R0,So,ft",
-gl:function(){return this.ft},
-G:function(){var z,y,x,w,v,u
-z=this.So
-this.R0=z
-y=this.Y4
+Kg:{
+"^":"a;Q,a,b,c",
+gk:function(){return this.c},
+D:function(){var z,y,x,w,v,u
+z=this.b
+this.a=z
+y=this.Q
 x=J.U6(y)
-if(z===x.gB(y)){this.ft=null
-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)
-return!0}}this.So=v
-this.ft=w
+if(z===x.gv(y)){this.c=null
+return!1}w=x.O2(y,this.a)
+v=this.a+1
+if((w&64512)===55296&&v<x.gv(y)){u=x.O2(y,v)
+if((u&64512)===56320){this.b=v+1
+this.c=65536+((w&1023)<<10>>>0)+(u&1023)
+return!0}}this.b=v
+this.c=w
 return!0}},
 Rn:{
-"^":"a;IN<",
-gB:function(a){return this.IN.length},
-gl0:function(a){return this.IN.length===0},
-gor:function(a){return this.IN.length!==0},
-KF:function(a){this.IN+=typeof a==="string"?a:H.d(a)},
+"^":"a;IN:Q<",
+gv:function(a){return this.Q.length},
+gl0:function(a){return this.Q.length===0},
+gor:function(a){return this.Q.length!==0},
+KF:function(a){this.Q+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
-z=J.mY(a)
-if(!z.G())return
-if(b.length===0){do{y=z.gl()
-this.IN+=typeof y==="string"?y:H.d(y)}while(z.G())}else{this.KF(z.gl())
-for(;z.G();){this.IN+=b
-y=z.gl()
-this.IN+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.IN=""},
-bu:[function(a){return this.IN},"$0","gCR",0,0,73],
-PD:function(a){if(typeof a==="string")this.IN=a
+z=J.Nx(a)
+if(!z.D())return
+if(b.length===0){do{y=z.gk()
+this.Q+=typeof y==="string"?y:H.d(y)}while(z.D())}else{this.KF(z.gk())
+for(;z.D();){this.Q+=b
+y=z.gk()
+this.Q+=typeof y==="string"?y:H.d(y)}}},
+V1:function(a){this.Q=""},
+X:[function(a){var z=this.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0],
+PD:function(a){if(typeof a==="string")this.Q=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
@@ -9501,74 +9059,89 @@
 IN:{
 "^":"a;",
 $isIN:true},
-Lz:{
+UU:{
 "^":"a;",
-$isLz:true},
+$isUU:true},
 q5:{
-"^":"a;Kk,QB,Ee,Fi,ku,xu,ys,o6,nO",
-gJf:function(a){var z=this.Kk
+"^":"a;Q,a,b,c,d,e,f,r,x",
+gJf:function(a){var z,y
+z=this.Q
 if(z==null)return""
-if(J.Qe(z).nC(z,"["))return C.yo.Nj(z,1,z.length-1)
+y=J.NH(z)
+if(y.nC(z,"["))return y.Nj(z,1,J.D5(y.gv(z),1))
 return z},
-gtp:function(a){var z=this.QB
-if(z==null)return P.l3(this.Fi)
+gtp:function(a){var z=this.a
+if(z==null)return P.SN(this.c)
 return z},
-gIi:function(a){return this.Ee},
-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
+gIi:function(a){return this.b},
+Kf:function(a,b){var z,y,x,w,v,u,t,s
+z=J.U6(a)
+if(z.gl0(a)===!0)return"/"+H.d(b)
+for(y=J.NH(b),x=0,w=0;y.Qi(b,"../",w);){w+=3;++x}v=z.cn(a,"/")
+while(!0){if(!(v>0&&x>0))break
+u=z.Pk(a,"/",v-1)
+if(u<0)break
+t=v-u
+s=t!==2
+if(!s||t===3)if(z.O2(a,u+1)===46)s=!s||z.O2(a,u+2)===46
+else s=!1
+else s=!1
+if(s)break;--x
+v=u}return z.Nj(a,0,v+1)+y.yn(b,w-3*x)},
+jI:function(a){var z=J.U6(a)
+if(J.vU(z.gv(a),0)&&z.O2(a,0)===46)return!0
+return z.OY(a,"/.")!==-1},
+mE:function(a){var z,y,x,w,v
 if(!this.jI(a))return a
 z=[]
-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
+for(y=J.BQ(a,"/"),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!1;y.D();){w=y.c
+if(J.mG(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
+v=!J.mG(z[0],"")}else v=!0
 else v=!1
 if(v){if(0>=z.length)return H.e(z,0)
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y,x,w
+X:[function(a){var z,y,x,w
 z=P.p9("")
-y=this.Fi
+y=this.c
 if(""!==y){z.KF(y)
-z.KF(":")}x=this.Kk
+z.KF(":")}x=this.Q
 w=x==null
-if(!w||C.yo.nC(this.Ee,"//")||y==="file"){z.KF("//")
-y=this.ku
-if(C.yo.gor(y)){z.KF(y)
+if(!w||J.co(this.b,"//")||y==="file"){z.KF("//")
+y=this.d
+if(J.pO(y)){z.KF(y)
 z.KF("@")}if(!w)z.KF(x)
-y=this.QB
+y=this.a
 if(y!=null){z.KF(":")
-z.KF(y)}}z.KF(this.Ee)
-y=this.xu
+z.KF(y)}}z.KF(this.b)
+y=this.e
 if(y!=null){z.KF("?")
-z.KF(y)}y=this.ys
+z.KF(y)}y=this.f
 if(y!=null){z.KF("#")
-z.KF(y)}return z.IN},"$0","gCR",0,0,73],
-n:function(a,b){var z,y,x,w
+z.KF(y)}y=z.Q
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x,w
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$isq5)return!1
-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)
+if(this.c===b.c)if(this.Q!=null===(b.Q!=null))if(J.mG(this.d,b.d))if(J.mG(this.gJf(this),z.gJf(b))){y=this.gtp(this)
 z=z.gtp(b)
-if(y==null?z==null:y===z)if(this.Ee===b.Ee){z=this.xu
+if(y==null?z==null:y===z)if(J.mG(this.b,b.b)){z=this.e
 y=z==null
-x=b.xu
+x=b.e
 w=x==null
 if(!y===!w){if(y)z=""
-if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.ys
+if(J.mG(z,w?"":x)){z=this.f
 y=z==null
-x=b.ys
+x=b.f
 w=x==null
 if(!y===!w){if(y)z=""
-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
+z=J.mG(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},
@@ -9576,12 +9149,12 @@
 z=new P.XZ()
 y=this.gJf(this)
 x=this.gtp(this)
-w=this.xu
+w=this.e
 if(w==null)w=""
-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)))))))},
+v=this.f
+return z.$2(this.c,z.$2(this.d,z.$2(y,z.$2(x,z.$2(this.b,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,tvi,uCX,zk,ilf,tC,GpR,Q5W,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,Tet,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo0,yw1,SQU,rvM,fbQ",l3:function(a){if(a==="http")return 80
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,UId,Imi,GpR,Bd,XrJ,Vxa,pkL,O5i,FsP,qfW,dRC,u0I,TGN,Tet,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo0,yw1,SQU,rvM,fbQ",SN: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={}
@@ -9595,18 +9168,16 @@
 v=0
 while(!0){if(!(v<w)){y=0
 x=0
-break}if(v>=w)H.vh(P.N(v))
-u=a.charCodeAt(v)
+break}u=C.yo.O2(a,v)
 z.f=u
 if(u===63||u===35){y=0
 x=0
 break}if(u===47){x=v===0?2:1
 y=0
-break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
-z.a=P.iy(a,v);++v
+break}if(u===58){if(v===0)P.Xz(a,0,"Invalid empty scheme")
+z.a=P.Wf(a,v);++v
 if(v===w){z.f=-1
-x=0}else{if(v>=w)H.vh(P.N(v))
-u=a.charCodeAt(v)
+x=0}else{u=C.yo.O2(a,v)
 z.f=u
 if(u===63||u===35)x=0
 else x=u===47?2:1}y=v
@@ -9615,109 +9186,93 @@
 if(x===2){t=v+1
 z.e=t
 if(t===w){z.f=-1
-x=0}else{u=C.yo.j(a,t)
+x=0}else{u=C.yo.O2(a,t)
 z.f=u
 if(u===47){++z.e
-new P.BH(z,a,-1).$0()
+new P.tF(z,a,-1).$0()
 y=z.e}s=z.f
-x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
-if(s>=w)H.vh(P.N(s))
-u=a.charCodeAt(s)
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){u=C.yo.O2(a,s)
 z.f=u
 if(u===63||u===35)break
 z.f=-1}s=z.a
 r=z.c
-q=P.qd(a,y,z.e,null,r!=null,s==="file")
+q=P.re(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.jr(a,p+1,w)}}else{n=s===35?P.jr(a,z.e+1,w):null
+s=z.e
+if(p<0){o=P.BH(a,s+1,w,null)
+n=null}else{o=P.BH(a,s+1,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(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)},iV:function(a,b,c){throw H.b(P.cD(c,a,b))},JF:function(a,b){if(a!=null&&a===P.l3(b))return
+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 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.iV(a,b,"Missing end `]` to match `[` in host")
+if(C.yo.O2(a,b)===91){z=c-1
+if(C.yo.O2(a,z)!==93)P.Xz(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.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
+return C.yo.Nj(a,b,c).toLowerCase()}if(!d)for(y=b;y<c;++y)if(C.yo.O2(a,y)===58){P.eg(a,b,c)
+return"["+a+"]"}return P.cq(a,b,c)},cq:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+for(z=b,y=z,x=null,w=!0;z<c;){v=C.yo.O2(a,z)
+if(v===37){u=P.Yi(a,z,!0)
+t=u==null
+if(t&&w){z+=3
 continue}if(x==null){x=new P.Rn("")
-x.IN=""}s=C.yo.Nj(a,y,z)
+x.Q=""}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"
+x.Q=x.Q+s
+if(t){u=C.yo.Nj(a,z,z+3)
+r=3}else if(u==="%"){u="%25"
 r=1}else r=3
-x.IN+=t
+x.Q+=u
 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
+w=!0}else{if(v<127){t=v>>>4
+if(t>=8)return H.e(C.aa,t)
+t=(C.aa[t]&C.jn.iK(1,v&15))!==0}else t=!1
+if(t){if(w&&65<=v&&90>=v){if(x==null){x=new P.Rn("")
+x.Q=""}if(y<z){t=C.yo.Nj(a,y,z)
+x.Q=x.Q+t
+y=z}w=!1}++z}else{if(v<=93){t=v>>>4
+if(t>=8)return H.e(C.rz,t)
+t=(C.rz[t]&C.jn.iK(1,v&15))!==0}else t=!1
+if(t)P.Xz(a,z,"Invalid character")
+else{if((v&64512)===55296&&z+1<c){q=C.yo.O2(a,z+1)
+if((q&64512)===56320){v=(65536|(v&1023)<<10|q&1023)>>>0
 r=2}else r=1}else r=1
 if(x==null){x=new P.Rn("")
-x.IN=""}s=C.yo.Nj(a,y,z)
+x.Q=""}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
+x.Q=x.Q+s
+t=P.lN(v)
+x.Q+=t
 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
+y=z}}}}if(x==null)return C.yo.Nj(a,b,c)
+if(y<c){s=C.yo.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}t=x.Q
+return t.charCodeAt(0)==0?t:t},Wf:function(a,b){var z,y,x,w,v
 if(b===0)return""
-a.toString
-z=a.length
-if(0>=z)H.vh(P.N(0))
-y=a.charCodeAt(0)
-x=y>=97
-if(!(x&&y<=122))w=y>=65&&y<=90
-else w=!0
-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.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)},qd:function(a,b,c,d,e,f){var z,y
+z=J.NH(a).O2(a,0)
+y=z>=97
+if(!(y&&z<=122))x=z>=65&&z<=90
+else x=!0
+if(!x)P.Xz(a,0,"Scheme not starting with alphabetic character")
+for(w=0;w<b;++w){v=C.yo.O2(a,w)
+if(v<128){x=v>>>4
+if(x>=8)return H.e(C.mKy,x)
+x=(C.mKy[x]&C.jn.iK(1,v&15))!==0}else x=!1
+if(!x)P.Xz(a,w,"Illegal scheme character")
+if(v<97||v>122)y=!1}a=C.yo.Nj(a,0,b)
+return!y?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
 z=a==null
 if(z&&!0)return f?"/":""
 z=!z
-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
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.Kd()).zV(0,"/")
+z=J.U6(y)
+if(z.gl0(y)===!0){if(f)return"/"}else if((f||e)&&z.O2(y,0)!==47)return"/"+H.d(y)
+return y},BH:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
 if(y&&!0)return
@@ -9725,215 +9280,187 @@
 if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(d,new P.Sz(z,x))
-return x.IN},jr:function(a,b,c){if(a==null)return
+C.jN.aN(d,new P.Ue(z,x))
+z=x.Q
+return z.charCodeAt(0)==0?z:z},o6: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
-return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+return 97<=a&&102>=a},Qw:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w
 z=b+2
-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)
-if(z<0)H.vh(P.N(z))
-v=a.charCodeAt(z)
-if(!P.qr(w)||!P.qr(v))return"%"
-u=P.RD(w)*16+P.RD(v)
-if(u<127){z=C.jn.wG(u,4)
-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 J.Nj(a,b,b+3).toUpperCase()
-return},mC:function(a){var z,y,x,w,v,u,t,s
+if(z>=a.length)return"%"
+y=C.yo.O2(a,b+1)
+x=C.yo.O2(a,z)
+if(!P.qr(y)||!P.qr(x))return"%"
+w=P.Qw(y)*16+P.Qw(x)
+if(w<127){z=C.jn.wG(w,4)
+if(z>=8)return H.e(C.kg,z)
+z=(C.kg[z]&C.jn.iK(1,w&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=w&&90>=w?(w|32)>>>0:w)
+if(y>=97||x>=97)return C.yo.Nj(a,b,b+3).toUpperCase()
+return},lN:function(a){var z,y,x,w,v,u,t,s
 if(a<128){z=Array(3)
-z.fixed$length=init
+z.fixed$length=Array
 z[0]=37
-y=a>>>4
-if(y>=16)H.vh(P.N(y))
-z[1]="0123456789ABCDEF".charCodeAt(y)
-z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
-w=4}else{x=224
-w=3}else{x=192
-w=2}y=3*w
-z=Array(y)
-z.fixed$length=init
-for(v=0;--w,w>=0;x=128){u=C.jn.PK(a,6*w)&63|x
-if(v>=y)return H.e(z,v)
+z[1]=C.yo.O2("0123456789ABCDEF",a>>>4)
+z[2]=C.yo.O2("0123456789ABCDEF",a&15)}else{if(a>2047)if(a>65535){y=240
+x=4}else{y=224
+x=3}else{y=192
+x=2}w=3*x
+z=Array(w)
+z.fixed$length=Array
+for(v=0;--x,x>=0;y=128){u=C.jn.bf(a,6*x)&63|y
+if(v>=w)return H.e(z,v)
 z[v]=37
 t=v+1
-s=u>>>4
-if(s>=16)H.vh(P.N(s))
-s="0123456789ABCDEF".charCodeAt(s)
-if(t>=y)return H.e(z,t)
+s=C.yo.O2("0123456789ABCDEF",u>>>4)
+if(t>=w)return H.e(z,t)
 z[t]=s
 s=v+2
-t="0123456789ABCDEF".charCodeAt(u&15)
-if(s>=y)return H.e(z,s)
+t=C.yo.O2("0123456789ABCDEF",u&15)
+if(s>=w)return H.e(z,s)
 z[s]=t
-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)++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.iV(a,z,"Invalid character")
-t=null
-s=null}else{if((v&64512)===55296){u=z+1
-if(u<c){if(u<0)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.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)
-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
+v+=3}}return P.Qe(z,0,null)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s
+for(z=b,y=z,x=null;z<c;){w=C.yo.O2(a,z)
+if(w<127){v=w>>>4
+if(v>=8)return H.e(d,v)
+v=(d[v]&C.jn.iK(1,w&15))!==0}else v=!1
+if(v)++z
+else{if(w===37){u=P.Yi(a,z,!1)
+if(u==null){z+=3
+continue}if("%"===u){u="%25"
+t=1}else t=3}else{if(w<=93){v=w>>>4
+if(v>=8)return H.e(C.rz,v)
+v=(C.rz[v]&C.jn.iK(1,w&15))!==0}else v=!1
+if(v){P.Xz(a,z,"Invalid character")
+u=null
+t=null}else{if((w&64512)===55296){v=z+1
+if(v<c){s=C.yo.O2(a,v)
+if((s&64512)===56320){w=(65536|(w&1023)<<10|s&1023)>>>0
+t=2}else t=1}else t=1}else t=1
+u=P.lN(w)}}if(x==null){x=new P.Rn("")
+x.Q=""}v=C.yo.Nj(a,y,z)
+x.Q=x.Q+v
+x.Q+=typeof u==="string"?u:H.d(u)
+if(typeof t!=="number")return H.o(t)
+z+=t
+y=z}}if(x==null)return C.yo.Nj(a,b,c)
+if(y<c)x.KF(C.yo.Nj(a,y,c))
+v=x.Q
+return v.charCodeAt(0)==0?v:v},WX:function(a,b){return H.n3(J.BQ(a,"&"),P.A(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.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.x8(a)
+return H.J(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.wS(a)
+z=new P.kZ(a)
 y=new P.ZN(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
+if(J.wS(a)<2)z.$1("address is too short")
 x=[]
 w=b
 u=b
 t=!1
 while(!0){s=c
-if(typeof s!=="number")return H.s(s)
+if(typeof s!=="number")return H.o(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)
+if(J.IC(a,u)===58){if(u===b){++u
+if(J.IC(a,u)!==58)z.$2("invalid start colon.",u)
 w=u}if(u===w){if(t)z.$2("only one wildcard `::` is allowed",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.MQ(x),-1)
-if(q&&!p)z.$2("expected a part after last `:`",c)
-if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+J.dH(x,-1)
+t=!0}else J.dH(x,y.$2(w,u))
+w=u+1}++u}if(J.wS(x)===0)z.$1("too few parts")
+r=J.mG(w,c)
+q=J.mG(J.rn(x),-1)
+if(r&&!q)z.$2("expected a part after last `:`",c)
+if(!r)try{J.dH(x,y.$2(w,c))}catch(p){H.Ru(p)
 try{v=P.Dy(J.Nj(a,w,c))
-s=J.Eh(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-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.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")
+s=J.o3(J.Tf(v,0),8)
+o=J.Tf(v,1)
+if(typeof o!=="number")return H.o(o)
+J.dH(x,(s|o)>>>0)
+o=J.o3(J.Tf(v,2),8)
+s=J.Tf(v,3)
+if(typeof s!=="number")return H.o(s)
+J.dH(x,(o|s)>>>0)}catch(p){H.Ru(p)
+z.$2("invalid end of IPv6 address.",w)}}if(t){if(J.wS(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.wS(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
 n=Array(16)
 n.$builtinTypeInfo=[P.KN]
 u=0
 m=0
-while(!0){s=J.q8(x)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=J.wS(x)
+if(typeof s!=="number")return H.o(s)
 if(!(u<s))break
-l=J.UQ(x,u)
-s=J.x(l)
-if(s.n(l,-1)){k=9-J.q8(x)
+l=J.Tf(x,u)
+s=J.t(l)
+if(s.m(l,-1)){k=9-J.wS(x)
 for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
 n[m]=0
 s=m+1
 if(s>=16)return H.e(n,s)
 n[s]=0
-m+=2}}else{r=s.m(l,8)
+m+=2}}else{o=s.l(l,8)
 if(m<0||m>=16)return H.e(n,m)
-n[m]=r
-r=m+1
+n[m]=o
+o=m+1
 s=s.i(l,255)
-if(r>=16)return H.e(n,r)
-n[r]=s
-m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+if(o>=16)return H.e(n,o)
+n[o]=s
+m+=2}++u}return n},Mp:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
-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)
+x=c.gZE().WJ(b)
+for(w=x.length,v=0;v<w;++v){u=x[v]
+if(u<128){t=u>>>4
 if(t>=8)return H.e(a,t)
-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)
+t=(a[t]&C.jn.iK(1,u&15))!==0}else t=!1
+if(t){t=H.mx(u)
+y.Q+=t}else if(d&&u===32){t=H.mx(43)
+y.Q+=t}else{t=H.mx(37)
+y.Q+=t
+z.$2(u,y)}}z=y.Q
+return z.charCodeAt(0)==0?z:z},tN:function(a,b){var z,y,x,w
+for(z=J.NH(a),y=0,x=0;x<2;++x){w=z.O2(a,b+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-87
-else throw H.b(P.u("Invalid URL encoding"))}}return y},pE:function(a,b,c){var z,y,x,w,v,u,t
+else throw H.b(P.p("Invalid URL encoding"))}}return y},pE:function(a,b,c){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=!0
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w&&y))break
-v=z.j(a,x)
+v=z.O2(a,x)
 y=v!==37&&v!==43;++x}if(y)if(b===C.xM||!1)return a
 else u=z.gNq(a)
 else{u=[]
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=z.j(a,x)
-if(v>127)throw H.b(P.u("Illegal percent encoding in URI"))
-if(v===37){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(x+3>w)throw H.b(P.u("Truncated URI"))
+v=z.O2(a,x)
+if(v>127)throw H.b(P.p("Illegal percent encoding in URI"))
+if(v===37){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
+if(x+3>w)throw H.b(P.p("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.QA
-return new P.GY(t).Sw(u)}}},
-hP2:{
-"^":"TpZ:147;",
-$1:function(a){a.C(0,128)
-return!1},
-$isEH:true},
-BH:{
-"^":"TpZ:17;a,b,c",
+else u.push(v);++x}}t=b.Q
+return new P.GY(t).WJ(u)}}},
+jY:{
+"^":"r:147;",
+$1:function(a){a.w(0,128)
+return!1}},
+tF:{
+"^":"r:1;Q,a,b",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.a
+z=this.Q
 y=z.e
-x=this.b
+x=this.a
 w=x.length
-if(y===w){z.f=this.c
-return}z.f=J.Pp(x,y)
-for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
-if(s>=w)H.vh(P.N(s))
-r=x.charCodeAt(s)
+if(y===w){z.f=this.b
+return}z.f=J.NH(x).O2(x,y)
+for(v=this.b,u=-1,t=-1;s=z.e,s<w;){r=C.yo.O2(x,s)
 z.f=r
 if(r===47||r===63||r===35)break
 if(r===64){t=z.e
@@ -9947,231 +9474,143 @@
 z.f=v}p=z.e
 if(t>=0){z.b=P.ua(x,y,t)
 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.iV(x,o,"Invalid port number")
+if(o<z.e)for(n=0;o<z.e;++o){m=C.yo.O2(x,o)
+if(48>m||57<m)P.Xz(x,o,"Invalid port number")
 n=n*10+(m-48)}else n=null
-z.d=P.JF(n,z.a)
+z.d=P.Ec(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},
-UU:{
-"^":"TpZ:12;",
-$1:function(a){return P.jW(C.yk,a,C.xM,!1)},
-$isEH:true},
-Sz:{
-"^":"TpZ:81;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
+if(s<w)z.f=C.yo.O2(x,s)}},
+Kd:{
+"^":"r:14;",
+$1:function(a){return P.Mp(C.jr,a,C.xM,!1)}},
+Ue:{
+"^":"r:80;Q,a",
+$2:function(a,b){var z=this.Q
+if(!z.a)this.a.KF("&")
 z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
+z=this.a
+z.KF(P.Mp(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
+z.KF(P.Mp(C.kg,b,C.xM,!0))}},
 XZ:{
-"^":"TpZ:148;",
-$2:function(a,b){return b*31+J.v1(a)&1073741823},
-$isEH:true},
+"^":"r:148;",
+$2:function(a,b){var z=J.v1(a)
+if(typeof z!=="number")return H.o(z)
+return b*31+z&1073741823}},
 qz:{
-"^":"TpZ:81;a",
+"^":"r:80;Q",
 $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.kW(a,P.pE(b,this.a,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
+if(y===-1){if(!z.m(b,""))J.H9(a,P.pE(b,this.Q,!0),"")}else if(y!==0){x=z.Nj(b,0,y)
 w=z.yn(b,y+1)
-z=this.a
-J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
-$isEH:true},
+z=this.Q
+J.H9(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a}},
 JV:{
-"^":"TpZ:44;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a,null,null))},
-$isEH:true},
+"^":"r:46;",
+$1:function(a){throw H.b(P.rr("Illegal IPv4 address, "+a,null,null))}},
 C9P:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,149,"call"],
-$isEH:true},
-x8:{
-"^":"TpZ:150;a",
-$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},
+if(y.w(z,0)||y.A(z,255))this.Q.$1("each part must be in the range of `0..255`")
+return z},"$1",null,2,0,null,149,"call"]},
+kZ:{
+"^":"r:150;Q",
+$2:function(a,b){throw H.b(P.rr("Illegal IPv6 address, "+a,this.Q,b))},
+$1:function(a){return this.$2(a,null)}},
 ZN:{
-"^":"TpZ:100;b,c",
+"^":"r:100;Q,a",
 $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(J.Nj(this.b,a,b),16,null)
+if(b-a>4)this.a.$2("an IPv6 part can only contain a maximum of 4 hex digits",a)
+z=H.BU(C.yo.Nj(this.Q,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},
-$isEH:true},
+if(y.w(z,0)||y.A(z,65535))this.a.$2("each part must be in the range of `0x0..0xFFFF`",a)
+return z}},
 rI:{
-"^":"TpZ:81;",
+"^":"r:80;",
 $2:function(a,b){var z=J.Wx(a)
-b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.mx(C.yo.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["","",,W,{
+b.KF(H.mx(C.yo.O2("0123456789ABCDEF",z.l(a,4))))
+b.KF(H.mx(C.yo.O2("0123456789ABCDEF",z.i(a,15))))}}}],["","",,W,{
 "^":"",
-SE:function(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/ig,C.Vu)},
-Q8:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.We(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isT8){y=d
-if(typeof y!=="string"){y=d
-y=typeof y==="number"}else y=!0}else y=!0
-else y=!0
-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)},
-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.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.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.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))},
-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")
-if(!y);y=!z||a==null
-if(y)return new WebSocket(a,b)
-z=!z||a==null
-if(z)return new WebSocket(a,b)
-throw H.b(P.u("Incorrect number or type of arguments"))},
-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)},
-qc:function(a){var z
-if(a==null)return
-if("postMessage" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-Pd:function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},
-v8:function(a,b){return new W.uY(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,12,56],
-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.KE(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-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.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.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})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},
-Yt:function(a){if(J.xC($.X3,C.fQ))return a
-if(a==null)return
-return $.X3.rO(a,!0)},
-K2:function(a){if(J.xC($.X3,C.fQ))return a
-return $.X3.PT(a,!0)},
 Bo:{
-"^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|pva|AK|cda|ys|waa|NF|V10|Hi|V11|ts|Tk|V12|ZP|V13|nJ|KAf|Eg|i7|V14|Gk|V15|J3|V16|MJ|T53|DK|V17|BS|V18|Vb|V19|Ly|V20|Im|pR|V21|EZ|V22|L4|Mb|V23|mO|DE|V24|U1|V25|H8|WS|qh|V26|oF|V27|Q6|uE|V28|Zn|V29|n5|V30|Ma|wN|V31|ds|V32|qM|ZzR|av|V33|uz|V34|kK|oa|V35|St|V36|IW|V37|Qh|V38|Oz|V39|Z4|V40|qk|V41|vj|LU|V42|CX|V43|qn|V44|I2|V45|FB|V46|md|V47|Bm|V48|Ya|V49|Ww|ye|V50|G1|V51|fl|V52|UK|V53|wM|V54|Co|V55|Zx|V56|qV|V57|NT|V58|F1|V59|ov|V60|vr|oEY|kn|V61|fI|V62|zM|V63|Rk|V64|Ti|V65|Um|V66|VZ|V67|WG|V68|f7|Ce|ImK|CY|V69|Pa|V70|D2|I5|V71|el"},
-Yyn:{
+"^":"z2;",
+"%":"HTMLAppletElement|HTMLBRElement|HTMLDListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLModElement|HTMLParagraphElement|HTMLPictureElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|Vfx|G6|Dsd|xI|eW|tuj|eo|Vct|ak|VY|D13|Be|uV|WZq|NY|SaM|JI|pva|AK|cda|ys|waa|NF|V4|Hi|V10|ts|Tk|V11|ZP|V12|nJ|KAf|Eg|i7|V13|Gk|V14|J3|V15|MJ|T53|DK|V16|BS|V17|Vb|V18|Ly|V19|Im|pR|V20|EZ|V21|L4|Mb|V22|IH|DE|V23|U1|V24|H8|WS|qh|V25|oF|V26|Q6|uE|V27|Zn|V28|n5|V29|Ma|wN|V30|ds|V31|qM|ZzR|av|V32|uz|V33|kK|oa|V34|St|V35|IW|V36|Qh|V37|Oz|V38|Z4|V39|qk|V40|vj|LU|V41|CX|V42|qn|V43|I2|V44|FB|V45|md|V46|Bm|V47|Ya|V48|Ww|ye|V49|G1|V50|fl|V51|UK|V52|wM|V53|NK|V54|Zx|V55|qV|V56|NT|V57|F1|V58|ov|V59|vr|oEY|kn|V60|fI|V61|zM|V62|Rk|V63|Ti|V64|Um|V65|VZ|V66|WG|V67|f7|Ce|ImK|CY|V68|Pa|V69|D2|I5|V70|el"},
+SV:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.QI]},
+$asWO:function(){return[W.M5K]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.QI]},
+$asQV:function(){return[W.M5K]},
 "%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target%,t5:type=,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+mj:{
+"^":"Bo;K:target%,t5:type=,LU:href%,A8:protocol=",
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+fc:{
+"^":"ea;G1:message=,pf:status=,O3:url=",
+"%":"ApplicationCacheErrorEvent"},
+Zz:{
+"^":"Bo;K:target%,LU:href%,A8:protocol=",
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"HTMLAreaElement"},
 rZg:{
-"^":"Bo;mH:href%,N:target%",
+"^":"Bo;LU:href%,K:target%",
 "%":"HTMLBaseElement"},
 O4:{
-"^":"Gv;yT:size=,t5:type=",
+"^":"Gv;ky:size=,t5:type=",
+xO:function(a){return a.close()},
 $isO4:true,
 "%":";Blob"},
 QPB:{
 "^":"Bo;",
-$isPZ:true,
+$isD0:true,
 "%":"HTMLBodyElement"},
 IFv:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+"^":"Bo;oc:name%,t5:type=,M:value%",
 "%":"HTMLButtonElement"},
-Ny9:{
-"^":"Bo;fg:height%,R:width}",
-gVE:function(a){return a.getContext("2d")},
+Ny:{
+"^":"Bo;fg:height%,N:width}",
+gwe:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
-Y5K:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
 Gcw:{
-"^":"Y5K;",
-A8:function(a,b,c,d,e,f,g,h){var z
+"^":"Gv;",
+kN: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)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
+return}throw H.b(P.p("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,ke:nextElementSibling=",
+JJ:{
+"^":"KV;Rn:data=,v:length=,Wq:nextElementSibling=",
 "%":"Comment;CharacterData"},
-BI:{
+Yr:{
 "^":"ea;tT:code=",
-$isBI:true,
 "%":"CloseEvent"},
-y4f:{
+di:{
 "^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-d7T:{
+d7:{
 "^":"Bo;",
 q3:function(a){return a.select.$0()},
 "%":"HTMLContentElement"},
 oJo:{
-"^":"BVt;B:length=",
-T2:function(a,b){var z=this.RT(a,b)
+"^":"AN;v:length=",
+T2:function(a,b){var z=this.YP(a,b)
 return z!=null?z:""},
-RT:function(a,b){var z
+YP:function(a,b){var z
 if(W.SE(b) in a)return a.getPropertyValue(b)
 else{z=P.O2()
-if(typeof z!=="string")return z.g()
+if(z==null)return z.g()
 return a.getPropertyValue(z+b)}},
 hV:function(a,b,c,d){var z
 if(W.SE(b) in a)return this.Dg(a,b,c,d)
 else{z=P.O2()
-if(typeof z!=="string")return z.g()
+if(z==null)return z.g()
 return this.Dg(a,z+b,c,d)}},
 f8:function(a,b,c){return this.hV(a,b,c,null)},
 Dg:function(a,b,c,d){var z
@@ -10184,142 +9623,175 @@
 "^":"ea;NJ:_dartDetail}",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
-return P.o7(a.detail,!0)},
+return P.UQ(a.detail,!0)},
 GM:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
 $isDG4:true,
 "%":"CustomEvent"},
-vHT:{
+On:{
 "^":"Bo;bG:options=",
 "%":"HTMLDataListElement"},
 Q3:{
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDetailsElement"},
-rV7:{
+KB:{
+"^":"ea;M:value=",
+"%":"DeviceLightEvent"},
+rV:{
 "^":"Bo;",
 TR:function(a,b){return a.open.$1(b)},
 "%":"HTMLDialogElement"},
-YN:{
+Sy:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
-d2:function(a,b,c){return a.importNode(b,c)},
-XT:function(a,b){return a.querySelector(b)},
-geg:function(a){return H.VM(new W.RO(a,C.rt.fA,!1),[null])},
+ek:function(a,b,c){return a.importNode(b,c)},
+Wk:function(a,b){return a.querySelector(b)},
+gHQ:function(a){return H.J(new W.vG(a,"keydown",!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+$isSy:true,
 "%":"XMLDocument;Document"},
 hsw:{
 "^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
+gwd:function(a){if(a._docChildren==null)a._docChildren=H.J(new P.P0(a,new W.OB(a)),[null])
 return a._docChildren},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-XT:function(a,b){return a.querySelector(b)},
+Kb:function(a,b){return a.getElementById(b)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-cmJ:{
+Nu:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-BK:{
+Nh:{
 "^":"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],
-$isBK:true,
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
+$isNh:true,
 "%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,S:style=,ns:tagName=,ke:nextElementSibling=",
+nV:{
+"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,N:width=,x=,y=",
+X:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(this.gN(a))+" x "+H.d(this.gfg(a))},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x
+if(b==null)return!1
+z=J.t(b)
+if(!z.$istn)return!1
+y=a.left
+x=z.gBb(b)
+if(y==null?x==null:y===x){y=a.top
+x=z.gG6(b)
+if(y==null?x==null:y===x){y=this.gN(a)
+x=z.gN(b)
+if(y==null?x==null:y===x){y=this.gfg(a)
+z=z.gfg(b)
+z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
+return z},
+giO:function(a){var z,y,x,w
+z=J.v1(a.left)
+y=J.v1(a.top)
+x=J.v1(this.gN(a))
+w=J.v1(this.gfg(a))
+return W.Up(W.VC(W.VC(W.VC(W.VC(0,z),y),x),w))},
+gSR:function(a){return H.J(new P.hL(a.left,a.top),[null])},
+$istn:true,
+$astn:function(){return[null]},
+"%":";DOMRectReadOnly"},
+z2:{
+"^":"KV;mk:title},xr:className%,jO:id=,O:style=,ns:tagName=,Wq:nextElementSibling=",
 gQg:function(a){return new W.E9(a)},
-gks:function(a){return new W.VG(a,a.children)},
+gwd:function(a){return new W.VG(a,a.children)},
 Md: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){},
-Lx:function(a){},
-wN:function(a,b,c,d){},
+dQ:function(a){},
+aC: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],
-xZ:function(a,b){if(!!a.matches)return a.matches(b)
+X:[function(a){return a.localName},"$0","gCR",0,0,0],
+WO: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"))},
-Ft:function(a,b){var z=a
-do{if(J.wK(z,b))return!0
+bA:function(a,b){var z=a
+do{if(J.YN(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
-TL:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-PN:function(a,b){return a.getAttribute(b)},
+er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
+GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-XT:function(a,b){return a.querySelector(b)},
-geg:function(a){return H.VM(new W.Cqa(a,C.rt.fA,!1),[null])},
-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])},
+Wk:function(a,b){return a.querySelector(b)},
+gHQ:function(a){return H.J(new W.eu(a,"keydown",!1),[null])},
+gVY:function(a){return H.J(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.J(new W.eu(a,"mousemove",!1),[null])},
 LX:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
+$isz2:true,
+$isD0:true,
+"%":";Element",
+static:{"^":"Mm7<"}},
 fC:{
-"^":"Bo;fg:height%,oc:name%,t5:type=,R:width}",
+"^":"Bo;fg:height%,oc:name%,t5:type=,N:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;dl:_selector},Ii:path=,Ea:timeStamp=,t5:type=",
-gF0:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
+"^":"Gv;dl:_selector},Ii:path=,ee:timeStamp=,t5:type=",
+gAJ:function(a){return W.xj(a.currentTarget)},
+gK:function(a){return W.xj(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"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:{
+"%":"AnimationPlayerEvent|AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|DeviceMotionEvent|DeviceOrientationEvent|FetchEvent|FontFaceSetLoadEvent|GamepadEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|RelatedEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;ClipboardEvent|Event|InputEvent"},
+D0:{
 "^":"Gv;",
-On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Ph:function(a,b){return a.dispatchEvent(b)},
-Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
+On:function(a,b,c,d){if(c!=null)this.v0(a,b,c,d)},
+Y9:function(a,b,c,d){if(c!=null)this.Ci(a,b,c,d)},
+v0:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
+H2:function(a,b){return a.dispatchEvent(b)},
+Ci:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
+$isD0:true,
 "%":";EventTarget"},
 Ao:{
-"^":"Bo;P9:elements=,oc:name%,t5:type=",
+"^":"Bo;nS:elements=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
-hH:{
+jq:{
 "^":"O4;oc:name=",
-$ishH:true,
+$isjq:true,
 "%":"File"},
 QU:{
-"^":"cmJ;tT:code=",
+"^":"Nu;tT:code=",
 "%":"FileError"},
-H05:{
-"^":"PZ;kc:error=",
+H0:{
+"^":"D0;kc:error=",
 gyG:function(a){var z=a.result
-if(!!J.x(z).$isaI)return H.z4(z,0,null)
+if(!!J.t(z).$isaI)return H.GG(z,0,null)
 return z},
 "%":"FileReader"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target%",
+YuD:{
+"^":"Bo;v:length=,oc:name%,K:target%",
 "%":"HTMLFormElement"},
 iGN:{
 "^":"Bo;ih:color%",
 "%":"HTMLHRElement"},
-us:{
-"^":"Gv;B:length=",
+UT:{
+"^":"Gv;v:length=",
 "%":"History"},
 xnd:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+"^":"ec;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10329,134 +9801,132 @@
 $asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"YN;",
-gQr:function(a){return a.head},
+Lv:{
+"^":"Sy;",
+gKa:function(a){return a.head},
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
-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)},
+O7:{
+"^":"ny;il:responseText=,pf:status=",
+gS4:function(a){return W.Pd(a.response)},
+R3: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)},
-$isfJ:true,
+$isO7:true,
 "%":"XMLHttpRequest"},
-waV:{
-"^":"PZ;",
+ny:{
+"^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
-"^":"Bo;fg:height%,oc:name%,R:width}",
+"^":"Bo;fg:height%,oc:name%,N:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
+"^":"Gv;Rn:data=,fg:height=,N:width=",
 $isSg:true,
 "%":"ImageData"},
 pAv:{
-"^":"Bo;fg:height%,EE:isMap=,R:width}",
-j3:function(a,b){return a.complete.$1(b)},
+"^":"Bo;fg:height%,EE:isMap=,N:width}",
+aM:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Sc:{
-"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,RP:selectionStart=,yT:size=,t5:type=,P:value%,R:width}",
+"^":"Bo;d4:checked%,fg:height%,jx:list=,A5:max=,Bp:min=,oc:name%,RP:selectionStart=,ky:size=,t5:type=,M:value%,N:width}",
 RR:function(a,b){return a.accept.$1(b)},
 q3:function(a){return a.select()},
 ul:function(a,b,c,d,e){return a.setRangeText(b,e,c,d)},
-mT:function(a,b){return a.setRangeText(b)},
+jy:function(a,b){return a.setRangeText(b)},
 Zl:function(a,b,c,d){return a.setSelectionRange(b,c,d)},
 np:function(a,b,c){return a.setSelectionRange(b,c)},
 $isSc:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-AD:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+vn:{
+"^":"w6O;w4:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 gIG:function(a){return a.keyCode},
-$isAD:true,
 "%":"KeyboardEvent"},
 ttH:{
 "^":"Bo;oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wPF:{
-"^":"Bo;P:value%",
+pL:{
+"^":"Bo;M:value%",
 "%":"HTMLLIElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type=",
+Qj:{
+"^":"Bo;LU:href%,t5:type=",
 "%":"HTMLLinkElement"},
 u8r:{
-"^":"Gv;mH:href=,aB:protocol=",
+"^":"Gv;LU:href=,A8:protocol=",
 VD:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gCR",0,0,73],
+X:[function(a){return a.toString()},"$0","gCR",0,0,0],
 "%":"Location"},
-jJ:{
+M6O:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-ftg:{
+TF:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-WJ:[function(a){return a.pause()},"$0","gX0",0,0,17],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"dZ5<"}},
-mCi:{
+yy:[function(a){return a.pause()},"$0","gX0",0,0,1],
+"%":"HTMLAudioElement;HTMLMediaElement"},
+mC:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
 wq:{
 "^":"ea;G1:message=",
 "%":"MediaKeyEvent"},
-fJn:{
+W7:{
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 CM:{
-"^":"PZ;jO:id=,ph:label=",
+"^":"D0;jO:id=,ph:label=",
 "%":"MediaStream"},
 VhH:{
 "^":"ea;vq:stream=",
 "%":"MediaStreamEvent"},
+ZY:{
+"^":"Bo;ph:label%,t5:type=",
+"%":"HTMLMenuElement"},
+k7:{
+"^":"Bo;d4:checked%,ph:label%,t5:type=",
+"%":"HTMLMenuItemElement"},
 cxu:{
 "^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-gFF:function(a){return W.qc(a.source)},
-$iscxu:true,
+gRn:function(a){return P.UQ(a.data,!0)},
+gFF:function(a){return W.xj(a.source)},
 "%":"MessageEvent"},
 EeC:{
 "^":"Bo;rz:content=,oc:name%",
 "%":"HTMLMetaElement"},
 QbE:{
-"^":"Bo;A5:max=,Bp:min=,P:value%",
+"^":"Bo;A5:max=,Bp:min=,M:value%",
 "%":"HTMLMeterElement"},
-PGY:{
-"^":"ea;",
-$isPGY:true,
-"%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bnE:{
-"^":"Imr;",
-EZ:function(a,b,c){return a.send(b,c)},
+"^":"tH;",
+LV:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
 "%":"MIDIOutput"},
-Imr:{
-"^":"PZ;jO:id=,oc:name=,t5:type=,Ye:version=",
-giG:function(a){return H.VM(new W.RO(a,C.iw.fA,!1),[null])},
+tH:{
+"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
+giG:function(a){return H.J(new W.vG(a,"disconnect",!1),[null])},
 "%":"MIDIInput;MIDIPort"},
-N2:{
-"^":"w6O;YK:altKey=,EV:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+v3:{
+"^":"w6O;w4:altKey=,pL:button=,AE: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.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,
+if(!!a.offsetX)return H.J(new P.hL(a.offsetX,a.offsetY),[null])
+else{if(!J.t(W.xj(a.target)).$isz2)throw H.b(P.f("offsetX is only supported on elements"))
+z=W.xj(a.target)
+y=H.J(new P.hL(a.clientX,a.clientY),[null]).T(0,J.Yq(J.HO(z)))
+return H.J(new P.hL(J.Ta(y.Q),J.Ta(y.a)),[null])}},
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 x76:{
 "^":"Gv;",
 je:function(a){return a.disconnect()},
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
+VP:function(a,b,c,d,e,f,g,h,i){var z,y
 z={}
 y=new W.DB(z)
 y.$2("childList",h)
@@ -10467,51 +9937,56 @@
 y.$2("characterDataOldValue",g)
 if(c!=null)y.$2("attributeFilter",c)
 a.observe(b,z)},
-OT:function(a,b,c){return this.jh(a,b,null,null,null,null,null,c,null)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
+OT:function(a,b,c){return this.VP(a,b,null,null,null,null,null,c,null)},
+MS:function(a,b,c,d){return this.VP(a,b,c,null,d,null,null,null,null)},
 "%":"MutationObserver|WebKitMutationObserver"},
 Vv:{
-"^":"Gv;N:target=,t5:type=",
+"^":"Gv;K:target=,t5:type=",
 "%":"MutationRecord"},
+nz:{
+"^":"Gv;PB:connection=",
+"%":"Navigator"},
 qT:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
+PE:{
+"^":"D0;t5:type=",
+"%":"NetworkInformation"},
 KV:{
-"^":"PZ;NL:firstChild=,uD:nextSibling=,J8:ownerDocument=,eT:parentElement=,Ad:parentNode=,a4:textContent%",
-gUN:function(a){return new W.wi(a)},
+"^":"D0;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
+gdH:function(a){return new W.OB(a)},
 wg:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
+So:function(a,b){var z,y
 try{z=a.parentNode
-J.LW(z,b,a)}catch(y){H.Ru(y)}return a},
+J.jk(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.$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
+z=J.t(b)
+if(!!z.$isOB){z=b.Q
+if(z===a)throw H.b(P.p(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gu(b);z.D();)a.insertBefore(z.gk(),c)},
+ay:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
-bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gCR",0,0,73],
-mx:function(a,b){return a.appendChild(b)},
+X:[function(a){var z=a.nodeValue
+return z==null?this.fN(a):z},"$0","gCR",0,0,0],
+MM:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-FO:function(a,b,c){return a.insertBefore(b,c)},
-AS:function(a,b,c){return a.replaceChild(b,c)},
+mK:function(a,b,c){return a.insertBefore(b,c)},
+OP:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+dX:{
+"^":"ecX;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10522,80 +9997,80 @@
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
 VSm:{
-"^":"Bo;t5:type=",
+"^":"Bo;J:start=,t5:type=",
 "%":"HTMLOListElement"},
 G77:{
-"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,R:width}",
+"^":"Bo;Rn:data=,fg:height%,oc:name%,t5:type=,N:width}",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-lq:{
-"^":"Bo;vH:index=,ph:label%,P:value%",
-$islq:true,
+Qlt:{
+"^":"Bo;vH:index=,ph:label%,M:value%",
+$isQlt:true,
 "%":"HTMLOptionElement"},
-Xp:{
-"^":"Bo;oc:name%,t5:type=,P:value%",
+wL2:{
+"^":"Bo;oc:name%,t5:type=,M:value%",
 "%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
+l1:{
+"^":"Bo;oc:name%,M:value%",
 "%":"HTMLParamElement"},
-niR:{
+f5:{
 "^":"ea;",
-$isniR:true,
 "%":"PopStateEvent"},
-S8:{
+p3:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-Qls:{
-"^":"nx;N:target=",
+nk:{
+"^":"JJ;K:target=",
 "%":"ProcessingInstruction"},
 KR:{
-"^":"Bo;A5:max=,P:value%",
+"^":"Bo;A5:max=,M:value%",
 "%":"HTMLProgressElement"},
-ew7:{
+ew:{
 "^":"ea;ox:loaded=",
-$isew7:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-bXi:{
-"^":"ew7;O3:url=",
+JN:{
+"^":"ea;Rn:data=",
+"%":"PushEvent"},
+M9:{
+"^":"ew;O3:url=",
 "%":"ResourceProgressEvent"},
-j24:{
+j2:{
 "^":"Bo;t5:type=",
 "%":"HTMLScriptElement"},
-bs:{
-"^":"Bo;B:length%,oc:name%,Mj:selectedIndex},yT:size=,t5:type=,P:value%",
+zk:{
+"^":"Bo;v:length%,oc:name%,Mj:selectedIndex},ky:size=,t5:type=,M: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])},
-$isbs:true,
+z=z.ev(z,new W.xv())
+return H.J(new P.Eb(P.z(z,!0,H.W8(z,"mW",0))),[null])},
+$iszk:true,
 "%":"HTMLSelectElement"},
-I0:{
+Bn:{
 "^":"hsw;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
+$isBn:true,
 "%":"ShadowRoot"},
-yNV:{
+QR:{
 "^":"Bo;t5:type=",
 "%":"HTMLSourceElement"},
 zD9:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
+"^":"Gv;V5:isFinal=,v:length=",
 "%":"SpeechRecognitionResult"},
-KKC:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 AsS:{
 "^":"Gv;",
-FV:function(a,b){H.bQ(b,new W.AA(a))},
+FV:function(a,b){C.Nm.aN(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)},
+p:function(a,b){return a.getItem(b)},
+q:function(a,b,c){a.setItem(b,c)},
 Rz:function(a,b){var z=a.getItem(b)
 a.removeItem(b)
 return z},
@@ -10608,143 +10083,148 @@
 this.aN(a,new W.wQ(z))
 return z},
 gUQ:function(a){var z=[]
-this.aN(a,new W.rs(z))
+this.aN(a,new W.ru(z))
 return z},
-gB:function(a){return a.length},
+gv:function(a){return a.length},
 gl0:function(a){return a.key(0)==null},
 gor:function(a){return a.key(0)!=null},
-$isT8:true,
-$asT8:function(){return[P.qU,P.qU]},
+$isw:true,
+$asw:function(){return[P.I,P.I]},
 "%":"Storage"},
 iiu:{
-"^":"ea;nl:key=,O3:url=",
+"^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
-fqq:{
+EU:{
 "^":"Bo;t5:type=",
 "%":"HTMLStyleElement"},
-v6:{
+kr:{
 "^":"Bo;",
-$isv6:true,
+$iskr:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
 inA:{
 "^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
+gzU:function(a){return H.J(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableElement"},
 Iv:{
-"^":"Bo;RH:rowIndex=",
+"^":"Bo;Cw:rowIndex=",
 iF:function(a,b){return a.insertCell(b)},
 $isIv:true,
 "%":"HTMLTableRowElement"},
 BTK:{
 "^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.Iv])},
+gzU:function(a){return H.J(new W.uB(a.rows),[W.Iv])},
 "%":"HTMLTableSectionElement"},
-OH:{
+yY:{
 "^":"Bo;rz:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|Hq|hg"},
-Un:{
-"^":"nx;",
-$isUn:true,
+$isyY:true,
+"%":";HTMLTemplateElement;RP|Hq|G0"},
+kJ:{
+"^":"JJ;",
+$iskJ:true,
 "%":"CDATASection|Text"},
 FBi:{
-"^":"Bo;oc:name%,vp:rows=,RP:selectionStart=,t5:type=,P:value%",
+"^":"Bo;oc:name%,zU:rows=,RP:selectionStart=,t5:type=,M:value%",
 q3:function(a){return a.select()},
 ul:function(a,b,c,d,e){return a.setRangeText(b,e,c,d)},
-mT:function(a,b){return a.setRangeText(b)},
+jy:function(a,b){return a.setRangeText(b)},
 Zl:function(a,b,c,d){return a.setSelectionRange(b,c,d)},
 np:function(a,b,c){return a.setSelectionRange(b,c)},
 "%":"HTMLTextAreaElement"},
 R0:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
-y6:{
-"^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+y6s:{
+"^":"w6O;w4:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"TouchEvent"},
 RHt:{
 "^":"Bo;fY:kind=,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
-guc:function(a){return H.VM(new P.hL(a.pageX,a.pageY),[null])},
+guc:function(a){return H.J(new P.hL(a.pageX,a.pageY),[null])},
 "%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"ftg;fg:height%,R:width}",
+Rg:{
+"^":"TF;fg:height%,N:width}",
 "%":"HTMLVideoElement"},
-EKW:{
-"^":"PZ;aB:protocol=,O3:url=",
+os:{
+"^":"D0;A8: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:{
-"^":"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']
+"^":"D0;bq:history=,oc:name%,pf:status%",
+ne:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
+y4: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
 b.requestAnimationFrame=function(c){return window.setTimeout(function(){c(Date.now())},16)}
 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.pf(b),c)
+kr:function(a,b,c,d){a.postMessage(P.jl(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],
-geg:function(a){return H.VM(new W.RO(a,C.rt.fA,!1),[null])},
+X6:function(a,b,c){return this.kr(a,b,c,null)},
+gHQ:function(a){return H.J(new W.vG(a,"keydown",!1),[null])},
 $isK5:true,
-$isPZ:true,
+$isD0:true,
 "%":"DOMWindow|Window"},
 U3:{
-"^":"KV;oc:name=,P:value%",
+"^":"KV;oc:name=,M:value%",
+ga4:function(a){return a.textContent},
+sa4:function(a,b){a.textContent=b},
 "%":"Attr"},
-YC2:{
-"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,73],
-n:function(a,b){var z,y,x
+MD:{
+"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,N:width=",
+X:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$istn)return!1
 y=a.left
 x=z.gBb(b)
 if(y==null?x==null:y===x){y=a.top
 x=z.gG6(b)
 if(y==null?x==null:y===x){y=a.width
-x=z.gR(b)
+x=z.gN(b)
 if(y==null?x==null:y===x){y=a.height
 z=z.gfg(b)
 z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w,v
+giO:function(a){var z,y,x,w
 z=J.v1(a.left)
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-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)},
-gTt:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
+return W.Up(W.VC(W.VC(W.VC(W.VC(0,z),y),x),w))},
+gSR:function(a){return H.J(new P.hL(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
+"%":"ClientRect"},
+dF:{
+"^":"nV;",
+gfg:function(a){return a.height},
+sfg:function(a,b){a.height=b},
+gN:function(a){return a.width},
+gx:function(a){return a.x},
+gy:function(a){return a.y},
+"%":"DOMRect"},
 NfA:{
 "^":"Bo;",
-$isPZ:true,
+$isD0:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+"^":"w1p;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10754,19 +10234,18 @@
 $asQV:function(){return[W.KV]},
 $isXj:true,
 "%":"MozNamedAttrMap|NamedNodeMap"},
-LOx:{
-"^":"x5e;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+LO:{
+"^":"kEI;",
+gv:function(a){return a.length},
+p:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Hj(b,a,null,null,null))
 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."))},
-gqG:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
+q:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sv:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(P.s("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
+throw H.b(P.s("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
 $isWO:true,
@@ -10776,33 +10255,110 @@
 $asQV:function(){return[W.vKL]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
-BVt:{
+SE:function(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/ig,C.Vu)},
+Q8:function(a,b,c,d){var z,y,x
+z=document.createEvent("CustomEvent")
+J.We(z,d)
+if(!J.t(d).$isWO)if(!J.t(d).$isw){y=d
+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)
+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())},
+lt:function(a,b,c,d,e,f,g,h){var z,y,x
+z=W.O7
+y=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[z])),[z])
+x=new XMLHttpRequest()
+C.Dt.i3(x,"GET",a,!0)
+z=H.J(new W.vG(x,"load",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new W.hH(y,x)),z.b),[H.u3(z,0)]).P6()
+z=H.J(new W.vG(x,"error",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(y.gYJ()),z.b),[H.u3(z,0)]).P6()
+x.send()
+return y.Q},
+Ws:function(a){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(a),2))},
+D7:function(a,b){var z,y
+z=typeof a!=="string"
+if((!z||a==null)&&!0)return new WebSocket(a)
+y=!z||a==null
+if(y)return new WebSocket(a,b)
+y=H.RB(b,"$isWO",[P.I],"$asWO")
+if(!y);z=!z||a==null
+if(z)return new WebSocket(a,b)
+throw H.b(P.p("Incorrect number or type of arguments"))},
+VC: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)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+xj:function(a){var z
+if(a==null)return
+if("postMessage" in a){z=W.P1(a)
+if(!!J.t(z).$isD0)return z
+return}else return a},
+Pd:function(a){if(!!J.t(a).$isSy)return a
+return P.UQ(a,!0)},
+Rl:function(a,b){return new W.zZ(a,b)},
+z9:[function(a){return J.N1(a)},"$1","b4",2,0,14,58],
+Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,14,58],
+Hw:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","ri",8,0,59,58,60,61,62],
+wi:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r
+z=J.Fb(d)
+if(z==null)throw H.b(P.p(d))
+y=z.prototype
+x=J.YC(d,"created")
+if(x==null)throw H.b(P.p(H.d(d)+" has no constructor called 'created'"))
+J.MZ(W.r3("article",null))
+w=z.$nativeSuperclassTag
+if(w==null)throw H.b(P.p(d))
+v=e==null
+if(v){if(!J.mG(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.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.Z6(),1))}
+t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.ri(),4))}
+s=Object.create(u.prototype,t)
+Object.defineProperty(s,init.dispatchPropertyName,{value:H.Va(y),enumerable:false,writable:true,configurable:true})
+r={prototype:s}
+if(!v)r.extends=e
+b.registerElement(c,r)},
+Yt:function(a){if(J.mG($.X3,C.fQ))return a
+return $.X3.oj(a,!0)},
+K2:function(a){if(J.mG($.X3,C.fQ))return a
+return $.X3.PT(a,!0)},
+AN:{
 "^":"Gv+REn;"},
 Xn:{
-"^":"vY6;RN,Pv",
-T2:function(a,b){var z=this.Pv
-if(J.xC(z.gB(z),0))H.vh(H.DU())
-return J.KU(z.Zv(0,0),b)},
-hV:function(a,b,c,d){this.Pv.aN(0,new W.Fp(b,c,d))},
+"^":"vY6;Q,a",
+T2:function(a,b){var z=this.a
+return J.KU(z.gtH(z),b)},
+hV:function(a,b,c,d){this.a.aN(0,new W.Fp(b,c,d))},
 f8:function(a,b,c){return this.hV(a,b,c,null)},
-F5:function(a){this.Pv=H.VM(new H.A8(P.F(this.RN,!0,null),new W.XX()),[null,null])},
+XG:function(a){this.a=H.J(new H.A8(P.z(this.Q,!0,null),new W.px()),[null,null])},
 static:{BW:function(a){var z=new W.Xn(a,null)
-z.F5(a)
+z.XG(a)
 return z}}},
 vY6:{
 "^":"a+REn;"},
-XX:{
-"^":"TpZ:12;",
-$1:[function(a){return J.rk(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+px:{
+"^":"r:14;",
+$1:[function(a){return J.ma(a)},"$1",null,2,0,null,4,"call"]},
 Fp:{
-"^":"TpZ:12;a,b,c",
-$1:function(a){return J.oS(a,this.a,this.b,this.c)},
-$isEH:true},
+"^":"r:14;Q,a,b",
+$1:function(a){return J.X9(a,this.Q,this.a,this.b)}},
 REn:{
 "^":"a;",
-gi1:function(a){return this.T2(a,"clear")},
-V1:function(a){return this.gi1(a).$0()},
+gyP:function(a){return this.T2(a,"clear")},
+V1:function(a){return this.gyP(a).$0()},
 gih:function(a){return this.T2(a,"color")},
 sih:function(a,b){this.hV(a,"color",b,"")},
 goH:function(a){return this.T2(a,"columns")},
@@ -10814,96 +10370,94 @@
 guc:function(a){return this.T2(a,"page")},
 suc:function(a,b){this.hV(a,"page",b,"")},
 gT8:function(a){return this.T2(a,"right")},
-gyT:function(a){return this.T2(a,"size")}},
+gky:function(a){return this.T2(a,"size")}},
 VG:{
-"^":"ark;dA,jS",
-tg:function(a,b){return J.kE(this.jS,b)},
-gl0:function(a){return this.dA.firstElementChild==null},
-gB:function(a){return this.jS.length},
-t:function(a,b){var z=this.jS
+"^":"ark;Q,a",
+tg:function(a,b){return J.kE(this.a,b)},
+gl0:function(a){return this.Q.firstElementChild==null},
+gv:function(a){return this.a.length},
+p:function(a,b){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.jS
+q:function(a,b,c){var z=this.a
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.dA.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.dA.appendChild(b)
+this.Q.replaceChild(c,z[b])},
+sv:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
+h:function(a,b){this.Q.appendChild(b)
 return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])},
+gu:function(a){var z=this.br(this)
+return H.J(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.Ff)},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.Q;z.D();)y.appendChild(z.c)},
 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.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())},
+z=this.Q
+if(b){z=J.OD(z)
+y=z.ev(z,new W.dz(a))}else{z=J.OD(z)
+y=z.ev(z,a)}for(z=H.J(new H.Mo(J.Nx(y.Q),y.a),[H.u3(y,0)]),x=z.Q;z.D();)J.vX(x.gk())},
 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)},
+vg: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(!!J.t(b).$isz2){z=this.Q
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},
-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
+aP:function(a,b,c){var z,y,x
+if(b>this.a.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.a
 y=z.length
-x=this.dA
+x=this.Q
 if(b===y)x.appendChild(c)
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
 Mh:function(a,b,c){throw H.b(P.nO(null))},
-V1:function(a){J.Wf(this.dA)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.dA.removeChild(z)
+V1:function(a){J.Ul(this.Q)},
+f4:function(a){var z=this.grZ(this)
+this.Q.removeChild(z)
 return z},
-gqG:function(a){var z=this.dA.firstElementChild
-if(z==null)throw H.b(P.w("No elements"))
+gtH:function(a){var z=this.Q.firstElementChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-grZ:function(a){var z=this.dA.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
+grZ:function(a){var z=this.Q.lastElementChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-$asark:function(){return[W.h4]},
-$aseD:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
+$asark:function(){return[W.z2]},
+$asE9h:function(){return[W.z2]},
+$asWO:function(){return[W.z2]},
+$asQV:function(){return[W.z2]}},
 dz:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.$1(a)!==!0},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q.$1(a)!==!0}},
 wz:{
-"^":"ark;jt,xa",
-gB:function(a){return this.jt.length},
-t:function(a,b){var z=this.jt
+"^":"ark;Q,a",
+gv:function(a){return this.Q.length},
+p:function(a,b){var z=this.Q
 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"))},
+q:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
+sv: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)},
-gqG:function(a){return C.t5.gqG(this.jt)},
-grZ:function(a){return C.t5.grZ(this.jt)},
-gDD:function(a){return W.oo(this.xa)},
-gS:function(a){return W.BW(this.xa)},
-geg:function(a){return H.VM(new W.Uc(this,!1,C.rt.fA),[null])},
-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))},
+gtH:function(a){return C.t5.gtH(this.Q)},
+grZ:function(a){return C.t5.grZ(this.Q)},
+gDD:function(a){return W.Dk(this.a)},
+gO:function(a){return W.BW(this.a)},
+gHQ:function(a){return H.J(new W.Uc(this,!1,"keydown"),[null])},
+nJ:function(a,b){var z=C.t5.ev(this.Q,new W.ty())
+this.a=P.z(z,!0,H.W8(z,"mW",0))},
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
-z.S8(a,b)
+static:{vD:function(a,b){var z=H.J(new W.wz(a,null),[b])
+z.nJ(a,b)
 return z}}},
 ty:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isz2}},
+M5K:{
 "^":"Gv;"},
 RAp:{
 "^":"Gv+lD;",
@@ -10912,7 +10466,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-ecX:{
+ec:{
 "^":"RAp+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -10920,85 +10474,86 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"TpZ:12;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,151,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return J.CA(a)},"$1",null,2,0,null,151,"call"]},
 bU2:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-bU:{
-"^":"TpZ:12;b,c",
+"^":"r:80;Q",
+$2:function(a,b){this.Q.setRequestHeader(a,b)}},
+hH:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-z=this.c
+z=this.a
 y=z.status
-if(typeof y!=="number")return y.F()
+if(typeof y!=="number")return y.C()
 y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.YM!==0)H.vh(P.w("Future already completed"))
-y.Xf(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+x=this.Q
+if(y)x.aM(0,z)
+else x.pm(a)},"$1",null,2,0,null,4,"call"]},
 DB:{
-"^":"TpZ:81;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;uR",
-gqG:function(a){var z=this.uR.firstChild
-if(z==null)throw H.b(P.w("No elements"))
+"^":"r:80;Q",
+$2:function(a,b){if(b!=null)this.Q[a]=b}},
+OB:{
+"^":"ark;Q",
+gtH:function(a){var z=this.Q.firstChild
+if(z==null)throw H.b(P.s("No elements"))
 return z},
-grZ:function(a){var z=this.uR.lastChild
-if(z==null)throw H.b(P.w("No elements"))
+grZ:function(a){var z=this.Q.lastChild
+if(z==null)throw H.b(P.s("No elements"))
 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.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
+h:function(a,b){this.Q.appendChild(b)},
+FV:function(a,b){var z,y,x,w
+z=J.t(b)
+if(!!z.$isOB){z=b.Q
+y=this.Q
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gu(b),y=this.Q;z.D();)y.appendChild(z.gk())},
+aP:function(a,b,c){var z,y,x
+if(b>this.Q.childNodes.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.Q
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
-z=this.uR
+UG:function(a,b,c){var z,y,x
+z=this.Q
 y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+x=y.length
+if(b===x)this.FV(0,c)
+else{if(b<0||b>=x)return H.e(y,b)
+J.qD(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
-z=this.uR
+if(!J.t(b).$isKV)return!1
+z=this.Q
 if(z!==b.parentNode)return!1
 z.removeChild(b)
 return!0},
 aO:function(a,b){var z,y,x
-z=this.uR
+z=this.Q
 y=z.firstChild
 for(;y!=null;y=x){x=y.nextSibling
-if(J.xC(a.$1(y),b))z.removeChild(y)}},
+if(J.mG(a.$1(y),b))z.removeChild(y)}},
 uk:function(a,b){this.aO(b,!0)},
-V1:function(a){J.Wf(this.uR)},
-u:function(a,b,c){var z,y
-z=this.uR
+V1:function(a){J.Ul(this.Q)},
+q:function(a,b,c){var z,y
+z=this.Q
 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.t5.gA(this.uR.childNodes)},
+gu:function(a){return C.t5.gu(this.Q.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"))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.uR.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.uR.childNodes
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+gv:function(a){return this.Q.childNodes.length},
+sv:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
+p:function(a,b){var z=this.Q.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$iswi:true,
+$isOB:true,
 $asark:function(){return[W.KV]},
-$aseD:function(){return[W.KV]},
+$asE9h:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
 nNL:{
@@ -11008,7 +10563,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-w1p:{
+ecX:{
 "^":"nNL+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -11016,21 +10571,17 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 xv:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$islq},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isQlt}},
 AA:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.setItem(a,b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.setItem(a,b)}},
 wQ:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.push(a)},
-$isEH:true},
-rs:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.push(b)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.push(a)}},
+ru:{
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.push(b)}},
 yoo:{
 "^":"Gv+lD;",
 $isWO:true,
@@ -11038,7 +10589,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-kEI:{
+w1p:{
 "^":"yoo+Gm;",
 $isWO:true,
 $asWO:function(){return[W.KV]},
@@ -11052,7 +10603,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.vKL]}},
-x5e:{
+kEI:{
 "^":"zLC+Gm;",
 $isWO:true,
 $asWO:function(){return[W.vKL]},
@@ -11061,187 +10612,174 @@
 $asQV:function(){return[W.vKL]}},
 a7B:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Za(this))},
+FV:function(a,b){J.Me(b,new W.ZcQ(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.Ff)},
+for(z=this.gvc(this),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)this.Rz(0,z.c)},
 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.Ff
-b.$2(y,this.t(0,y))}},
+for(z=this.gvc(this),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+b.$2(y,this.p(0,y))}},
 gvc:function(a){var z,y,x,w
-z=this.dA.attributes
-y=H.VM([],[P.qU])
+z=this.Q.attributes
+y=H.J([],[P.I])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
+if(this.Bs(z[w])){if(w>=z.length)return H.e(z,w)
 y.push(J.DA(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
-z=this.dA.attributes
-y=H.VM([],[P.qU])
+z=this.Q.attributes
+y=H.J([],[P.I])
 for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.O2(z[w])){if(w>=z.length)return H.e(z,w)
-y.push(J.Vm(z[w]))}}return y},
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(this)!==0},
-$isT8:true,
-$asT8:function(){return[P.qU,P.qU]}},
-Za:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
+if(this.Bs(z[w])){if(w>=z.length)return H.e(z,w)
+y.push(J.SW(z[w]))}}return y},
+gl0:function(a){return this.gv(this)===0},
+gor:function(a){return this.gv(this)!==0},
+$isw:true,
+$asw:function(){return[P.I,P.I]}},
+ZcQ:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,b)}},
 E9:{
-"^":"a7B;dA",
-NZ:function(a,b){return this.dA.hasAttribute(b)},
-t:function(a,b){return this.dA.getAttribute(b)},
-u:function(a,b,c){this.dA.setAttribute(b,c)},
+"^":"a7B;Q",
+NZ:function(a,b){return this.Q.hasAttribute(b)},
+p:function(a,b){return this.Q.getAttribute(b)},
+q:function(a,b,c){this.Q.setAttribute(b,c)},
 Rz:function(a,b){var z,y
-z=this.dA
+z=this.Q
 y=z.getAttribute(b)
 z.removeAttribute(b)
 return y},
-gB:function(a){return this.gvc(this).length},
-O2:function(a){return a.namespaceURI==null}},
-nFk:{
-"^":"As3;RN,AL",
-DG:function(){var z=P.Ls(null,null,null,P.qU)
-this.AL.aN(0,new W.jL(z))
+gv:function(a){return this.gvc(this).length},
+Bs:function(a){return a.namespaceURI==null}},
+hZ:{
+"^":"As3;Q,a",
+DG:function(){var z=P.fM(null,null,null,P.I)
+this.a.aN(0,new W.qm(z))
 return z},
 p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-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.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:{oo:function(a){var z=new W.nFk(a,null)
+z=C.Nm.zV(P.z(a,!0,null)," ")
+for(y=this.Q,y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();)J.fm(y.c,z)},
+H9:function(a){this.a.aN(0,new W.uS(a))},
+Rz:function(a,b){return this.jA(new W.Bj(b))},
+jA:function(a){return this.a.es(0,!1,new W.Zl(a))},
+b1:function(a){this.a=H.J(new H.A8(P.z(this.Q,!0,null),new W.Lu()),[null,null])},
+static:{Dk:function(a){var z=new W.hZ(a,null)
 z.b1(a)
 return z}}},
-FK:{
-"^":"TpZ:12;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-jL:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.FV(0,a.DG())},
-$isEH:true},
+Lu:{
+"^":"r:14;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,4,"call"]},
+qm:{
+"^":"r:14;Q",
+$1:function(a){return this.Q.FV(0,a.DG())}},
 uS:{
-"^":"TpZ:12;a",
-$1:function(a){return a.H9(this.a)},
-$isEH:true},
-FcD:{
-"^":"TpZ:12;a",
-$1:function(a){return J.V1(a,this.a)},
-$isEH:true},
-hD:{
-"^":"TpZ:81;a",
-$2:function(a,b){return this.a.$1(b)===!0||a===!0},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return a.H9(this.Q)}},
+Bj:{
+"^":"r:14;Q",
+$1:function(a){return J.V1(a,this.Q)}},
+Zl:{
+"^":"r:80;Q",
+$2:function(a,b){return this.Q.$1(b)===!0||a===!0}},
 I4:{
-"^":"As3;dA",
+"^":"As3;Q",
 DG:function(){var z,y,x
-z=P.Ls(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.rr(y.Ff)
+z=P.fM(null,null,null,P.I)
+for(y=J.ufU(this.Q).split(" "),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=J.Q7(y.c)
 if(x.length!==0)z.h(0,x)}return z},
-p5:function(a){P.F(a,!0,null)
-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)
+p5:function(a){P.z(a,!0,null)
+J.fm(this.Q,a.zV(0," "))}},
+vG:{
+"^":"cb;Q,a,b",
+X5:function(a,b,c,d){var z=new W.Ov(0,this.Q,this.a,W.Yt(a),this.b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
-z.DN()
+z.P6()
 return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-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.W3w(J.l2(a),this.a)},
-$isEH:true},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)}},
+eu:{
+"^":"vG;Q,a,b",
+WO:function(a,b){var z=H.J(new P.fk(new W.tS(b),this),[H.W8(this,"cb",0)])
+return H.J(new P.c9(new W.rg(b),z),[H.W8(z,"cb",0),null])},
+$iscb:true},
 tS:{
-"^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
-return a},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return J.I0(J.Zu(a),this.Q)}},
+rg:{
+"^":"r:14;Q",
+$1:[function(a){J.A6(a,this.Q)
+return a},"$1",null,2,0,null,4,"call"]},
 Uc:{
-"^":"wS;fT,el,fA",
-xZ:function(a,b){var z=H.VM(new P.fk(new W.Al(b),this),[H.W8(this,"wS",0)])
-return H.VM(new P.c9(new W.iND(b),z),[H.W8(z,"wS",0),null])},
-KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.wS,null],[P.MO,null])),[null])
-z.xd(null)
-for(y=this.fT,y=y.gA(y),x=this.fA,w=this.el;y.G();){v=new W.RO(y.Ff,x,w)
+"^":"cb;Q,a,b",
+WO:function(a,b){var z=H.J(new P.fk(new W.Es(b),this),[H.W8(this,"cb",0)])
+return H.J(new P.c9(new W.Hb(b),z),[H.W8(z,"cb",0),null])},
+X5:function(a,b,c,d){var z,y,x,w,v
+z=H.J(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.yX,null])),[null])
+z.KS(null)
+for(y=this.Q,y=y.gu(y),x=this.b,w=this.a;y.D();){v=new W.vG(y.c,x,w)
 v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.Hj
+z.h(0,v)}y=z.Q
 y.toString
-return H.VM(new P.Ln(y),[H.u3(y,0)]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-$iswS:true},
-Al:{
-"^":"TpZ:12;a",
-$1:function(a){return J.W3w(J.l2(a),this.a)},
-$isEH:true},
-iND:{
-"^":"TpZ:12;b",
-$1:[function(a){J.A6L(a,this.b)
-return a},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+return H.J(new P.rk(y),[H.u3(y,0)]).X5(a,b,c,d)},
+zC:function(a,b,c){return this.X5(a,null,b,c)},
+yI:function(a){return this.X5(a,null,null,null)},
+$iscb:true},
+Es:{
+"^":"r:14;Q",
+$1:function(a){return J.I0(J.Zu(a),this.Q)}},
+Hb:{
+"^":"r:14;Q",
+$1:[function(a){J.A6(a,this.Q)
+return a},"$1",null,2,0,null,4,"call"]},
 Ov:{
-"^":"MO;UU,bi,fA,H2,el",
-Gv:function(){if(this.bi==null)return
+"^":"yX;Q,a,b,c,d",
+Gv:function(){if(this.a==null)return
 this.EO()
-this.bi=null
-this.H2=null
+this.a=null
+this.c=null
 return},
-Fv:[function(a,b){if(this.bi==null)return;++this.UU
+Fv:[function(a,b){if(this.a==null)return;++this.Q
 this.EO()
-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.we(this.bi,this.fA,z,this.el)}},
+if(b!=null)b.wM(this.gbY(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,136,23,137],
+gRW:function(){return this.Q>0},
+QE:[function(a){if(this.a==null||this.Q<=0)return;--this.Q
+this.P6()},"$0","gbY",0,0,1],
+P6:function(){var z=this.c
+if(z!=null&&this.Q<=0)J.cZ(this.a,this.b,z,this.d)},
+EO:function(){var z=this.c
+if(z!=null)J.GJ(this.a,this.b,z,this.d)}},
 qO:{
-"^":"a;Hj,u4",
-gvq:function(a){var z=this.Hj
+"^":"a;Q,a",
+gvq:function(a){var z=this.Q
 z.toString
-return H.VM(new P.Ln(z),[H.u3(z,0)])},
+return H.J(new P.rk(z),[H.u3(z,0)])},
 h:function(a,b){var z,y
-z=this.u4
+z=this.a
 if(z.NZ(0,b))return
-y=this.Hj
-z.u(0,b,b.zC(y.ght(y),new W.rW(this,b),this.Hj.gGj()))},
-Rz:function(a,b){var z=this.u4.Rz(0,b)
+y=this.Q
+z.q(0,b,b.zC(y.ght(y),new W.RXm(this,b),this.Q.gXB()))},
+Rz:function(a,b){var z=this.a.Rz(0,b)
 if(z!=null)z.Gv()},
 xO:[function(a){var z,y
-for(z=this.u4,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.Gv()
+for(z=this.a,y=z.gUQ(z),y=H.J(new H.MH(null,J.Nx(y.Q),y.a),[H.u3(y,0),H.u3(y,1)]);y.D();)y.Q.Gv()
 z.V1(0)
-this.Hj.xO(0)},"$0","gQF",0,0,17],
-xd:function(a){this.Hj=P.bK(this.gQF(this),null,!0,a)}},
-rW:{
-"^":"TpZ:76;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+this.Q.xO(0)},"$0","gJK",0,0,1],
+KS:function(a){this.Q=P.bK(this.gJK(this),null,!0,a)}},
+RXm:{
+"^":"r:77;Q,a",
+$0:[function(){return this.Q.Rz(0,this.a)},"$0",null,0,0,null,"call"]},
 Gm:{
 "^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.W8(a,"Gm",0)])},
+gu:function(a){return H.J(new W.W9(a,this.gv(a),-1,null),[H.W8(a,"Gm",0)])},
 h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
 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)},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+aP: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."))},
 uk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 oq:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
 $isWO:true,
 $asWO:null,
@@ -11249,67 +10787,65 @@
 $isQV:true,
 $asQV:null},
 uB:{
-"^":"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.U2(this.xN)},
-t:function(a,b){var z=this.xN
+"^":"ark;Q",
+gu:function(a){return H.J(new W.Qg(J.Nx(this.Q)),[null])},
+gv:function(a){return this.Q.length},
+h:function(a,b){J.dH(this.Q,b)},
+Rz:function(a,b){return J.V1(this.Q,b)},
+V1:function(a){J.U2(this.Q)},
+p:function(a,b){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.xN
+q:function(a,b,c){var z=this.Q
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.wg(this.xN,b)},
-GT:function(a,b){J.uF(this.xN,b)},
+sv:function(a,b){J.RS(this.Q,b)},
+GT:function(a,b){J.y6(this.Q,b)},
 Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.DP(this.xN,b,c)},
+XU:function(a,b,c){return J.DP(this.Q,b,c)},
 OY:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xN,b,c)},
+Pk:function(a,b,c){return J.ff(this.Q,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-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.xN,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
+aP:function(a,b,c){return J.V2(this.Q,b,c)},
+YW:function(a,b,c,d,e){J.L0(this.Q,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+oq:function(a,b,c){J.Hd(this.Q,b,c)}},
+Qg:{
+"^":"a;Q",
+D:function(){return this.Q.D()},
+gk:function(){return this.Q.c}},
 W9:{
-"^":"a;NX,vN,G3,QZ",
-G:function(){var z,y
-z=this.G3+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.NX,z)
-this.G3=z
-return!0}this.QZ=null
-this.G3=y
+"^":"a;Q,a,b,c",
+D:function(){var z,y
+z=this.b+1
+y=this.a
+if(z<y){this.c=J.Tf(this.Q,z)
+this.b=z
+return!0}this.c=null
+this.b=y
 return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"TpZ:12;a,b",
-$1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
+gk:function(){return this.c}},
+zZ:{
+"^":"r:14;Q,a",
+$1:[function(a){Object.defineProperty(a,init.dispatchPropertyName,{value:H.Va(this.a),enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,56,"call"],
-$isEH:true},
+return this.Q(a)},"$1",null,2,0,null,58,"call"]},
 dW:{
-"^":"a;uU",
-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.pf(b),c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+"^":"a;Q",
+gbq:function(a){return W.zK(this.Q.history)},
+geT:function(a){return W.P1(this.Q.parent)},
+xO:function(a){return this.Q.close()},
+kr:function(a,b,c,d){this.Q.postMessage(P.jl(b),c)},
+X6:function(a,b,c){return this.kr(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."))},
-$isPZ:true,
+$isD0:true,
 static:{P1:function(a){if(a===window)return a
 else return new W.dW(a)}}},
-VP:{
-"^":"a;nA",
+IV:{
+"^":"a;Q",
 static:{zK:function(a){if(a===window.history)return a
-else return new W.VP(a)}}}}],["","",,P,{
+else return new W.IV(a)}}}}],["","",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -11317,105 +10853,105 @@
 "%":"IDBKeyRange"}}],["","",,P,{
 "^":"",
 Y0Y:{
-"^":"tpr;N:target=,mH:href=",
+"^":"tpr;K:target=,LU:href=",
 "%":"SVGAElement"},
 ZJQ:{
-"^":"Rc;mH:href=",
+"^":"Eo4;LU:href=",
 "%":"SVGAltGlyphElement"},
-jwG:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Lr:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
 lvr:{
-"^":"d5G;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
+"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pfc:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-lF:{
-"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
+pyf:{
+"^":"d5;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-EfE:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Kq:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+tr:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 ihH:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
 tk2:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 meI:{
-"^":"d5G;fg:height=,yG:result=,x=,y=,mH:href=",
+"^":"d5;fg:height=,yG:result=,x=,y=,LU:href=",
 "%":"SVGFEImageElement"},
 oBW:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
 yu:{
-"^":"d5G;xS:operator=,fg:height=,yG:result=,x=,y=",
+"^":"d5;xS:operator=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+MI:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
 Ubr:{
-"^":"d5G;x=,y=",
+"^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+xX:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
 HAk:{
-"^":"d5G;x=,y=",
+"^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
-Rg:{
-"^":"d5G;fg:height=,yG:result=,x=,y=",
+Qya:{
+"^":"d5;fg:height=,yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 juM:{
-"^":"d5G;t5:type=,fg:height=,yG:result=,x=,y=",
+"^":"d5;t5:type=,fg:height=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 OE5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5;fg:height=,x=,y=,LU:href=",
 "%":"SVGFilterElement"},
-l6:{
+q8t:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
-en:{
+d0D:{
 "^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 tpr:{
-"^":"d5G;",
+"^":"d5;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 rEM:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGImageElement"},
 NBZ:{
-"^":"d5G;fg:height=,x=,y=",
+"^":"d5;fg:height=,x=,y=",
 "%":"SVGMaskElement"},
 Gr5:{
-"^":"d5G;fg:height=,x=,y=,mH:href=",
+"^":"d5;fg:height=,x=,y=,LU:href=",
 "%":"SVGPatternElement"},
 NJ3:{
-"^":"en;fg:height=,x=,y=",
+"^":"d0D;fg:height=,x=,y=",
 "%":"SVGRectElement"},
-qIR:{
-"^":"d5G;t5:type=,mH:href=",
+j24:{
+"^":"d5;t5:type=,LU:href=",
 "%":"SVGScriptElement"},
-EUL:{
-"^":"d5G;t5:type=",
+BD:{
+"^":"d5;t5:type=",
 smk:function(a,b){a.title=b},
 "%":"SVGStyleElement"},
-d5G:{
-"^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
+d5:{
+"^":"z2;",
+gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.Ci(a)
 return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-geg:function(a){return H.VM(new W.Cqa(a,C.rt.fA,!1),[null])},
-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,
+gwd:function(a){return H.J(new P.P0(a,new W.OB(a)),[W.z2])},
+gHQ:function(a){return H.J(new W.eu(a,"keydown",!1),[null])},
+gVY:function(a){return H.J(new W.eu(a,"mousedown",!1),[null])},
+gf0:function(a){return H.J(new W.eu(a,"mousemove",!1),[null])},
+$isD0: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:{
@@ -11423,68 +10959,68 @@
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
-mHq:{
+mH:{
 "^":"tpr;",
 "%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
+xN:{
+"^":"mH;LU:href=",
 "%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
+Eo4:{
+"^":"mH;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"tpr;fg:height=,x=,y=,mH:href=",
+"^":"tpr;fg:height=,x=,y=,LU:href=",
 "%":"SVGUseElement"},
 cuU:{
-"^":"d5G;mH:href=",
+"^":"d5;LU:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
+Ci:{
+"^":"As3;Q",
 DG:function(){var z,y,x,w
-z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
+z=this.Q.getAttribute("class")
+y=P.fM(null,null,null,P.I)
 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.rr(x.Ff)
+for(x=z.split(" "),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=J.Q7(x.c)
 if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
+p5:function(a){this.Q.setAttribute("class",a.zV(0," "))}}}],["","",,P,{
 "^":"",
 QmI:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["","",,P,{
 "^":"",
-hq:{
+XY:{
 "^":"a;",
-$ishq:true}}],["","",,P,{
+$isXY: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)},
+xZ: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
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,40,61,26,62],
+d=z}return P.wY(H.eC(a,P.z(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,42,63,27,64],
 Dm:function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
+if(Object.isExtensible(a)&&!Object.prototype.hasOwnProperty.call(a,b))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
 Jk:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},
 wY:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-else{z=J.x(a)
+else{z=J.t(a)
 if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5)return a
 else if(!!z.$isiP)return H.o2(a)
-else if(!!z.$isE4)return a.S1
+else if(!!z.$isE4)return a.Q
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,14,65],
 hE:function(a,b,c){var z=P.Jk(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
-else{if(a instanceof Object){z=J.x(a)
+else{if(a instanceof Object){z=J.t(a)
 z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isK5}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,52,63],
+else return P.ND(a)}},"$1","Xl",2,0,53,65],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.np())
 else return P.iQ(a,$.LZ(),new P.Ut())},
@@ -11492,94 +11028,91 @@
 if(z==null||!(a instanceof Object)){z=c.$1(a)
 P.Dm(a,b,z)}return z},
 E4:{
-"^":"a;S1",
-t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-return P.dU(this.S1[b])},
-u:function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
-this.S1[b]=P.wY(c)},
+"^":"a;Q",
+p:["lg",function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.p("property is not a String or num"))
+return P.dU(this.Q[b])}],
+q:["kW",function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.p("property is not a String or num"))
+this.Q[b]=P.wY(c)}],
 giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.S1===b.S1},
-Eg:function(a){return a in this.S1},
-Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.u("property is not a String or num"))
-delete this.S1[a]},
-bu:[function(a){var z,y
-try{z=String(this.S1)
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isE4&&this.Q===b.Q},
+Bm:function(a){return a in this.Q},
+Ji:function(a){if(typeof a!=="string"&&typeof a!=="number")throw H.b(P.p("property is not a String or num"))
+delete this.Q[a]},
+X:[function(a){var z,y
+try{z=String(this.Q)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gCR",0,0,73],
-V7:function(a,b){var z,y
-z=this.S1
-y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
+return this.L7(this)}},"$0","gCR",0,0,0],
+Z:function(a,b){var z,y
+z=this.Q
+y=b==null?null:P.z(H.J(new H.A8(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.V7(a,null)},
+nQ:function(a){return this.Z(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
+C.Nm.FV(y,H.J(new H.A8(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-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)}}},
+return P.ND(new x())},kW:function(a){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||a==null)throw H.b(P.p("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.J(new P.PL(0,null,null,null,null),[null,null])).$1(a)}}},
 Xb:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.NZ(0,a))return z.t(0,a)
-y=J.x(a)
-if(!!y.$isT8){x={}
-z.u(0,a,x)
-for(z=J.mY(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
-z.u(0,a,v)
+z=this.Q
+if(z.NZ(0,a))return z.p(0,a)
+y=J.t(a)
+if(!!y.$isw){x={}
+z.q(0,a,x)
+for(z=J.Nx(y.gvc(a));z.D();){w=z.gk()
+x[w]=this.$1(y.p(a,w))}return x}else if(!!y.$isQV){v=[]
+z.q(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
-$isEH:true},
+return v}else return P.wY(a)},"$1",null,2,0,null,65,"call"]},
 r7:{
-"^":"E4;S1",
+"^":"E4;Q",
 qP:function(a,b){var z,y
 z=P.wY(b)
-y=P.F(H.VM(new H.A8(a,P.En()),[null,null]),!0,null)
-return P.dU(this.S1.apply(z,y))},
+y=P.z(H.J(new H.A8(a,P.En()),[null,null]),!0,null)
+return P.dU(this.Q.apply(z,y))},
 PO:function(a){return this.qP(a,null)},
 $isr7:true,
-static:{mt:function(a){return new P.r7(P.z8(a,!0))}}},
+static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
 GD:{
-"^":"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)
+"^":"WkF;Q",
+p: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.gv(this)
 else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}return P.E4.prototype.t.call(this,this,b)},
-u:function(a,b,c){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)
+if(z)H.vh(P.ve(b,0,this.gv(this),null,null))}return this.lg(this,b)},
+q:function(a,b,c){var z
+if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gv(this)
 else z=!1
-if(z)H.vh(P.TE(b,0,this.gB(this)))}P.E4.prototype.u.call(this,this,b,c)},
-gB:function(a){var z=this.S1.length
+if(z)H.vh(P.ve(b,0,this.gv(this),null,null))}this.kW(this,b,c)},
+gv:function(a){var z=this.Q.length
 if(typeof z==="number"&&z>>>0===z)return z
-throw H.b(P.w("Bad JsArray length"))},
-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))},
-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.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)
-if(b<0||b>z)H.vh(P.TE(b,0,z))
-if(c<b||c>z)H.vh(P.TE(c,b,z))
-y=c-b
-if(y===0)return
-if(e<0)throw H.b(P.u(e))
-x=[b,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",[])},
+throw H.b(P.s("Bad JsArray length"))},
+sv:function(a,b){this.kW(this,"length",b)},
+h:function(a,b){this.Z("push",[b])},
+FV:function(a,b){this.Z("push",b instanceof Array?b:P.z(b,!0,null))},
+aP:function(a,b,c){if(b>=this.gv(this)+1)H.vh(P.ve(b,0,this.gv(this),null,null))
+this.Z("splice",[b,0,c])},
+oq:function(a,b,c){P.BE(b,c,this.gv(this))
+this.Z("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y
+P.BE(b,c,this.gv(this))
+z=c-b
+if(z===0)return
+if(e<0)throw H.b(P.p(e))
+y=[b,z]
+C.Nm.FV(y,J.Ld(d,e).qZ(0,z))
+this.Z("splice",y)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+GT:function(a,b){this.Z("sort",[])},
 Jd:function(a){return this.GT(a,null)},
-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))}}},
+static:{BE:function(a,b,c){if(a<0||a>c)throw H.b(P.ve(a,0,c,null,null))
+if(b<a||b>c)throw H.b(P.ve(b,a,c,null,null))}}},
 WkF:{
 "^":"E4+lD;",
 $isWO:true,
@@ -11588,27 +11121,22 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"TpZ:12;",
-$1:function(a){var z=P.z8(a,!1)
+"^":"r:14;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
+return z}},
 Hp:{
-"^":"TpZ:12;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return new this.Q(a)}},
 Nz:{
-"^":"TpZ:12;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return new P.r7(a)}},
 np:{
-"^":"TpZ:12;",
-$1:function(a){return H.VM(new P.GD(a),[null])},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return H.J(new P.GD(a),[null])}},
 Ut:{
-"^":"TpZ:12;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["","",,P,{
+"^":"r:14;",
+$1:function(a){return new P.E4(a)}}}],["","",,P,{
 "^":"",
 Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
@@ -11616,9 +11144,9 @@
 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
-if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
+C:function(a,b){var z
+if(typeof a!=="number")throw H.b(P.p(a))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
@@ -11626,8 +11154,8 @@
 else z=!1
 if(z||isNaN(b))return b
 return a}return a},
-y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
-if(typeof b!=="number")throw H.b(P.u(b))
+u:function(a,b){if(typeof a!=="number")throw H.b(P.p(a))
+if(typeof b!=="number")throw H.b(P.p(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
@@ -11639,33 +11167,33 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;xx,vz",
-SR:function(){var z,y,x,w,v,u
-z=this.xx
+"^":"a;Q,a",
+v7:function(){var z,y,x,w,v,u
+z=this.Q
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.vz
+u=v+x+this.a
 z=(u&4294967295)>>>0
-this.xx=z
-this.vz=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Q=z
+this.a=(C.jn.BU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 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.SR()
-return(this.xx&z)>>>0}do{this.SR()
-y=this.xx
+if((a&z)===0){this.v7()
+return(this.Q&z)>>>0}do{this.v7()
+y=this.Q
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mK:function(a){var z,y,x,w,v,u,t,s
-z=J.u6(a,0)?-1:0
+FO:function(a){var z,y,x,w,v,u,t,s
+z=J.UN(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
-a=J.Cl(y.W(a,x),4294967296)
+a=J.bI(y.T(a,x),4294967296)
 y=J.Wx(a)
 w=y.i(a,4294967295)
-a=J.Cl(y.W(a,w),4294967296)
+a=J.bI(y.T(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
@@ -11680,141 +11208,130 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.BU(v-u,4294967296)
-v=this.xx*1037
+v=this.Q*1037
 t=(v&4294967295)>>>0
-this.xx=t
-s=(this.vz*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
-this.vz=s
-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.SR()
-this.SR()
-this.SR()
-this.SR()},
-static:{"^":"tgM,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
-z.mK(a)
+this.Q=t
+s=(this.a*1037+C.jn.BU(v-t,4294967296)&4294967295)>>>0
+this.a=s
+this.Q=(t^u)>>>0
+this.a=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.mG(a,z))
+if(this.a===0&&this.Q===0)this.Q=23063
+this.v7()
+this.v7()
+this.v7()
+this.v7()},
+static:{"^":"dK,PZi,JYU",n2:function(a){var z=new P.kh(0,0)
+z.FO(a)
 return z}}},
 hL:{
-"^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gCR",0,0,73],
-n:function(a,b){var z,y
+"^":"a;x:Q>,y:a>",
+X:[function(a){return"Point("+H.d(this.Q)+", "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z,y
 if(b==null)return!1
-if(!J.x(b).$ishL)return!1
-z=this.x
-y=b.x
-if(z==null?y==null:z===y){z=this.y
-y=b.y
+if(!J.t(b).$ishL)return!1
+z=this.Q
+y=b.Q
+if(z==null?y==null:z===y){z=this.a
+y=b.a
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},
 giO:function(a){var z,y
-z=J.v1(this.x)
-y=J.v1(this.y)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return P.xk(P.Zm(P.Zm(0,z),y))},
 g:function(a,b){var z,y,x,w
-z=this.x
+z=this.Q
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
+if(typeof x!=="number")return H.o(x)
+w=this.a
 y=y.gy(b)
 if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(y)
+if(typeof y!=="number")return H.o(y)
 y=new P.hL(z+x,w+y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-W:function(a,b){var z,y,x,w
-z=this.x
+T:function(a,b){var z,y,x,w
+z=this.Q
 y=J.RE(b)
 x=y.gx(b)
-if(typeof z!=="number")return z.W()
-if(typeof x!=="number")return H.s(x)
-w=this.y
+if(typeof z!=="number")return z.T()
+if(typeof x!=="number")return H.o(x)
+w=this.a
 y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(y)
+if(typeof w!=="number")return w.T()
+if(typeof y!=="number")return H.o(y)
 y=new P.hL(z-x,w-y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-U:function(a,b){var z,y
-z=this.x
-if(typeof z!=="number")return z.U()
-if(typeof b!=="number")return H.s(b)
-y=this.y
-if(typeof y!=="number")return y.U()
+R:function(a,b){var z,y
+z=this.Q
+if(typeof z!=="number")return z.R()
+if(typeof b!=="number")return H.o(b)
+y=this.a
+if(typeof y!=="number")return y.R()
 y=new P.hL(z*b,y*b)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
 $ishL:true},
 HDe:{
 "^":"a;",
-gT8:function(a){return this.gBb(this)+this.R},
-gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gCR",0,0,73],
-n:function(a,b){var z,y
+gT8:function(a){return this.gBb(this)+this.b},
+gQG:function(a){return this.gG6(this)+this.c},
+X:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.a+") "+this.b+" x "+this.c},"$0","gCR",0,0,0],
+m:function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
+z=J.t(b)
 if(!z.$istn)return!1
-if(this.gBb(this)===z.gBb(b)){y=this.G6
-z=y===z.gG6(b)&&this.Bb+this.R===z.gT8(b)&&y+this.fg===z.gQG(b)}else z=!1
+if(this.gBb(this)===z.gBb(b)){y=this.a
+z=y===z.gG6(b)&&this.Q+this.b===z.gT8(b)&&y+this.c===z.gQG(b)}else z=!1
 return z},
-giO:function(a){var z=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)
+giO:function(a){var z=this.a
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,this.gBb(this)&0x1FFFFFFF),z&0x1FFFFFFF),this.Q+this.b&0x1FFFFFFF),z+this.c&0x1FFFFFFF))},
+gSR:function(a){var z=new P.hL(this.gBb(this),this.a)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
+"^":"HDe;Bb:Q>,G6:a>,N:b>,fg:c>",
 $istn:true,
 $astn:null,
 static:{T7:function(a,b,c,d,e){var z,y
 z=c<0?-c*0:c
 y=d<0?-d*0:d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
+return H.J(new P.tn(a,b,z,y),[e])}}}}],["","",,P,{
 "^":"",
 moY:{
-"^":"a;JH",
+"^":"a;Q",
 static:{"^":"aRn,aLE,Rwl"}},
-V2:{
+Wy:{
 "^":"a;",
 $isAS:true}}],["","",,H,{
 "^":"",
-Hj:function(a,b,c){},
-m6:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-z4:function(a,b,c){H.Hj(a,b,c)
-return new Uint8Array(a,b)},
-bf:{
+D8:{
 "^":"Gv;H3:byteLength=",
-gbx:function(a){return C.uh},
-kq:function(a,b,c){H.Hj(a,b,c)
-return new DataView(a,b)},
-$isbf:true,
+gbx:function(a){return C.E0},
+$isD8:true,
 $isaI:true,
 "%":"ArrayBuffer"},
 eH:{
-"^":"Gv;bg:buffer=,H3:byteLength=,Vl:byteOffset=",
+"^":"Gv;bg:buffer=,H3:byteLength=,rv:byteOffset=",
 aq:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-Lu:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
-Mz:function(a,b,c,d){var z=d+1
-this.Lu(a,b,z)
-this.Lu(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
+if(z.w(b,0)||z.C(b,c)){if(!!this.$isWO)if(c===a.length)throw H.b(P.Hj(b,a,null,null,null))
+throw H.b(P.ve(b,0,c-1,null,null))}else throw H.b(P.p("Invalid list index "+H.d(b)))},
+bv:function(a,b,c){if(b>>>0!==b||b>=c)this.aq(a,b,c)},
+i4:function(a,b,c,d){var z=d+1
+this.bv(a,b,z)
+this.bv(a,c,z)
+if(b>c)throw H.b(P.ve(b,0,c,null,null))
 return c},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;b0B|ObS|GVy|Dg|fjp|Ipv|Pg"},
+"%":";ArrayBufferView;vF|Ui|GVy|Dg|ObS|Ipv|Pg"},
 dfL:{
 "^":"eH;",
-gbx:function(a){return C.nW},
+gbx:function(a){return C.T1},
 mt:function(a,b,c){throw H.b(P.f("Uint64 accessor not supported by dart2js."))},
 $isAS:true,
 "%":"DataView"},
@@ -11823,25 +11340,25 @@
 gbx:function(a){return C.ra},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float32Array"},
 K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.nC},
+gbx:function(a){return C.Ev},
 $isAS:true,
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]},
+$asQV:function(){return[P.CP]},
 "%":"Float64Array"},
 xja:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11851,10 +11368,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int16Array"},
-dE5:{
+dE:{
 "^":"Pg;",
-gbx:function(a){return C.QP},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.J0},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11866,8 +11383,8 @@
 "%":"Int32Array"},
 Zc5:{
 "^":"Pg;",
-gbx:function(a){return C.OP},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.QG},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11877,10 +11394,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Int8Array"},
-pd:{
+us:{
 "^":"Pg;",
-gbx:function(a){return C.u9},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.iN},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11890,10 +11407,10 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"Uint16Array"},
-Pqh:{
+N2:{
 "^":"Pg;",
 gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11905,9 +11422,9 @@
 "%":"Uint32Array"},
 eEV:{
 "^":"Pg;",
-gbx:function(a){return C.YZ},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.hD},
+gv:function(a){return a.length},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
 $isAS:true,
@@ -11917,14 +11434,13 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
+V6:{
 "^":"Pg;",
-gbx:function(a){return C.Wr},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
+gbx:function(a){return C.HC},
+gv:function(a){return a.length},
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-aM:function(a,b,c){return new Uint8Array(a.subarray(b,this.Mz(a,b,c,a.length)))},
 $isAS:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
@@ -11932,65 +11448,71 @@
 $isQV:true,
 $asQV:function(){return[P.KN]},
 "%":";Uint8Array"},
-b0B:{
+QY:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.p("Invalid view offsetInBytes "+H.d(b)))
+if(c!=null&&!1)throw H.b(P.p("Invalid view length "+H.d(c)))},
+eb:function(a,b,c){H.QY(a,b,c)
+return new DataView(a,b,c)},
+GG:function(a,b,c){H.QY(a,b,c)
+return new Uint8Array(a,b)},
+vF:{
 "^":"eH;",
-gB:function(a){return a.length},
-SM:function(a,b,c,d,e){var z,y,x
+gv:function(a){return a.length},
+Xx:function(a,b,c,d,e){var z,y,x
 z=a.length+1
-this.Lu(a,b,z)
-this.Lu(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
+this.bv(a,b,z)
+this.bv(a,c,z)
+if(b>c)throw H.b(P.ve(b,0,c,null,null))
 y=c-b
-if(e<0)throw H.b(P.u(e))
+if(e<0)throw H.b(P.p(e))
 x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
+if(x-e<y)throw H.b(P.s("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
 a.set(d,b)},
 $isXj:true},
 Dg:{
 "^":"GVy;",
-t:function(a,b){var z=a.length
+p:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
+q:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.SM(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+YW:function(a,b,c,d,e){if(!!J.t(d).$isDg){this.Xx(a,b,c,d,e)
+return}this.as(a,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true},
-ObS:{
-"^":"b0B+lD;",
+Ui:{
+"^":"vF+lD;",
 $isWO:true,
-$asWO:function(){return[P.Vf]},
+$asWO:function(){return[P.CP]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.Vf]}},
+$asQV:function(){return[P.CP]}},
 GVy:{
-"^":"ObS+SU7;"},
+"^":"Ui+SU7;"},
 Pg:{
 "^":"Ipv;",
-u:function(a,b,c){var z=a.length
+q:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.aq(a,b,z)
 a[b]=c},
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.SM(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+YW:function(a,b,c,d,e){if(!!J.t(d).$isPg){this.Xx(a,b,c,d,e)
+return}this.as(a,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-fjp:{
-"^":"b0B+lD;",
+ObS:{
+"^":"vF+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"fjp+SU7;"}}],["","",,H,{
+"^":"ObS+SU7;"}}],["","",,H,{
 "^":"",
 qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
 return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
@@ -11999,791 +11521,781 @@
 return}throw"Unable to print message: "+String(a)}}],["","",,O,{
 "^":"",
 AK:{
-"^":"pva;HX,Qh,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-gIH:function(a){return a.Qh},
-sIH:function(a,b){a.Qh=this.ct(a,C.TI,a.Qh,b)},
+"^":"pva;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+gIH:function(a){return a.ij},
+sIH:function(a,b){a.ij=this.ct(a,C.TI,a.ij,b)},
 Es:function(a){var z,y,x,w,v
-Z.uL.prototype.Es.call(this,a)
-z=this.gKM(a).LL.t(0,"stack")
+this.VM(a)
+z=this.gKM(a).Q.p(0,"stack")
 y=window.innerHeight
-if(typeof y!=="number")return y.W()
+if(typeof y!=="number")return y.T()
 x=y-56
-w=C.jn.Z(x,1.3)
+w=C.jn.W(x,1.3)
 v=J.RE(z)
-if(a.Qh===!0)J.Yo(v.gS(z),"height",H.d(w)+"px")
-else J.Yo(v.gS(z),"height",""+x+"px")},
-static:{rV: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.Qh=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.BKH.LX(a)
-C.BKH.XI(a)
+if(a.ij===!0)J.IE(v.gO(z),"height",H.d(w)+"px")
+else J.IE(v.gO(z),"height",""+x+"px")},
+static:{Rzb:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.va.LX(a)
+C.va.XI(a)
 return a}}},
 pva:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 ys:{
-"^":"cda;HX,yJ,lJ,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-gGp:function(a){return a.yJ},
-sGp:function(a,b){a.yJ=this.ct(a,C.rX,a.yJ,b)},
-guo:function(a){return a.lJ},
-suo:function(a,b){a.lJ=this.ct(a,C.NK,a.lJ,b)},
-vD:[function(a,b){a.HX.cv("stacktrace").ml(new O.Kd(a))},"$1","guz",2,0,12,59],
-static:{Jt: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.lJ=0
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.uyw.LX(a)
-C.uyw.XI(a)
+"^":"cda;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+gGp:function(a){return a.ij},
+sGp:function(a,b){a.ij=this.ct(a,C.rX,a.ij,b)},
+guo:function(a){return a.TQ},
+suo:function(a,b){a.TQ=this.ct(a,C.N,a.TQ,b)},
+GU:[function(a,b){a.RZ.cv("stacktrace").ml(new O.nl(a))},"$1","guz",2,0,14,61],
+static:{RIs:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=0
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Yw.LX(a)
+C.Yw.XI(a)
 return a}}},
 cda:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-Kd:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-z.yJ=J.NB(z,C.rX,z.yJ,a)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
+nl:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.rX,z.ij,a)},"$1",null,2,0,null,121,"call"]},
 NF:{
-"^":"waa;zh,KH,t4,Zk,Bu,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.zh},
-sM6:function(a,b){a.zh=this.ct(a,C.rE,a.zh,b)},
-git:function(a){return a.KH},
-sit:function(a,b){a.KH=this.ct(a,C.B0,a.KH,b)},
-gO7:function(a){return a.t4},
-sO7:function(a,b){a.t4=this.ct(a,C.FQ,a.t4,b)},
-goE:function(a){return a.Zk},
-soE:function(a,b){a.Zk=this.ct(a,C.mr,a.Zk,b)},
-gO9:function(a){return a.Bu},
-sO9:function(a,b){a.Bu=this.ct(a,C.S4,a.Bu,b)},
+"^":"waa;RZ,ij,TQ,ca,Jc,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gM6:function(a){return a.RZ},
+sM6:function(a,b){a.RZ=this.ct(a,C.rE,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+gO7:function(a){return a.TQ},
+sO7:function(a,b){a.TQ=this.ct(a,C.FQ,a.TQ,b)},
+goE:function(a){return a.ca},
+soE:function(a,b){a.ca=this.ct(a,C.mr,a.ca,b)},
+gO9:function(a){return a.Jc},
+sO9:function(a,b){a.Jc=this.ct(a,C.S4,a.Jc,b)},
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=window.innerHeight
-if(typeof z!=="number")return z.Z()
-y=H.d(C.jn.Z(z,1.6))+"px"
-a.t4=this.ct(a,C.FQ,a.t4,y)},
-tn:[function(a,b){if(!J.xC(a.KH,a.Zk))this.AZ(a,null,null,null)},"$1","ghy",2,0,19,59],
-AZ:[function(a,b,c,d){var z=a.Bu
+if(typeof z!=="number")return z.W()
+y=H.d(C.jn.W(z,1.6))+"px"
+a.TQ=this.ct(a,C.FQ,a.TQ,y)},
+tn:[function(a,b){if(!J.mG(a.ij,a.ca))this.AZ(a,null,null,null)},"$1","ghy",2,0,20,61],
+AZ:[function(a,b,c,d){var z=a.Jc
 if(z===!0)return
-a.Bu=this.ct(a,C.S4,z,!0)
-J.SK(J.UQ(a.zh,"function")).ml(new O.eV(a))},"$3","gDI",6,0,84,49,50,85],
+a.Jc=this.ct(a,C.S4,z,!0)
+J.SK(J.Tf(a.RZ,"function")).ml(new O.lc(a))},"$3","gDI",6,0,84,52,55,85],
 static:{eqi: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.KH=!1
-a.Zk=!1
-a.Bu=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.ca=!1
+a.Jc=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.AuX.LX(a)
 C.AuX.XI(a)
 return a}}},
 waa:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
-eV:{
-"^":"TpZ:12;a",
+lc:{
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w
-z=this.a
-y=z.Zk
+z=this.Q
+y=z.ca
 x=J.RE(z)
-z.Zk=x.ct(z,C.mr,y,y!==!0)
-w=x.gKM(z).LL.t(0,"frameOuter")
+z.ca=x.ct(z,C.mr,y,y!==!0)
+w=x.gKM(z).Q.p(0,"frameOuter")
 y=J.RE(w)
-if(z.Zk===!0)y.gDD(w).h(0,"shadow")
+if(z.ca===!0)y.gDD(w).h(0,"shadow")
 else y.gDD(w).Rz(0,"shadow")
-z.Bu=x.ct(z,C.S4,z.Bu,!1)},"$1",null,2,0,null,152,"call"],
-$isEH:true},
+z.Jc=x.ct(z,C.S4,z.Jc,!1)},"$1",null,2,0,null,152,"call"]},
 Hi:{
-"^":"V10;HX,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-static:{Uo: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V4;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+static:{kQ:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Pj.LX(a)
 C.Pj.XI(a)
 return a}}},
-V10:{
-"^":"uL+Pi;",
+V4:{
+"^":"uL+Piz;",
 $isd3:true},
 ts:{
-"^":"V11;HX,x8,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.HX},
-sod:function(a,b){a.HX=this.ct(a,C.rB,a.HX,b)},
-ga4:function(a){return a.x8},
-sa4:function(a,b){a.x8=this.ct(a,C.mi,a.x8,b)},
+"^":"V10;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+ga4:function(a){return a.ij},
+sa4:function(a,b){a.ij=this.ct(a,C.mi,a.ij,b)},
 I9:function(a){var z,y
-Z.uL.prototype.I9.call(this,a)
-z=this.gKM(a).LL.t(0,"textBox")
+this.Ni(a)
+z=this.gKM(a).Q.p(0,"textBox")
 y=J.RE(z)
 y.q3(z)
-y.geg(z).yI(new O.eU2(a,z))},
+y.gHQ(z).yI(new O.eU2(a,z))},
 static:{wy: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.x8=""
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.mk.LX(a)
-C.mk.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=""
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Y7.LX(a)
+C.Y7.XI(a)
 return a}}},
-V11:{
-"^":"uL+Pi;",
+V10:{
+"^":"uL+Piz;",
 $isd3:true},
 eU2:{
-"^":"TpZ:153;a,b",
+"^":"r:153;Q,a",
 $1:[function(a){var z,y,x,w
 z=J.RE(a)
 switch(z.gIG(a)){case 9:z.e6(a)
-z=this.b
+z=this.a
 y=J.RE(z)
-y.mT(z,"TAB")
+y.jy(z,"TAB")
 x=y.gRP(z)
 if(typeof x!=="number")return x.g()
 w=y.gRP(z)
 if(typeof w!=="number")return w.g()
 y.np(z,x+3,w+3)
 break
-case 13:z=this.a
-P.FL("Debugger command (not implemented): "+H.d(z.x8))
-z.x8=J.NB(z,C.mi,z.x8,"")
-break}},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["","",,G,{
+case 13:z=this.Q
+P.FL("Debugger command (not implemented): "+H.d(z.ij))
+z.ij=J.Q5(z,C.mi,z.ij,"")
+break}},"$1",null,2,0,null,4,"call"]}}],["","",,G,{
 "^":"",
 Tk:{
-"^":"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:{aMd: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{WF:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.BB.LX(a)
 C.BB.XI(a)
 return a}}}}],["","",,F,{
 "^":"",
 ZP:{
-"^":"V12;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)},
+"^":"V11;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkc:function(a){return a.RZ},
+skc:function(a,b){a.RZ=this.ct(a,C.yh,a.RZ,b)},
 static:{hGU: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.On.LX(a)
-C.On.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.a3.LX(a)
+C.a3.XI(a)
 return a}}},
-V12:{
-"^":"uL+Pi;",
+V11:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
 nJ:{
-"^":"V13;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},
+"^":"V12;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+ga4:function(a){return a.RZ},
+sa4:function(a,b){a.RZ=this.ct(a,C.mi,a.RZ,b)},
+gdu:function(a){return a.ij},
+sdu:function(a,b){a.ij=this.ct(a,C.eh,a.ij,b)},
+gFR:function(a){return a.TQ},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},
-gCf:function(a){return a.y4},
-sCf:function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},
-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.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)
+sFR:function(a,b){a.TQ=this.ct(a,C.U,a.TQ,b)},
+gCf:function(a){return a.ca},
+sCf:function(a,b){a.ca=this.ct(a,C.Aa,a.ca,b)},
+y6:[function(a,b,c,d){var z=H.Go(J.Zu(b),"$isSc").value
+z=this.ct(a,C.eh,a.ij,z)
+a.ij=z
+if(J.mG(z,"1-line")){z=J.JA(a.RZ,"\n"," ")
+a.RZ=this.ct(a,C.mi,a.RZ,z)}},"$3","gxb",6,0,116,4,106,107],
+tj:[function(a,b,c,d){var z,y,x
+J.Kr(b)
+z=a.RZ
+a.RZ=this.ct(a,C.mi,z,"")
+if(a.TQ!=null){y=P.A(null,null)
 x=R.tB(y)
-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.VU(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,154,2],
+J.H9(x,"expr",z)
+J.V2(a.ca,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,116,4,106,107],
+Oq:[function(a,b){var z=J.wo(J.Zu(b),"expr")
+a.RZ=this.ct(a,C.mi,a.RZ,z)},"$1","gHo",2,0,154,4],
 static:{Rpj:function(a){var z,y,x,w,v
 z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.Ek="1-line"
-a.y4=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.ij="1-line"
+a.ca=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
 C.Jh.LX(a)
 C.Jh.XI(a)
 return a}}},
-V13:{
-"^":"uL+Pi;",
+V12:{
+"^":"uL+Piz;",
 $isd3:true},
 YW:{
-"^":"TpZ:12;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,R,{
+"^":"r:14;Q",
+$1:[function(a){J.H9(this.Q,"value",a)},"$1",null,2,0,null,121,"call"]}}],["","",,R,{
 "^":"",
 Eg:{
-"^":"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},
-sph:function(a,b){a.l1=this.ct(a,C.hf,a.l1,b)},
-gFR:function(a){return a.bY},
+"^":"KAf;LD,kX,RZ,ij,TQ,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gO9:function(a){return a.LD},
+sO9:function(a,b){a.LD=this.ct(a,C.S4,a.LD,b)},
+gph:function(a){return a.kX},
+sph:function(a,b){a.kX=this.ct(a,C.hf,a.kX,b)},
+gFR:function(a){return a.RZ},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
-gkZ:function(a){return a.jv},
-skZ:function(a,b){a.jv=this.ct(a,C.YT,a.jv,b)},
-gyG:function(a){return a.oy},
-syG:function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},
-cg:[function(a,b,c,d){var z=a.fe
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+gkZ:function(a){return a.ij},
+skZ:function(a,b){a.ij=this.ct(a,C.YT,a.ij,b)},
+gyG:function(a){return a.TQ},
+syG:function(a,b){a.TQ=this.ct(a,C.UY,a.TQ,b)},
+cg:[function(a,b,c,d){var z=a.LD
 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.Kz(a)).wM(new R.uv(a))}},"$3","gDf",6,0,84,49,50,85],
+if(a.RZ!=null){a.LD=this.ct(a,C.S4,z,!0)
+a.TQ=this.ct(a,C.UY,a.TQ,null)
+this.LY(a,a.ij).ml(new R.VO(a)).wM(new R.Kzn(a))}},"$3","gDf",6,0,84,52,55,85],
 static:{Ola: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.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.LD=!1
+a.kX="[evaluate]"
+a.RZ=null
+a.ij=""
+a.TQ=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.qL.LX(a)
 C.qL.XI(a)
 return a}}},
 KAf:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true},
-Kz:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.oy=J.NB(z,C.UY,z.oy,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-uv:{
-"^":"TpZ:76;b",
-$0:[function(){var z=this.b
-z.fe=J.NB(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["","",,D,{
+VO:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.TQ=J.Q5(z,C.UY,z.TQ,a)},"$1",null,2,0,null,96,"call"]},
+Kzn:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+z.LD=J.Q5(z,C.S4,z.LD,!1)},"$0",null,0,0,null,"call"]}}],["","",,D,{
 "^":"",
 i7:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.MC.LX(a)
 C.MC.XI(a)
 return a}}}}],["","",,A,{
 "^":"",
 Gk:{
-"^":"V14;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],
+"^":"V13;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gt0:function(a){return a.RZ},
+st0:function(a,b){a.RZ=this.ct(a,C.WQ,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{cYO: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.LTI.LX(a)
-C.LTI.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.by.LX(a)
+C.by.XI(a)
 return a}}},
-V14:{
-"^":"uL+Pi;",
+V13:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,X,{
 "^":"",
 J3:{
-"^":"V15;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],
+"^":"V14;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpM:function(a){return a.RZ},
+spM:function(a,b){a.RZ=this.ct(a,C.Mc,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{TsF: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.n0.LX(a)
 C.n0.XI(a)
 return a}}},
-V15:{
-"^":"uL+Pi;",
+V14:{
+"^":"uL+Piz;",
 $isd3:true},
 MJ:{
-"^":"V16;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)},
+"^":"V15;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gJ6:function(a){return a.RZ},
+sJ6:function(a,b){a.RZ=this.ct(a,C.OO,a.RZ,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ls6.LX(a)
 C.ls6.XI(a)
 return a}}},
-V16:{
-"^":"uL+Pi;",
+V15:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 DK:{
-"^":"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
-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.PQ=!0
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Xo.LX(a)
-C.Xo.XI(a)
+"^":"T53;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gU4:function(a){return a.TQ},
+sU4:function(a,b){a.TQ=this.ct(a,C.QK,a.TQ,b)},
+static:{E5W:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=!0
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.XoJ.LX(a)
+C.XoJ.XI(a)
 return a}}},
 T53:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true}}],["","",,N,{
 "^":"",
 BS:{
-"^":"V17;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],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V16;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gig:function(a){return a.RZ},
+sig:function(a,b){a.RZ=this.ct(a,C.nf,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
+static:{p71:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.PJ8.LX(a)
 C.PJ8.XI(a)
 return a}}},
-V17:{
-"^":"uL+Pi;",
+V16:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,O,{
 "^":"",
-Hz:{
-"^":"a;zE,y5",
-sih:function(a,b){var z=this.y5
-C.yp.zB(J.Qd(this.zE),z,z+4,b)},
-gih:function(a){var z=this.y5
-return C.yp.Yc(J.Qd(this.zE),z,z+4)},
-PY:[function(){return new O.Hz(this.zE,this.y5+4)},"$0","gaw",0,0,156],
-gvH:function(a){return C.CD.BU(this.y5,4)},
+na:{
+"^":"a;Q,a",
+sih:function(a,b){var z=this.a
+C.yp.vg(J.ns(this.Q),z,z+4,b)},
+gih:function(a){var z=this.a
+return C.yp.Mu(J.ns(this.Q),z,z+4)},
+PY:[function(){return new O.na(this.Q,this.a+4)},"$0","gaw",0,0,156],
+gvH:function(a){return C.CD.BU(this.a,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=J.RE(b)
 y=z.gy(b)
-x=J.eY(a)
-if(typeof y!=="number")return y.U()
-if(typeof x!=="number")return H.s(x)
+x=J.l2(a)
+if(typeof y!=="number")return y.R()
+if(typeof x!=="number")return H.o(x)
 z=z.gx(b)
-if(typeof z!=="number")return H.s(z)
-return new O.Hz(a,(y*x+z)*4)}}},
+if(typeof z!=="number")return H.o(z)
+return new O.na(a,(y*x+z)*4)}}},
 x2:{
-"^":"a;Yu<,yT>"},
+"^":"a;Yu:Q<,ky:a>"},
 Vb:{
-"^":"V18;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},
-syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
+"^":"V17;RZ,ij,TQ,ca,Jc,cw,bN,mT,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpf:function(a){return a.bN},
+spf:function(a,b){a.bN=this.ct(a,C.PM,a.bN,b)},
+gyw:function(a){return a.mT},
+syw:function(a,b){a.mT=this.ct(a,C.QH,a.mT,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.N2=z
+a.RZ=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.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()},
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gel(a)),z.b),[H.u3(z,0)]).P6()
+z=J.PQ(a.RZ)
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gok(a)),z.b),[H.u3(z,0)]).P6()},
 Zt:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.Ff
-if(typeof x!=="number")return H.s(x)
+for(z=J.Nx(b),y=0;z.D();){x=z.c
+if(typeof x!=="number")return H.o(x)
 y=y*256+x}return y},
 OU:function(a,b,c,d){var z=J.BQ(c,"@")
 if(0>=z.length)return H.e(z,0)
-a.Cv.u(0,b,z[0])
-a.Tl.u(0,b,d)
-a.GE.u(0,this.Zt(a,d),b)},
+a.cw.q(0,b,z[0])
+a.ca.q(0,b,d)
+a.Jc.q(0,this.Zt(a,d),b)},
 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.TU,"/")),null,null)
+for(z=J.Nx(J.Tf(b,"members")),y=a.cw,x=a.ca,w=a.Jc;z.D();){v=z.gk()
+if(!J.t(v).$isdy){N.QM("").To(H.d(v))
+continue}u=H.BU(C.Nm.grZ(J.BQ(v.a,"/")),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,"@")
+r=J.BQ(v.e,"@")
 if(0>=r.length)return H.e(r,0)
-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,"",$.Qg())},
+y.q(0,u,r[0])
+x.q(0,u,s)
+w.q(0,this.Zt(a,s),u)}this.OU(a,c,"Free",$.Su())
+this.OU(a,0,"",$.v2())},
 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)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
+z=a.TQ
+y=J.l2(a.ij)
+if(typeof z!=="number")return z.R()
+if(typeof y!=="number")return H.o(y)
 x=z*y
-w=C.CD.BU(O.x6(a.WC,b).y5,4)
-v=C.CD.Z(w,x)
-u=C.CD.Y(w,x)
-t=J.UQ(a.oj,"pages")
-if(!(v<0)){z=J.q8(t)
-if(typeof z!=="number")return H.s(z)
+w=C.CD.BU(O.x6(a.ij,b).a,4)
+v=C.CD.W(w,x)
+u=C.CD.V(w,x)
+t=J.Tf(a.mT,"pages")
+if(!(v<0)){z=J.wS(t)
+if(typeof z!=="number")return H.o(z)
 z=v>=z}else z=!0
 if(z)return
-s=J.UQ(t,v)
+s=J.Tf(t,v)
 z=J.U6(s)
-r=z.t(s,"objects")
+r=z.p(s,"objects")
 y=J.U6(r)
 q=0
 p=0
 o=0
-while(!0){n=y.gB(r)
-if(typeof n!=="number")return H.s(n)
+while(!0){n=y.gv(r)
+if(typeof n!=="number")return H.o(n)
 if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(p)
+p=y.p(r,o)
+if(typeof p!=="number")return H.o(p)
 q+=p
 if(q>u){u=q-p
-break}o+=2}z=H.BU(z.t(s,"object_start"),null,null)
-y=J.UQ(a.oj,"unit_size_bytes")
-if(typeof y!=="number")return H.s(y)
-return new O.x2(J.WB(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
+break}o+=2}z=H.BU(z.p(s,"object_start"),null,null)
+y=J.Tf(a.mT,"unit_size_bytes")
+if(typeof y!=="number")return H.o(y)
+return new O.x2(J.WB(z,u*y),J.lX(p,J.Tf(a.mT,"unit_size_bytes")))},
 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.yT)+"B @ 0x"+J.u1(y.Yu,16)
+x=H.d(y.a)+"B @ 0x"+J.u1(y.Q,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,154,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,154,87],
+z=O.x6(a.ij,z)
+w=z.a
+v=a.cw.p(0,a.Jc.p(0,this.Zt(a,C.yp.Mu(J.ns(z.Q),w,w+4))))
+z=J.mG(v,"")?"-":H.d(v)+" "+x
+a.bN=this.ct(a,C.PM,a.bN,z)},"$1","gel",2,0,154,87],
+qM:[function(a,b){var z=J.u1(this.Tm(a,J.op(b)).Q,16)
+$.Pi.b.bo(0,"#"+J.wg(a.mT).Mq("address/"+z))},"$1","gok",2,0,154,87],
 UV:function(a){var z,y,x,w,v
-z=a.oj
-if(z==null||a.N2==null)return
-this.DO(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
-y=J.UQ(a.oj,"pages")
-z=a.N2.parentElement
+z=a.mT
+if(z==null||a.RZ==null)return
+this.DO(a,J.Tf(z,"class_list"),J.Tf(a.mT,"free_class_id"))
+y=J.Tf(a.mT,"pages")
+z=a.RZ.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.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)
+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).b
+z=J.bI(J.bI(J.Tf(a.mT,"page_size_bytes"),J.Tf(a.mT,"unit_size_bytes")),x)
+if(typeof z!=="number")return H.o(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.Ry(a.N2).createImageData(x,v))
-a.WC=w
-J.vP(a.N2,J.eY(w))
-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")
+a.TQ=z
+w=J.wS(y)
+if(typeof w!=="number")return H.o(w)
+v=P.C(z*w,6000)
+w=P.f9(J.pz(a.RZ).createImageData(x,v))
+a.ij=w
+J.TZQ(a.RZ,J.l2(w))
+J.OE(a.RZ,J.Jv(a.ij))
+this.QV(a,0)},
+QV:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+z=J.Tf(a.mT,"pages")
 y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.rn
-if(typeof x!=="number")return H.s(x)
+x="Loaded "+b+" of "+H.d(y.gv(z))+" pages"
+a.bN=this.ct(a,C.PM,a.bN,x)
+x=a.TQ
+if(typeof x!=="number")return H.o(x)
 w=b*x
 v=w+x
-x=y.gB(z)
-if(typeof x!=="number")return H.s(x)
-if(!(b>=x)){x=J.OB(a.WC)
-if(typeof x!=="number")return H.s(x)
+x=y.gv(z)
+if(typeof x!=="number")return H.o(x)
+if(!(b>=x)){x=J.Jv(a.ij)
+if(typeof x!=="number")return H.o(x)
 x=v>x}else x=!0
 if(x)return
-u=O.x6(a.WC,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
+u=O.x6(a.ij,H.J(new P.hL(0,w),[null]))
+t=J.Tf(y.p(z,b),"objects")
 y=J.U6(t)
-x=a.Tl
+x=a.ca
 s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(r)
+while(!0){r=y.gv(t)
+if(typeof r!=="number")return H.o(r)
 if(!(s<r))break
-q=y.t(t,s)
-p=x.t(0,y.t(t,s+1))
-for(;r=J.Wx(q),o=r.W(q,1),r.D(q,0);q=o){r=u.zE
-n=u.y5
+q=y.p(t,s)
+p=x.p(0,y.p(t,s+1))
+for(;r=J.Wx(q),o=r.T(q,1),r.A(q,0);q=o){r=u.Q
+n=u.a
 m=n+4
-C.yp.zB(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.y5
+C.yp.vg(J.ns(r),n,m,p)
+u=new O.na(r,m)}s+=2}while(!0){y=u.a
 x=C.CD.BU(y,4)
-r=u.zE
+r=u.Q
 n=J.RE(r)
-m=n.gR(r)
-if(typeof m!=="number")return H.s(m)
-m=C.CD.Y(x,m)
-l=n.gR(r)
-if(typeof l!=="number")return H.s(l)
-l=C.CD.Z(x,l)
+m=n.gN(r)
+if(typeof m!=="number")return H.o(m)
+m=C.CD.V(x,m)
+l=n.gN(r)
+if(typeof l!=="number")return H.o(l)
+l=C.CD.W(x,l)
 new P.hL(m,l).$builtinTypeInfo=[null]
 if(!(l<v))break
-x=$.Qg()
+x=$.v2()
 m=y+4
-C.yp.zB(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Ry(a.N2)
-x=a.WC
-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
+C.yp.vg(n.gRn(r),y,m,x)
+u=new O.na(r,m)}y=J.pz(a.RZ)
+x=a.ij
+J.ls(y,x,0,0,0,w,J.l2(x),v)
+P.e4Q(new O.o7(a,b),null)},
+SK:[function(a,b){var z=a.mT
 if(z==null)return
-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)
-w=P.L5(null,null,null,P.qU,W.I0)
-v=P.qU
-v=H.VM(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
-u=P.Fl(null,null)
-t=P.Fl(null,null)
-a.Tl=z
-a.GE=y
-a.Cv=x
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=w
-a.ZQ=v
-a.qJ=u
-a.wy=t
-C.wc.LX(a)
-C.wc.XI(a)
+J.wg(z).cv("heapmap").ml(new O.aG(a)).OA(new O.wx()).wM(b)},"$1","gvC",2,0,20,102],
+nY:[function(a,b){P.e4Q(new O.oc(a),null)},"$1","gRs",2,0,20,61],
+static:{"^":"nK,Uw,SoT,WBO",teo:function(a){var z,y,x,w,v,u,t
+z=P.A(null,null)
+y=P.A(null,null)
+x=P.A(null,null)
+w=P.L5(null,null,null,P.I,W.Bn)
+v=P.I
+v=H.J(new V.qC(P.YM(null,null,null,v,null),null,null),[v,null])
+u=P.A(null,null)
+t=P.A(null,null)
+a.ca=z
+a.Jc=y
+a.cw=x
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=w
+a.z$=v
+a.ch$=u
+a.cx$=t
+C.Cs.LX(a)
+C.Cs.XI(a)
 return a}}},
-V18:{
-"^":"uL+Pi;",
+V17:{
+"^":"uL+Piz;",
 $isd3:true},
-R5:{
-"^":"TpZ:76;a,b",
-$0:function(){J.AC(this.a,this.b+1)},
-$isEH:true},
+o7:{
+"^":"r:77;Q,a",
+$0:function(){J.Ha(this.Q,this.a+1)}},
 aG:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.oj=J.NB(z,C.QH,z.oj,a)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
-pM:{
-"^":"TpZ:81;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,158,"call"],
-$isEH:true},
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.mT=J.Q5(z,C.QH,z.mT,a)},"$1",null,2,0,null,157,"call"]},
+wx:{
+"^":"r:80;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,4,158,"call"]},
 oc:{
-"^":"TpZ:76;a",
-$0:function(){J.oO(this.a)},
-$isEH:true}}],["","",,K,{
+"^":"r:77;Q",
+$0:function(){J.J2g(this.Q)}}}],["","",,K,{
 "^":"",
 UC:{
-"^":"Vz;oH,vp,zz,pT,Rj,Vg,fn",
-Ey:function(a,b){var z
-if(b===0){z=this.vp
+"^":"Vz;Q,a,b,c,d,cy$,db$",
+wA:function(a,b){var z
+if(b===0){z=this.a
 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)}},
+return J.DA(J.Tf(J.U8(z[a]),b))}return this.k5(a,b)}},
 Ly:{
-"^":"V19;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},
-scH:function(a,b){a.uY=this.ct(a,C.Zi,a.uY,b)},
-gLF:function(a){return a.Rp},
-sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
-gB1:function(a){return a.Ol},
-sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
-god:function(a){return a.Sk},
-sod:function(a,b){a.Sk=this.ct(a,C.rB,a.Sk,b)},
+"^":"V18;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gYt:function(a){return a.RZ},
+sYt:function(a,b){a.RZ=this.ct(a,C.TN,a.RZ,b)},
+gcH:function(a){return a.ij},
+scH:function(a,b){a.ij=this.ct(a,C.Zi,a.ij,b)},
+gLF:function(a){return a.bN},
+sLF:function(a,b){a.bN=this.ct(a,C.kG,a.bN,b)},
+gB1:function(a){return a.Jr},
+sB1:function(a,b){a.Jr=this.ct(a,C.vb,a.Jr,b)},
+god:function(a){return a.IL},
+sod:function(a,b){a.IL=this.ct(a,C.rB,a.IL,b)},
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.yD(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
-a.jF=y
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.Q=P.zV(J.Tf($.NR,"PieChart"),[z])
+a.ca=y
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.yD(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-a.Uv=z
-a.Na=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Y1:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+z=new G.qu(null,P.L5(null,null,null,null,null))
+z.Q=P.zV(J.Tf($.NR,"PieChart"),[y])
+a.cw=z
+a.mT=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
+Qf:function(a){var z,y,x,w
+for(z=J.Nx(J.Tf(a.Jr,"members"));z.D();){y=z.gk()
 x=J.U6(y)
-w=x.t(y,"class")
+w=x.p(y,"class")
 if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
+w.gUY().eC(x.p(y,"new"))
+w.gxQ().eC(x.p(y,"old"))}},
 FS:function(a){var z,y,x,w,v,u,t,s,r,q
-a.Rp.Ai()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
+a.bN.Ai()
+for(z=J.Nx(J.Tf(a.Jr,"members"));z.D();){y=J.Tf(z.gk(),"class")
 if(y==null)continue
 if(y.gMp())continue
-x=y.gUY().gEJ().wY
-w=y.gUY().gEJ().wf
-v=y.gUY().gl().wY
-u=y.gUY().gl().wf
-t=y.gxQ().gEJ().wY
-s=y.gxQ().gEJ().wf
-r=y.gxQ().gl().wY
-q=y.gxQ().gl().wf
-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)
+x=y.gUY().gEJ().a
+w=y.gUY().gEJ().Q
+v=y.gUY().gk().a
+u=y.gUY().gk().Q
+t=y.gxQ().gEJ().a
+s=y.gxQ().gEJ().Q
+r=y.gxQ().gk().a
+q=y.gxQ().gk().Q
+J.vP(a.bN,new G.E8([y,"",x,w,v,u,"",t,s,r,q]))}J.zq(a.bN)},
+lD:function(a,b,c){var z,y,x,w,v,u
+z=J.Tf(J.i8(a.bN),c)
 y=J.RE(b)
 x=J.RE(z)
-J.PP(J.UQ(J.Mx(J.UQ(y.gks(b),0)),0),J.UQ(x.gUQ(z),0))
+J.PP(J.Tf(J.OD(J.Tf(y.gwd(b),0)),0),J.Tf(x.gUQ(z),0))
 w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
+while(!0){v=J.wS(x.gUQ(z))
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-c$0:{if(C.Nm.tg(C.Q5,w))break c$0
-u=J.UQ(y.gks(b),w)
+c$0:{if(C.Nm.tg(C.jb,w))break c$0
+u=J.Tf(y.gwd(b),w)
 v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.Rp.Gu(c,w))}++w}},
+v.smk(u,J.Lz(J.Tf(x.gUQ(z),w)))
+v.sa4(u,a.bN.Gu(c,w))}++w}},
 ya:function(a){var z,y,x,w,v,u,t,s
-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)
+z=J.OD(a.mT)
+if(z.gv(z)>a.bN.gGD().length){z=J.OD(a.mT)
+y=z.gv(z)-a.bN.gGD().length
+for(x=0;x<y;++x)J.OD(a.mT).f4(0)}else{z=J.OD(a.mT)
+if(z.gv(z)<a.bN.gGD().length){z=a.bN.gGD().length
+w=J.OD(a.mT)
+v=z-w.gv(w)
 for(x=0;x<v;++x){u=document.createElement("tr",null)
 z=J.RE(u)
 z.iF(u,-1).appendChild(W.r3("class-ref",null))
@@ -12801,257 +12313,248 @@
 z.iF(u,-1)
 z.iF(u,-1)
 z.iF(u,-1)
-J.Mx(a.Na).h(0,u)}}}for(x=0;x<a.Rp.gzz().length;++x){z=a.Rp.gzz()
+J.OD(a.mT).h(0,u)}}}for(x=0;x<a.bN.gGD().length;++x){z=a.bN.gGD()
 if(x>=z.length)return H.e(z,x)
 s=z[x]
-this.As(a,J.Mx(a.Na).t(0,x),s)}},
+this.lD(a,J.OD(a.mT).p(0,x),s)}},
 BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.Rp.gxp()
+if(!!J.t(d).$iskr){z=a.bN.gxp()
 y=d.cellIndex
-x=a.Rp
+x=a.bN
 if(z==null?y!=null:z!==y){x.sxp(y)
-a.Rp.sT3(!0)}else x.sT3(!x.gT3())
-J.II(a.Rp)
-this.ya(a)}},"$3","gQq",6,0,105,2,106,107],
-pA:[function(a,b){var z=a.Ol
+a.bN.sT3(!0)}else x.sT3(!x.gT3())
+J.zq(a.bN)
+this.ya(a)}},"$3","gQq",6,0,105,4,106,107],
+SK:[function(a,b){var z=a.Jr
 if(z==null)return
-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
+J.wg(z).cv("/allocationprofile").ml(this.gLv(a)).wM(b)},"$1","gvC",2,0,20,102],
+zT:[function(a,b){var z=a.Jr
 if(z==null)return
-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
+J.wg(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).wM(b)},"$1","gzH",2,0,20,102],
+eJ:[function(a,b){var z=a.Jr
 if(z==null)return
-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,159,160],
+J.wg(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).wM(b)},"$1","gNb",2,0,20,102],
+Ed:[function(a,b){a.Jr=this.ct(a,C.vb,a.Jr,b)},"$1","gLv",2,0,159,160],
 n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
+z=a.Jr
 if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-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.aT(a.Ol)
-z=a.Xe
-w=x.gUY().gSU()
-z=z.Yb
+z=J.wg(z)
+z=this.ct(a,C.rB,a.IL,z)
+a.IL=z
+z.WU(J.Tf(a.Jr,"heaps"))
+y=H.BU(J.Tf(a.Jr,"dateLastAccumulatorReset"),null,null)
+if(!J.mG(y,0)){z=P.Wu(y,!1).X(0)
+a.ij=this.ct(a,C.Zi,a.ij,z)}y=H.BU(J.Tf(a.Jr,"dateLastServiceGC"),null,null)
+if(!J.mG(y,0)){z=P.Wu(y,!1).X(0)
+a.RZ=this.ct(a,C.TN,a.RZ,z)}z=a.TQ.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+x=J.wg(a.Jr)
+z=a.TQ
+w=x.gUY().gcs()
+z=z.Q
 v=[]
 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().gkV(),x.gUY().gSU())
-v=v.Yb
+z.Z("addRow",[H.J(new P.GD(v),[null])])
+v=a.TQ
+z=J.D5(x.gUY().gCs(),x.gUY().gcs())
+v=v.Q
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.Xe
+v.Z("addRow",[H.J(new P.GD(w),[null])])
+w=a.TQ
 v=x.gUY().gMX()
-w=w.Yb
+w=w.Q
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.GD(z),[null])])
-z=a.FX.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.FX
-w=x.gxQ().gSU()
-z=z.Yb
+w.Z("addRow",[H.J(new P.GD(z),[null])])
+z=a.Jc.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+z=a.Jc
+w=x.gxQ().gcs()
+z=z.Q
 v=[]
 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().gkV(),x.gxQ().gSU())
-v=v.Yb
+z.Z("addRow",[H.J(new P.GD(v),[null])])
+v=a.Jc
+z=J.D5(x.gxQ().gCs(),x.gxQ().gcs())
+v=v.Q
 w=[]
 C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.GD(w),[null])])
-w=a.FX
+v.Z("addRow",[H.J(new P.GD(w),[null])])
+w=a.Jc
 v=x.gxQ().gMX()
-w=w.Yb
+w=w.Q
 z=[]
 C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.GD(z),[null])])
-this.Y1(a)
+w.Z("addRow",[H.J(new P.GD(z),[null])])
+this.Qf(a)
 this.FS(a)
 this.ya(a)
-a.jF.Am(0,a.Xe)
-a.Uv.Am(0,a.FX)
+a.ca.Am(0,a.TQ)
+a.cw.Am(0,a.Jc)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
+this.ct(a,C.DS,0,1)},"$1","gwh",2,0,20,61],
 ps:[function(a,b){var z,y,x
-z=a.Ol
+z=a.Jr
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,161,162],
+return C.CD.Sy(J.x4(J.lX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,161,162],
 NC:[function(a,b){var z,y
-z=a.Ol
+z=a.Jr
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,161,162],
+return J.Lz((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,161,162],
 o7:[function(a,b){var z,y
-z=a.Ol
+z=a.Jr
 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,161,162],
-Zy:function(a){var z=P.zV(J.UQ($.NR,"DataTable"),null)
-a.Xe=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.Xe.Yb.V7("addColumn",["number","Size"])
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-a.FX=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.FX.Yb.V7("addColumn",["number","Size"])
-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.AFV()),new G.Kt("Accumulated Instances",G.OA()),new G.Kt("Current Size",G.AFV()),new G.Kt("Current Instances",G.OA()),new G.Kt("",G.Tp()),new G.Kt("Accumulator Size (Old)",G.AFV()),new G.Kt("Accumulator Instances",G.OA()),new G.Kt("Current Size",G.AFV()),new G.Kt("Current Instances",G.OA())],z,[],0,!0,null,null))
-a.Rp=z
+Zy:function(a){var z=P.zV(J.Tf($.NR,"DataTable"),null)
+a.TQ=new G.Kf(z)
+z.Z("addColumn",["string","Type"])
+a.TQ.Q.Z("addColumn",["number","Size"])
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+a.Jc=new G.Kf(z)
+z.Z("addColumn",["string","Type"])
+a.Jc.Q.Z("addColumn",["number","Size"])
+z=H.J([],[G.E8])
+z=this.ct(a,C.kG,a.bN,new K.UC([new G.Ktd("Class",G.J1()),new G.Ktd("",G.J1()),new G.Ktd("Accumulated Size (New)",G.nQ()),new G.Ktd("Accumulated Instances",G.nI()),new G.Ktd("Current Size",G.nQ()),new G.Ktd("Current Instances",G.nI()),new G.Ktd("",G.J1()),new G.Ktd("Accumulator Size (Old)",G.nQ()),new G.Ktd("Accumulator Instances",G.nI()),new G.Ktd("Current Size",G.nQ()),new G.Ktd("Current Instances",G.nI())],z,[],0,!0,null,null))
+a.bN=z
 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
-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.MF="---"
-a.uY="---"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.xut.LX(a)
-C.xut.XI(a)
-C.xut.Zy(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="---"
+a.ij="---"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Vc.LX(a)
+C.Vc.XI(a)
+C.Vc.Zy(a)
 return a}}},
-V19:{
-"^":"uL+Pi;",
+V18:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,P,{
 "^":"",
-pf:function(a){var z,y
+jl:function(a){var z,y
 z=[]
-y=new P.kd(new P.wF([],z),new P.rG(z),new P.yhO(z)).$1(a)
+y=new P.Tm(new P.wF([],z),new P.rG(z),new P.Os(z)).$1(a)
 new P.Qa().$0()
 return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.D6(z),new P.m5(z)).$1(a)},
+UQ:function(a,b){var z=[]
+return new P.xL(b,new P.GW([],z),new P.D6(z),new P.m5(z)).$1(a)},
 f9:function(a){var z,y
-z=J.x(a)
+z=J.t(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.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}
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},
+QO:function(a){if(!!J.t(a).$isqS)return{data:a.Q,height:a.a,width:a.b}
 return a},
 dg:function(){var z=$.Qz
-if(z==null){z=J.QY(window.navigator.userAgent,"Opera",0)
+if(z==null){z=J.Cw(window.navigator.userAgent,"Opera",0)
 $.Qz=z}return z},
 F7:function(){var z=$.R6
-if(z==null){z=P.dg()!==!0&&J.QY(window.navigator.userAgent,"WebKit",0)
+if(z==null){z=P.dg()!==!0&&J.Cw(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 O2:function(){var z=$.SB
 if(z==null){z=$.w5
-if(z==null){z=J.QY(window.navigator.userAgent,"Firefox",0)
+if(z==null){z=J.Cw(window.navigator.userAgent,"Firefox",0)
 $.w5=z}if(z===!0){$.SB="-moz-"
 z="-moz-"}else{z=$.EM
-if(z==null){z=P.dg()!==!0&&J.QY(window.navigator.userAgent,"Trident/",0)
+if(z==null){z=P.dg()!==!0&&J.Cw(window.navigator.userAgent,"Trident/",0)
 $.EM=z}if(z===!0){$.SB="-ms-"
 z="-ms-"}else if(P.dg()===!0){$.SB="-o-"
 z="-o-"}else{$.SB="-webkit-"
 z="-webkit-"}}}return z},
 wF:{
-"^":"TpZ:51;b,c",
+"^":"r:51;Q,a",
 $1:function(a){var z,y,x
-z=this.b
+z=this.Q
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
+this.a.push(null)
+return y}},
 rG:{
-"^":"TpZ:163;d",
-$1:function(a){var z=this.d
+"^":"r:163;Q",
+$1:function(a){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-yhO:{
-"^":"TpZ:164;e",
-$2:function(a,b){var z=this.e
+return z[a]}},
+Os:{
+"^":"r:164;Q",
+$2:function(a,b){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
+z[a]=b}},
 Qa:{
-"^":"TpZ:76;",
-$0:function(){},
-$isEH:true},
-kd:{
-"^":"TpZ:12;f,UI,bK",
+"^":"r:77;",
+$0:function(){}},
+Tm:{
+"^":"r:14;Q,a,b",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
 if(typeof a==="string")return a
-y=J.x(a)
-if(!!y.$isiP)return new Date(a.rq)
+y=J.t(a)
+if(!!y.$isiP)return new Date(a.Q)
 if(!!y.$iswL)throw H.b(P.nO("structured clone of RegExp"))
-if(!!y.$ishH)return a
+if(!!y.$isjq)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
-if(!!y.$isbf)return a
+if(!!y.$isD8)return a
 if(!!y.$iseH)return a
-if(!!y.$isT8){x=this.f.$1(a)
-w=this.UI.$1(x)
+if(!!y.$isw){x=this.Q.$1(a)
+w=this.a.$1(x)
 z.a=w
 if(w!=null)return w
 w={}
 z.a=w
-this.bK.$2(x,w)
+this.b.$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$1(x)
+return z.a}if(!!y.$isWO){v=y.gv(a)
+x=this.Q.$1(a)
+w=this.a.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
-this.bK.$2(x,w)}return w}w=new Array(v)
-this.bK.$2(x,w)
-for(u=0;u<v;++u){z=this.$1(y.t(a,u))
+this.b.$2(x,w)}return w}w=new Array(v)
+this.b.$2(x,w)
+for(u=0;u<v;++u){z=this.$1(y.p(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))},
-$isEH:true},
+w[u]=z}return w}throw H.b(P.nO("structured clone of other type"))}},
 ib:{
-"^":"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},
-CA:{
-"^":"TpZ:51;a,b",
+"^":"r:80;Q,a",
+$2:function(a,b){this.Q.a[a]=this.a.$1(b)}},
+GW:{
+"^":"r:51;Q,a",
 $1:function(a){var z,y,x,w
-z=this.a
+z=this.Q
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
+this.a.push(null)
+return y}},
 D6:{
-"^":"TpZ:163;c",
-$1:function(a){var z=this.c
+"^":"r:163;Q",
+$1:function(a){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
+return z[a]}},
 m5:{
-"^":"TpZ:164;d",
-$2:function(a,b){var z=this.d
+"^":"r:164;Q",
+$2:function(a,b){var z=this.Q
 if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
+z[a]=b}},
 xL:{
-"^":"TpZ:12;e,f,UI,bK",
+"^":"r:14;Q,a,b,c",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -13059,50 +12562,49 @@
 if(typeof a==="string")return a
 if(a instanceof Date)return P.Wu(a.getTime(),!0)
 if(a instanceof RegExp)throw H.b(P.nO("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$1(z)
+if(Object.getPrototypeOf(a)===Object.prototype){z=this.a.$1(a)
+y=this.b.$1(z)
 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.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)
+y=P.A(null,null)
+this.c.$2(z,y)
+for(x=Object.keys(a),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=x.c
+y.q(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.a.$1(a)
+y=this.b.$1(z)
 if(y!=null)return y
 x=J.U6(a)
-v=x.gB(a)
-y=this.e?new Array(v):a
-this.bK.$2(z,y)
-if(typeof v!=="number")return H.s(v)
+v=x.gv(a)
+y=this.Q?new Array(v):a
+this.c.$2(z,y)
+if(typeof v!=="number")return H.o(v)
 u=J.w1(y)
 t=0
-for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},
-$isEH:true},
-nl:{
-"^":"a;Rn>,fg>,R>",
-$isnl:true,
+for(;t<v;++t)u.q(y,t,this.$1(x.p(a,t)))
+return y}return a}},
+qS:{
+"^":"a;Rn:Q>,fg:a>,N:b>",
+$isqS:true,
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,73],
-gA:function(a){var z=this.DG()
-z=H.VM(new P.zQ(z,z.HU,null,null),[null])
-z.Qx=z.vY.HH
+X:[function(a){return this.DG().zV(0," ")},"$0","gCR",0,0,0],
+gu:function(a){var z=this.DG()
+z=H.J(new P.zQ(z,z.f,null,null),[null])
+z.b=z.Q.d
 return z},
 aN:function(a,b){this.DG().aN(0,b)},
 zV:function(a,b){return this.DG().zV(0,b)},
 ez:[function(a,b){var z=this.DG()
-return H.VM(new H.xy(z,b),[H.u3(z,0),null])},"$1","gIr",2,0,165,30],
-ad:function(a,b){var z=this.DG()
-return H.VM(new H.U5(z,b),[H.u3(z,0)])},
-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,166,30],
+return H.J(new H.xy(z,b),[H.W8(z,"lf",0),null])},"$1","gIr",2,0,165,31],
+ev:function(a,b){var z=this.DG()
+return H.J(new H.U5(z,b),[H.W8(z,"lf",0)])},
+Ft:[function(a,b){var z=this.DG()
+return H.J(new H.Fm(z,b),[H.W8(z,"lf",0),null])},"$1","git",2,0,166,31],
 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},
-gB:function(a){return this.DG().X5},
+gl0:function(a){return this.DG().Q===0},
+gor:function(a){return this.DG().Q!==0},
+gv:function(a){return this.DG().Q},
 tg:function(a,b){return this.DG().tg(0,b)},
-Ie:function(a){return this.DG().tg(0,a)?a:null},
+iQ:function(a){return this.DG().tg(0,a)?a:null},
 h:function(a,b){return this.H9(new P.GE(b))},
 Rz:function(a,b){var z,y
 if(typeof b!=="string")return!1
@@ -13112,21 +12614,19 @@
 return y},
 FV:function(a,b){this.H9(new P.rl(b))},
 uk:function(a,b){this.H9(new P.Jg(b))},
-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
-if(z==null)H.vh(P.w("No elements"))
-return z.gGc(z)},
+gtH:function(a){var z=this.DG()
+return z.gtH(z)},
+grZ:function(a){var z=this.DG()
+return z.grZ(z)},
 tt:function(a,b){return this.DG().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-zH:function(a){var z,y
+Oe: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.ke(z,b,H.u3(z,0))},
+return H.ke(z,b,H.W8(z,"lf",0))},
 V1:function(a){this.H9(new P.uQ())},
 H9:function(a){var z,y
 z=this.DG()
@@ -13134,2044 +12634,2015 @@
 this.p5(z)
 return y},
 $isOl:true,
-$asOl:function(){return[P.qU]},
+$asOl:function(){return[P.I]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[P.qU]}},
+$asQV:function(){return[P.I]}},
 GE:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.dH(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 rl:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.bj(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 Jg:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.Ei(a,this.a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.OP(a,this.Q)},"$1",null,2,0,null,167,"call"]},
 uQ:{
-"^":"TpZ:12;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,167,"call"],
-$isEH:true},
-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()
+"^":"r:14;",
+$1:[function(a){return J.U2(a)},"$1",null,2,0,null,167,"call"]},
+P0:{
+"^":"ark;Q,a",
+gd3:function(){var z=this.a
+return P.z(z.ev(z,new P.hT()),!0,W.z2)},
+aN:function(a,b){C.Nm.aN(this.gd3(),b)},
+q:function(a,b,c){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.DG(z[b],c)},
-sB:function(a,b){var z=this.gd3().length
+J.vu(z[b],c)},
+sv:function(a,b){var z=this.gd3().length
 if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
+else if(b<0)throw H.b(P.p("Invalid list length"))
 this.oq(0,b,z)},
-h:function(a,b){this.kG.uR.appendChild(b)},
+h:function(a,b){this.a.Q.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.kG.uR;z.G();)y.appendChild(z.Ff)},
-tg:function(a,b){if(!J.x(b).$ish4)return!1
-return b.parentNode===this.im},
+for(z=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]),y=this.a.Q;z.D();)y.appendChild(z.c)},
+tg:function(a,b){if(!J.t(b).$isz2)return!1
+return b.parentNode===this.Q},
 GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
 Jd:function(a){return this.GT(a,null)},
 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.kG.uR)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+oq:function(a,b,c){C.Nm.aN(C.Nm.D6(this.gd3(),b,c),new P.rK())},
+V1:function(a){J.Ul(this.a.Q)},
+f4:function(a){var z=this.grZ(this)
+if(z!=null)J.vX(z)
 return z},
-xe:function(a,b,c){this.kG.xe(0,b,c)},
-UG:function(a,b,c){var z,y
-z=this.kG.uR
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.r5(z,c,y[b])},
+aP:function(a,b,c){this.a.aP(0,b,c)},
+UG:function(a,b,c){this.a.UG(0,b,c)},
 Rz:function(a,b){var z,y,x
-if(!J.x(b).$ish4)return!1
+if(!J.t(b).$isz2)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.Mp(x)
+if(x===b){J.vX(x)
 return!0}}return!1},
-gB:function(a){return this.gd3().length},
-t:function(a,b){var z=this.gd3()
+gv:function(a){return this.gd3().length},
+p:function(a,b){var z=this.gd3()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gd3()
-return H.VM(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
+gu:function(a){var z=this.gd3()
+return H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)])}},
 hT:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isz2}},
 rK:{
-"^":"TpZ:12;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["","",,O,{
+"^":"r:14;",
+$1:function(a){return J.vX(a)}}}],["","",,O,{
 "^":"",
 Im:{
-"^":"V20;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)},
-gV8:function(a){return J.UQ(a.ee,"slot")},
-gyg:function(a){var z=J.UQ(a.ee,"slot")
+"^":"V19;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
+gR9:function(a){return J.Tf(a.RZ,"slot")},
+gnx:function(a){var z=J.Tf(a.RZ,"slot")
 return typeof z==="number"},
-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)},
-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],
-Po:[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],
+gIq:function(a){return!!J.t(J.Tf(a.RZ,"slot")).$isvO&&J.mG(J.Tf(J.Tf(a.RZ,"slot"),"type"),"@Field")},
+gFF:function(a){return J.Tf(a.RZ,"source")},
+gyK:function(a){return a.ij},
+syK:function(a,b){a.ij=this.ct(a,C.uO,a.ij,b)},
+yg:[function(a,b){return J.wg(J.Tf(a.RZ,"source")).cv(J.WB(J.eS(J.Tf(a.RZ,"source")),"/inbound_references?limit="+H.d(b))).ml(new O.cCu(a))},"$1","gi0",2,0,111,33],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){if(b===!0)this.yg(a,100).ml(new O.ng(a)).wM(c)
+else{a.ij=this.ct(a,C.uO,a.ij,null)
+c.$0()}},"$2","gNe",4,0,118,119,120],
 static:{eka: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.QFk.LX(a)
 C.QFk.XI(a)
 return a}}},
-V20:{
-"^":"uL+Pi;",
+V19:{
+"^":"uL+Piz;",
 $isd3:true},
-cC:{
-"^":"TpZ:114;a",
+cCu:{
+"^":"r:114;Q",
 $1:[function(a){var z,y,x
-z=this.a
-y=J.UQ(a,"references")
+z=this.Q
+y=J.Tf(a,"references")
 x=Q.pT(null,null)
 x.FV(0,y)
-z.jw=J.NB(z,C.uO,z.jw,x)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
-qm:{
-"^":"TpZ:12;a",
-$1:[function(a){J.NB(this.a,C.kY,0,1)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,B,{
+z.ij=J.Q5(z,C.uO,z.ij,x)},"$1",null,2,0,null,157,"call"]},
+ng:{
+"^":"r:14;Q",
+$1:[function(a){J.Q5(this.Q,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,B,{
 "^":"",
 pR:{
-"^":"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."
-else if(J.xC(J.eS(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gJp:function(a){var z=a.RZ
+if(z!=null)if(J.mG(J.zH(z),"Sentinel"))if(J.mG(J.eS(a.RZ),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.mG(J.eS(a.RZ),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.mG(J.eS(a.RZ),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.mG(J.eS(a.RZ),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.mG(J.eS(a.RZ),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){var z=a.tY
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){var z=a.RZ
 if(b===!0)J.LE(z).ml(new B.Js(a)).wM(c)
 else{z.stJ(null)
-J.Z6(z,null)
-c.$0()}},"$2","gus",4,0,118,119,120],
+J.lF(z,null)
+c.$0()}},"$2","gNe",4,0,118,119,120],
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.uRw.LX(a)
 C.uRw.XI(a)
 return a}}},
 Js:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y
-if(a.gPE()!=null){J.DF(a,a.gPE())
-a.sTE(a.gPE())}z=this.a
+if(a.gHD()!=null){J.WI(a,a.gHD())
+a.szz(a.gHD())}z=this.Q
 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,{
+z.RZ=y.ct(z,C.kY,z.RZ,a)
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,121,"call"]}}],["","",,Z,{
 "^":"",
 EZ:{
-"^":"V21;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.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],
+"^":"V20;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+ghf:function(a){return a.RZ},
+shf:function(a,b){a.RZ=this.ct(a,C.fn,a.RZ,b)},
+vV:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+SK:[function(a,b){J.LE(a.RZ).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)
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.yKx.LX(a)
 C.yKx.XI(a)
 return a}}},
-V21:{
-"^":"uL+Pi;",
+V20:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,E,{
 "^":"",
 L4:{
-"^":"V22;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],
+"^":"V21;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkm:function(a){return a.RZ},
+skm:function(a,b){a.RZ=this.ct(a,C.qs,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{p4: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.j1o.LX(a)
-C.j1o.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.za.LX(a)
+C.za.XI(a)
 return a}}},
-V22:{
-"^":"uL+Pi;",
+V21:{
+"^":"uL+Piz;",
 $isd3:true},
 Mb:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ag.LX(a)
 C.Ag.XI(a)
 return a}}},
-mO:{
-"^":"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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+IH:{
+"^":"V22;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{O0h:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ie.LX(a)
 C.Ie.XI(a)
 return a}}},
-V23:{
-"^":"uL+Pi;",
+V22:{
+"^":"uL+Piz;",
 $isd3:true},
 DE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Ig.LX(a)
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V24;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],
-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.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
+"^":"V23;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gql:function(a){return a.RZ},
+sql:function(a,b){a.RZ=this.ct(a,C.oj,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+i9:[function(a){J.LE(a.RZ).wM(new E.Jj(a))},"$0","gqw",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.VLs.LX(a)
 C.VLs.XI(a)
 return a}}},
-V24:{
-"^":"uL+Pi;",
+V23:{
+"^":"uL+Piz;",
 $isd3:true},
-XB:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+Jj:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"]},
 H8:{
-"^":"V25;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],
-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.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
+"^":"V24;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPB:function(a){return a.RZ},
+sPB:function(a,b){a.RZ=this.ct(a,C.yL,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+i9:[function(a){J.LE(a.RZ).wM(new E.LB(a))},"$0","gqw",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gqw(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.GII.LX(a)
 C.GII.XI(a)
 return a}}},
-V25:{
-"^":"uL+Pi;",
+V24:{
+"^":"uL+Piz;",
 $isd3:true},
-cP:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+LB:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.wd(z))},"$0",null,0,0,null,"call"]},
 WS:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.bP.LX(a)
-C.bP.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{l5:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ug.LX(a)
+C.Ug.XI(a)
 return a}}},
 qh:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.IXz.LX(a)
-C.IXz.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.wK.LX(a)
+C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V26;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],
+"^":"V25;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{J3z: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ozm.LX(a)
 C.ozm.XI(a)
 return a}}},
-V26:{
-"^":"uL+Pi;",
+V25:{
+"^":"uL+Piz;",
 $isd3:true},
 Q6:{
-"^":"V27;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],
+"^":"V26;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gj4:function(a){return a.RZ},
+sj4:function(a,b){a.RZ=this.ct(a,C.Ve,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{chF: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.rU.LX(a)
 C.rU.XI(a)
 return a}}},
-V27:{
-"^":"uL+Pi;",
+V26:{
+"^":"uL+Piz;",
 $isd3:true},
 uE:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Fw.LX(a)
-C.Fw.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.RrX.LX(a)
+C.RrX.XI(a)
 return a}}},
 Zn:{
-"^":"V28;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:{O3: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.ijR.LX(a)
-C.ijR.XI(a)
+"^":"V27;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{kf:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.ag.LX(a)
+C.ag.XI(a)
 return a}}},
-V28:{
-"^":"uL+Pi;",
+V27:{
+"^":"uL+Piz;",
 $isd3:true},
 n5:{
-"^":"V29;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)
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.aVr.LX(a)
-C.aVr.XI(a)
+"^":"V28;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gyW:function(a){return a.RZ},
+syW:function(a,b){a.RZ=this.ct(a,C.YE,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{iO:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Dw.LX(a)
+C.Dw.XI(a)
 return a}}},
-V29:{
-"^":"uL+Pi;",
+V28:{
+"^":"uL+Piz;",
 $isd3:true},
 Ma:{
-"^":"V30;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],
+"^":"V29;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
 static:{Ii: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.iR.LX(a)
 C.iR.XI(a)
 return a}}},
-V30:{
-"^":"uL+Pi;",
+V29:{
+"^":"uL+Piz;",
 $isd3:true},
 wN:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{wZ7:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.RVQ.LX(a)
 C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V31;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],
-ur:[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.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
+"^":"V30;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gMZ:function(a){return a.RZ},
+sMZ:function(a,b){a.RZ=this.ct(a,C.jU,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+ur:[function(a){J.LE(a.RZ).wM(new E.As(a))},"$0","gyT",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.yr.LX(a)
-C.yr.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.wP.LX(a)
+C.wP.XI(a)
 return a}}},
-V31:{
-"^":"uL+Pi;",
+V30:{
+"^":"uL+Piz;",
 $isd3:true},
-mj:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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},
+As:{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"]},
 qM:{
-"^":"V32;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V31;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{TEI:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ej.LX(a)
 C.ej.XI(a)
 return a}}},
-V32:{
-"^":"uL+Pi;",
+V31:{
+"^":"uL+Piz;",
 $isd3:true},
 av:{
-"^":"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)},
+"^":"ZzR;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gEQ:function(a){return a.TQ},
+sEQ:function(a,b){a.TQ=this.ct(a,C.pH,a.TQ,b)},
 static:{R7: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.CB=!1
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=!1
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.OkI.LX(a)
 C.OkI.XI(a)
 return a}}},
 ZzR:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true},
 uz:{
-"^":"V33;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},
+"^":"V32;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gpE:function(a){return a.RZ},
 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],
-ur:[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.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
+spE:function(a,b){a.RZ=this.ct(a,C.Wj,a.RZ,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+ur:[function(a){J.LE(a.RZ).wM(new E.Cc(a))},"$0","gyT",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gyT(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.c3=null}},
+a.ij=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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.bZ.LX(a)
 C.bZ.XI(a)
 return a}}},
-V33:{
-"^":"uL+Pi;",
+V32:{
+"^":"uL+Piz;",
 $isd3:true},
 Cc:{
-"^":"TpZ:76;a",
-$0:[function(){var z=this.a
-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,{
+"^":"r:77;Q",
+$0:[function(){var z=this.Q
+if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.Y5(z))},"$0",null,0,0,null,"call"]}}],["","",,X,{
 "^":"",
 Se:{
-"^":"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.ks
+"^":"Y2;B1:r>,x,y,Zn:z<,Gc:ch<,ki:cx<,Vh:cy<,ZX:db<,Q,a,b,c,d,e,f,cy$,db$",
+gtT:function(a){return J.tX(this.y)},
+Pz:function(){var z,y,x,w,v,u,t,s,r
+z=this.r
+y=J.Tf(z,"threshold")
+x=this.b
 if(x.length>0)return
-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(!(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},
+for(w=this.y,v=J.Nx(J.OD(w)),u=this.x,t=u.a;v.D();){s=v.gk()
+r=J.x4(s.gAv(),w.gAv())
+if(typeof y!=="number")return H.o(y)
+if(!(r>y||J.x4(J.tX(s).gbu(),t)>y))continue
+x.push(X.i3(z,u,s,this))}},
+aY:function(){},
+Nh:function(){return J.wS(J.OD(this.y))>0},
 mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.J8(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
+z=this.y
+this.cy=H.d(z.gAv())
+this.db=G.J8(J.x4(J.lX(J.Tf(this.r,"period"),z.gAv()),1000000))
 y=J.RE(z)
-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.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
+if(J.mG(J.Iz(y.gtT(z)),C.Ea)){this.z="Tag (category)"
+if(d==null)this.ch=G.dj(z.gAv(),this.x.a)
+else this.ch=G.dj(z.gAv(),d.y.gAv())
+this.cx=G.dj(z.gAv(),this.x.a)}else{if(J.mG(J.Iz(y.gtT(z)),C.WA)||J.mG(J.Iz(y.gtT(z)),C.yP))this.z="Garbage Collected Code"
+else this.z=H.d(J.Iz(y.gtT(z)))+" (Function)"
+if(d==null)this.ch=G.dj(z.gAv(),this.x.a)
+else this.ch=G.dj(z.gAv(),d.y.gAv())
+this.cx=G.dj(y.gtT(z).gbu(),this.x.a)}z=this.c
+z.push(this.ch)
+z.push(this.cx)},
+static:{i3:function(a,b,c,d){var z,y
+z=H.J([],[G.Y2])
+y=d!=null?d.a+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
 z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V34;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},
-sPL:function(a,b){a.TH=this.ct(a,C.He,a.TH,b)},
-gLW:function(a){return a.WT},
-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)},
-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)},
-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
+"^":"V33;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,TO,Hm:S8=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gB1:function(a){return a.RZ},
+sB1:function(a,b){a.RZ=this.ct(a,C.vb,a.RZ,b)},
+gGq:function(a){return a.ij},
+sGq:function(a,b){a.ij=this.ct(a,C.He,a.ij,b)},
+gLW:function(a){return a.TQ},
+sLW:function(a,b){a.TQ=this.ct(a,C.Gs,a.TQ,b)},
+gUo:function(a){return a.ca},
+sUo:function(a,b){a.ca=this.ct(a,C.Dj,a.ca,b)},
+gEl:function(a){return a.Jc},
+sEl:function(a,b){a.Jc=this.ct(a,C.YD,a.Jc,b)},
+gnZ:function(a){return a.cw},
+snZ:function(a,b){a.cw=this.ct(a,C.bE,a.cw,b)},
+gNG:function(a){return a.bN},
+sNG:function(a,b){a.bN=this.ct(a,C.aH,a.bN,b)},
+gQl:function(a){return a.mT},
+sQl:function(a,b){a.mT=this.ct(a,C.zz,a.mT,b)},
+gXc:function(a){return a.IL},
+sXc:function(a,b){a.IL=this.ct(a,C.TW,a.IL,b)},
+n1:[function(a,b){var z,y,x,w
+z=a.RZ
 if(z==null)return
-y=J.UQ(z,"samples")
-x=new P.iP(Date.now(),!1)
-x.EK()
-z=J.AG(y)
-a.WT=this.ct(a,C.Gs,a.WT,z)
-z=x.bu(0)
-a.Uw=this.ct(a,C.Dj,a.Uw,z)
-z=J.AG(J.UQ(a.oi,"depth"))
-a.oo=this.ct(a,C.bE,a.oo,z)
-w=J.UQ(a.oi,"period")
-if(typeof w!=="number")return H.s(w)
+y=J.Tf(z,"samples")
+z=Date.now()
+x=J.Lz(y)
+a.TQ=this.ct(a,C.Gs,a.TQ,x)
+z=new P.iP(z,!1).X(0)
+a.ca=this.ct(a,C.Dj,a.ca,z)
+z=J.Lz(J.Tf(a.RZ,"depth"))
+a.cw=this.ct(a,C.bE,a.cw,z)
+w=J.Tf(a.RZ,"period")
+if(typeof w!=="number")return H.o(w)
 z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-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.aT(a.oi).N3(a.oi)
-J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,19,59],
+a.Jc=this.ct(a,C.YD,a.Jc,z)
+z=G.M5(J.Tf(a.RZ,"timeSpan"))
+a.mT=this.ct(a,C.zz,a.mT,z)
+z=a.Jr
+x=C.YI.X(z*100)+"%"
+a.bN=this.ct(a,C.aH,a.bN,x)
+J.wg(a.RZ).N3(a.RZ)
+J.H9(a.RZ,"threshold",z)
+this.Dq(a)},"$1","gwh",2,0,20,61],
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=R.tB([])
-a.Hm=new G.ih(z,null,null)
-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.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
+a.S8=new G.iY(z,null,null)
+this.Dq(a)},
+Wy:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,61],
+SK:[function(a,b){var z="profile?tags="+H.d(a.IL)
+J.wg(a.RZ).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,20,102],
+Dq:function(a){if(a.RZ==null)return
 this.FG(a)},
 FG:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gqo()
+z=J.wg(a.RZ).gNp()
 if(z==null)return
-try{a.Hm.G7(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
+try{a.S8.rT(X.i3(a.RZ,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.oP(w,null)
-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.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,103,104],
+x=new H.XO(w,null)
+N.QM("").r0("_buildStackTree",y,x)}if(J.mG(J.wS(a.S8.Q),1))a.S8.lo(0)
+this.ct(a,C.ep,null,a.S8)},
+ka:[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.V(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
+if(!J.mG(J.eS(w.gK(b)),"expand")&&!J.mG(w.gK(b),d))return
 z=J.Lp(d)
-if(!!J.x(z).$isIv)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
+if(!!J.t(z).$isIv)try{w=a.S8
+v=J.JC(z)
+if(typeof v!=="number")return v.T()
 w.lo(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.oP(u,null)
-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])
-x=P.Fl(null,null)
-w=P.Fl(null,null)
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.Xg="#tableTree"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+x=new H.XO(u,null)
+N.QM("").r0("toggleExpanded",y,x)}},"$3","gZ9",6,0,105,4,106,107],
+static:{"^":"B6",osd:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=""
+a.ca=""
+a.Jc=""
+a.cw=""
+a.bN=""
+a.mT=""
+a.Jr=0.0002
+a.IL="uv"
+a.TO="#tableTree"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.kS.LX(a)
 C.kS.XI(a)
 return a}}},
-V34:{
-"^":"uL+Pi;",
+V33:{
+"^":"uL+Piz;",
 $isd3:true},
 Xy:{
-"^":"TpZ:114;a",
-$1:[function(a){var z=this.a
-z.oi=J.NB(z,C.vb,z.oi,a)},"$1",null,2,0,null,168,"call"],
-$isEH:true}}],["","",,N,{
+"^":"r:114;Q",
+$1:[function(a){var z=this.Q
+z.RZ=J.Q5(z,C.vb,z.RZ,a)},"$1",null,2,0,null,168,"call"]}}],["","",,N,{
 "^":"",
 oa:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.LN.LX(a)
 C.LN.XI(a)
 return a}}}}],["","",,D,{
 "^":"",
 St:{
-"^":"V35;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)},
+"^":"V34;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 static:{N5: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.OoF.LX(a)
-C.OoF.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.ta.LX(a)
+C.ta.XI(a)
 return a}}},
-V35:{
-"^":"uL+Pi;",
+V34:{
+"^":"uL+Piz;",
 $isd3:true},
 IW:{
-"^":"V36;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.Ho(a.ow)},"$1","gX0",2,0,169,13],
-qW:[function(a,b){$.Kh.pZ(a.ow)
-return J.df(a.ow)},"$1","gDQ",2,0,169,13],
-PyB:[function(a,b){$.Kh.pZ(a.ow)
-return J.UR(a.ow)},"$1","gLc",2,0,169,13],
-XQ:[function(a,b){$.Kh.pZ(a.ow)
-return J.MU(a.ow)},"$1","gqF",2,0,169,13],
-Cx:[function(a,b){$.Kh.pZ(a.ow)
-return J.Fy(a.ow)},"$1","gZp",2,0,169,13],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V35;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+Fv:[function(a,b){return J.v6(a.RZ)},"$1","gX0",2,0,169,15],
+xK:[function(a,b){$.Pi.pZ(a.RZ)
+return J.df(a.RZ)},"$1","gbY",2,0,169,15],
+tb:[function(a,b){$.Pi.pZ(a.RZ)
+return J.aN(a.RZ)},"$1","gLc",2,0,169,15],
+lM:[function(a,b){$.Pi.pZ(a.RZ)
+return J.ex(a.RZ)},"$1","gqF",2,0,169,15],
+Cx:[function(a,b){$.Pi.pZ(a.RZ)
+return J.Fy(a.RZ)},"$1","gVX",2,0,169,15],
+static:{zr:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.F2.LX(a)
 C.F2.XI(a)
 return a}}},
-V36:{
-"^":"uL+Pi;",
+V35:{
+"^":"uL+Piz;",
 $isd3:true},
 Qh:{
-"^":"V37;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
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.rCJ.LX(a)
-C.rCJ.XI(a)
+"^":"V36;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+static:{kgI:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.kd.LX(a)
+C.kd.XI(a)
 return a}}},
-V37:{
-"^":"uL+Pi;",
+V36:{
+"^":"uL+Piz;",
 $isd3:true},
 Oz:{
-"^":"V38;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)},
+"^":"V37;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
 static:{TSH: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.mb.LX(a)
-C.mb.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YGo.LX(a)
+C.YGo.XI(a)
 return a}}},
-V38:{
-"^":"uL+Pi;",
+V37:{
+"^":"uL+Piz;",
 $isd3:true},
-vT:{
-"^":"a;NK,aF",
+Tb:{
+"^":"a;Q,a",
 eC:function(a){var z,y,x,w,v,u
-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()
-v=J.BQ(y.t(a,w),"%")
+z=this.Q.Q
+if(J.mG(z.nQ("getNumberOfColumns"),0)){z.Z("addColumn",["string","Name"])
+z.Z("addColumn",["number","Value"])}z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.RE(a),x=J.Nx(y.gvc(a));x.D();){w=x.gk()
+v=J.BQ(y.p(a,w),"%")
 if(0>=v.length)return H.e(v,0)
 u=[]
 C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.GD(u)
 u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
+z.Z("addRow",[u])}}},
 Z4:{
-"^":"V39;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)},
+"^":"V38;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gXE:function(a){return a.RZ},
+sXE:function(a,b){a.RZ=this.ct(a,C.bJ,a.RZ,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.vT(new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null)),null)
-z=a.iw
+if(a.RZ==null)return
+if($.Ib().Q.Q!==0&&a.ij==null)a.ij=new D.Tb(new G.Kf(P.zV(J.Tf($.NR,"DataTable"),null)),null)
+z=a.ij
 if(z==null)return
-z.eC(a.wd)
+z.eC(a.RZ)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-x=z.aF
-if(x==null){x=new G.yD(null,P.L5(null,null,null,null,null))
-x.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+if(y!=null){z=a.ij
+x=z.a
+if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x.Q=P.zV(J.Tf($.NR,"PieChart"),[y])
+z.a=x}x.Am(0,z.Q)}},"$1","ghU",2,0,20,61],
+static:{Oll:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.aXP.LX(a)
 C.aXP.XI(a)
 return a}}},
-V39:{
-"^":"uL+Pi;",
+V38:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
-Lr:{
-"^":"a;KK,S2",
+cA:{
+"^":"a;Q,a",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.KK.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-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.Q0(a.gaf(),"Idle")
-v=a.gvh()
-for(u=0;u<a.gFw().length;++u){y=a.gFw()
+z=this.Q.Q
+if(J.mG(z.nQ("getNumberOfColumns"),0)){z.Z("addColumn",["string","Time"])
+for(y=J.Nx(a.gfJ());y.D();){x=y.c
+if(J.mG(x,"Idle"))continue
+z.Z("addColumn",["number",x])}}z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+w=J.YQ(a.gfJ(),"Idle")
+v=a.gZ0()
+for(u=0;u<a.glI().length;++u){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-t=y[u].SP
+t=y[u].Q
 s=[]
-if(t>0){if(typeof v!=="number")return H.s(v)
+if(t>0){if(typeof v!=="number")return H.o(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.gFw()
+y=a.glI()
 if(u>=y.length)return H.e(y,u)
-r=y[u].jf
+r=y[u].b
 if(r===0){q=0
-while(!0){y=a.gFw()
+while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
+if(!(q<y[u].a.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.gFw()
+while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
+if(!(q<y[u].a.length))break
 c$1:{if(q===w)break c$1
-y=a.gFw()
+y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=y[u].XE
+y=y[u].a
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
+s.push(C.CD.yu(J.x4(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])}}},
+z.Z("addRow",[y])}}},
 qk:{
-"^":"V40;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="+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.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
+"^":"V39;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+god:function(a){return a.RZ},
+sod:function(a,b){a.RZ=this.ct(a,C.rB,a.RZ,b)},
+vV:[function(a,b){var z=a.RZ
+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],
+af:[function(a){a.RZ.m7().ml(new L.LX(a))},"$0","gke",0,0,1],
+Es:function(a){this.VM(a)
+a.ij=P.cH(P.xC(0,0,0,0,0,1),this.gke(a))},
+dQ:function(a){var z
+this.eX(a)
+z=a.ij
 if(z!=null){z.Gv()
-a.Cn=null}},
-pA:[function(a,b){J.LE(a.TO).wM(b)},"$1","gvC",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,169,13],
-qW:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,169,13],
+a.ij=null}},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,102],
+Fv:[function(a,b){return a.RZ.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,169,15],
+xK:[function(a,b){return a.RZ.cv("resume").ml(new L.CZ(a))},"$1","gbY",2,0,169,15],
 static:{Qtp:function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.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.hys.LX(a)
-C.hys.XI(a)
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.TQ=new L.cA(new G.Kf(z),null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.Xe.LX(a)
+C.Xe.XI(a)
 return a}}},
-V40:{
-"^":"uL+Pi;",
+V39:{
+"^":"uL+Piz;",
 $isd3:true},
 LX:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w,v
-z=this.a
-y=z.LR
+z=this.Q
+y=z.TQ
 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.yD(null,w)
-v.vR=P.zV(J.UQ($.NR,"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.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,170,"call"],
-$isEH:true},
+if(x!=null){if(y.a==null){w=P.L5(null,null,null,null,null)
+v=new G.qu(null,w)
+v.Q=P.zV(J.Tf($.NR,"SteppedAreaChart"),[x])
+y.a=v
+w.q(0,"isStacked",!0)
+y.a.a.q(0,"connectSteps",!1)
+y.a.a.q(0,"vAxis",P.B(["minValue",0,"maxValue",100],null,null))}y.a.Am(0,y.Q)}if(z.ij!=null)z.ij=P.cH(P.xC(0,0,0,0,0,1),J.cC(z))},"$1",null,2,0,null,170,"call"]},
 CV:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-Vq:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.LE(this.a.TO)},"$1",null,2,0,null,121,"call"],
-$isEH:true}}],["","",,Z,{
+"^":"r:14;Q",
+$1:[function(a){return J.LE(this.Q.RZ)},"$1",null,2,0,null,121,"call"]},
+CZ:{
+"^":"r:14;Q",
+$1:[function(a){return J.LE(this.Q.RZ)},"$1",null,2,0,null,121,"call"]}}],["","",,Z,{
 "^":"",
 xh:{
-"^":"a;ue,GO",
+"^":"a;Q,a",
 KW:function(a,b){var z,y,x,w,v,u,t,s
-z=this.GO
+z=this.a
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.RE(a),x=J.mY(y.gvc(a)),w=this.ue,v=b+1;x.G();){u=x.gl()
-t=y.t(a,u)
-s=J.x(t)
-if(!!s.$isT8){s=C.yo.U("  ",b)
-w.IN+=s
+for(y=J.RE(a),x=J.Nx(y.gvc(a)),w=this.Q,v=b+1;x.D();){u=x.gk()
+t=y.p(a,u)
+s=J.t(t)
+if(!!s.$isw){s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": {\n"
-w.IN+=s
+w.Q+=s
 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)
-w.IN+=s
+s=C.yo.R("  ",b)
+s=w.Q+=s
+w.Q=s+"}\n"}else if(!!s.$isWO){s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": [\n"
-w.IN+=s
+w.Q+=s
 this.J7(t,v)
-s=C.yo.U("  ",b)
-s=w.IN+=s
-w.IN=s+"]\n"}else{s=C.yo.U("  ",b)
-w.IN+=s
+s=C.yo.R("  ",b)
+s=w.Q+=s
+w.Q=s+"]\n"}else{s=C.yo.R("  ",b)
+w.Q+=s
 s="\""+H.d(u)+"\": "+H.d(t)
-s=w.IN+=s
-w.IN=s+"\n"}}z.Rz(0,a)},
+s=w.Q+=s
+w.Q=s+"\n"}}z.Rz(0,a)},
 J7:function(a,b){var z,y,x,w,v,u
-z=this.GO
+z=this.a
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.mY(a),x=this.ue,w=b+1;y.G();){v=y.gl()
-u=J.x(v)
-if(!!u.$isT8){u=C.yo.U("  ",b)
-u=x.IN+=u
-x.IN=u+"{\n"
+for(y=J.Nx(a),x=this.Q,w=b+1;y.D();){v=y.gk()
+u=J.t(v)
+if(!!u.$isw){u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"{\n"
 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)
-u=x.IN+=u
-x.IN=u+"[\n"
+u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"}\n"}else if(!!u.$isWO){u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"[\n"
 this.J7(v,w)
-u=C.yo.U("  ",b)
-u=x.IN+=u
-x.IN=u+"]\n"}else{u=C.yo.U("  ",b)
-x.IN+=u
-u=x.IN+=typeof v==="string"?v:H.d(v)
-x.IN=u+"\n"}}z.Rz(0,a)}},
+u=C.yo.R("  ",b)
+u=x.Q+=u
+x.Q=u+"]\n"}else{u=C.yo.R("  ",b)
+x.Q+=u
+u=x.Q+=typeof v==="string"?v:H.d(v)
+x.Q=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V41;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},
+"^":"V40;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gIr:function(a){return a.RZ},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
-glp:function(a){return a.cs},
-slp:function(a,b){a.cs=this.ct(a,C.t6,a.cs,b)},
-oC:[function(a,b){var z,y,x
+sIr:function(a,b){a.RZ=this.ct(a,C.SR,a.RZ,b)},
+glp:function(a){return a.ij},
+slp:function(a,b){a.ij=this.ct(a,C.t6,a.ij,b)},
+qW:[function(a,b){var z,y,x
 z=P.p9("")
-y=P.Ls(null,null,null,null)
-x=a.Ly
-z.IN=""
+y=P.fM(null,null,null,null)
+x=a.RZ
+z.Q=""
 z.KF("{\n")
 new Z.xh(z,y).KW(x,0)
 z.KF("}\n")
-z=z.IN
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","gLU",2,0,19,59],
+z=z.Q
+z=z.charCodeAt(0)==0?z:z
+a.ij=this.ct(a,C.t6,a.ij,z)},"$1","gdB",2,0,20,61],
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Du.LX(a)
-C.Du.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.GB.LX(a)
+C.GB.XI(a)
 return a}}},
-V41:{
-"^":"uL+Pi;",
+V40:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,R,{
 "^":"",
 LU:{
-"^":"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:{dH: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{bUN:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Z3.LX(a)
 C.Z3.XI(a)
 return a}}}}],["","",,M,{
 "^":"",
 CX:{
-"^":"V42;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],
+"^":"V41;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gHt:function(a){return a.RZ},
+sHt:function(a,b){a.RZ=this.ct(a,C.EV,a.RZ,b)},
+vV:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/eval?expr="+H.d(P.Mp(C.yD,b,C.xM,!1))))},"$1","gZ2",2,0,109,110],
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.ag.LX(a)
-C.ag.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.MG.LX(a)
+C.MG.XI(a)
 return a}}},
-V42:{
-"^":"uL+Pi;",
+V41:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,N,{
 "^":"",
 TJ:{
-"^":"a;oc>,eT>,cK,Zm>,ks>,z3",
+"^":"a;oc:Q>,eT:a>,b,Zm:c>,wd:d>,e",
 gB8:function(){var z,y,x
-z=this.eT
-y=z==null||J.xC(J.DA(z),"")
-x=this.oc
+z=this.a
+y=z==null||J.mG(J.DA(z),"")
+x=this.Q
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.cK
+gOR:function(){if($.RL){var z=this.b
 if(z!=null)return z
-z=this.eT
+z=this.a
 if(z!=null)return z.gOR()}return $.DR},
-sOR:function(a){if($.RL&&this.eT!=null)this.cK=a
-else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
+sOR:function(a){if($.RL&&this.a!=null)this.b=a
+else{if(this.a!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.DR=a}},
-gSZ:function(){return this.qX()},
-mL:function(a){return a.P>=this.gOR().P},
+gY:function(){return this.qX()},
+mL:function(a){return a.a>=this.gOR().a},
 Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){if(!!J.x(b).$isEH)b=b.$0()
-if(typeof b!=="string")b=J.AG(b)
+if(a.a>=this.gOR().a){if(!!J.t(b).$isEH)b=b.$0()
+if(typeof b!=="string")b=J.Lz(b)
 z=this.gB8()
-y=new P.iP(Date.now(),!1)
-y.EK()
+y=Date.now()
 x=$.xO
 $.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
+w=new N.HV(a,b,z,new P.iP(y,!1),x,c,d)
 if($.RL)for(v=this;v!=null;){v.js(w)
 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.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)},
+X2A:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
+x9: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)},
+ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZW(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)},
-hh:function(a){return this.WB(a,null,null)},
-qX:function(){if($.RL||this.eT==null){var z=this.z3
+r6:function(a,b,c){return this.Y6(C.cd,a,b,c)},
+YX:function(a){return this.r6(a,null,null)},
+qX:function(){if($.RL||this.a==null){var z=this.e
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.z3=z}z.toString
-return H.VM(new P.Ln(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())
+this.e=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])}else return N.QM("").qX()},
+js:function(a){var z=this.e
+if(z!=null){if(z.b>=4)H.vh(z.Pq())
 z.MW(a)}},
-QL:function(a,b,c){var z=this.eT
-if(z!=null)J.jd(z).u(0,this.oc,this)},
+QL:function(a,b,c){var z=this.a
+if(z!=null)J.jd(z).q(0,this.Q,this)},
 $isTJ:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
-aO:{
-"^":"TpZ:76;a",
+static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.dG(a))}}},
+dG:{
+"^":"r:77;Q",
 $0:function(){var z,y,x,w,v
-z=this.a
-if(C.yo.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
+z=this.Q
+if(C.yo.nC(z,"."))H.vh(P.p("name shouldn't start with a '.'"))
 y=C.yo.cn(z,".")
 if(y===-1)x=z!==""?N.QM(""):null
 else{x=N.QM(C.yo.Nj(z,0,y))
-z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new P.A2(w),[null,null]),null)
+z=C.yo.yn(z,y+1)}w=P.L5(null,null,null,P.I,N.TJ)
+v=new N.TJ(z,x,null,w,H.J(new P.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},
-$isEH:true},
+return v}},
 Ng:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isNg&&this.P===b.P},
-C:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<z},
-E:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P<=z},
-D:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>z},
-F:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P>=z},
-iM:function(a,b){var z=J.Vm(b)
-if(typeof z!=="number")return H.s(z)
-return this.P-z},
-giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gCR",0,0,73],
+"^":"a;oc:Q>,M:a>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isNg&&this.a===b.a},
+w:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a<z},
+B:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a<=z},
+A:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a>z},
+C:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a>=z},
+iM:function(a,b){var z=J.SW(b)
+if(typeof z!=="number")return H.o(z)
+return this.a-z},
+giO:function(a){return this.a},
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
 $isNg:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,wC,uxc"}},
+static:{"^":"V7K,cU,Enk,LkO,reI,kH8,hlK,MHK,Uu,lDu,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],
+"^":"a;OR:Q<,G1:a>,b,Fl:c<,d,kc:e>,I4:f<",
+X:[function(a){return"["+this.Q.Q+"] "+this.b+": "+H.d(this.a)},"$0","gCR",0,0,0],
 $isHV:true,
 static:{"^":"xO"}}}],["","",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e555())
+N.QM("").gY().yI(new F.e551())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Xw(),"google")
+z=J.Tf($.Xw(),"google")
 y=$.Ib()
-z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e556())},
-e555:{
-"^":"TpZ:172;",
+z.Z("load",["visualization","1",P.jT(P.B(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
+$.Ib().Q.ml(G.vN()).ml(new F.e552())},
+e551:{
+"^":"r:172;",
 $1:[function(a){var z
-if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
+if(J.mG(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-e556:{
-"^":"TpZ:12;",
+P.FL(a.gOR().Q+": "+a.gFl().X(0)+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"]},
+e552:{
+"^":"r:14;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
-try{A.Zw()}catch(y){x=H.Ru(y)
+try{A.Ok()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").hh("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["","",,N,{
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,15,"call"]}}],["","",,N,{
 "^":"",
 qn:{
-"^":"V43;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},
-sod:function(a,b){a.OM=this.ct(a,C.rB,a.OM,b)},
-geZ:function(a){return a.zv},
-seZ:function(a,b){a.zv=this.ct(a,C.tf,a.zv,b)},
+"^":"V42;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+guc:function(a){return a.RZ},
+suc:function(a,b){a.RZ=this.ct(a,C.EP,a.RZ,b)},
+god:function(a){return a.ij},
+sod:function(a,b){a.ij=this.ct(a,C.rB,a.ij,b)},
+geZ:function(a){return a.TQ},
+seZ:function(a,b){a.TQ=this.ct(a,C.tf,a.TQ,b)},
 Sd:function(a){var z,y
-if(a.zv!=null)return
-if(a.OM!=null){z=a.GC
+if(a.TQ!=null)return
+if(a.ij!=null){z=a.RZ
 z=z!=null&&z.gcX()!=null}else z=!1
-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().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
+if(z){z=a.ij.gpG().Q.p(0,a.RZ.gcX())
+z=this.ct(a,C.tf,a.TQ,z)
+a.TQ=z
+if(z==null){z=a.ij.gSn().Q.p(0,a.RZ.gcX())
+a.TQ=this.ct(a,C.tf,a.TQ,z)}}if(a.TQ==null&&a.ij!=null){z=a.ij.gpG().Q
 y=z.gUQ(z)
-z=y.gqG(y)
-a.zv=this.ct(a,C.tf,a.zv,z)}},
+z=y.gtH(y)
+a.TQ=this.ct(a,C.tf,a.TQ,z)}},
 Es:function(a){this.Sd(a)},
-vD:[function(a,b){var z=a.OM
-if(z!=null)z.VT().ml(new N.AP(a))},"$1","guz",2,0,19,59],
-pA:[function(a,b){a.OM.VT().wM(b)},"$1","gvC",2,0,19,102],
+GU:[function(a,b){var z=a.ij
+if(z!=null)z.VT().ml(new N.oYh(a))},"$1","guz",2,0,20,61],
+SK:[function(a,b){a.ij.VT().wM(b)},"$1","gvC",2,0,20,102],
 Cd9:[function(a,b,c,d){var z,y,x
-z=J.Vs(d).dA.getAttribute("data-id")
-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().LL.t(0,z)
-y=this.ct(a,C.tf,a.zv,y)
-a.zv=y}x=a.GC
+z=J.Vs(d).Q.getAttribute("data-id")
+y=a.ij.gpG().Q.p(0,z)
+y=this.ct(a,C.tf,a.TQ,y)
+a.TQ=y
+if(y==null){y=a.ij.gSn().Q.p(0,z)
+y=this.ct(a,C.tf,a.TQ,y)
+a.TQ=y}x=a.RZ
 if(y!=null)x.scX(z)
-else x.scX(null)},"$3","gUt",6,0,105,2,106,107],
+else x.scX(null)},"$3","gUt",6,0,105,4,106,107],
 $isqn:true,
 static:{hYg: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.po.LX(a)
 C.po.XI(a)
 return a}}},
-V43:{
-"^":"uL+Pi;",
+V42:{
+"^":"uL+Piz;",
 $isd3:true},
-AP:{
-"^":"TpZ:12;a",
-$1:[function(a){J.O8(this.a)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+oYh:{
+"^":"r:14;Q",
+$1:[function(a){J.O8(this.Q)},"$1",null,2,0,null,15,"call"]},
 I2:{
-"^":"V44;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.on},
-sbe:function(a,b){a.on=this.ct(a,C.kB,a.on,b)},
-jV:function(a,b,c){var z,y
+"^":"V43;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+guc:function(a){return a.RZ},
+suc:function(a,b){a.RZ=this.ct(a,C.EP,a.RZ,b)},
+gbe:function(a){return a.ij},
+sbe:function(a,b){a.ij=this.ct(a,C.kB,a.ij,b)},
+mu: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
+for(z=J.RE(b),y=0;y<J.wS(z.gbG(b));++y)if(J.mG(H.BU(J.SW(J.Tf(z.gbG(b),y)),null,null),c))return y
 return},
-Es:function(a){Z.uL.prototype.Es.call(this,a)
+Es:function(a){this.VM(a)
 this.hB(a)},
 hB:function(a){var z,y
-if(a.on==null)return
+if(a.ij==null)return
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#refreshrate")
 if(z==null)return
-J.yi(z,this.jV(a,z,a.on.gmw()!=null?J.cj(a.on.gmw()).gVs():0))
+J.yi(z,this.mu(a,z,a.ij.gmw()!=null?J.cj(a.ij.gmw()).gVs():0))
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#buffersize")
-J.yi(y,this.jV(a,y,a.on.ghM()))},
-y3q:[function(a,b){this.hB(a)},"$1","gyZ",2,0,12,59],
+J.yi(y,this.mu(a,y,a.ij.ghM()))},
+Fe:[function(a,b){this.hB(a)},"$1","gyZ",2,0,14,61],
 rm:[function(a,b,c,d){var z,y
-z=H.BU(H.Go(d,"$isbs").value,null,null)
-y=a.on
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.ij
 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,"$isbs").value,null,null)
-y=a.on
+a.RZ.TG(z,y)},"$3","gIf",6,0,105,4,106,107],
+bW:[function(a,b,c,d){var z,y
+z=H.BU(H.Go(d,"$iszk").value,null,null)
+y=a.ij
 if(y==null)return
-y.shM(z)},"$3","gTK",6,0,105,2,106,107],
+y.shM(z)},"$3","gTK",6,0,105,4,106,107],
 static:{rI3: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Ax.LX(a)
-C.Ax.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.pc.LX(a)
+C.pc.XI(a)
 return a}}},
-V44:{
-"^":"uL+Pi;",
+V43:{
+"^":"uL+Piz;",
 $isd3:true},
 FB:{
-"^":"V45;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)
-a.tB=this.ct(a,C.O9,a.tB,z)
-Z.uL.prototype.Es.call(this,a)},
+"^":"V44;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gbe:function(a){return a.TQ},
+sbe:function(a,b){a.TQ=this.ct(a,C.kB,a.TQ,b)},
+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=P.xC(0,0,0,0,0,1)
+a.LD=this.ct(a,C.O9,a.LD,z)
+this.VM(a)},
 yY:function(a){this.T1(a)},
 T1:function(a){var z,y
-if(a.qV==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
+if(a.ij==null){z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#graph")
 if(z==null)return
-y=new G.yD(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"LineChart"),[z])
-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.on.gJk().XG.length;++y){x=a.on.gJk().XG
+y=new G.qu(null,P.L5(null,null,null,null,null))
+y.Q=P.zV(J.Tf($.NR,"LineChart"),[z])
+a.ij=y}if(a.TQ==null)return
+this.Ta(a)
+a.ij.Am(0,a.RZ)},
+Ta:function(a){var z,y,x,w,v,u,t
+z=a.RZ.Q
+z.Z("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=0;y<a.TQ.gtB().b.length;++y){x=a.TQ.gtB().b
 if(y>=x.length)return H.e(x,y)
 w=x[y]
 x=w.gFl()
-v=J.Vm(w)
+v=J.SW(w)
 u=[]
-C.Nm.FV(u,C.Nm.ez([x.gGt(),x.gS6(),x.gBM()],P.En()))
+C.Nm.FV(u,C.Nm.ez([x.gX3(),x.gcO(),x.gIv()],P.En()))
 t=new P.GD(u)
 t.$builtinTypeInfo=[null]
 x=[]
 C.Nm.FV(x,C.Nm.ez([t,v],P.En()))
 x=new P.GD(x)
 x.$builtinTypeInfo=[null]
-z.V7("addRow",[x])}},
-y3q:[function(a,b){var z
-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.on)])}},"$1","gyZ",2,0,12,59],
+z.Z("addRow",[x])}},
+Fe:[function(a,b){var z
+if(!J.mG(b,a.TQ)){z=a.RZ.Q
+z.Z("removeColumns",[0,z.nQ("getNumberOfColumns")])
+z.Z("addColumn",["timeofday","time"])
+z.Z("addColumn",["number",J.DA(a.TQ)])}},"$1","gyZ",2,0,14,61],
 static:{kUw:function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.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.Mw.LX(a)
-C.Mw.XI(a)
+z=P.zV(J.Tf($.NR,"DataTable"),null)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.RZ=new G.Kf(z)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.h1.LX(a)
+C.h1.XI(a)
 return a}}},
-V45:{
-"^":"uL+Pi;",
+V44:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
 md:{
-"^":"V46;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)},
+"^":"V45;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+giC:function(a){return a.RZ},
+siC:function(a,b){a.RZ=this.ct(a,C.Ys,a.RZ,b)},
 static:{DCi: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.i4=!0
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.aV.LX(a)
-C.aV.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!0
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.kDK.LX(a)
+C.kDK.XI(a)
 return a}}},
-V46:{
-"^":"uL+Pi;",
+V45:{
+"^":"uL+Piz;",
 $isd3:true},
 Bm:{
-"^":"V47;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},
-swp:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-grZ:function(a){return a.Jo},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJ: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.KU="#"
-a.V4="---"
-a.Jo=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.IG.LX(a)
-C.IG.XI(a)
+"^":"V46;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPj:function(a){return a.RZ},
+sPj:function(a,b){a.RZ=this.ct(a,C.kV,a.RZ,b)},
+gwp:function(a){return a.ij},
+swp:function(a,b){a.ij=this.ct(a,C.P,a.ij,b)},
+grZ:function(a){return a.TQ},
+srZ:function(a,b){a.TQ=this.ct(a,C.uk,a.TQ,b)},
+static:{AJm:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="#"
+a.ij="---"
+a.TQ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.YY.LX(a)
+C.YY.XI(a)
 return a}}},
-V47:{
-"^":"uL+Pi;",
+V46:{
+"^":"uL+Piz;",
 $isd3:true},
 Ya:{
-"^":"V48;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:{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])
-x=P.Fl(null,null)
-w=P.Fl(null,null)
-a.KU="#"
-a.V4="---"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V47;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gPj:function(a){return a.RZ},
+sPj:function(a,b){a.RZ=this.ct(a,C.kV,a.RZ,b)},
+gwp:function(a){return a.ij},
+swp:function(a,b){a.ij=this.ct(a,C.P,a.ij,b)},
+static:{P5Z:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ="#"
+a.ij="---"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.nn.LX(a)
 C.nn.XI(a)
 return a}}},
-V48:{
-"^":"uL+Pi;",
+V47:{
+"^":"uL+Piz;",
 $isd3:true},
 Ww:{
-"^":"V49;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},
+"^":"V48;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gFR:function(a){return a.RZ},
 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.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
+sFR:function(a,b){a.RZ=this.ct(a,C.U,a.RZ,b)},
+gjl:function(a){return a.ij},
+sjl:function(a,b){a.ij=this.ct(a,C.S,a.ij,b)},
+gph:function(a){return a.TQ},
+sph:function(a,b){a.TQ=this.ct(a,C.hf,a.TQ,b)},
+Kp:[function(a,b,c,d){var z=a.ij
 if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-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.Hq="Refresh"
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+a.ij=this.ct(a,C.S,z,!0)
+if(a.RZ!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,116,4,106,107],
+wY6:[function(a){a.ij=this.ct(a,C.S,a.ij,!1)},"$0","gCB",0,0,1],
+static:{wC:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.TQ="Refresh"
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J7.LX(a)
 C.J7.XI(a)
 return a}}},
-V49:{
-"^":"uL+Pi;",
+V48:{
+"^":"uL+Piz;",
 $isd3:true},
 ye:{
-"^":"uL;tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"uL;LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.br.LX(a)
-C.br.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.pl.LX(a)
+C.pl.XI(a)
 return a}}},
 G1:{
-"^":"V50;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V49;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grZ:function(a){return a.RZ},
+srZ:function(a,b){a.RZ=this.ct(a,C.uk,a.RZ,b)},
+static:{J8h:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.OKl.LX(a)
 C.OKl.XI(a)
 return a}}},
-V50:{
-"^":"uL+Pi;",
+V49:{
+"^":"uL+Piz;",
 $isd3:true},
 fl:{
-"^":"V51;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","guz",2,0,19,59],
-gu6:function(a){var z=a.iy
+"^":"V50;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+grZ:function(a){return a.RZ},
+srZ:function(a,b){a.RZ=this.ct(a,C.uk,a.RZ,b)},
+god:function(a){return a.ij},
+sod:function(a,b){a.ij=this.ct(a,C.rB,a.ij,b)},
+GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,61],
+gu6:function(a){var z=a.ij
 if(z!=null)return J.Ds(z)
 else return""},
 su6:function(a,b){},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.RRl.LX(a)
 C.RRl.XI(a)
 return a}}},
-V51:{
-"^":"uL+Pi;",
+V50:{
+"^":"uL+Piz;",
 $isd3:true},
 UK:{
-"^":"V52;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},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+"^":"V51;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gHt:function(a){return a.RZ},
+sHt:function(a,b){a.RZ=this.ct(a,C.EV,a.RZ,b)},
+grZ:function(a){return a.ij},
+srZ:function(a,b){a.ij=this.ct(a,C.uk,a.ij,b)},
 static:{Qje: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.xA.LX(a)
 C.xA.XI(a)
 return a}}},
-V52:{
-"^":"uL+Pi;",
+V51:{
+"^":"uL+Piz;",
 $isd3:true},
 wM:{
-"^":"V53;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},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+"^":"V52;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRu:function(a){return a.RZ},
+sRu:function(a,b){a.RZ=this.ct(a,C.XA,a.RZ,b)},
+grZ:function(a){return a.ij},
+srZ:function(a,b){a.ij=this.ct(a,C.uk,a.ij,b)},
 static:{ZTA: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ic.LX(a)
 C.ic.XI(a)
 return a}}},
-V53:{
-"^":"uL+Pi;",
+V52:{
+"^":"uL+Piz;",
 $isd3:true},
-Co:{
-"^":"V54;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)},
+NK:{
+"^":"V53;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRk:function(a){return a.RZ},
+sRk:function(a,b){a.RZ=this.ct(a,C.ld,a.RZ,b)},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.BJj.LX(a)
 C.BJj.XI(a)
 return a}}},
-V54:{
-"^":"uL+Pi;",
+V53:{
+"^":"uL+Piz;",
 $isd3:true},
 Zx:{
-"^":"V55;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)},
-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,169,13],
-PyB:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.UR(J.aT(a.Wx))},"$1","gLc",2,0,169,13],
-XQ:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.MU(J.aT(a.Wx))},"$1","gqF",2,0,169,13],
-Cx:[function(a,b){$.Kh.pZ(J.aT(a.Wx))
-return J.Fy(J.aT(a.Wx))},"$1","gZp",2,0,169,13],
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,173,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V54;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRk:function(a){return a.RZ},
+sRk:function(a,b){a.RZ=this.ct(a,C.ld,a.RZ,b)},
+gMl:function(a){return a.ij},
+sMl:function(a,b){a.ij=this.ct(a,C.p8,a.ij,b)},
+xK:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.df(J.wg(a.ij))},"$1","gbY",2,0,169,15],
+tb:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.aN(J.wg(a.ij))},"$1","gLc",2,0,169,15],
+lM:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.ex(J.wg(a.ij))},"$1","gqF",2,0,169,15],
+Cx:[function(a,b){$.Pi.pZ(J.wg(a.ij))
+return J.Fy(J.wg(a.ij))},"$1","gVX",2,0,169,15],
+cz:[function(a,b,c,d){J.V1(a.RZ,a.ij)},"$3","gTA",6,0,173,4,106,107],
+static:{zC:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.L8.LX(a)
 C.L8.XI(a)
 return a}}},
-V55:{
-"^":"uL+Pi;",
+V54:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,L,{
 "^":"",
 qV:{
-"^":"V56;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)},
-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],
+"^":"V55;RZ,ij,TQ,ca,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+gIi:function(a){return a.ij},
+sIi:function(a,b){a.ij=this.ct(a,C.XM,a.ij,b)},
+gyK:function(a){return a.TQ},
+syK:function(a,b){a.TQ=this.ct(a,C.uO,a.TQ,b)},
+gCF:function(a){return a.ca},
+sCF:function(a,b){a.ca=this.ct(a,C.tg,a.ca,b)},
+Cq:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/retained")).ml(new L.uWE(a))},"$1","ghN",2,0,111,113],
+DC:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/retaining_path?limit="+H.d(b))).ml(new L.vT(a))},"$1","gCI",2,0,111,33],
+yg:[function(a,b){return J.wg(a.RZ).cv(J.WB(J.eS(a.RZ),"/inbound_references?limit="+H.d(b))).ml(new L.C1y(a))},"$1","gi0",2,0,111,33],
+SK:[function(a,b){J.LE(a.RZ).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
-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.wA=null
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.h5.LX(a)
-C.h5.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ca=null
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.br.LX(a)
+C.br.XI(a)
 return a}}},
-V56:{
-"^":"uL+Pi;",
+V55:{
+"^":"uL+Piz;",
 $isd3:true},
-rQ:{
-"^":"TpZ:115;a",
+uWE:{
+"^":"r:115;Q",
 $1:[function(a){var z,y
-z=this.a
-y=H.BU(a.gPE(),null,null)
-z.wA=J.NB(z,C.tg,z.wA,y)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-ky:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.qB=J.NB(z,C.XM,z.qB,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true},
-WZ:{
-"^":"TpZ:155;a",
-$1:[function(a){var z=this.a
-z.GI=J.NB(z,C.uO,z.GI,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["","",,L,{
+z=this.Q
+y=H.BU(a.gHD(),null,null)
+z.ca=J.Q5(z,C.tg,z.ca,y)},"$1",null,2,0,null,96,"call"]},
+vT:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.XM,z.ij,a)},"$1",null,2,0,null,96,"call"]},
+C1y:{
+"^":"r:155;Q",
+$1:[function(a){var z=this.Q
+z.TQ=J.Q5(z,C.uO,z.TQ,a)},"$1",null,2,0,null,96,"call"]}}],["","",,L,{
 "^":"",
 NT:{
-"^":"V57;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
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.LQi.LX(a)
-C.LQi.XI(a)
+"^":"V56;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+static:{iLU:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Lj.LX(a)
+C.Lj.XI(a)
 return a}}},
-V57:{
-"^":"uL+Pi;",
+V56:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,V,{
 "^":"",
 F1:{
-"^":"V58;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)},
+"^":"V57;RZ,iJ:ij=,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gzj:function(a){return a.RZ},
+szj:function(a,b){a.RZ=this.ct(a,C.VK,a.RZ,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.Tj]),null,new G.ng("/vm",null,null,null,null,null),null,null,a,null,null,Q.pT(null,D.Mk),null,null)
+this.VM(a)
+if(a.RZ===!0){z=new G.mL(H.J([],[G.MQ]),null,new G.OR("/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.Tj])
+a.ij=z}else{z=H.J([],[G.MQ])
 y=Q.pT(null,D.Mk)
-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)
+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)
 y.Ty(a)
-a.i6=y}},
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+a.ij=y}},
+static:{JT8:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.RZ=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.YpE.LX(a)
 C.YpE.XI(a)
 return a}}},
-V58:{
-"^":"uL+Pi;",
+V57:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Z,{
 "^":"",
 uL:{
-"^":"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).fN},
-gl6:function(a){return J.D8(this.guc(a))},
-Es:function(a){A.zs.prototype.Es.call(this,a)
-this.U2(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)},
+"^":"Xfs;LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+giJ:function(a){return $.Pi},
+guc:function(a){return this.giJ(a).a},
+gl6:function(a){return J.BI(this.guc(a))},
+Es:["VM",function(a){this.tZ(a)
+this.U2(a)}],
+aC:function(a,b,c,d){this.Ud(a,b,c,d)},
+dQ:["eX",function(a){this.xD(a)
+this.mv(a)}],
+I9:["Ni",function(a){this.Kv(a)}],
+gMT:function(a){return a.LD},
+sMT:function(a,b){a.LD=this.ct(a,C.O9,a.LD,b)},
 yY:function(a){},
-JnB:[function(a,b){if(a.tB!=null)this.U2(a)
-else this.yM(a)},"$1","grX",2,0,19,59],
+Lq:[function(a,b){if(a.LD!=null)this.U2(a)
+else this.mv(a)},"$1","gj8",2,0,20,61],
 U2:function(a){var z
-if(a.tB==null)return
-z=a.Qf
+if(a.LD==null)return
+z=a.kX
 if(z!=null)z.Gv()
-a.Qf=P.cH(a.tB,this.gPs(a))},
-yM:function(a){var z=a.Qf
+a.kX=P.cH(a.LD,this.gPs(a))},
+mv:function(a){var z=a.kX
 if(z!=null)z.Gv()
-a.Qf=null},
+a.kX=null},
 Yl:[function(a){var z
 this.yY(a)
-z=a.tB
-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,173,87,106,107],
-Gxe:[function(a,b){this.gi6(a).Z6
+z=a.LD
+if(z==null){this.mv(a)
+return}a.kX=P.cH(z,this.gPs(a))},"$0","gPs",0,0,1],
+cD:[function(a,b,c,d){this.giJ(a).b.Cz(b,c,d)},"$3","gCK",6,0,173,87,106,107],
+XD:[function(a,b){this.giJ(a).b
 return"#"+H.d(b)},"$1","gGs",2,0,174,175],
-Qb:[function(a,b){return G.M5(b)},"$1","gSs",2,0,176,177],
-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],
+Om:[function(a,b){return G.M5(b)},"$1","gSs",2,0,176,177],
+Ze:[function(a,b){return G.O3(b)},"$1","gbJ",2,0,16,17],
+S2:[function(a,b){return H.BU(b,null,null)},"$1","gIb",2,0,145,21],
 Rms:[function(a,b,c){var z,y,x,w
 z=[]
-z.push(C.yo.j("'",0))
-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"))
-else if(w.n(x,"\u000c".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\f"))
-else if(w.n(x,"\u0008".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\b"))
-else if(w.n(x,"\t".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\t"))
-else if(w.n(x,"\u000b".charCodeAt(0)))C.Nm.FV(z,new J.IA("\\v"))
-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.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.HM(z)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,178,69,20,179],
-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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z.push(39)
+for(y=J.OX(b),y=y.gu(y);y.D();){x=y.c
+w=J.t(x)
+if(w.m(x,10))C.Nm.FV(z,new J.mN("\\n"))
+else if(w.m(x,13))C.Nm.FV(z,new J.mN("\\r"))
+else if(w.m(x,12))C.Nm.FV(z,new J.mN("\\f"))
+else if(w.m(x,8))C.Nm.FV(z,new J.mN("\\b"))
+else if(w.m(x,9))C.Nm.FV(z,new J.mN("\\t"))
+else if(w.m(x,11))C.Nm.FV(z,new J.mN("\\v"))
+else if(w.m(x,36))C.Nm.FV(z,new J.mN("\\$"))
+else if(w.m(x,92))C.Nm.FV(z,new J.mN("\\\\"))
+else if(w.m(x,39))C.Nm.FV(z,new J.mN("'"))
+else if(w.w(x,32))C.Nm.FV(z,new J.mN("\\u"+C.yo.Zp(w.WZ(x,16),4,"0")))
+else z.push(x)}if(c===!0)C.Nm.FV(z,new J.mN("..."))
+else z.push(39)
+return P.Qe(z,0,null)},function(a,b){return this.Rms(a,b,!1)},"hD","$2","$1","gRO",2,2,178,71,21,179],
+static:{LD:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Pfz.LX(a)
 C.Pfz.XI(a)
 return a}}},
 Xfs:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
 Ap:{
 "^":"a;",
-sP:function(a,b){},
+sM:function(a,b){},
 fR:function(){},
 $isAp:true}}],["","",,O,{
 "^":"",
-Pi:{
+Piz:{
 "^":"a;",
-gqh:function(a){var z=a.Vg
+gqh:function(a){var z=a.cy$
 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.Ln(z),[H.u3(z,0)])},
-w37:[function(a){},"$0","gcm",0,0,17],
-dt:[function(a){a.Vg=null},"$0","gym",0,0,17],
+z=P.bK(this.gl1(a),z,!0,null)
+a.cy$=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])},
+Tr:[function(a){},"$0","gcm",0,0,1],
+dt:[function(a){a.cy$=null},"$0","gl1",0,0,1],
 HC:[function(a){var z,y,x
-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())
+z=a.db$
+a.db$=null
+if(this.gnz(a)&&z!=null){y=a.cy$
+x=H.J(new P.Eb(z),[T.yj])
+if(y.b>=4)H.vh(y.Pq())
 y.MW(x)
 return!0}return!1},"$0","gDx",0,0,131],
 gnz:function(a){var z,y
-z=a.Vg
-if(z!=null){y=z.iE
+z=a.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
+SZ:function(a,b){if(!this.gnz(a))return
+if(a.db$==null){a.db$=[]
+P.rb(this.gDx(a))}a.db$.push(b)},
 $isd3:true}}],["","",,T,{
 "^":"",
 yj:{
 "^":"a;",
 $isyj:true},
 qI:{
-"^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gCR",0,0,73],
+"^":"yj;WA:Q>,oc:a>,b,c",
+X:[function(a){return"#<PropertyChangeRecord "+H.d(this.a)+" from: "+H.d(this.b)+" to: "+H.d(this.c)+">"},"$0","gCR",0,0,0],
 $isqI:true}}],["","",,O,{
 "^":"",
-X0:function(){var z,y,x,w,v,u,t,s,r,q
+N0:function(){var z,y,x,w,v,u,t,s,r,q
 if($.Td)return
 if($.Oo==null)return
 $.Td=!0
@@ -15187,65 +14658,59 @@
 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=$.S5()
+if(w&&v){w=$.aT()
 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.Ff
+for(s=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);s.D();){r=s.c
 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))+".")}}$.Nc=$.Oo.length
+w.j2("In last iteration Observable changed at index "+H.d(q.p(r,0))+", object: "+H.d(q.p(r,1))+".")}}$.dL=$.Oo.length
 $.Td=!1},
 Ht:function(){var z={}
 z.a=!1
-z=new O.YC(z)
-return new P.yQ(null,null,null,null,new O.zI(z),new O.qj(z),null,null,null,null,null,null)},
-YC:{
-"^":"TpZ:180;a",
-$2:function(a,b){var z=this.a
+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,null)},
+Nq:{
+"^":"r:180;Q",
+$2:function(a,b){var z=this.Q
 if(z.a)return
 z.a=!0
-a.RK(b,new O.N0(z))},
-$isEH:true},
-N0:{
-"^":"TpZ:76;a",
-$0:[function(){this.a.a=!1
-O.X0()},"$0",null,0,0,null,"call"],
-$isEH:true},
+a.RK(b,new O.jB(z))}},
+jB:{
+"^":"r:77;Q",
+$0:[function(){this.Q.a=!1
+O.N0()},"$0",null,0,0,null,"call"]},
 zI:{
-"^":"TpZ:29;b",
+"^":"r:30;Q",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
-$isEH:true},
+return new O.HF(this.Q,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"]},
 HF:{
-"^":"TpZ:76;c,d,e,f",
-$0:[function(){this.c.$2(this.d,this.e)
-return this.f.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-qj:{
-"^":"TpZ:181;UI",
+"^":"r:77;Q,a,b,c",
+$0:[function(){this.Q.$2(this.a,this.b)
+return this.c.$0()},"$0",null,0,0,null,"call"]},
+bF:{
+"^":"r:181;Q",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
-$isEH:true},
+return new O.iu(this.Q,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"]},
 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,182,"call"],
-$isEH:true}}],["","",,G,{
+"^":"r:14;Q,a,b,c",
+$1:[function(a){this.Q.$2(this.a,this.b)
+return this.c.$1(a)},"$1",null,2,0,null,182,"call"]}}],["","",,G,{
 "^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+LR: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)
+y=J.WB(J.D5(c,b),1)
 x=Array(z)
-for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(y)
+for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.o(y)
 u=Array(y)
 if(v>=w)return H.e(x,v)
 x[v]=u
 if(0>=u.length)return H.e(u,0)
-u[0]=v}if(typeof y!=="number")return H.s(y)
+u[0]=v}if(typeof y!=="number")return H.o(y)
 t=0
 for(;t<y;++t){if(0>=w)return H.e(x,0)
 u=x[0]
 if(t>=u.length)return H.e(u,t)
-u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
-p=J.xC(d[q],s.t(a,J.bI(u.g(b,t),1)))
+u[t]=t}for(u=J.rv(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
+p=J.mG(d[q],s.p(a,J.D5(u.g(b,t),1)))
 o=x[r]
 n=x[v]
 m=t-1
@@ -15263,10 +14728,10 @@
 if(m>=o)return H.e(n,m)
 m=n[m]
 if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
+m=P.C(p+1,m+1)
 if(t>=o)return H.e(n,t)
 n[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+Mw: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)
@@ -15292,7 +14757,7 @@
 t=a[y]
 if(s>=t.length)return H.e(t,s)
 o=t[s]
-n=P.J(P.J(p,o),q)
+n=P.C(P.C(p,o),q)
 if(n===q){if(q==null?v==null:q===v)u.push(0)
 else{u.push(1)
 v=q}x=s
@@ -15300,152 +14765,147 @@
 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.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)
+x=s}}}return H.J(new H.iK(u),[H.u3(H.J(new H.ii(),[H.u3(u,0)]),0)]).br(0)},
+uf:function(a,b,c){var z,y,x
+for(z=J.U6(a),y=0;y<c;++y){x=z.p(a,y)
 if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
+if(!J.mG(x,b[y]))return y}return c},
 xU:function(a,b,c){var z,y,x,w,v
 z=J.U6(a)
-y=z.gB(a)
+y=z.gv(a)
 x=b.length
 w=0
 while(!0){if(w<c){--y
-v=z.t(a,y);--x
+v=z.p(a,y);--x
 if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(v,b[x])}else v=!1
+v=J.mG(v,b[x])}else v=!1
 if(!v)break;++w}return w},
 jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
 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.rN(a,d,y):0
-v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
+y=P.C(z.T(c,b),f-e)
+x=J.t(b)
+w=x.m(b,0)&&e===0?G.uf(a,d,y):0
+v=z.m(c,J.wS(a))&&f===d.length?G.xU(a,d,y-w):0
 b=x.g(b,w)
 e+=w
-c=z.W(c,v)
+c=z.T(c,v)
 f-=v
 z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
-if(J.xC(b,c)){u=[]
-z=new P.Ui(u)
+if(J.mG(z.T(c,b),0)&&f-e===0)return C.xD
+if(J.mG(b,c)){u=[]
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
 t=new G.Zq(a,z,u,b,0)
-for(;e<f;e=s){z=t.kJ
+for(;e<f;e=s){z=t.b
 s=e+1
 if(e>>>0!==e||e>=d.length)return H.e(d,e)
-J.bi(z,d[e])}return[t]}else if(e===f){z=z.W(c,b)
+C.Nm.h(z,d[e])}return[t]}else if(e===f){z=z.T(c,b)
 u=[]
-x=new P.Ui(u)
+x=new P.Eb(u)
 x.$builtinTypeInfo=[null]
-return[new G.Zq(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
+return[new G.Zq(a,x,u,b,z)]}r=G.Mw(G.LR(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)
 t=null}o=J.WB(o,1);++p
 break
 case 1:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
+t=new G.Zq(a,z,u,o,0)}t.d=J.WB(t.d,1)
 o=J.WB(o,1)
-z=t.kJ
+z=t.b
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(z,d[p]);++p
 break
 case 2:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}t.wF=J.WB(t.wF,1)
+t=new G.Zq(a,z,u,o,0)}t.d=J.WB(t.d,1)
 o=J.WB(o,1)
 break
 case 3:if(t==null){u=[]
-z=new P.Ui(u)
+z=new P.Eb(u)
 z.$builtinTypeInfo=[null]
-t=new G.Zq(a,z,u,o,0)}z=t.kJ
+t=new G.Zq(a,z,u,o,0)}z=t.b
 if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
+C.Nm.h(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
+yq: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=J.qA(b.gkJ())
+x=C.Nm.br(b.gkJ())
 w=b.gNg()
-if(w==null)w=0
-v=new P.Ui(x)
+v=new P.Eb(x)
 v.$builtinTypeInfo=[null]
 u=new G.Zq(y,v,x,z,w)
 for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
 q=a[r]
-q.kW=J.WB(q.kW,s)
+q.c=J.WB(q.c,s)
 if(t)continue
-z=u.kW
-y=J.WB(z,u.HD.G4.length)
-x=q.kW
-p=P.J(y,J.WB(x,q.wF))-P.y(z,x)
+z=u.c
+y=J.WB(z,u.a.Q.length)
+x=q.c
+p=P.C(y,J.WB(x,q.d))-P.u(z,x)
 if(p>=0){C.Nm.W4(a,r);--r
-z=J.bI(q.wF,q.HD.G4.length)
-if(typeof z!=="number")return H.s(z)
+z=J.D5(q.d,q.a.Q.length)
+if(typeof z!=="number")return H.o(z)
 s-=z
-z=J.WB(u.wF,J.bI(q.wF,p))
-u.wF=z
-y=u.HD.G4.length
-x=q.HD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.kJ
-if(J.u6(u.kW,q.kW)){z=u.HD
-z=z.Yc(z,0,J.bI(q.kW,u.kW))
-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.kW,u.HD.G4.length),J.WB(q.kW,q.wF))){z=u.HD
-J.bj(o,z.Yc(z,J.bI(J.WB(q.kW,q.wF),u.kW),u.HD.G4.length))}u.kJ=o
-u.HD=q.HD
-if(J.u6(q.kW,u.kW))u.kW=q.kW
-t=!1}}else if(J.u6(u.kW,q.kW)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.wF,u.HD.G4.length)
-q.kW=J.WB(q.kW,n)
-if(typeof n!=="number")return H.s(n)
+z=J.WB(u.d,J.D5(q.d,p))
+u.d=z
+y=u.a.Q.length
+x=q.a.Q.length
+if(J.mG(z,0)&&y+x-p===0)t=!0
+else{o=q.b
+if(J.UN(u.c,q.c)){z=u.a
+z=z.Mu(z,0,J.D5(q.c,u.c))
+if(!!o.fixed$length)H.vh(P.f("insertAll"))
+H.FR(o,0,z)}if(J.vU(J.WB(u.c,u.a.Q.length),J.WB(q.c,q.d))){z=u.a
+C.Nm.FV(o,z.Mu(z,J.D5(J.WB(q.c,q.d),u.c),u.a.Q.length))}u.b=o
+u.a=q.a
+if(J.UN(q.c,u.c))u.c=q.c
+t=!1}}else if(J.UN(u.c,q.c)){C.Nm.aP(a,r,u);++r
+n=J.D5(u.d,u.a.Q.length)
+q.c=J.WB(q.c,n)
+if(typeof n!=="number")return H.o(n)
 s+=n
 t=!0}else t=!1}if(!t)a.push(u)},
-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.Ff)
+VT:function(a,b){var z,y
+z=H.J([],[G.Zq])
+for(y=H.J(new H.a7(b,b.length,0,null),[H.u3(b,0)]);y.D();)G.yq(z,y.c)
 return z},
 Qi:function(a,b){var z,y,x,w,v,u
 if(b.length<=1)return b
 z=[]
-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
+for(y=G.VT(a,b),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=a.b;y.D();){w=y.c
+if(J.mG(w.gNg(),1)&&w.gRt().Q.length===1){v=w.gRt().Q
 if(0>=v.length)return H.e(v,0)
 v=v[0]
 u=J.zj(w)
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
-if(!J.xC(v,x[u]))z.push(w)
+if(!J.mG(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().G4.length))}return z},
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gkJ(),0,w.gRt().Q.length))}return z},
 Zq:{
-"^":"yj;WA>,HD,kJ<,kW,wF",
-gvH:function(a){return this.kW},
-gRt:function(){return this.HD},
-gNg:function(){return this.wF},
-aa:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.kW
-if(typeof z!=="number")return H.s(z)
+"^":"yj;WA:Q>,a,kJ:b<,c,d",
+gvH:function(a){return this.c},
+gRt:function(){return this.a},
+gNg:function(){return this.d},
+vP:function(a){var z
+if(typeof a==="number"&&Math.floor(a)===a){z=this.c
+if(typeof z!=="number")return H.o(z)
 z=a<z}else z=!0
 if(z)return!1
-if(!J.xC(this.wF,this.HD.G4.length))return!0
-return J.u6(a,J.WB(this.kW,this.wF))},
-bu:[function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.kW)+", removed: "
-y=this.HD
-return z+y.bu(y)+", addedCount: "+H.d(this.wF)+">"},"$0","gCR",0,0,73],
+if(!J.mG(this.d,this.a.Q.length))return!0
+return J.UN(a,J.WB(this.c,this.d))},
+X:[function(a){return"#<ListChangeRecord index: "+H.d(this.c)+", removed: "+H.d(this.a)+", addedCount: "+H.d(this.d)+">"},"$0","gCR",0,0,0],
 $isZq:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
-z=new P.Ui(d)
+z=new P.Eb(d)
 z.$builtinTypeInfo=[null]
 return new G.Zq(a,z,d,b,c)}}}}],["","",,K,{
 "^":"",
@@ -15454,79 +14914,78 @@
 vly:{
 "^":"a;"}}],["","",,F,{
 "^":"",
-kM:[function(){return O.X0()},"$0","Jy",0,0,17],
+kM:[function(){return O.N0()},"$0","Jy",0,0,1],
 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]))
+if(z.gnz(a)&&!J.mG(c,d))z.SZ(a,H.J(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,rJ:XY%,xt:cU%",
+"^":"a;VE:dx$%,r9:dy$%,xt:fr$%",
 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)
+if(this.gVE(a)==null){z=this.gvl(a)
+this.sVE(a,P.bK(this.gEp(a),z,!0,null))}z=this.gVE(a)
 z.toString
-return H.VM(new P.Ln(z),[H.u3(z,0)])},
+return H.J(new P.rk(z),[H.u3(z,0)])},
 gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
+if(this.gVE(a)!=null){z=this.gVE(a)
+y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-W7Y:[function(a){var z,y,x,w
+WW:[function(a){var z,y,x,w
 z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
+if(z==null){z=H.J([],[F.d3])
 $.Oo=z}z.push(a)
-$.Nc=$.Nc+1
+$.dL=$.dL+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.rv(!0,!1,!0,C.Vc,!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],
+for(z=this.gbx(a),z=$.II().WT(0,z,new A.yM(!0,!1,!0,C.AP,!1,!1,C.fo,null)),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){x=J.DA(z.c)
+w=$.cp().Q.Q.p(0,x)
+if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+H.d(a)))
+y.q(0,x,w.$1(a))}this.sr9(a,y)},"$0","gvl",0,0,1],
+Fw:[function(a){if(this.gr9(a)!=null)this.sr9(a,null)},"$0","gEp",0,0,1],
 HC:function(a){var z,y
 z={}
-if(this.grJ(a)==null||!this.gnz(a))return!1
+if(this.gr9(a)==null||!this.gnz(a))return!1
 z.a=this.gxt(a)
 this.sxt(a,null)
-this.grJ(a).aN(0,new F.X6(z,a))
+this.gr9(a).aN(0,new F.X6(z,a))
 if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Ui(z.a),[T.yj])
-if(y.YM>=4)H.vh(y.Pq())
+y=this.gVE(a)
+z=H.J(new P.Eb(z.a),[T.yj])
+if(y.b>=4)H.vh(y.Pq())
 y.MW(z)
 return!0},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
+SZ:function(a,b){if(!this.gnz(a))return
 if(this.gxt(a)==null)this.sxt(a,[])
 this.gxt(a).push(b)},
 $isd3:true},
 X6:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a",
 $2:function(a,b){var z,y,x,w,v
-z=this.b
+z=this.a
 y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
+if(!J.mG(b,y)){x=this.Q
 w=x.a
 if(w==null){v=[]
 x.a=v
 x=v}else x=w
-x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.Zh(z).u(0,a,y)}},
-$isEH:true}}],["","",,A,{
+x.push(H.J(new T.qI(z,a,b,y),[null]))
+J.Xi(z).q(0,a,y)}}}}],["","",,A,{
 "^":"",
 xhq:{
-"^":"Pi;",
-gP:function(a){return this.Xq},
-sP:function(a,b){this.Xq=F.Wi(this,C.zd,this.Xq,b)},
-bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Xq)+">"},"$0","gCR",0,0,73]}}],["","",,Q,{
+"^":"Piz;",
+gM:function(a){return this.Q},
+sM:function(a,b){this.Q=F.Wi(this,C.zd,this.Q,b)},
+X:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.Q)+">"},"$0","gCR",0,0,0]}}],["","",,Q,{
 "^":"",
 wn:{
-"^":"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.Ln(z),[H.u3(z,0)])},
-gB:function(a){return this.XG.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.XG
+"^":"uFU;lr:Q@,a,b,cy$,db$",
+gXF:function(){var z=this.a
+if(z==null){z=P.bK(new Q.OA(this),null,!0,null)
+this.a=z}z.toString
+return H.J(new P.rk(z),[H.u3(z,0)])},
+gv:function(a){return this.b.length},
+sv:function(a,b){var z,y,x,w,v
+z=this.b
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
@@ -15534,144 +14993,145 @@
 w=b===0
 this.ct(this,C.ai,x,w)
 this.ct(this,C.nZ,!x,!w)
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){x=new H.wb()
+if(x)if(b<y){x=new H.ii()
 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))
+P.iZ(b,y,z.length,null,null,null)
 w=new H.bX(z,b,y)
 w.$builtinTypeInfo=[H.u3(x,0)]
-if(b<0)H.vh(P.N(b))
-if(y<0)H.vh(P.N(y))
-if(b>y)H.vh(P.TE(b,0,y))
+if(b<0)H.vh(P.ve(b,0,null,"start",null))
+if(y<0)H.vh(P.ve(y,0,null,"end",null))
+if(b>y)H.vh(P.ve(b,0,y,"start",null))
 x=w.br(0)
-w=new P.Ui(x)
+w=new P.Eb(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,0))}else{v=[]
-x=new P.Ui(v)
+x=new P.Eb(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.XG
+this.E2(new G.Zq(this,x,v,y,b-y))}C.Nm.sv(z,b)},
+p:function(a,b){var z=this.b
 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.XG
+q:function(a,b,c){var z,y,x,w
+z=this.b
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
 if(x){x=[y]
-w=new P.Ui(x)
+w=new P.Eb(x)
 w.$builtinTypeInfo=[null]
 this.E2(new G.Zq(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
 z[b]=c},
 gl0:function(a){return P.lD.prototype.gl0.call(this,this)},
 gor:function(a){return P.lD.prototype.gor.call(this,this)},
 Mh:function(a,b,c){var z,y,x
-z=J.x(c)
+z=J.t(c)
 if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.Mu
-if(z!=null){x=z.iE
+y=J.wS(c)
+z=this.a
+if(z!=null){x=z.c
 z=x==null?z!=null:x!==z}else z=!1
-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)},
+if(z&&y>0){z=this.b
+x=H.J(new H.ii(),[H.u3(z,0)])
+P.iZ(b,y,z.length,null,null,null)
+this.E2(G.K6(this,b,y,H.c1(z,b,y,H.u3(x,0)).br(0)))}z=this.b
+C.Nm.uy(z,"setAll")
+H.h8(z,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.XG
+z=this.b
 y=z.length
 this.Xy(y,y+1)
-x=this.Mu
-if(x!=null){w=x.iE
+x=this.a
+if(x!=null){w=x.c
 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.XG
+z=this.b
 y=z.length
 C.Nm.FV(z,b)
 this.Xy(y,z.length)
 x=z.length-y
-z=this.Mu
-if(z!=null){w=z.iE
+z=this.a
+if(z!=null){w=z.c
 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.XG,y=0;y<z.length;++y)if(J.xC(z[y],b)){this.oq(0,y,y+1)
+for(z=this.b,y=0;y<z.length;++y)if(J.mG(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.XG.length)H.vh(P.TE(b,0,this.gB(this)))
-y=!(c<b)
-if(!y||c>this.XG.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.XG
-v=w.length
-u=v-x
-this.ct(this,C.Wn,v,u)
-t=v===0
-u=u===0
-this.ct(this,C.ai,t,u)
-this.ct(this,C.nZ,!t,!u)
-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.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))
-z=new H.bX(w,b,c)
-z.$builtinTypeInfo=[H.u3(u,0)]
-if(b<0)H.vh(P.N(b))
-if(c<0)H.vh(P.N(c))
-if(b>c)H.vh(P.TE(b,0,c))
-z=z.br(0)
-y=new P.Ui(z)
-y.$builtinTypeInfo=[null]
-this.E2(new G.Zq(this,y,z,b,0))}C.Nm.oq(w,b,c)},
+oq:function(a,b,c){var z,y,x,w,v
+if(b<0||b>this.b.length)H.vh(P.ve(b,0,this.gv(this),null,null))
+if(c<b||c>this.b.length)H.vh(P.ve(c,b,this.gv(this),null,null))
+z=c-b
+y=this.b
+x=y.length
+w=x-z
+this.ct(this,C.Wn,x,w)
+v=x===0
+w=w===0
+this.ct(this,C.ai,v,w)
+this.ct(this,C.nZ,!v,!w)
+w=this.a
+if(w!=null){v=w.c
+w=v==null?w!=null:v!==w}else w=!1
+if(w&&z>0){w=new H.ii()
+w.$builtinTypeInfo=[H.u3(y,0)]
+P.iZ(b,c,y.length,null,null,null)
+v=new H.bX(y,b,c)
+v.$builtinTypeInfo=[H.u3(w,0)]
+if(b<0)H.vh(P.ve(b,0,null,"start",null))
+if(c<0)H.vh(P.ve(c,0,null,"end",null))
+if(b>c)H.vh(P.ve(b,0,c,"start",null))
+w=v.br(0)
+v=new P.Eb(w)
+v.$builtinTypeInfo=[null]
+this.E2(new G.Zq(this,v,w,b,0))}C.Nm.oq(y,b,c)},
 UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.XG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=J.x(c)
+if(b<0||b>this.b.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=J.t(c)
 if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.XG
+y=J.wS(c)
+z=this.b
 x=z.length
-C.Nm.sB(z,x+y)
+C.Nm.sv(z,x+y)
 w=z.length
+C.Nm.uy(z,"set range")
 H.qG(z,b+y,w,this,b)
+C.Nm.uy(z,"setAll")
 H.h8(z,b,c)
 this.Xy(x,z.length)
-z=this.Mu
-if(z!=null){w=z.iE
+z=this.a
+if(z!=null){w=z.c
 z=w==null?z!=null:w!==z}else z=!1
 if(z&&y>0)this.E2(G.K6(this,b,y,null))},
-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
+aP:function(a,b,c){var z,y,x
+if(b>this.b.length)throw H.b(P.ve(b,0,this.gv(this),null,null))
+z=this.b
 y=z.length
 if(b===y){this.h(0,c)
-return}C.Nm.sB(z,y+1)
+return}C.Nm.sv(z,y+1)
 y=z.length
+C.Nm.uy(z,"set range")
 H.qG(z,b+1,y,this,b)
 y=z.length
 this.Xy(y-1,y)
-y=this.Mu
-if(y!=null){x=y.iE
+y=this.a
+if(y!=null){x=y.c
 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.Mu
-if(z!=null){y=z.iE
+z=this.a
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
-if(this.lr==null){this.lr=[]
-P.rb(this.gL6())}this.lr.push(a)},
+if(this.Q==null){this.Q=[]
+P.rb(this.gL6())}this.Q.push(a)},
 Xy:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
@@ -15679,2216 +15139,2134 @@
 this.ct(this,C.ai,z,y)
 this.ct(this,C.nZ,!z,!y)},
 oCy:[function(){var z,y,x
-z=this.lr
+z=this.Q
 if(z==null)return!1
 y=G.Qi(this,z)
-this.lr=null
-z=this.Mu
-if(z!=null){x=z.iE
+this.Q=null
+z=this.a
+if(z!=null){x=z.c
 x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Ui(y),[G.Zq])
-if(z.YM>=4)H.vh(z.Pq())
+if(x&&y.length!==0){x=H.J(new P.Eb(y),[G.Zq])
+if(z.b>=4)H.vh(z.Pq())
 z.MW(x)
 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])},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()
+static:{pT:function(a,b){var z=H.J([],[b])
+return H.J(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.p("can't use same list for previous and current"))
+for(z=J.Nx(c),y=J.w1(b);z.D();){x=z.gk()
 w=J.RE(x)
 v=J.WB(w.gvH(x),x.gNg())
-u=J.WB(w.gvH(x),x.gRt().G4.length)
-t=y.Yc(b,w.gvH(x),v)
+u=J.WB(w.gvH(x),x.gRt().Q.length)
+t=y.Mu(b,w.gvH(x),v)
 w=w.gvH(x)
-s=J.Wx(w)
-if(s.C(w,0)||s.D(w,a.length))H.vh(P.TE(w,0,a.length))
-r=J.Wx(u)
-if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
-q=r.W(u,w)
-p=t.gB(t)
-r=J.Wx(q)
-if(r.F(q,p)){o=r.W(q,p)
-n=s.g(w,p)
-s=a.length
-if(typeof o!=="number")return H.s(o)
-m=s-o
+P.iZ(w,u,a.length,null,null,null)
+s=J.D5(u,w)
+r=t.gv(t)
+q=J.Wx(s)
+p=J.rv(w)
+if(q.C(s,r)){o=q.T(s,r)
+n=p.g(w,r)
+q=a.length
+if(typeof o!=="number")return H.o(o)
+m=q-o
 H.qG(a,w,n,t,0)
 if(o!==0){H.qG(a,n,m,a,u)
-C.Nm.sB(a,m)}}else{o=J.bI(p,q)
-r=a.length
-if(typeof o!=="number")return H.s(o)
-l=r+o
-n=s.g(w,p)
-C.Nm.sB(a,l)
+C.Nm.sv(a,m)}}else{o=J.D5(r,s)
+q=a.length
+if(typeof o!=="number")return H.o(o)
+l=q+o
+n=p.g(w,r)
+C.Nm.sv(a,l)
 H.qG(a,n,l,a,u)
 H.qG(a,w,n,t,0)}}}}},
 uFU:{
-"^":"ark+Pi;",
+"^":"ark+Piz;",
 $isd3:true},
-xb:{
-"^":"TpZ:76;a",
-$0:function(){this.a.Mu=null},
-$isEH:true}}],["","",,V,{
+OA:{
+"^":"r:77;Q",
+$0:function(){this.Q.a=null}}}],["","",,V,{
 "^":"",
 ya:{
-"^":"yj;nl>,jL,zZ,aC,w5",
-bu:[function(a){var z
-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],
+"^":"yj;G3:Q>,a,b,c,d",
+X:[function(a){var z
+if(this.c)z="insert"
+else z=this.d?"remove":"set"
+return"#<MapChangeRecord "+z+" "+H.d(this.Q)+" from: "+H.d(this.a)+" to: "+H.d(this.b)+">"},"$0","gCR",0,0,0],
 $isya:true},
 qC:{
-"^":"Pi;LL,Vg,fn",
-gvc:function(a){var z=this.LL
+"^":"Piz;Q,cy$,db$",
+gvc:function(a){var z=this.Q
 return z.gvc(z)},
-gUQ:function(a){var z=this.LL
+gUQ:function(a){var z=this.Q
 return z.gUQ(z)},
-gB:function(a){var z=this.LL
-return z.gB(z)},
-gl0:function(a){var z=this.LL
-return z.gB(z)===0},
-gor:function(a){var z=this.LL
-return z.gB(z)!==0},
-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
+gv:function(a){var z=this.Q
+return z.gv(z)},
+gl0:function(a){var z=this.Q
+return z.gv(z)===0},
+gor:function(a){var z=this.Q
+return z.gv(z)!==0},
+NZ:function(a,b){return this.Q.NZ(0,b)},
+p:function(a,b){return this.Q.p(0,b)},
+q:function(a,b,c){var z,y,x,w
+z=this.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
-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)
-if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
-this.nq(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
-this.ld()}else if(!J.xC(w,c)){this.nq(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
-this.nq(this,H.VM(new T.qI(this,C.l4,null,null),[null]))}},
+if(!z){this.Q.q(0,b,c)
+return}z=this.Q
+x=z.gv(z)
+w=z.p(0,b)
+z.q(0,b,c)
+if(x!==z.gv(z)){F.Wi(this,C.Wn,x,z.gv(z))
+this.SZ(this,H.J(new V.ya(b,null,c,!0,!1),[null,null]))
+this.ld()}else if(!J.mG(w,c)){this.SZ(this,H.J(new V.ya(b,w,c,!1,!1),[null,null]))
+this.SZ(this,H.J(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.LL
-y=z.gB(z)
+z=this.Q
+y=z.gv(z)
 x=z.Rz(0,b)
-w=this.Vg
-if(w!=null){v=w.iE
+w=this.cy$
+if(w!=null){v=w.c
 w=v==null?w!=null:v!==w}else w=!1
-if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.ya(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))
+if(w&&y!==z.gv(z)){this.SZ(this,H.J(new V.ya(b,x,null,!1,!0),[null,null]))
+F.Wi(this,C.Wn,y,z.gv(z))
 this.ld()}return x},
 V1:function(a){var z,y,x,w
-z=this.LL
-y=z.gB(z)
-x=this.Vg
-if(x!=null){w=x.iE
+z=this.Q
+y=z.gv(z)
+x=this.cy$
+if(x!=null){w=x.c
 x=w==null?x!=null:w!==x}else x=!1
 if(x&&y>0){z.aN(0,new V.Lo(this))
 F.Wi(this,C.Wn,y,0)
 this.ld()}z.V1(0)},
-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]))},
+aN:function(a,b){return this.Q.aN(0,b)},
+X:[function(a){return P.vW(this)},"$0","gCR",0,0,0],
+ld:function(){this.SZ(this,H.J(new T.qI(this,C.SY,null,null),[null]))
+this.SZ(this,H.J(new T.qI(this,C.l4,null,null),[null]))},
 $isqC:true,
-$isT8:true,
-$asT8:null,
+$isw:true,
+$asw:null,
 static:{AB:function(a,b,c){var z,y
-z=J.x(a)
-if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
+z=J.t(a)
+if(!!z.$isBa)y=H.J(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.J(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.J(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
-"^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,79,20,"call"],
-$isEH:true,
-$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.a,"qC")}},
+"^":"r;Q",
+$2:[function(a,b){this.Q.q(0,a,b)},"$2",null,4,0,null,81,21,"call"],
+$signature:function(){return H.oZ(function(a,b){return{func:"oKp",args:[a,b]}},this.Q,"qC")}},
 Lo:{
-"^":"TpZ:81;a",
-$2:function(a,b){var z=this.a
-z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
-$isEH:true}}],["","",,Y,{
+"^":"r:80;Q",
+$2:function(a,b){var z=this.Q
+z.SZ(z,H.J(new V.ya(a,b,null,!1,!0),[null,null]))}}}],["","",,Y,{
 "^":"",
-cU:{
-"^":"Ap;Os,he,mD,iI,A2",
-bl:function(a){return this.he.$1(a)},
-WM:function(a){return this.iI.$1(a)},
+aU:{
+"^":"Ap;Q,a,b,c,d",
+ip:function(a){return this.a.$1(a)},
+kk:function(a){return this.c.$1(a)},
 TR:function(a,b){var z
-this.iI=b
-z=this.bl(J.mu(this.Os,this.gYZ()))
-this.A2=z
+this.c=b
+z=this.ip(J.mu(this.Q,this.ghz()))
+this.d=z
 return z},
-pN:[function(a){var z=this.bl(a)
-if(J.xC(z,this.A2))return
-this.A2=z
-return this.WM(z)},"$1","gYZ",2,0,12,60],
-xO:function(a){var z=this.Os
-if(z!=null)J.yd(z)
-this.Os=null
-this.he=null
-this.mD=null
-this.iI=null
-this.A2=null},
-gP:function(a){var z=this.bl(J.Vm(this.Os))
-this.A2=z
+ab:[function(a){var z=this.ip(a)
+if(J.mG(z,this.d))return
+this.d=z
+return this.kk(z)},"$1","ghz",2,0,14,62],
+xO:function(a){var z=this.Q
+if(z!=null)J.xl(z)
+this.Q=null
+this.a=null
+this.b=null
+this.c=null
+this.d=null},
+gM:function(a){var z=this.ip(J.SW(this.Q))
+this.d=z
 return z},
-sP:function(a,b){J.Fc(this.Os,b)},
-fR:function(){return this.Os.fR()}}}],["","",,L,{
+sM:function(a,b){J.Ja(this.Q,b)},
+fR:function(){return this.Q.fR()}}}],["","",,L,{
 "^":"",
-yfW:function(a,b){var z,y,x,w,v
+B2:function(a,b){var z,y,x,w,v
 if(a==null)return
 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)))return J.UQ(a,b)}else{z=b
-if(typeof z==="string")return J.UQ(a,b)
-else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.t(a).$isWO&&J.u6(b,0)&&J.UN(b,J.wS(a)))return J.Tf(a,b)}else{z=b
+if(typeof z==="string")return J.Tf(a,b)
+else if(!!J.t(b).$isIN){z=a
+y=H.RB(z,"$isueT",[P.I,null],"$asueT")
 if(!y){z=a
-y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
+y=H.RB(z,"$isw",[P.I,null],"$asw")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z)return J.UQ(a,$.Mg().xV.af.t(0,b))
+if(z)return J.Tf(a,$.Mg().Q.e.p(0,b))
 try{z=a
 y=b
-x=$.cp().xV.II.t(0,y)
-if(x==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+H.d(z)))
+x=$.cp().Q.Q.p(0,y)
+if(x==null)H.vh(O.lA("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=$.mX().NW(z,C.OV)
+return z}catch(w){if(!!J.t(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()
-if(z.mL(C.EkO))z.kS("can't get "+H.d(b)+" in "+H.d(a))
+if(z.mL(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
 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.kW(a,b,c)
-return!0}}else if(!!J.x(b).$isIN){z=a
-y=H.RB(z,"$isueT",[P.qU,null],"$asueT")
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.t(a).$isWO&&J.u6(b,0)&&J.UN(b,J.wS(a))){J.H9(a,b,c)
+return!0}}else if(!!J.t(b).$isIN){z=a
+y=H.RB(z,"$isueT",[P.I,null],"$asueT")
 if(!y){z=a
-y=H.RB(z,"$isT8",[P.qU,null],"$asT8")
+y=H.RB(z,"$isw",[P.I,null],"$asw")
 z=y&&!C.Nm.tg(C.WK,b)}else z=!0
-if(z){J.kW(a,$.Mg().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(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
-if(z.mL(C.EkO))z.kS("can't set "+H.d(b)+" in "+H.d(a))
+if(z){J.H9(a,$.Mg().Q.e.p(0,b),c)
+return!0}try{$.cp().Q1(a,b,c)
+return!0}catch(x){if(!!J.t(H.Ru(x)).$isJS){z=J.bB(a)
+if(!$.II().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
+if(z.mL(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 WR:{
-"^":"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)},
+"^":"ARh;d,e,f,Q,a,b,c",
+gIi:function(a){return this.d},
+sM:function(a,b){var z=this.d
+if(z!=null)z.rL(this.e,b)},
 gDJ:function(){return 2},
-TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
-Ej:function(a){this.IE=L.KJ(this,this.Lq)
+TR:function(a,b){return this.kv(this,b)},
+Ej:function(a){this.f=L.KJ(this,this.e)
 this.CG(!0)},
-U9:function(){this.z7=null
-this.HS=null
-this.Lq=null},
-VC:function(a){this.HS.I5(this.Lq,a)},
+Wm:function(){this.b=null
+this.d=null
+this.e=null},
+QC:function(a){this.d.KJ(this.e,a)},
 CG:function(a){var z,y
-z=this.z7
-y=this.HS.WK(this.Lq)
-this.z7=y
-if(a||J.xC(y,z))return!1
-this.dC(this.z7,z,this)
+z=this.b
+y=this.d.Tl(this.e)
+this.b=y
+if(a||J.mG(y,z))return!1
+this.vk(this.b,z,this)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zl:{
-"^":"a;T7",
-gB:function(a){return this.T7.length},
-gl0:function(a){return this.T7.length===0},
+Tv:{
+"^":"a;Q",
+gv:function(a){return this.Q.length},
+gl0:function(a){return this.Q.length===0},
 gPu:function(){return!0},
-bu:[function(a){var z,y,x,w,v,u
+X:[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.Ff
-v=J.x(w)
-if(!!v.$isIN){if(!x)z.IN+="."
-u=$.Mg().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="[\""+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
+for(y=this.Q,y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=!0;y.D();x=!1){w=y.c
+v=J.t(w)
+if(!!v.$isIN){if(!x)z.Q+="."
+u=$.Mg().Q.e.p(0,w)
+z.Q+=typeof u==="string"?u:H.d(u)}else if(typeof w==="number"&&Math.floor(w)===w){v="["+H.d(w)+"]"
+z.Q+=v}else{v="[\""+H.d(J.JA(v.X(w),"\"","\\\""))+"\"]"
+z.Q+=v}}y=z.Q
+return y.charCodeAt(0)==0?y:y},"$0","gCR",0,0,0],
+m:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
-if(!J.x(b).$isZl)return!1
+if(!J.t(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.T7
+z=this.Q
 y=z.length
-x=b.T7
+x=b.Q
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
-if(!J.xC(v,x[w]))return!1}return!0},
+if(!J.mG(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.T7,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Q,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
-if(typeof v!=="number")return H.s(v)
+if(typeof v!=="number")return H.o(v)
 x=536870911&x+v
 x=536870911&x+((524287&x)<<10>>>0)
 x^=x>>>6}x=536870911&x+((67108863&x)<<3>>>0)
 x^=x>>>11
 return 536870911&x+((16383&x)<<15>>>0)},
-WK:function(a){var z,y
+Tl: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.Ff
+for(z=this.Q,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
 if(a==null)return
-a=L.yfW(a,y)}return a},
+a=L.B2(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.T7
+z=this.Q
 y=z.length-1
 if(y<0)return!1
 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)
+a=L.B2(a,z[x])}if(y>=z.length)return H.e(z,y)
 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
+KJ:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Q.length===0)return
+z=this.Q
 y=z.length-1
-for(x=0;a!=null;x=w){if(0>=z.length)return H.e(z,0)
-b.$2(a,z[0])
+for(x=0;a!=null;x=w){if(x>=z.length)return H.e(z,x)
+b.$2(a,z[x])
 if(x>=y)break
 w=x+1
 if(x>=z.length)return H.e(z,x)
-a=L.yfW(a,z[x])}},
-$isZl:true,
+a=L.B2(a,z[x])}},
+$isTv:true,
 static:{hk:function(a){var z,y,x,w,v,u,t
-z=J.x(a)
-if(!!z.$isZl)return a
+z=J.t(a)
+if(!!z.$isTv)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)
+if(!!J.t(a).$isWO){y=P.z(a,!1,null)
 z=new H.a7(y,y.length,0,null)
 z.$builtinTypeInfo=[H.u3(y,0)]
-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)
+for(;z.D();){x=z.c
+if((typeof x!=="number"||Math.floor(x)!==x)&&typeof x!=="string"&&!J.t(x).$isIN)throw H.b(P.p("List must contain only ints, Strings, and Symbols"))}return new L.Tv(y)}z=$.aB()
+w=z.p(0,a)
 if(w!=null)return w
-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 $.RZ()
-w=new L.Zl(C.Nm.tt(v,!1))
-if(z.X5>=100){u=new P.i5(z)
+v=new L.Pw([],-1,null,P.B(["beforePath",P.B(["ws",["beforePath"],"ident",["inIdent","append"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"inPath",P.B(["ws",["inPath"],".",["beforeIdent"],"[",["beforeElement"],"eof",["afterPath"]],null,null),"beforeIdent",P.B(["ws",["beforeIdent"],"ident",["inIdent","append"]],null,null),"inIdent",P.B(["ident",["inIdent","append"],"0",["inIdent","append"],"number",["inIdent","append"],"ws",["inPath","push"],".",["beforeIdent","push"],"[",["beforeElement","push"],"eof",["afterPath","push"]],null,null),"beforeElement",P.B(["ws",["beforeElement"],"0",["afterZero","append"],"number",["inIndex","append"],"'",["inSingleQuote","append",""],"\"",["inDoubleQuote","append",""]],null,null),"afterZero",P.B(["ws",["afterElement","push"],"]",["inPath","push"]],null,null),"inIndex",P.B(["0",["inIndex","append"],"number",["inIndex","append"],"ws",["afterElement"],"]",["inPath","push"]],null,null),"inSingleQuote",P.B(["'",["afterElement"],"eof",["error"],"else",["inSingleQuote","append"]],null,null),"inDoubleQuote",P.B(["\"",["afterElement"],"eof",["error"],"else",["inDoubleQuote","append"]],null,null),"afterElement",P.B(["ws",["afterElement"],"]",["inPath","push"]],null,null)],null,null)).pI(a)
+if(v==null)return $.Nc()
+w=new L.Tv(C.Nm.tt(v,!1))
+if(z.Q>=100){u=new P.i5(z)
 u.$builtinTypeInfo=[H.u3(z,0)]
-t=u.gA(u)
-if(!t.G())H.vh(H.DU())
-z.Rz(0,t.gl())}z.u(0,a,w)
+t=u.gu(u)
+if(!t.D())H.vh(H.DU())
+z.Rz(0,t.gk())}z.q(0,a,w)
 return w}}},
 vH:{
-"^":"Zl;T7",
+"^":"Tv;Q",
 gPu:function(){return!1},
-static:{"^":"dY"}},
-lPa:{
-"^":"TpZ:76;",
-$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},
-iF:{
-"^":"a;vc>,vH>,nl*,ep",
+static:{"^":"HS"}},
+MdQ:{
+"^":"r:77;",
+$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)}},
+Pw:{
+"^":"a;vc:Q>,vH:a>,G3:b*,c",
 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.eT([a])
+switch(a){case 91:case 93:case 46:case 34:case 39:case 48:return P.Qe([a],0,null)
 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)
+case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}if(typeof a!=="number")return H.o(a)
 if(!(97<=a&&a<=122))z=65<=a&&a<=90
 else z=!0
 if(z)return"ident"
 if(49<=a&&a<=57)return"number"
 return"else"},
-rXF:function(){var z,y,x,w
-z=this.nl
+rX:function(a){var z,y,x,w
+z=this.b
 if(z==null)return
-z=$.cx().B0(z)
-y=this.vc
-x=this.nl
-if(z)y.push($.Mg().xV.T4.t(0,x))
+z=$.EN().zD(z)
+y=this.Q
+x=this.b
+if(z)y.push($.Mg().Q.f.p(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
-this.nl=z==null?b:H.d(z)+H.d(b)},
-jN:function(a,b){var z,y,x
-z=this.vH
+y.push(w!=null?w:this.b)}this.b=null},
+MM:function(a,b){var z=this.b
+this.b=z==null?b:H.d(z)+H.d(b)},
+lA:function(a,b){var z,y,x
+z=this.a
 y=b.length
 if(z>=y)return!1;++z
 if(z<0||z>=y)return H.e(b,z)
-z=b[z]
-x=H.eT([z])
+x=P.Qe([b[z]],0,null)
 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
+if(z){++this.a
+z=this.b
+this.b=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
-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}},
+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.c,x=z.length,w="beforePath";w!=null;){v=++this.a
+if(v>=x)u=null
+else{if(v<0)return H.e(z,v)
+u=z[v]}if(u!=null&&P.Qe([u],0,null)==="\\"&&this.lA(w,z))continue
+t=this.Xn(u)
+if(J.mG(w,"error"))return
+s=y.p(0,w)
+r=s.p(0,t)
+if(r==null)r=s.p(0,"else")
+if(r==null)return
+v=J.U6(r)
+w=v.p(r,0)
+q=v.gv(r)>1?v.p(r,1):null
+p=J.t(q)
+if(p.m(q,"push")&&this.b!=null)this.rX(0)
+if(p.m(q,"append")){if(v.gv(r)>2){v.p(r,2)
+p=!0}else p=!1
+o=p?v.p(r,2):P.Qe([u],0,null)
+v=this.b
+this.b=v==null?o:H.d(v)+H.d(o)}if(w==="afterPath")return this.Q}return}},
 PD:{
-"^":"TpZ:12;",
-$1:function(a){return},
-$isEH:true},
-nQ:{
-"^":"ARh;IE,pu,vl,zo,dR,z7,KZ",
+"^":"r:14;",
+$1:function(a){return}},
+NV:{
+"^":"ARh;d,e,f,Q,a,b,c",
 gDJ:function(){return 3},
-TR:function(a,b){return L.ARh.prototype.TR.call(this,this,b)},
+TR:function(a,b){return this.kv(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.zr){z=$.rf
-if(z!=null){y=z.Ou
+for(z=this.f,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.aZ){z=$.rf
+if(z!=null){y=z.Q
 y=y==null?w!=null:y!==w}else y=!0
-if(y){z=w==null?null:P.Ls(null,null,null,null)
-z=new L.XU(w,z,[],null)
-$.rf=z}if(z.Ou==null){z.Ou=w
-z.pe=P.Ls(null,null,null,null)}z.JD.push(this)
-this.VC(z.gUu(z))
-this.IE=null
-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.zr){w=z+1
+if(y){z=w==null?null:P.fM(null,null,null,null)
+z=new L.Og(w,z,[],null)
+$.rf=z}if(z.Q==null){z.Q=w
+z.a=P.fM(null,null,null,null)}z.b.push(this)
+this.QC(z.gTT(z))
+this.d=null
+break}}this.CG(!this.e)},
+Wm:function(){var z,y,x,w
+for(z=0;y=this.f,x=y.length,z<x;z+=2)if(y[z]===C.aZ){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===$.ljh||z===$.ls)throw H.b(P.w("Cannot add paths once started."))
+J.xl(y[w])}this.f=null
+this.b=null},
+WX:function(a,b){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Cannot add paths once started."))
 b=L.hk(b)
-z=this.vl
+z=this.f
 z.push(a)
 z.push(b)
-if(!this.pu)return
-J.bi(this.z7,b.WK(a))},
+if(!this.e)return
+J.dH(this.b,b.Tl(a))},
 ti:function(a){return this.WX(a,null)},
-YU:function(a){var z=this.KZ
-if(z===$.ljh||z===$.ls)throw H.b(P.w("Cannot add observers once started."))
-z=this.vl
-z.push(C.zr)
+Qs:function(a){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Cannot add observers once started."))
+z=this.f
+z.push(C.aZ)
 z.push(a)
-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.zr){v=z+1
+if(!this.e)return
+J.dH(this.b,J.mu(a,new L.bjd(this)))},
+QC:function(a){var z,y,x,w,v
+for(z=0;y=this.f,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.aZ){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isZl").I5(w,a)}}},
+H.Go(y[v],"$isTv").KJ(w,a)}}},
 CG:function(a){var z,y,x,w,v,u,t,s,r
-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]
+J.RS(this.b,C.jn.BU(this.f.length,2))
+for(z=!1,y=null,x=0;w=this.f,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.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
+if(u===C.aZ){H.Go(s,"$isAp")
+r=this.c===$.qF?s.TR(0,new L.R2(this)):s.gM(s)}else r=H.Go(s,"$isTv").Tl(u)
+if(a){J.H9(this.b,C.jn.BU(x,2),r)
+continue}w=this.b
 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(J.mG(r,J.Tf(w,v)))continue
+w=this.a
+if(typeof w!=="number")return w.C()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.z7,v))}J.kW(this.z7,v,r)
+y.q(0,v,J.Tf(this.b,v))}J.H9(this.b,v,r)
 z=!0}if(!z)return!1
-this.dC(this.z7,y,w)
+this.vk(this.b,y,w)
 return!0},
 mX:function(){return this.CG(!1)},
 $isAp:true},
-Zu:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
-return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-vI:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.KZ===$.ljh)z.fl()
-return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+bjd:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.c===$.ljh)z.fl()
+return},"$1",null,2,0,null,15,"call"]},
+R2:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.c===$.ljh)z.fl()
+return},"$1",null,2,0,null,15,"call"]},
 iNc:{
 "^":"a;"},
 ARh:{
 "^":"Ap;",
-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===$.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.RI(b))
+Yd:function(){return this.Q.$0()},
+d1:function(a){return this.Q.$1(a)},
+qk:function(a,b){return this.Q.$2(a,b)},
+hw:function(a,b,c){return this.Q.$3(a,b,c)},
+gB9:function(){return this.c===$.ljh},
+TR:["kv",function(a,b){var z=this.c
+if(z===$.ljh||z===$.H2)throw H.b(P.s("Observer has already been opened."))
+if(X.Cz(b)>this.gDJ())throw H.b(P.p("callback should take "+this.gDJ()+" or fewer arguments"))
+this.Q=b
+this.a=P.C(this.gDJ(),X.aA(b))
 this.Ej(0)
-this.KZ=$.ljh
-return this.z7},
-gP:function(a){this.CG(!0)
-return this.z7},
-xO:function(a){if(this.KZ!==$.ljh)return
-this.U9()
-this.z7=null
-this.zo=null
-this.KZ=$.ls},
-fR:function(){if(this.KZ===$.ljh)this.fl()},
+this.c=$.ljh
+return this.b}],
+gM:function(a){this.CG(!0)
+return this.b},
+xO:function(a){if(this.c!==$.ljh)return
+this.Wm()
+this.b=null
+this.Q=null
+this.c=$.H2},
+fR:function(){if(this.c===$.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
-try{switch(this.dR){case 0:this.Yd()
+vk:function(a,b,c){var z,y,x,w
+try{switch(this.a){case 0:this.Yd()
 break
 case 1:this.d1(a)
 break
 case 2:this.qk(a,b)
 break
-case 3:this.Tu(a,b,c)
+case 3:this.hw(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)}}},
-XU:{
-"^":"a;Ou,pe,JD,YR",
-zJ:[function(a,b,c){var z=this.Ou
-if(b==null?z==null:b===z)this.pe.h(0,c)
-z=J.x(b)
+y=new H.XO(x,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0(z,y)}}},
+Og:{
+"^":"a;Q,a,b,c",
+zJ:[function(a,b,c){var z=this.Q
+if(b==null?z==null:b===z)this.a.h(0,c)
+z=J.t(b)
 if(!!z.$iswn)this.hr(b.gXF())
-if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gUu",4,0,183,96,184],
-hr:function(a){var z=this.YR
+if(!!z.$isd3)this.hr(z.gqh(b))},"$2","gTT",4,0,183,96,184],
+hr:function(a){var z=this.c
 if(z==null){z=P.YM(null,null,null,null,null)
-this.YR=z}if(!z.NZ(0,a))this.YR.u(0,a,a.yI(this.gCP()))},
-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.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.pe.tg(0,y.kW))return!1}else return!1}return!0},
-Fk0:[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.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,185],
+this.c=z}if(!z.NZ(0,a))this.c.q(0,a,a.yI(this.gCP()))},
+kR:function(a){var z,y,x,w
+for(z=J.Nx(a);z.D();){y=z.gk()
+x=J.t(y)
+if(!!x.$isqI){if(y.Q!==this.Q||this.a.tg(0,y.a))return!1}else if(!!x.$isZq){x=y.Q
+w=this.Q
+if((x==null?w!=null:x!==w)||this.a.tg(0,y.c))return!1}else return!1}return!0},
+uG:[function(a){var z,y,x
+if(this.kR(a))return
+for(z=this.b,y=C.Nm.tt(z,!1),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=y.c
+if(x.gB9())x.QC(this.gTT(this))}for(z=C.Nm.tt(z,!1),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){x=z.c
+if(x.gB9())x.mX()}},"$1","gCP",2,0,20,185],
 static:{"^":"rf",KJ:function(a,b){var z,y
 z=$.rf
-if(z!=null){y=z.Ou
+if(z!=null){y=z.Q
 y=y==null?b!=null:y!==b}else y=!0
-if(y){z=b==null?null:P.Ls(null,null,null,null)
-z=new L.XU(b,z,[],null)
-$.rf=z}if(z.Ou==null){z.Ou=b
-z.pe=P.Ls(null,null,null,null)}z.JD.push(a)
-a.VC(z.gUu(z))}}}}],["","",,R,{
+if(y){z=b==null?null:P.fM(null,null,null,null)
+z=new L.Og(b,z,[],null)
+$.rf=z}if(z.Q==null){z.Q=b
+z.a=P.fM(null,null,null,null)}z.b.push(a)
+a.QC(z.gTT(z))}}}}],["","",,R,{
 "^":"",
 tB:[function(a){var z,y,x
-z=J.x(a)
+z=J.t(a)
 if(!!z.$isd3)return a
-if(!!z.$isT8){y=V.AB(a,null,null)
+if(!!z.$isw){y=V.AB(a,null,null)
 z.aN(a,new R.Fk(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
+return y}if(!!z.$isQV){z=z.ez(a,R.WZ())
 x=Q.pT(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,12,20],
+return x}return a},"$1","WZ",2,0,14,21],
 Fk:{
-"^":"TpZ:81;a",
-$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,{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,R.tB(a),R.tB(b))}}}],["","",,A,{
 "^":"",
-ec:function(a,b,c){var z=$.lx()
-if(z==null||$.Snm()!==!0)return
-z.V7("shimStyling",[a,b,c])},
-q3:function(a){var z,y,x,w,v
+YG:function(a,b,c){var z=$.lx()
+if(z==null||$.oo()!==!0)return
+z.Z("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
 if($.UG)return""
 w=J.RE(a)
-z=w.gmH(a)
-if(J.xC(z,""))z=w.gQg(a).dA.getAttribute("href")
+z=w.gLU(a)
+if(J.mG(z,""))z=w.gQg(a).Q.getAttribute("href")
 try{w=new XMLHttpRequest()
-C.W3.i3(w,"GET",z,!1)
+C.Dt.i3(w,"GET",z,!1)
 w.send()
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
-if(!!J.x(w).$isBK){y=w
-x=new H.oP(v,null)
-$.Is().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+if(!!J.t(w).$isNh){y=w
+x=new H.XO(v,null)
+$.eU().Ny("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=$.Mg().xV.af.t(0,a)
+z=$.Mg().Q.e.p(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],
-Ad:function(a,b){$.lQ().u(0,a,b)
-H.Go(J.UQ($.Xw(),"Polymer"),"$isr7").PO([a])},
+y=J.NH(z)
+return y.C1(z,"Changed")&&!y.m(z,"attributeChanged")},"$1","F4",2,0,66,67],
+Ad:function(a,b){var z
+$.lC().q(0,a,b)
+z=$.Xw()
+H.Go(J.Tf(z,"Polymer"),"$isr7").PO([a])
+H.Go(J.Tf(J.Tf(z,"HTMLElement"),"register"),"$isr7").PO([a,J.Tf(J.Tf(z,"HTMLElement"),"prototype")])},
 ZI:function(a,b){var z,y,x,w
 if(a==null)return
 document
-if($.Snm()===!0)b=document.head
+if($.oo()===!0)b=document.head
 z=document.createElement("style",null)
-J.t3(z,J.yO(a))
+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.ae(C.t5.grZ(w.jt))}b.insertBefore(z,x)},
-Zw:function(){A.c4()
-if($.UG){A.X1($.M6,!0)
+if(w.gor(w))x=J.QP(C.t5.grZ(w.Q))}b.insertBefore(z,x)},
+Ok:function(){A.c4()
+if($.UG){A.X1($.MU,!0)
 return $.X3}var z=$.X3.iT(O.Ht())
 z.Gr(new A.mS())
 return z},
 X1:function(a,b){var z,y
-if($.HE)throw H.b("Initialization was already done.")
-$.HE=!0
+if($.DG)throw H.b("Initialization was already done.")
+$.DG=!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.nj)
+A.Ad("auto-binding-dart",C.CR)
 z=document.createElement("polymer-element",null)
 z.setAttribute("name","auto-binding-dart")
 z.setAttribute("extends","template")
-J.UQ($.Dw(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,96,0,null),[H.u3(a,0)]);y.G();)y.Ff.$0()},
+J.Tf($.XX(),"init").qP([],z)
+for(y=H.J(new H.a7(a,96,0,null),[H.u3(a,0)]);y.D();)y.c.$0()
+A.bS()},
 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."))
+z=J.Tf($.Xw(),"Polymer")
+if(z==null)throw H.b(P.s("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($.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.kW($.Dw(),"register",P.mt(new A.k2(y,x)))},
-c4:function(){var z,y,x,w
+z.Z("whenPolymerReady",[y.ce(new A.XR())])
+x=J.Tf($.XX(),"register")
+if(x==null)throw H.b(P.s("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+J.H9($.XX(),"register",P.mt(new A.k2(y,x)))},
+c4:function(){var z,y,x,w,v
 z={}
 $.RL=!0
-y=J.UQ($.Xw(),"logFlags")
-z.a=y
-if(y==null)z.a=P.Fl(null,null)
-x=[$.dn(),$.vo(),$.iX(),$.Lu(),$.ek(),$.lg()]
-w=N.QM("polymer")
-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())},
-So:{
-"^":"a;FL>,t5>,Jh<,oc>,Q7<,tN<,ws>,Gl<,PH<,ix<,y0,G9,wX>,mR<,WV,vT",
+y=J.Tf($.Xw(),"WebComponents")
+x=y==null||J.Tf(y,"flags")==null?P.A(null,null):J.Tf(J.Tf(y,"flags"),"log")
+z.a=x
+if(x==null)z.a=P.A(null,null)
+w=[$.FX(),$.Uk(),$.UW(),$.aQ(),$.Is(),$.zG()]
+v=N.QM("polymer")
+if(!H.Ck(w,new A.j0(z))){v.sOR(C.oO)
+return}H.J(new H.U5(w,new A.j0N(z)),[H.u3(H.J(new H.ii(),[H.u3(w,0)]),0)]).aN(0,new A.MZ6())
+v.gY().yI(new A.mqr())},
+bS:function(){var z={}
+z.a=J.wS($.uj().Z("waitingFor",[null]))
+z.b=null
+P.SZ(P.xC(0,0,0,0,0,1),new A.yd(z))},
+XP:{
+"^":"a;FL:Q>,t5:a>,P1:b<,oc:c>,Q7:d<,DB:e<,Tw:f>,iz:r<,CY:x<,ix:y<,z,ch,ZJ:cx>,mR:cy<,db,dx",
 gZf:function(){var z,y
-z=J.yR(this.FL,"template")
-if(z!=null)y=J.f5(!!J.x(z).$isvy?z:M.Xi(z))
+z=J.Eh(this.Q,"template")
+if(z!=null)y=J.NB(!!J.t(z).$ishs?z:M.uH(z))
 else y=null
 return y},
+IW:function(a){var z,y
+if($.c0().tg(0,a)){z="Cannot define property \""+H.d(a)+"\" for element \""+H.d(this.c)+"\" because it has the same name as an HTMLElement property, and not all browsers support overriding that. Consider giving it a different name. "
+y=$.oK
+if(y==null)H.qw(z)
+else y.$1(z)
+return!0}return!1},
 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.gJh()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.uj()
+for(z=null,y=this;y!=null;){z=J.Vs(J.y3(y)).Q.getAttribute("extends")
+y=y.gP1()}x=document
+W.wi(window,x,a,this.a,z)},
+RH:function(a){var z=$.uj()
 if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
+J.Tf(z,"urlResolver").Z("resolveDom",[a])},
 Zw:function(a){var z,y,x,w,v,u,t,s,r,q
 if(a!=null){if(a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-this.Q7=y}if(a.gix()!=null){z=a.gix()
-y=P.Ls(null,null,null,null)
+this.d=y}if(a.gix()!=null){z=a.gix()
+y=P.fM(null,null,null,null)
 y.FV(0,z)
-this.ix=y}}z=this.t5
+this.y=y}}z=this.a
 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.rr(y.Ff)
+x=J.Vs(this.Q).Q.getAttribute("attributes")
+if(x!=null)for(y=C.yo.Fr(x,$.FF()),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),w=this.c;y.D();){v=J.Q7(y.c)
 if(v==="")continue
-u=$.Mg().xV.T4.t(0,v)
+u=$.Mg().Q.f.p(0,v)
 t=u!=null
 if(t){s=L.hk([u])
-r=this.Q7
+r=this.d
 if(r!=null&&r.NZ(0,s))continue
-q=$.mX().CV(z,u)}else{q=null
+q=$.II().CV(z,u)}else{q=null
 s=null}if(!t||q==null||q.gUA()||J.or(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)}},
+continue}t=this.d
+if(t==null){t=P.A(null,null)
+this.d=t}t.q(0,s,q)}},
 en:function(a){var z,y,x,w,v
-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
+for(z=$.II().WT(0,a,C.BK),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
 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)
+if(this.IW(x.goc(y)))continue
+w=this.d
+if(w==null){w=P.A(null,null)
+this.d=w}w.q(0,L.hk([x.goc(y)]),y)
 w=y.gDv()
-v=new H.wb()
+v=new H.ii()
 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.rg())){w=this.ix
-if(w==null){w=P.Ls(null,null,null,null)
-this.ix=w}x=x.goc(y)
-w.h(0,$.Mg().xV.af.t(0,x))}}},
+if(w.Vr(0,new A.Hs())){w=this.y
+if(w==null){w=P.fM(null,null,null,null)
+this.y=w}x=x.goc(y)
+w.h(0,$.Mg().Q.e.p(0,x))}}},
 Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-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.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.Mp(z.Ff)},
+z=P.L5(null,null,null,P.I,P.a)
+this.x=z
+y=this.b
+if(y!=null)z.FV(0,y.gCY())
+J.Vs(this.Q).aN(0,new A.ih(this))},
+W3:function(a){J.Vs(this.Q).aN(0,new A.LJ(a))},
+fk:function(){var z=this.Bg("link[rel=stylesheet]")
+this.z=z
+for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.vX(z.c)},
 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.Mp(z.Ff)},
-yq:function(){var z,y,x,w,v,u,t,s
-z=this.y0
+this.ch=z
+for(z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.vX(z.c)},
+OL:function(){var z,y,x,w,v,u,t,s
+z=this.z
 z.toString
-y=H.VM(new H.U5(z,new A.IJ()),[H.u3(H.VM(new H.wb(),[H.u3(z,0)]),0)])
+y=H.J(new H.U5(z,new A.IJ()),[H.u3(H.J(new H.ii(),[H.u3(z,0)]),0)])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-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.lu(this.FL).createElement("style",null)
+for(z=H.J(new H.Mo(J.Nx(y.Q),y.a),[H.u3(y,0)]),v=z.Q;z.D();){u=A.Hl(v.gk())
+t=w.Q+=typeof u==="string"?u:H.d(u)
+w.Q=t+"\n"}if(w.Q.length>0){s=J.Do(this.Q).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
-z.FO(x,s,z.gNL(x))}}},
+z.mK(x,s,z.gPZ(x))}}},
 Wz:function(a,b){var z,y,x
-z=J.Vj(this.FL,a)
+z=J.Vj(this.Q,a)
 y=z.br(z)
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.Wz(a,null)},
-ds:function(a){var z,y,x,w,v,u
+kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-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.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.yO(y.gl())
-w=z.IN+=typeof v==="string"?v:H.d(v)
-z.IN=w+"\n\n"}return z.IN},
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.z,x.toString,x=H.J(new H.U5(x,y),[H.u3(H.J(new H.ii(),[H.u3(x,0)]),0)]),x=H.J(new H.Mo(J.Nx(x.Q),x.a),[H.u3(x,0)]),w=x.Q;x.D();){v=A.Hl(w.gk())
+u=z.Q+=typeof v==="string"?v:H.d(v)
+z.Q=u+"\n\n"}for(x=this.ch,x.toString,x=H.J(new H.U5(x,y),[H.u3(H.J(new H.ii(),[H.u3(x,0)]),0)]),x=H.J(new H.Mo(J.Nx(x.Q),x.a),[H.u3(x,0)]),y=x.Q;x.D();){v=J.dY(y.gk())
+w=z.Q+=typeof v==="string"?v:H.d(v)
+z.Q=w+"\n\n"}y=z.Q
+return y.charCodeAt(0)==0?y:y},
 J3:function(a,b){var z
-if(a==="")return
+if(J.mG(a,""))return
 z=document.createElement("style",null)
 J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
+z.setAttribute("element",H.d(this.c)+"-"+b)
 return z},
 rH:function(){var z,y,x,w,v
-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.ws==null)this.ws=P.YM(null,null,null,null,null)
+for(z=$.HN(),z=$.II().WT(0,this.a,z),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+if(this.f==null)this.f=P.YM(null,null,null,null,null)
 x=J.RE(y)
 w=x.goc(y)
-v=$.Mg().xV.af.t(0,w)
+v=$.Mg().Q.e.p(0,w)
 w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.ws.u(0,L.hk(v),[x.goc(y)])}},
+v=w.Nj(v,0,J.D5(w.gv(v),7))
+w=x.goc(y)
+if($.js().tg(0,w))continue
+this.f.q(0,L.hk(v),[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()
+for(z=$.II().WT(0,this.a,C.SM),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c.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.nk(z))
+for(;x.D();)continue}},
+jq:function(a){var z=P.L5(null,null,null,P.I,null)
+a.aN(0,new A.fh(z))
 return z},
-ut:function(){var z,y,x,w,v,u,t,s,r
-z=P.Fl(null,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.In(),null)
-u=J.RE(w)
-t=u.goc(w)
-s=z.t(0,t)
-if(s!=null){u=u.gt5(w)
+hW:function(){var z,y,x,w,v,u,t,s,r
+z=P.A(null,null)
+for(y=$.II().WT(0,this.a,C.h5),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]),x=this.r;y.D();){w=y.c
+v=J.RE(w)
+u=v.goc(w)
+if(this.IW(u))continue
+t=H.Sz(w.gDv(),new A.HH(),null)
+s=z.p(0,u)
+if(s!=null){v=v.gt5(w)
 r=J.zH(s)
-r=$.mX().xs(u,r)
-u=r}else u=!0
-if(u){x.u(0,t,v.gXt())
-z.u(0,t,w)}}},
-$isSo:true,
-static:{"^":"Kb"}},
+r=$.II().xs(v,r)
+v=r}else v=!0
+if(v){x.q(0,u,t.gEV())
+z.q(0,u,w)}}},
+$isXP:true,
+static:{"^":"Kb,Il,x9"}},
 Zd:{
-"^":"TpZ:12;",
-$1:function(a){return!!J.x(a).$isxn},
-$isEH:true},
-rg:{
-"^":"TpZ:12;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-EB:{
-"^":"TpZ:81;a",
-$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.a.PH.u(0,a,b)},
-$isEH:true},
-Y1:{
-"^":"TpZ:81;a",
+"^":"r:14;",
+$1:function(a){return!!J.t(a).$isA2}},
+Hs:{
+"^":"r:14;",
+$1:function(a){return a.gvn()}},
+ih:{
+"^":"r:80;Q",
+$2:function(a,b){if(C.pv.NZ(0,a)!==!0&&!J.co(a,"on-"))this.Q.x.q(0,a,b)}},
+LJ:{
+"^":"r:80;Q",
 $2:function(a,b){var z,y,x
-z=J.Qe(a)
+z=J.NH(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.bS(C.yo.Nj(b,y+2,x)))}},
-$isEH:true},
+if(y>=0&&x>=0)this.Q.q(0,z.yn(a,3),C.yo.bS(C.yo.Nj(b,y+2,x)))}}},
 IJ:{
-"^":"TpZ:12;",
-$1:function(a){return J.Vs(a).dA.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ui:{
-"^":"TpZ:12;a",
-$1:function(a){return J.wK(a,this.a)},
-$isEH:true},
-XUG:{
-"^":"TpZ:76;",
-$0:function(){return[]},
-$isEH:true},
-nk:{
-"^":"TpZ:186;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-In:{
-"^":"TpZ:12;",
-$1:function(a){return!1},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){return J.Vs(a).Q.hasAttribute("polymer-scope")!==!0}},
+Vi:{
+"^":"r:14;Q",
+$1:function(a){return J.YN(a,this.Q)}},
+zR:{
+"^":"r:77;",
+$0:function(){return[]}},
+fh:{
+"^":"r:186;Q",
+$2:function(a,b){this.Q.q(0,H.d(a).toLowerCase(),b)}},
+HH:{
+"^":"r:14;",
+$1:function(a){return!1}},
 Li:{
-"^":"BG9;Mn,oe",
+"^":"BG9;a,Q",
 op:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.op(a,b,c)},
+return this.a.op(a,b,c)},
 static:{"^":"rd0,QPA"}},
 BG9:{
-"^":"vE+d23;"},
+"^":"VE+d23;"},
 d23:{
 "^":"a;",
-XB:function(a){var z,y
-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")
-else if(!!z.$ish4){y=J.UQ(P.XY(a),"eventController")
-if(y!=null)return y}a=z.gAd(a)}return!!z.$isI0?a.host:null},
-Z8:function(a,b,c){var z={}
+h5:function(a){var z,y
+for(;z=J.RE(a),z.gKV(a)!=null;){if(!!z.$iszs&&J.Tf(a.r$,"eventController")!=null)return J.Tf(z.gCp(a),"eventController")
+else if(!!z.$isz2){y=J.Tf(P.kW(a),"eventController")
+if(y!=null)return y}a=z.gKV(a)}return!!z.$isBn?a.host:null},
+Y2:function(a,b,c){var z={}
 z.a=a
-return new A.l5(z,this,b,c)},
+return new A.AC(z,this,b,c)},
 CZ:function(a,b,c){var z,y,x,w
 z={}
-y=J.Qe(b)
+y=J.NH(b)
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.yt.t(0,x)
+w=C.lyV.p(0,x)
 z.a=w!=null?w:z.a
 return new A.liz(z,this,a)}},
-l5:{
-"^":"TpZ:12;a,b,c,d",
+AC:{
+"^":"r:14;Q,a,b,c",
 $1:[function(a){var z,y,x,w
-z=this.a
+z=this.Q
 y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
+if(y==null||!J.t(y).$iszs){x=this.a.h5(this.b)
 z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(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)
+y=x}if(!!J.t(y).$iszs){y=J.t(a)
+if(!!y.$isDG4){w=C.lG.gey(a)
+if(w==null)w=J.Tf(P.kW(a),"detail")}else w=null
+y=y.gAJ(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},
+J.bH(z,z,this.c,[a,w,y])}else throw H.b(P.s("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,4,"call"]},
 liz:{
-"^":"TpZ:190;a,b,c",
+"^":"r:190;Q,a,b",
 $3:[function(a,b,c){var z,y,x
-z=this.c
-y=P.mt(new A.kD($.X3.mS(this.b.Z8(null,b,z))))
-x=this.a
-$.tNi().V7("addEventListener",[b,x.a,y])
+z=this.b
+y=P.mt(new A.kD($.X3.mS(this.a.Y2(null,b,z))))
+x=this.Q
+$.Op().Z("addEventListener",[b,x.a,y])
 if(c===!0)return
-return new A.zIs(z,b,x.a,y)},"$3",null,6,0,null,187,188,189,"call"],
-$isEH:true},
+return new A.d6(z,b,x.a,y)},"$3",null,6,0,null,187,188,189,"call"]},
 kD:{
-"^":"TpZ:81;d",
-$2:[function(a,b){return this.d.$1(b)},"$2",null,4,0,null,13,2,"call"],
-$isEH:true},
-zIs:{
-"^":"Ap;ED,d9,dF,Xj",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-xO:function(a){$.tNi().V7("removeEventListener",[this.d9,this.dF,this.Xj])}},
-xn:{
-"^":"iv;vn<",
-$isxn:true},
+"^":"r:80;Q",
+$2:[function(a,b){return this.Q.$1(b)},"$2",null,4,0,null,15,4,"call"]},
+d6:{
+"^":"Ap;Q,a,b,c",
+gM:function(a){return"{{ "+this.Q+" }}"},
+TR:function(a,b){return"{{ "+this.Q+" }}"},
+xO:function(a){$.Op().Z("removeEventListener",[this.a,this.b,this.c])}},
+A2:{
+"^":"iv;vn:Q<",
+$isA2:true},
 xc:{
-"^":"TR0;Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
-XI:function(a){this.kR(a)},
+"^":"TR0;cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+XI:function(a){this.Yi(a)},
 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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.GBL.LX(a)
-C.GBL.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ki.LX(a)
+C.Ki.XI(a)
 return a}}},
 jpR:{
-"^":"Bo+zs;Cp:n7=,KM:ZQ=",
+"^":"Bo+zs;Cp:r$=,KM:z$=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
 TR0:{
-"^":"jpR+Pi;",
+"^":"jpR+Piz;",
 $isd3:true},
 zs:{
-"^":"a;Cp:n7=,KM:ZQ=",
-gFL:function(a){return a.IX},
-gwX:function(a){return},
-gJQ:function(a){var z,y
-z=a.IX
+"^":"a;Cp:r$=,KM:z$=",
+gFL:function(a){return a.Q$},
+gZJ:function(a){return},
+gRT:function(a){var z,y
+z=a.Q$
 if(z!=null)return J.DA(z)
-y=this.gQg(a).dA.getAttribute("is")
+y=this.gQg(a).Q.getAttribute("is")
 return y==null||y===""?this.gqn(a):y},
-kR:function(a){var z,y
-z=this.gmb(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gJQ(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
+Yi:function(a){var z,y
+z=this.gCn(a)
+if(z!=null&&z.Q!=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.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.gJQ(a))
+y=this.gM0(a)
+if(!J.mG($.Tg().p(0,y),!0))this.Sx(a)},
+Ec:function(a){var z
+if(a.Q$!=null){window
+z="Element already prepared: "+H.d(this.gRT(a))
 if(typeof console!="undefined")console.warn(z)
-return}a.n7=P.XY(a)
-z=this.gJQ(a)
-a.IX=$.vu().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))
+return}a.r$=P.kW(a)
+z=this.gRT(a)
+a.Q$=$.RA().p(0,z)
+this.nt(a)
+z=a.e$
+if(z!=null)z.kv(z,this.gnu(a))
+if(a.Q$.gQ7()!=null)this.gqh(a).yI(this.gLj(a))
 this.oR(a)
-this.xL(a)
+this.kK(a)
 this.Uc(a)},
-rf:function(a){if(a.OD)return
-a.OD=!0
+Sx:function(a){if(a.f$)return
+a.f$=!0
 this.bT(a)
-this.Qs(a,a.IX)
+this.z2(a,a.Q$)
 this.gQg(a).Rz(0,"unresolved")
-$.lg().To(new A.pN(a))
+$.zG().To(new A.Eo(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.gJQ(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
+I9:["Kv",function(a){}],
+Es:["tZ",function(a){if(a.Q$==null)throw H.b(P.s("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))}},
-Lx:function(a){this.x3(a)},
-Qs:function(a,b){if(b!=null){this.Qs(a,b.gJh())
+if(!a.x$){a.x$=!0
+this.rW(a,new A.hp(a))}}],
+dQ:["xD",function(a){this.x3(a)}],
+z2:function(a,b){if(b!=null){this.z2(a,b.gP1())
 this.aI(a,J.y3(b))}},
 aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.XT(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).dA.getAttribute("name")
+y=z.Wk(b,"template")
+if(y!=null){x=this.TH(a,y)
+w=z.gQg(b).Q.getAttribute("name")
 if(w==null)return
-a.ZM.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.TL(a)
-M.Xi(b).cl(null)
-y=this.gwX(a)
-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)
+a.y$.q(0,w,x)}},
+TH:function(a,b){var z,y,x,w,v,u
+z=this.er(a)
+M.uH(b).Jh(null)
+y=this.gZJ(a)
+x=!!J.t(b).$ishs?b:M.uH(b)
+w=J.Km(x,a,y==null&&J.Ee(x)==null?J.vo(a.Q$):y)
+v=a.b$
+u=$.nR().p(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.Ff
-y.u(0,J.eS(x),x)}},
-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.gPH().aN(0,new A.Sv(a))},
-xL:function(a){if(a.IX.gtN()==null)return
+for(z=J.Vj(b,"[id]"),z=z.gu(z),y=a.z$;z.D();){x=z.c
+y.q(0,J.eS(x),x)}},
+aC:["Ud",function(a,b,c,d){var z=J.t(b)
+if(!z.m(b,"class")&&!z.m(b,"style"))this.D3(a,b,d)}],
+oR:function(a){a.Q$.gCY().aN(0,new A.WC(a))},
+kK:function(a){if(a.Q$.gDB()==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,$.VCp())===!0)return
+if(c==null||J.kE(c,$.iB())===!0)return
 y=J.RE(z)
 x=y.goc(z)
 w=$.cp().jD(a,x)
 v=y.gt5(z)
-x=J.x(v)
-u=Z.fd(c,w,(x.n(v,C.Vc)||x.n(v,C.wG))&&w!=null?J.bB(w):v)
+x=J.t(v)
+u=Z.Zh(c,w,(x.m(v,C.AP)||x.m(v,C.wG))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","gCg",4,0,191],
-B2:function(a,b){var z=a.IX.gtN()
+$.cp().Q1(a,y,u)}},"$2","gCg",4,0,191],
+B2:function(a,b){var z=a.Q$.gDB()
 if(z==null)return
-return z.t(0,b)},
+return z.p(0,b)},
 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)
+JY:function(a,b){var z,y
+z=L.hk(b).Tl(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).dA.setAttribute(b,y)
+if(y!=null)this.gQg(a).Q.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.IB(M.Xi(a),b,c,d)
+if(z==null)return J.FS1(M.uH(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.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()
+if(J.mG(J.Tf(J.Tf($.Xw(),"Platform"),"enableBindingsReflection"),!0)&&x!=null){if(J.C5(M.uH(a))==null){w=P.A(null,null)
+J.Rb(M.uH(a),w)}J.H9(J.C5(M.uH(a)),b,x)}v=a.Q$.gix()
 y=y.goc(z)
-u=$.Mg().xV.af.t(0,y)
-if(v!=null&&v.tg(0,u))this.QH(a,u)
+u=$.Mg().Q.e.p(0,y)
+if(v!=null&&v.tg(0,u))this.JY(a,u)
 return x}},
-lL:function(a){return this.rf(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))},
+x5:function(a){return this.Sx(a)},
+gCd:function(a){return J.C5(M.uH(a))},
+sCd:function(a,b){J.Rb(M.uH(a),b)},
+gCn:function(a){return J.OC(M.uH(a))},
 x3:function(a){var z,y
-if(a.bb===!0)return
-$.iX().J4(new A.N3(a))
-z=a.TT
-y=this.gyz(a)
+if(a.c$===!0)return
+$.UW().Ny(new A.rs(a))
+z=a.d$
+y=this.gJg(a)
 if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.TT=z},
-GBV:[function(a){if(a.bb===!0)return
+z.ui(0,y,null)
+a.d$=z},
+GB:[function(a){if(a.c$===!0)return
 this.mc(a)
 this.Uq(a)
-a.bb=!0},"$0","gyz",0,0,17],
+a.c$=!0},"$0","gJg",0,0,1],
 oW:function(a){var z
-if(a.bb===!0){$.iX().j2(new A.ti(a))
-return}$.iX().J4(new A.Rb(a))
-z=a.TT
-if(z!=null){z.nY(0)
-a.TT=null}},
-jM:function(a){var z,y,x,w,v
-z=J.eM(a.IX)
-if(z!=null){y=new L.nQ(null,!1,[],null,null,null,$.jq1)
-y.z7=[]
-a.MJ=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
+if(a.c$===!0){$.UW().j2(new A.TV(a))
+return}$.UW().Ny(new A.Z7(a))
+z=a.d$
+if(z!=null){z.TP(0)
+a.d$=null}},
+nt:function(a){var z,y,x,w,v
+z=J.ui(a.Q$)
+if(z!=null){y=new L.NV(null,!1,[],null,null,null,$.qF)
+y.b=[]
+a.e$=y
+a.b$.push(y)
+for(x=H.J(new P.fG(z),[H.u3(z,0)]),w=x.Q,x=H.J(new P.EQ(w,w.Nm(),0,null),[H.u3(x,0)]);x.D();){v=x.c
 y.WX(a,v)
-this.j6(a,v,v.WK(a),null)}}},
-FQx:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.eM(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,192],
+this.rJ(a,v,v.Tl(a),null)}}},
+l7:[function(a,b,c,d){J.Me(c,new A.OaD(a,b,c,d,J.ui(a.Q$),P.Ca(null,null,null,null)))},"$3","gnu",6,0,192],
 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
-w=x.oc
-if(y.t(0,w)!=null)continue
-this.Dt(a,w,x.zZ,x.jL)}},"$1","gLj",2,0,193,185],
+for(z=J.Nx(b),y=a.ch$;z.D();){x=z.gk()
+if(!J.t(x).$isqI)continue
+w=x.a
+if(y.p(0,w)!=null)continue
+this.Dt(a,w,x.c,x.b)}},"$1","gLj",2,0,193,185],
 Dt:function(a,b,c,d){var z,y
-$.ek().To(new A.qW(a,b,c,d))
-z=$.Mg().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
-z=J.eM(a.IX)
+$.Is().To(new A.qW(a,b,c,d))
+z=$.Mg().Q.e.p(0,b)
+y=a.Q$.gix()
+if(y!=null&&y.tg(0,z))this.JY(a,z)},
+rJ:function(a,b,c,d){var z,y,x,w,v
+z=J.ui(a.Q$)
 if(z==null)return
-y=z.t(0,b)
+y=z.p(0,b)
 if(y==null)return
-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)
+if(!!J.t(d).$iswn){$.FX().Ny(new A.xf(a,b))
+this.Mx(a,H.d(b)+"__array")}if(!!J.t(c).$iswn){$.FX().Ny(new A.Y0(a,b))
+x=c.gXF().w3(new A.fS(a,y),null,null,!1)
 w=H.d(b)+"__array"
-v=a.Bd
-if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
-a.Bd=v}v.u(0,w,x)}},
+v=a.a$
+if(v==null){v=P.L5(null,null,null,P.I,P.yX)
+a.a$=v}v.q(0,w,x)}},
 hq:function(a,b,c,d){if(d==null?c==null:d===c)return
 this.Dt(a,b,c,d)},
-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)))
+rh:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q
+z=$.cp().Q.Q.p(0,b)
+if(z==null)H.vh(O.lA("getter \""+H.d(b)+"\" in "+this.X(a)))
 y=z.$1(a)
-x=a.qJ.t(0,b)
+x=a.ch$.p(0,b)
 if(x==null){w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,y)
-v=new A.lK(a,b,c,null,null)
-v.Sx=this.gqh(a).k0(v.gou(),null,null,!1)
+if(w.gM(c)==null)w.sM(c,y)
+v=new A.BfZ(a,b,c,null,null)
+v.c=this.gqh(a).w3(v.gou(),null,null,!1)
 w=J.mu(c,v.gew())
-v.vP=w
-u=$.cp().xV.F8.t(0,b)
-if(u==null)H.vh(O.Fm("setter \""+H.d(b)+"\" in "+this.bu(a)))
+v.d=w
+u=$.cp().Q.a.p(0,b)
+if(u==null)H.vh(O.lA("setter \""+H.d(b)+"\" in "+this.X(a)))
 u.$2(a,w)
-a.f4.push(v)
-return v}x.mn=c
+a.b$.push(v)
+return v}x.c=c
 w=J.RE(c)
 t=w.TR(c,x.gUe())
 if(d){s=t==null?y:t
-if(t==null?y!=null:t!==y){w.sP(c,s)
-t=s}}y=x.VB
-w=x.I6
-r=x.JQ
+if(t==null?y!=null:t!==y){w.sM(c,s)
+t=s}}y=x.a
+w=x.b
+r=x.Q
 q=J.RE(w)
-x.VB=q.ct(w,r,y,t)
+x.a=q.ct(w,r,y,t)
 q.hq(w,r,t,y)
 v=new A.p0(x)
-a.f4.push(v)
+a.b$.push(v)
 return v},
-hH:function(a,b,c){return this.hO(a,b,c,!1)},
-yO:function(a,b){var z=a.IX.gGl().t(0,b)
+wc:function(a,b,c){return this.rh(a,b,c,!1)},
+yO:function(a,b){var z=a.Q$.giz().p(0,b)
 if(z==null)return
-return T.yM().$3$globals(T.u5().$1(z),a,J.v7(a.IX).Mn.nF)},
+return T.pw().$3$globals(T.EPS().$1(z),a,J.vo(a.Q$).a.b)},
 bT:function(a){var z,y,x,w,v,u,t,s
-z=a.IX.gGl()
-for(v=J.mY(J.iY(z)),u=a.qJ;v.G();){y=v.gl()
+z=a.Q$.giz()
+for(v=J.Nx(J.q8(z)),u=a.ch$;v.D();){y=v.gk()
 try{x=this.yO(a,y)
-if(u.t(0,y)==null){t=new A.js(y,J.Vm(x),a,null)
+if(u.p(0,y)==null){t=new A.Zw(y,J.SW(x),a,null)
 t.$builtinTypeInfo=[null]
-u.u(0,y,t)}this.hH(a,y,x)}catch(s){t=H.Ru(s)
+u.q(0,y,t)}this.wc(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)
+t="Failed to create computed property "+H.d(y)+" ("+H.d(J.Tf(z,y))+"): "+H.d(w)
 if(typeof console!="undefined")console.error(t)}}},
 mc:function(a){var z,y
-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)
+for(z=a.b$,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();){y=z.c
+if(y!=null)J.xl(y)}a.b$=[]},
+Mx:function(a,b){var z=a.a$.Rz(0,b)
 if(z==null)return!1
 z.Gv()
 return!0},
 Uq:function(a){var z,y
-z=a.Bd
+z=a.a$
 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.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().Cq(a,b,c)
-return}return this.hO(a,b,c,!0)},
-Uc:function(a){var z=a.IX.gmR()
+for(z=z.gUQ(z),z=H.J(new H.MH(null,J.Nx(z.Q),z.a),[H.u3(z,0),H.u3(z,1)]);z.D();){y=z.Q
+if(y!=null)y.Gv()}a.a$.V1(0)
+a.a$=null},
+Fy:function(a,b,c,d){var z=$.aQ()
+z.Ny(new A.aM(a,b,c))
+if(d){if(!!J.t(c).$isAp)z.j2(new A.aMY(a,b,c))
+$.cp().Q1(a,b,c)
+return}return this.rh(a,b,c,!0)},
+Uc:function(a){var z=a.Q$.gmR()
 if(z.gl0(z))return
-$.vo().J4(new A.SX(a,z))
+$.Uk().Ny(new A.SX(a,z))
 z.aN(0,new A.Jys(a))},
-ea:function(a,b,c,d){var z,y,x
-z=$.vo()
+ea:["jk",function(a,b,c,d){var z,y,x
+z=$.Uk()
 z.To(new A.od(a,c))
-if(!!J.x(c).$isEH){y=X.RI(c)
+if(!!J.t(c).$isEH){y=X.aA(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=$.Mg().xV.T4.t(0,c)
-$.cp().Ck(b,x,d,!0,null)}else z.j2("invalid callback")
-z.J4(new A.cB(a,c))},
+C.Nm.sv(d,y)
+H.eC(c,d,P.Te(null))}else if(typeof c==="string"){x=$.Mg().Q.f.p(0,c)
+$.cp().Ol(b,x,d,!0,null)}else z.j2("invalid callback")
+z.Ny(new A.cB(a,c))}],
 rW:function(a,b){var z
 P.rb(F.Jy())
-$.Kc().nQ("flush")
+$.uj().nQ("flush")
 z=window
-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.Ph(a,z)
+C.ol.y4(z)
+return C.ol.ne(z,W.Yt(b))},
+SE:function(a,b,c,d,e,f){var z=W.Q8(b,!0,!0,e)
+this.H2(a,z)
 return z},
-ZB:function(a,b){return this.TZ(a,b,null,null,null,null)},
+ZB:function(a,b){return this.SE(a,b,null,null,null,null)},
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
-pN:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+J.AG(this.a)+"]: ready"},"$0",null,0,0,null,"call"],
-$isEH:true},
+Eo:{
+"^":"r:77;Q",
+$0:[function(){return"["+J.Lz(this.Q)+"]: ready"},"$0",null,0,0,null,"call"]},
 hp:{
-"^":"TpZ:12;a",
-$1:[function(a){return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-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())
-z.t(0,a)},
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return},"$1",null,2,0,null,15,"call"]},
+WC:{
+"^":"r:80;Q",
+$2:function(a,b){var z=J.Vs(this.Q)
+if(z.NZ(0,a)!==!0)z.q(0,a,new A.Te4(b).$0())
+z.p(0,a)}},
 Te4:{
-"^":"TpZ:76;b",
-$0:function(){return this.b},
-$isEH:true},
-N3:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
-ti:{
-"^":"TpZ:76;a",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
-Rb:{
-"^":"TpZ:76;b",
-$0:[function(){return"["+H.d(J.f9c(this.b))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:function(){return this.Q}},
+rs:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] asyncUnbindAll"},"$0",null,0,0,null,"call"]},
+TV:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] already unbound, cannot cancel unbindAll"},"$0",null,0,0,null,"call"]},
+Z7:{
+"^":"r:77;Q",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] cancelUnbindAll"},"$0",null,0,0,null,"call"]},
 OaD:{
-"^":"TpZ:81;a,b,c,d,e,f",
+"^":"r:80;Q,a,b,c,d,e",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=J.UQ(x,2*a+1)
-v=this.e
+z=this.a
+y=J.Tf(z,a)
+x=this.c
+if(typeof a!=="number")return H.o(a)
+w=J.Tf(x,2*a+1)
+v=this.d
 if(v==null)return
-u=v.t(0,w)
+u=v.p(0,w)
 if(u==null)return
-for(v=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;v.G();){p=v.gl()
+for(v=J.Nx(u),t=this.Q,s=J.RE(t),r=this.b,q=this.e;v.D();){p=v.gk()
 if(!q.h(0,p))continue
-s.j6(t,w,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,59,"call"],
-$isEH:true},
+s.rJ(t,w,y,b)
+$.cp().Ol(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,97,61,"call"]},
 qW:{
-"^":"TpZ:76;a,b,c,d",
-$0:[function(){return"["+J.AG(this.a)+"]: "+H.d(this.b)+" changed from: "+H.d(this.d)+" to: "+H.d(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b,c",
+$0:[function(){return"["+J.Lz(this.Q)+"]: "+H.d(this.a)+" changed from: "+H.d(this.c)+" to: "+H.d(this.b)},"$0",null,0,0,null,"call"]},
 xf:{
-"^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] observeArrayValue: unregister "+H.d(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] observeArrayValue: unregister "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 Y0:{
-"^":"TpZ:76;c,d",
-$0:[function(){return"["+H.d(J.f9c(this.c))+"] observeArrayValue: register "+H.d(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-kMK:{
-"^":"TpZ:12;e,f",
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] observeArrayValue: register "+H.d(this.a)},"$0",null,0,0,null,"call"]},
+fS:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-for(z=J.mY(this.f),y=this.e;z.G();){x=z.gl()
-$.cp().Ck(y,x,[a],!0,null)}},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+for(z=J.Nx(this.a),y=this.Q;z.D();){x=z.gk()
+$.cp().Ol(y,x,[a],!0,null)}},"$1",null,2,0,null,194,"call"]},
 aM:{
-"^":"TpZ:76;a,b,c",
-$0:[function(){return"bindProperty: ["+H.d(this.c)+"] to ["+H.d(J.f9c(this.a))+"].["+H.d(this.b)+"]"},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return"bindProperty: ["+H.d(this.b)+"] to ["+H.d(J.RI(this.Q))+"].["+H.d(this.a)+"]"},"$0",null,0,0,null,"call"]},
 aMY:{
-"^":"TpZ:76;d,e,f",
-$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.f9c(this.d))+"].["+H.d(this.e)+"], but found "+H.a5(this.f)+"."},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a,b",
+$0:[function(){return"bindProperty: expected non-bindable value n a one-time binding to ["+H.d(J.RI(this.Q))+"].["+H.d(this.a)+"], but found "+H.a5(this.b)+"."},"$0",null,0,0,null,"call"]},
 SX:{
-"^":"TpZ:76;a,b",
-$0:[function(){return"["+H.d(J.f9c(this.a))+"] addHostListeners: "+this.b.bu(0)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return"["+H.d(J.RI(this.Q))+"] addHostListeners: "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 Jys:{
-"^":"TpZ:81;c",
-$2:function(a,b){var z=this.c
-$.tNi().V7("addEventListener",[z,a,$.X3.mS(J.v7(z.IX).Z8(z,z,b))])},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){var z=this.Q
+$.Op().Z("addEventListener",[z,a,$.X3.mS(J.vo(z.Q$).Y2(z,z,b))])}},
 od:{
-"^":"TpZ:76;a,b",
-$0:[function(){return">>> ["+H.d(J.f9c(this.a))+"]: dispatch "+H.d(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q,a",
+$0:[function(){return">>> ["+H.d(J.RI(this.Q))+"]: dispatch "+H.d(this.a)},"$0",null,0,0,null,"call"]},
 cB:{
-"^":"TpZ:76;c,d",
-$0:[function(){return"<<< ["+H.d(J.f9c(this.c))+"]: dispatch "+H.d(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lK:{
-"^":"Ap;I6,ko,q0,Sx,vP",
-z9N:[function(a){this.vP=a
-$.cp().Cq(this.I6,this.ko,a)},"$1","gew",2,0,19,60],
+"^":"r:77;Q,a",
+$0:[function(){return"<<< ["+H.d(J.RI(this.Q))+"]: dispatch "+H.d(this.a)},"$0",null,0,0,null,"call"]},
+BfZ:{
+"^":"Ap;Q,a,b,c,d",
+z9:[function(a){this.d=a
+$.cp().Q1(this.Q,this.a,a)},"$1","gew",2,0,20,62],
 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().xV.II.t(0,y)
-if(w==null)H.vh(O.Fm("getter \""+H.d(y)+"\" in "+J.AG(z)))
+for(z=J.Nx(a),y=this.a;z.D();){x=z.gk()
+if(!!J.t(x).$isqI&&J.mG(x.a,y)){z=this.Q
+w=$.cp().Q.Q.p(0,y)
+if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.Lz(z)))
 v=w.$1(z)
-z=this.vP
-if(z==null?v!=null:z!==v)J.Fc(this.q0,v)
+z=this.d
+if(z==null?v!=null:z!==v)J.Ja(this.b,v)
 return}}},"$1","gou",2,0,193,185],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.Fc(this.q0,b)
+TR:function(a,b){return J.mu(this.b,b)},
+gM:function(a){return J.SW(this.b)},
+sM:function(a,b){J.Ja(this.b,b)
 return b},
-xO:function(a){var z=this.Sx
+xO:function(a){var z=this.c
 if(z!=null){z.Gv()
-this.Sx=null}J.yd(this.q0)}},
+this.c=null}J.xl(this.b)}},
 p0:{
-"^":"Ap;pO",
+"^":"Ap;Q",
 TR:function(a,b){},
-gP:function(a){return},
-sP:function(a,b){},
+gM:function(a){return},
+sM:function(a,b){},
 fR:function(){},
 xO:function(a){var z,y
-z=this.pO
-y=z.mn
+z=this.Q
+y=z.c
 if(y==null)return
-J.yd(y)
-z.mn=null}},
+J.xl(y)
+z.c=null}},
 FT:{
-"^":"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.ole.Wq(z)
-this.lS=C.ole.rK(z,W.Yt(new A.K3(this)))},
-nY:function(a){var z,y
-z=this.lS
+"^":"a;Q,a,b",
+Dj:function(){return this.Q.$0()},
+ui:[function(a,b,c){var z
+this.TP(0)
+this.Q=b
+if(c==null){z=window
+C.ol.y4(z)
+this.b=C.ol.ne(z,W.Yt(new A.K3(this)))}else this.a=P.cH(c,this.gv6(this))},function(a,b){return this.ui(a,b,null)},"x0","$2","$1","gJ",2,2,195,23,42,196],
+TP:function(a){var z,y
+z=this.b
 if(z!=null){y=window
-C.ole.Wq(y)
+C.ol.y4(y)
 y.cancelAnimationFrame(z)
-this.lS=null}z=this.Ar
+this.b=null}z=this.a
 if(z!=null){z.Gv()
-this.Ar=null}}},
+this.a=null}},
+dS:[function(a){if(this.a!=null||this.b!=null){this.TP(0)
+this.Dj()}},"$0","gv6",0,0,1]},
 K3:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(z.Ar!=null||z.lS!=null){z.nY(0)
-z.Dj()}return},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(z.a!=null||z.b!=null){z.TP(0)
+z.Dj()}return},"$1",null,2,0,null,15,"call"]},
 mS:{
-"^":"TpZ:76;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return A.X1($.MU,$.UG)},"$0",null,0,0,null,"call"]},
 XR:{
-"^":"TpZ:76;",
-$0:[function(){var z=$.j6().MM
-if(z.YM!==0)H.vh(P.w("Future already completed"))
-z.Xf(null)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;",
+$0:[function(){return $.j6().dS(0)},"$0",null,0,0,null,"call"]},
 k2:{
-"^":"TpZ:197;a,b",
-$3:[function(a,b,c){var z=$.lQ().t(0,b)
-if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vu().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,195,58,196,"call"],
-$isEH:true},
-zR:{
-"^":"TpZ:76;c,d,e,f",
+"^":"r:199;Q,a",
+$3:[function(a,b,c){var z=$.lC().p(0,b)
+if(z!=null)return this.Q.Gr(new A.v4(a,b,z,$.RA().p(0,c)))
+return this.a.qP([b,c],a)},"$3",null,6,0,null,197,60,198,"call"]},
+v4:{
+"^":"r:77;Q,a,b,c",
 $0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=P.Fl(null,null)
-u=$.Ak()
-t=P.Fl(null,null)
-v=new A.So(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
-$.vu().u(0,y,v)
+z=this.Q
+y=this.a
+x=this.b
+w=this.c
+v=P.A(null,null)
+u=$.Cl()
+t=P.A(null,null)
+v=new A.XP(z,x,w,y,null,null,null,v,null,null,null,null,u,t,null,null)
+$.RA().q(0,y,v)
 v.Zw(w)
-s=v.Q7
-if(s!=null)v.tN=v.jq(s)
+s=v.d
+if(s!=null)v.e=v.jq(s)
 v.rH()
 v.I7()
-v.ut()
+v.hW()
 s=J.RE(z)
-r=s.XT(z,"template")
-if(r!=null)J.D4(!!J.x(r).$isvy?r:M.Xi(r),u)
-v.ka()
+r=s.Wk(z,"template")
+if(r!=null)J.NA(!!J.t(r).$ishs?r:M.uH(r),u)
+v.fk()
 v.f6()
-v.yq()
-A.ZI(v.J3(v.ds("global"),"global"),document.head)
-v.Cw(z)
+v.OL()
+A.ZI(v.J3(v.kO("global"),"global"),document.head)
+v.RH(z)
 v.Vk()
 v.W3(t)
-q=s.gQg(z).dA.getAttribute("assetpath")
+q=s.gQg(z).Q.getAttribute("assetpath")
 if(q==null)q=""
-p=P.hK(s.gJ8(z).baseURI)
+p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
-o=z.Fi
-if(o.length!==0){if(z.Kk!=null){n=z.ku
+o=z.c
+if(o.length!==0){if(z.Q!=null){n=z.d
 m=z.gJf(z)
-l=z.QB!=null?z.gtp(z):null}else{n=""
+l=z.a!=null?z.gtp(z):null}else{n=""
 m=null
-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
+l=null}k=p.mE(z.b)
+j=z.e
+if(j!=null);else j=null}else{o=p.c
+if(z.Q!=null){n=z.d
 m=z.gJf(z)
-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
-if(u===""){k=p.Ee
-j=z.xu
-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.QB}}i=z.ys
+l=P.Ec(z.a!=null?z.gtp(z):null,o)
+k=p.mE(z.b)
+j=z.e
+if(j!=null);else j=null}else{u=z.b
+t=J.t(u)
+if(t.m(u,"")){k=p.b
+j=z.e
+if(j!=null);else j=p.e}else{k=t.nC(u,"/")?p.mE(u):p.mE(p.Kf(p.b,u))
+j=z.e
+if(j!=null);else j=null}n=p.d
+m=p.Q
+l=p.a}}i=z.f
 if(i!=null);else i=null
-v.vT=new P.q5(m,l,k,o,n,j,i,null,null)
+v.dx=new P.q5(m,l,k,o,n,j,i,null,null)
 z=v.gZf()
-A.ec(z,y,w!=null?J.DA(w):null)
-if($.mX().n6(x,C.c86))$.cp().Ck(x,C.c86,[v],!1,null)
+A.YG(z,y,w!=null?J.DA(w):null)
+if($.II().n6(x,C.L9))$.cp().Ol(x,C.L9,[v],!1,null)
 v.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
+return},"$0",null,0,0,null,"call"]},
 Md:{
-"^":"TpZ:76;",
-$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},
+"^":"r:77;",
+$0:function(){var z=J.Tf(P.kW(document.createElement("polymer-element",null)),"__proto__")
+return!!J.t(z).$isKV?P.kW(z):z}},
 j0:{
-"^":"TpZ:12;a",
-$1:function(a){return J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return J.mG(J.Tf(this.Q.a,J.DA(a)),!0)}},
 j0N:{
-"^":"TpZ:12;a",
-$1:function(a){return!J.xC(J.UQ(this.a.a,J.DA(a)),!0)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return!J.mG(J.Tf(this.Q.a,J.DA(a)),!0)}},
 MZ6:{
-"^":"TpZ:12;",
-$1:function(a){a.sOR(C.oOA)},
-$isEH:true},
+"^":"r:14;",
+$1:function(a){a.sOR(C.oO)}},
 mqr:{
-"^":"TpZ:12;",
-$1:[function(a){P.FL(a)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-js:{
-"^":"a;JQ,VB,I6,mn",
-xz:[function(a){var z,y,x,w
-z=this.VB
-y=this.I6
-x=this.JQ
+"^":"r:14;",
+$1:[function(a){P.FL(a)},"$1",null,2,0,null,171,"call"]},
+yd:{
+"^":"r:201;Q",
+$1:[function(a){var z,y,x
+z=$.uj().Z("waitingFor",[null])
+y=J.U6(z)
+if(y.gl0(z)===!0){a.Gv()
+return}x=this.Q
+if(!J.mG(y.gv(z),x.a)){x.a=y.gv(z)
+return}if(J.mG(x.b,x.a))return
+x.b=x.a
+P.FL("No elements registered in a while, but still waiting on "+H.d(y.gv(z))+" elements to be registered. Check that you have a class with an @CustomTag annotation for each of the following tags: "+H.d(J.ZG(y.ez(z,new A.Vw()),", ")))},"$1",null,2,0,null,200,"call"]},
+Vw:{
+"^":"r:14;",
+$1:[function(a){return"'"+H.d(J.Vs(a).Q.getAttribute("name"))+"'"},"$1",null,2,0,null,4,"call"]},
+Zw:{
+"^":"a;Q,a,b,c",
+u3:[function(a){var z,y,x,w
+z=this.a
+y=this.b
+x=this.Q
 w=J.RE(y)
-this.VB=w.ct(y,x,z,a)
-w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"js")},60],
-gP:function(a){var z=this.mn
+this.a=w.ct(y,x,z,a)
+w.hq(y,x,a,z)},"$1","gUe",2,0,function(){return H.oZ(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"Zw")},62],
+gM:function(a){var z=this.c
 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.xz(b)},
-bu:[function(a){var z,y
-z=$.Mg().xV.af.t(0,this.JQ)
-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,{
+return this.a},
+sM:function(a,b){var z=this.c
+if(z!=null)J.Ja(z,b)
+else this.u3(b)},
+X:[function(a){var z,y
+z=$.Mg().Q.e.p(0,this.Q)
+y=this.c==null?"(no-binding)":"(with-binding)"
+return"["+H.d(new H.cu(H.wO(this),null))+": "+J.Lz(this.b)+"."+H.d(z)+": "+H.d(this.a)+" "+y+"]"},"$0","gCR",0,0,77]}}],["","",,Y,{
 "^":"",
-hg:{
-"^":"Hq;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)},
-gA0:function(a){return J.qy(a.Hf)},
-sA0:function(a,b){J.D4(a.Hf,b)},
-V1:function(a){return J.U2(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)},
+G0:{
+"^":"Hq;kX,dx$,dy$,fr$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gk8:function(a){return J.ZH(a.kX)},
+gG5:function(a){return J.Ee(a.kX)},
+sG5:function(a,b){J.NA(a.kX,b)},
+V1:function(a){return J.U2(a.kX)},
+gZJ:function(a){return J.Ee(a.kX)},
+ZK:function(a,b,c){return J.Km(a.kX,b,c)},
+ea:function(a,b,c,d){return this.jk(a,b===a?J.ZH(a.kX):b,c,d)},
 dX:function(a){var z
-this.kR(a)
-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))},
+this.Yi(a)
+a.kX=M.uH(a)
+z=T.GF(null,C.qY)
+J.NA(a.kX,new Y.oM(a,z,null))
+$.j6().Q.ml(new Y.lkK(a))},
 $isDT:true,
-$isvy:true,
+$ishs: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Gkp.LX(a)
 C.Gkp.dX(a)
 return a}}},
-GLL:{
-"^":"OH+zs;Cp:n7=,KM:ZQ=",
+RP:{
+"^":"yY+zs;Cp:r$=,KM:z$=",
 $iszs:true,
-$isvy:true,
+$ishs:true,
 $isd3:true,
-$ish4:true,
-$isPZ:true,
+$isz2:true,
+$isD0:true,
 $isKV:true},
 Hq:{
-"^":"GLL+d3;R9:ro%,rJ:XY%,xt:cU%",
+"^":"RP+d3;VE:dx$%,r9:dy$%,xt:fr$%",
 $isd3:true},
 lkK:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
 z.setAttribute("bind","")
-J.J1(z,new Y.Mrx(z))},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-Mrx:{
-"^":"TpZ:12;b",
+J.mI(z,new Y.dv(z))},"$1",null,2,0,null,15,"call"]},
+dv:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.b
+z=this.Q
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.ZB(z,"template-bound")},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+y.ZB(z,"template-bound")},"$1",null,2,0,null,15,"call"]},
 oM:{
-"^":"Li;dq,Mn,oe",
-XB:function(a){return this.dq}}}],["","",,Z,{
+"^":"Li;b,a,Q",
+h5:function(a){return this.b}}}],["","",,Z,{
 "^":"",
-fd:function(a,b,c){var z,y,x
-z=$.h2().t(0,c)
+Zh:function(a,b,c){var z,y,x
+z=$.RO().p(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.iQ(J.JA(a,"'","\""))
+try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
 return a}},
+DO:{
+"^":"r:80;",
+$2:function(a,b){return a}},
 lP:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-wJY:{
-"^":"TpZ:81;",
-$2:function(a,b){return a},
-$isEH:true},
-zOQ:{
-"^":"TpZ:81;",
+"^":"r:80;",
+$2:function(a,b){return a}},
+Uf:{
+"^":"r:80;",
 $2:function(a,b){var z,y
-try{z=P.zu(a)
+try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-W6o:{
-"^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-MdQ:{
-"^":"TpZ:81;",
-$2:function(a,b){return H.BU(a,null,new Z.pp(b))},
-$isEH:true},
-pp:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a},
-$isEH:true},
-YJG:{
-"^":"TpZ:81;",
-$2:function(a,b){return H.RR(a,new Z.fT(b))},
-$isEH:true},
+return b}}},
+Ra:{
+"^":"r:80;",
+$2:function(a,b){return!J.mG(a,"false")}},
+wJY:{
+"^":"r:80;",
+$2:function(a,b){return H.BU(a,null,new Z.fT(b))}},
 fT:{
-"^":"TpZ:12;b",
-$1:function(a){return this.b},
-$isEH:true}}],["","",,T,{
+"^":"r:14;Q",
+$1:function(a){return this.Q}},
+zOQ:{
+"^":"r:80;",
+$2:function(a,b){return H.RR(a,new Z.Lf(b))}},
+Lf:{
+"^":"r:14;Q",
+$1:function(a){return this.Q}}}],["","",,T,{
 "^":"",
-aW:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
+Rj:[function(a){var z=J.t(a)
+if(!!z.$isw)z=J.Vk(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","ey",2,0,52,66],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isT8)z=J.ZG(J.kl(z.gvc(a),new T.ex(a)),";")
+return z},"$1","PG6",2,0,53,68],
+PX5:[function(a){var z=J.t(a)
+if(!!z.$isw)z=J.ZG(J.kl(z.gvc(a),new T.k9(a)),";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Bn",2,0,52,66],
+return z},"$1","ey",2,0,53,68],
 IK:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.xC(J.UQ(this.a,a),!0)},"$1",null,2,0,null,141,"call"],
-$isEH:true},
-ex:{
-"^":"TpZ:12;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,141,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.mG(J.Tf(this.Q,a),!0)},"$1",null,2,0,null,202,"call"]},
+k9:{
+"^":"r:14;Q",
+$1:[function(a){return H.d(a)+": "+H.d(J.Tf(this.Q,a))},"$1",null,2,0,null,202,"call"]},
 QB:{
-"^":"vE;OH,nF,R3,SY,oe",
+"^":"VE;a,b,c,d,Q",
 op:function(a,b,c){var z,y,x
 z={}
-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)
+y=T.eHj(a,null).oK()
+if(M.CF(c)){x=J.t(b)
+x=x.m(b,"bind")||x.m(b,"repeat")}else x=!1
+if(x){z=J.t(y)
 if(!!z.$isDI)return new T.qb(this,y.gxG(),z.gkZ(y))
 else return new T.Xyb(this,y)}z.a=null
-x=!!J.x(c).$ish4
-if(x&&J.xC(b,"class"))z.a=T.ey()
-else if(x&&J.xC(b,"style"))z.a=T.Bn()
+x=!!J.t(c).$isz2
+if(x&&J.mG(b,"class"))z.a=T.PG6()
+else if(x&&J.mG(b,"style"))z.a=T.ey()
 return new T.Ddj(z,this,y)},
-CE:function(a){var z=this.SY.t(0,a)
-if(z==null)return new T.uKo(this,a)
-return new T.r6k(this,a,z)},
-jX:function(a){var z,y,x,w,v
+CE:function(a){var z=this.d.p(0,a)
+if(z==null)return new T.rc(this,a)
+return new T.uKo(this,a,z)},
+LR:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=z.gAd(a)
+y=z.gKV(a)
 if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Xi(a)
+if(M.CF(a)){x=!!z.$ishs?a:M.uH(a)
 z=J.RE(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.jX(y)},
-fi:function(a,b){var z,y
-if(a==null)return K.xVr(b,this.nF)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isPF)return b
-y=this.R3
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gAd(a)!=null)return this.W5(z.gAd(a),b)
+w=z.gCn(x)
+v=w==null?z.gk8(x):w.Q
+if(!!J.t(v).$isPF)return v
+else return this.c.p(0,a)}return this.LR(y)},
+mH:function(a,b){var z,y
+if(a==null)return K.cT(b,this.b)
+z=J.t(a)
+if(!!z.$isz2);if(!!J.t(b).$isPF)return b
+y=this.c
+if(y.p(0,a)!=null){y.p(0,a)
+return y.p(0,a)}else if(z.gKV(a)!=null)return this.W5(z.gKV(a),b)
 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).$isvy?a:M.Xi(a)
+if(M.CF(a)){z=!!J.t(a).$ishs?a:M.uH(a)
 y=J.RE(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.xVr(b,this.nF)}else return this.W5(y.gAd(a),b)}},
-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)
+if(y.gCn(z)==null)y.gk8(z)
+return this.c.p(0,a)}else{y=J.RE(a)
+if(y.geT(a)==null){x=this.c.p(0,a)
+return x!=null?x:K.cT(b,this.b)}else return this.W5(y.gKV(a),b)}},
+static:{"^":"rp3",GF:function(a,b){var z,y,x
+z=H.J(new P.nj(null),[K.PF])
+y=H.J(new P.nj(null),[P.I])
+x=P.L5(null,null,null,P.I,P.a)
 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.xVr(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]}},
+return new T.QB(b,x,z,y,null)},aV:[function(a){return T.eHj(a,null).oK()},"$1","EPS",2,0,69],mD:[function(a,b,c,d){var z=K.cT(b,c)
+return d?T.rD(a,z,null):new T.mY(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","pw",4,5,70,23,71]}},
 qb:{
-"^":"TpZ:198;b,c,d",
+"^":"r:203;Q,a,b",
 $3:[function(a,b,c){var z,y
-z=this.b
-z.SY.u(0,b,this.c)
-y=!!J.x(a).$isPF?a:K.xVr(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,187,188,189,"call"],
-$isEH:true},
+z=this.Q
+z.d.q(0,b,this.a)
+y=!!J.t(a).$isPF?a:K.cT(a,z.b)
+z.c.q(0,b,y)
+return new T.mY(y,null,this.b,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
 Xyb:{
-"^":"TpZ:198;e,f",
+"^":"r:203;Q,a",
 $3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isPF?a:K.xVr(a,z.nF)
-z.R3.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-return new T.tI(y,null,this.f,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"],
-$isEH:true},
+z=this.Q
+y=!!J.t(a).$isPF?a:K.cT(a,z.b)
+z.c.q(0,b,y)
+if(c===!0)return T.rD(this.a,y,null)
+return new T.mY(y,null,this.a,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
 Ddj:{
-"^":"TpZ:198;a,UI,bK",
-$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,187,188,189,"call"],
-$isEH:true},
-uKo:{
-"^":"TpZ:12;a,b",
+"^":"r:203;Q,a,b",
+$3:[function(a,b,c){var z=this.a.mH(b,a)
+if(c===!0)return T.rD(this.b,z,this.Q.a)
+return new T.mY(z,this.Q.a,this.b,null,null,null,null)},"$3",null,6,0,null,187,188,189,"call"]},
+rc:{
+"^":"r:14;Q,a",
 $1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.R3.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.xVr(a,z.nF)}else return z.fi(y,a)},"$1",null,2,0,null,187,"call"],
-$isEH:true},
-r6k:{
-"^":"TpZ:12;c,d,e",
+z=this.Q
+y=this.a
+x=z.c.p(0,y)
+if(x!=null){if(J.mG(a,J.ZH(x)))return x
+return K.cT(a,z.b)}else return z.mH(y,a)},"$1",null,2,0,null,187,"call"]},
+uKo:{
+"^":"r:14;Q,a,b",
 $1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.R3.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.jX(y).t1(w,a)},"$1",null,2,0,null,187,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;Hk,mo,te,qc,RQ,uZ,Ke",
-Ko:function(a){return this.mo.$1(a)},
-AO:function(a){return this.qc.$1(a)},
+z=this.Q
+y=this.a
+x=z.c.p(0,y)
+w=this.b
+if(x!=null)return x.Ek(w,a)
+else return z.LR(y).Ek(w,a)},"$1",null,2,0,null,187,"call"]},
+mY:{
+"^":"Ap;Q,a,b,c,d,e,f",
+Ko:function(a){return this.a.$1(a)},
+AO:function(a){return this.c.$1(a)},
 Mr:[function(a,b){var z,y
-z=this.Ke
-y=this.mo==null?a:this.Ko(a)
-this.Ke=y
-if(b!==!0&&this.qc!=null&&!J.xC(z,y)){this.AO(this.Ke)
-return!0}return!1},function(a){return this.Mr(a,!1)},"Eu0","$2$skipChanges","$1","gGX",2,3,199,69,60,200],
-gP:function(a){if(this.qc!=null){this.kf(!0)
-return this.Ke}return T.rD(this.te,this.Hk,this.mo)},
-sP:function(a,b){var z,y,x,w
-try{K.jXm(this.te,b,this.Hk,!1)}catch(x){w=H.Ru(x)
+z=this.f
+y=this.a==null?a:this.Ko(a)
+this.f=y
+if(b!==!0&&this.c!=null&&!J.mG(z,y)){this.AO(this.f)
+return!0}return!1},function(a){return this.Mr(a,!1)},"hR","$2$skipChanges","$1","gGX",2,3,204,71,62,205],
+gM:function(a){if(this.c!=null){this.kf(!0)
+return this.f}return T.rD(this.b,this.Q,this.a)},
+sM:function(a,b){var z,y,x,w
+try{K.jXm(this.b,b,this.Q,!1)}catch(x){w=H.Ru(x)
 z=w
-y=new H.oP(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.te)+"': "+H.d(z),y)}},
+y=new H.XO(x,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0("Error evaluating expression '"+H.d(this.b)+"': "+H.d(z),y)}},
 TR:function(a,b){var z,y
-if(this.qc!=null)throw H.b(P.w("already open"))
-this.qc=b
-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
+if(this.c!=null)throw H.b(P.s("already open"))
+this.c=b
+z=J.ph(this.b,new K.Oy(P.NZ2(null,null)))
+this.e=z
+y=z.gE6().yI(this.gGX())
+y.fm(0,new T.yF(this))
+this.d=y
 this.kf(!0)
-return this.Ke},
-kf:function(a){var z,y,x,w,v
-try{x=this.uZ
-J.okV(x,new K.Edh(this.Hk,a))
-x.gBI()
-x=this.Mr(this.uZ.gBI(),a)
+return this.f},
+kf:function(a){var z,y,x,w
+try{x=this.e
+J.ph(x,new K.pf(this.Q,a))
+x.gLl()
+x=this.Mr(this.e.gLl(),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)
+y=new H.XO(w,null)
+x=new P.Gc(0,$.X3,null)
 x.$builtinTypeInfo=[null]
-new P.Zf(x).$builtinTypeInfo=[null]
-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)
+x=new P.Zf(x)
+x.$builtinTypeInfo=[null]
+x.w0("Error evaluating expression '"+H.d(this.e)+"': "+H.d(z),y)
 return!1}},
 Yg:function(){return this.kf(!1)},
 xO:function(a){var z,y
-if(this.qc==null)return
-this.RQ.Gv()
-this.RQ=null
-this.qc=null
+if(this.c==null)return
+this.d.Gv()
+this.d=null
+this.c=null
 z=$.Pk()
-y=this.uZ
+y=this.e
 z.toString
-J.okV(y,z)
-this.uZ=null},
-fR:function(){if(this.qc!=null)this.Cm()},
-Cm:function(){var z=0
+J.ph(y,z)
+this.e=null},
+fR:function(){if(this.c!=null)this.Dy()},
+Dy:function(){var z=0
 while(!0){if(!(z<1000&&this.Yg()===!0))break;++z}return z>0},
 static:{"^":"Hi1",rD:function(a,b,c){var z,y,x,w,v
-try{z=J.okV(a,new K.GQ(b))
+try{z=J.ph(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.oP(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
+x=new H.XO(v,null)
+H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[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.uZ)+"': "+H.d(a),b)},"$2",null,4,0,null,2,167,"call"],
-$isEH:true},
+"^":"r:80;Q",
+$2:[function(a,b){H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]).w0("Error evaluating expression '"+H.d(this.Q.e)+"': "+H.d(a),b)},"$2",null,4,0,null,4,167,"call"]},
 WM:{
 "^":"a;"}}],["","",,B,{
 "^":"",
-LL:{
-"^":"xhq;vq>,Xq,Vg,fn",
-vb:function(a,b){this.vq.yI(new B.iH6(b,this))},
+De:{
+"^":"xhq;vq:a>,Q,cy$,db$",
+vb:function(a,b){this.a.yI(new B.iH6(b,this))},
 $asxhq:function(a){return[null]},
-static:{Ha:function(a,b){var z=H.VM(new B.LL(a,null,null,null),[b])
+static:{z4:function(a,b){var z=H.J(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 iH6:{
-"^":"TpZ;a,b",
-$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,"LL")}}}],["","",,K,{
+"^":"r;Q,a",
+$1:[function(a){var z=this.a
+z.Q=F.Wi(z,C.zd,z.Q,a)},"$1",null,2,0,null,97,"call"],
+$signature:function(){return H.oZ(function(a){return{func:"WM",args:[a]}},this.a,"De")}}}],["","",,K,{
 "^":"",
 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=H.J([],[U.rN])
+for(;y=J.t(a),!!y.$isuku;){if(!J.mG(y.gxS(a),"|"))break
 z.push(y.gT8(a))
-a=y.gBb(a)}if(!!y.$isfp){x=y.gP(a)
-w=C.x4
-v=!1}else if(!!y.$isvn){w=a.gZs()
+a=y.gBb(a)}if(!!y.$isfp){x=y.gM(a)
+w=C.HI
+v=!1}else if(!!y.$iszX){w=a.ghP()
 x=a.gmU()
-v=!0}else{if(!!y.$isx9){w=a.gZs()
-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))
+v=!0}else{if(!!y.$iszg){w=a.ghP()
+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.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.D();){u=y.c
+J.ph(u,new K.GQ(c))
+if(d)throw H.b(K.du("filter must implement Transformer to be assignable: "+H.d(u)))
+else return}t=J.ph(w,new K.GQ(c))
 if(t==null)return
-if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
-else{y=$.Mg().xV.T4.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-xVr: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},
+if(v)J.H9(t,J.ph(x,new K.GQ(c)),b)
+else{y=$.Mg().Q.f.p(0,x)
+$.cp().Q1(t,y,b)}return b},
+cT:function(a,b){var z,y
+z=P.L5(null,null,null,P.I,P.a)
+z.FV(0,b)
+y=new K.Ph(new K.ug(a),z)
+if(z.NZ(0,"this"))H.vh(K.du("'this' cannot be used as a variable name."))
+z=y
+return z},
+w10:{
+"^":"r:80;",
+$2:function(a,b){return J.WB(a,b)}},
+w11:{
+"^":"r:80;",
+$2:function(a,b){return J.D5(a,b)}},
+w12:{
+"^":"r:80;",
+$2:function(a,b){return J.lX(a,b)}},
 w13:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.WB(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.x4(a,b)}},
 w14:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.FWx(a,b)}},
 w15:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.mG(a,b)}},
 w16:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return!J.mG(a,b)}},
 w17:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.jOZ(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a==null?b==null:a===b}},
 w18:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a==null?b!=null:a!==b}},
 w19:{
-"^":"TpZ:81;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.vU(a,b)}},
 w20:{
-"^":"TpZ:81;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.u6(a,b)}},
 w21:{
-"^":"TpZ:81;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.UN(a,b)}},
 w22:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.xZ(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return J.W1(a,b)}},
 w23:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a===!0||b===!0}},
 w24:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){return a===!0&&b===!0}},
 w25:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w26:{
-"^":"TpZ:81;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w27:{
-"^":"TpZ:81;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w28:{
-"^":"TpZ:81;",
+"^":"r:80;",
 $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.zq("Filters must be a one-argument function."))},
-$isEH:true},
-w10:{
-"^":"TpZ:12;",
-$1:function(a){return a},
-$isEH:true},
-w11:{
-"^":"TpZ:12;",
-$1:function(a){return J.Lh(a)},
-$isEH:true},
-w12:{
-"^":"TpZ:12;",
-$1:function(a){return a!==!0},
-$isEH:true},
+throw H.b(K.du("Filters must be a one-argument function."))}},
+lPa:{
+"^":"r:14;",
+$1:function(a){return a}},
+Ufa:{
+"^":"r:14;",
+$1:function(a){return J.EFh(a)}},
+Raa:{
+"^":"r:14;",
+$1:function(a){return a!==!0}},
 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.zq("'this' cannot be used as a variable name."))
+q:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
+Ek:function(a,b){if(J.mG(a,"this"))H.vh(K.du("'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]}},
+$asueT:function(){return[P.I,P.a]}},
 ug:{
-"^":"PF;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.Mg().xV.T4.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+"^":"PF;k8:Q>",
+p:function(a,b){var z,y
+if(J.mG(b,"this"))return this.Q
+z=$.Mg().Q.f.p(0,b)
+y=this.Q
+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).$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]},
+return!!J.t(y).$iscb?B.z4(y,null):y},
+Eq:function(a){return!J.mG(a,"this")},
+X:[function(a){return"[model: "+H.d(this.Q)+"]"},"$0","gCR",0,0,0]},
 Rf:{
-"^":"PF;eT>,hI,P>",
-gk8:function(a){var z=this.eT
+"^":"PF;eT:Q>,a,M:b>",
+gk8:function(a){var z=this.Q
 z=z.gk8(z)
 return z},
-t:function(a,b){var z
-if(J.xC(this.hI,b)){z=this.P
-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]},
+p:function(a,b){var z
+if(J.mG(this.a,b)){z=this.b
+return!!J.t(z).$iscb?B.z4(z,null):z}return this.Q.p(0,b)},
+Eq:function(a){if(J.mG(this.a,a))return!1
+return this.Q.Eq(a)},
+X:[function(a){return this.Q.X(0)+" > [local: "+H.d(this.a)+"]"},"$0","gCR",0,0,0]},
 Ph:{
-"^":"PF;eT>,Z3<",
-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).$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: "+P.B4(H.VM(new P.i5(z),[H.u3(z,0)]),"(",")")+"]"},"$0","gCR",0,0,73]},
+"^":"PF;eT:Q>,Z3:a<",
+gk8:function(a){return this.Q.Q},
+p:function(a,b){var z=this.a
+if(z.NZ(0,b)){z=z.p(0,b)
+return!!J.t(z).$iscb?B.z4(z,null):z}return this.Q.p(0,b)},
+Eq:function(a){if(this.a.NZ(0,a))return!1
+return!J.mG(a,"this")},
+X:[function(a){var z=this.a
+return"[model: "+H.d(this.Q.Q)+"] > [global: "+H.d(H.J(new P.i5(z),[H.u3(z,0)]))+"]"},"$0","gCR",0,0,0]},
 Ay0:{
-"^":"a;VO?,Xl<",
-gju:function(){var z=this.vO
-return H.VM(new P.Ln(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.Yo(a)},
-fs:function(){var z=this.tj
+"^":"a;Hg:a?,Xl:c<",
+gE6:function(){var z=this.d
+return H.J(new P.rk(z),[H.u3(z,0)])},
+gEV:function(){return this.Q},
+gLl:function(){return this.c},
+Lz:function(a){},
+BZ:function(a){var z
+this.Wn(0,a,!1)
+z=this.a
+if(z!=null)z.BZ(a)},
+fs:function(){var z=this.b
 if(z!=null){z.Gv()
-this.tj=null}},
-jK:function(a,b,c){var z,y,x
+this.b=null}},
+Wn:function(a,b,c){var z,y,x
 this.fs()
-z=this.Xl
-this.MN(b)
-if(!c){y=this.Xl
+z=this.c
+this.Lz(b)
+if(!c){y=this.c
 y=y==null?z!=null:y!==z}else y=!1
-if(y){y=this.vO
-x=this.Xl
-if(y.YM>=4)H.vh(y.Pq())
+if(y){y=this.d
+x=this.c
+if(y.b>=4)H.vh(y.Pq())
 y.MW(x)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gCR",0,0,73],
-$isrx:true},
-Edh:{
-"^":"cfS;ms,OQ",
-xn:function(a){a.jK(0,this.ms,this.OQ)}},
+X:[function(a){return this.Q.X(0)},"$0","gCR",0,0,0],
+$isrN:true},
+pf:{
+"^":"cfS;Q,a",
+xn:function(a){a.Wn(0,this.Q,this.a)}},
 me:{
 "^":"cfS;",
 xn:function(a){a.fs()},
 static:{"^":"jC"}},
 GQ:{
-"^":"P55;ms",
-W9:function(a){return J.ZH(this.ms)},
-Hs:function(a){return a.o2.RR(0,this)},
-Ci:function(a){var z,y,x
-z=J.okV(a.gZs(),this)
+"^":"P55;Q",
+W9:function(a){return J.ZH(this.Q)},
+Hs:function(a){return a.Q.RR(0,this)},
+T7:function(a){var z,y,x
+z=J.ph(a.ghP(),this)
 if(z==null)return
 y=a.goc(a)
-x=$.Mg().xV.T4.t(0,y)
+x=$.Mg().Q.f.p(0,y)
 return $.cp().jD(z,x)},
-CU:function(a){var z=J.okV(a.gZs(),this)
+CU:function(a){var z=J.ph(a.ghP(),this)
 if(z==null)return
-return J.UQ(z,J.okV(a.gmU(),this))},
+return J.Tf(z,J.ph(a.gmU(),this))},
 Y7:function(a){var z,y,x,w,v
-z=J.okV(a.gZs(),this)
+z=J.ph(a.ghP(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 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=$.Mg().xV.T4.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-I6W:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).br(0)},
+y=H.J(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gbP(a)==null)return H.eC(z,y,P.Te(null))
+x=a.gbP(a)
+v=$.Mg().Q.f.p(0,x)
+return $.cp().Ol(z,v,y,!1,null)},
+I6:function(a){return a.gM(a)},
+Zh:function(a){return H.J(new H.A8(a.gMO(),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.Ff
-z.u(0,J.okV(J.AW(x),this),J.okV(x.gv4(),this))}return z},
+z=P.A(null,null)
+for(y=a.gJq(a),y=H.J(new H.a7(y,y.length,0,null),[H.u3(y,0)]);y.D();){x=y.c
+z.q(0,J.ph(J.Kt(x),this),J.ph(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))},
+qv:function(a){return J.Tf(this.Q,a.gM(a))},
 ex:function(a){var z,y,x,w,v
 z=a.gxS(a)
-y=J.okV(a.gBb(a),this)
-x=J.okV(a.gT8(a),this)
-w=$.YP().t(0,z)
-v=J.x(z)
-if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
-return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
+y=J.ph(a.gBb(a),this)
+x=J.ph(a.gT8(a),this)
+w=$.RTI().p(0,z)
+v=J.t(z)
+if(v.m(z,"&&")||v.m(z,"||")){v=y==null?!1:y
+return w.$2(v,x==null?!1:x)}else if(v.m(z,"==")||v.m(z,"!="))return w.$2(y,x)
 else if(y==null||x==null)return
 return w.$2(y,x)},
-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)
+Hx:function(a){var z,y
+z=J.ph(a.gO4(),this)
+y=$.fs().p(0,a.gxS(a))
+if(J.mG(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.geE(),this)},
-ky:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+RD:function(a){return J.mG(J.ph(a.gdc(),this),!0)?J.ph(a.gav(),this):J.ph(a.grM(),this)},
+MV: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.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)
+"^":"P55;Q",
+W9:function(a){return new K.WhS(a,null,null,null,P.bK(null,null,!1,null))},
+Hs:function(a){return a.Q.RR(0,this)},
+T7:function(a){var z,y
+z=J.ph(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(y)
+z.sHg(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.iTN(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z=J.ph(a.ghP(),this)
+y=J.ph(a.gmU(),this)
+x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(x)
+y.sHg(x)
 return x},
 Y7:function(a){var z,y,x,w,v
-z=J.okV(a.gZs(),this)
+z=J.ph(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
 w=this.gnG()
 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.zD(v))
+y=H.J(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(v)
+if(y!=null)C.Nm.aN(y,new K.Wv(v))
 return v},
-I6W:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+I6:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.gBx(),this.gnG()),[null,null]).tt(0,!1)
-y=new K.Gt(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
+z=H.J(new H.A8(a.gMO(),this.gnG()),[null,null]).tt(0,!1)
+y=new K.UF(z,a,null,null,null,P.bK(null,null,!1,null))
+C.Nm.aN(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.ev2(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.Xs(y))
+z=H.J(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))
+C.Nm.aN(z,new K.Xs(y))
 return y},
 YV:function(a){var z,y,x
-z=J.okV(a.gnl(a),this)
-y=J.okV(a.gv4(),this)
+z=J.ph(a.gG3(a),this)
+y=J.ph(a.gv4(),this)
 x=new K.EL(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z.sHg(x)
+y.sHg(x)
 return x},
-qv:function(a){return new K.Yw(a,null,null,null,P.bK(null,null,!1,null))},
+qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
-z=J.okV(a.gBb(a),this)
-y=J.okV(a.gT8(a),this)
-x=new K.ED(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(x)
-y.sVO(x)
+z=J.ph(a.gBb(a),this)
+y=J.ph(a.gT8(a),this)
+x=new K.ky(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(x)
+y.sHg(x)
 return x},
-kb:function(a){var z,y
-z=J.okV(a.go2(),this)
+Hx:function(a){var z,y
+z=J.ph(a.gO4(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sVO(y)
+z.sHg(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.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)
+z=J.ph(a.gdc(),this)
+y=J.ph(a.gav(),this)
+x=J.ph(a.grM(),this)
+w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sHg(w)
+y.sHg(w)
+x.sHg(w)
 return w},
-ky:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+MV: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},
+Wv:{
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
 XV:{
-"^":"TpZ:12;a",
-$1:function(a){var z=this.a
-a.sVO(z)
-return z},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
 Xs:{
-"^":"TpZ:12;a",
-$1:function(a){var z=this.a
-a.sVO(z)
-return z},
-$isEH:true},
-Il:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-MN:function(a){this.Xl=J.ZH(a)},
+"^":"r:14;Q",
+$1:function(a){var z=this.Q
+a.sHg(z)
+return z}},
+WhS:{
+"^":"Ay0;Q,a,b,c,d",
+Lz:function(a){this.c=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.WH]},
-$isWH:true,
-$isrx:true},
+$asAy0:function(){return[U.EO]},
+$isEO:true,
+$isrN:true},
 z0:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-gP:function(a){var z=this.KL
-return z.gP(z)},
-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},
-Gt:{
-"^":"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)},
+"^":"Ay0;Q,a,b,c,d",
+gM:function(a){var z=this.Q
+return z.gM(z)},
+Lz:function(a){var z=this.Q
+this.c=z.gM(z)},
+RR:function(a,b){return b.I6(this)},
+$asAy0:function(){return[U.Dv]},
+$asDv:function(){return[null]},
+$isDv:true,
+$isrN:true},
+UF:{
+"^":"Ay0;MO:e<,Q,a,b,c,d",
+Lz:function(a){this.c=H.J(new H.A8(this.e,new K.Hv()),[null,null]).br(0)},
 RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$isrx:true},
+$asAy0:function(){return[U.Ej]},
+$isEj:true,
+$isrN:true},
 Hv:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"],
-$isEH:true},
-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())},
+"^":"r:14;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,97,"call"]},
+ED:{
+"^":"Ay0;Jq:e>,Q,a,b,c,d",
+Lz:function(a){this.c=H.n3(this.e,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,
-$isrx:true},
+$isrN:true},
 Ku:{
-"^":"TpZ:81;",
-$2:function(a,b){J.kW(a,J.AW(b).gXl(),b.gv4().gXl())
-return a},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){J.H9(a,J.Kt(b).gXl(),b.gv4().gXl())
+return a}},
 EL:{
-"^":"Ay0;nl>,v4<,KL,VO,tj,Xl,vO",
+"^":"Ay0;G3:e>,v4:f<,Q,a,b,c,d",
 RR:function(a,b){return b.YV(this)},
 $asAy0:function(){return[U.nu]},
 $isnu:true,
-$isrx:true},
-Yw:{
-"^":"Ay0;KL,VO,tj,Xl,vO",
-gP:function(a){var z=this.KL
-return z.gP(z)},
-MN:function(a){var z,y,x,w
-z=this.KL
+$isrN:true},
+ek:{
+"^":"Ay0;Q,a,b,c,d",
+gM:function(a){var z=this.Q
+return z.gM(z)},
+Lz:function(a){var z,y,x,w
+z=this.Q
 y=J.U6(a)
-this.Xl=y.t(a,z.gP(z))
-if(!a.tc(z.gP(z)))return
+this.c=y.p(a,z.gM(z))
+if(!a.Eq(z.gM(z)))return
 x=y.gk8(a)
-y=J.x(x)
+y=J.t(x)
 if(!y.$isd3)return
-z=z.gP(z)
-w=$.Mg().xV.T4.t(0,z)
-this.tj=y.gqh(x).yI(new K.OC(this,a,w))},
+z=z.gM(z)
+w=$.Mg().Q.f.p(0,z)
+this.b=y.gqh(x).yI(new K.OCQ(this,a,w))},
 RR:function(a,b){return b.qv(this)},
 $asAy0:function(){return[U.fp]},
 $isfp:true,
-$isrx:true},
-OC:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+$isrN:true},
+OCQ:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.GC(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
 mv:{
-"^":"Ay0;o2<,KL,VO,tj,Xl,vO",
-gxS:function(a){var z=this.KL
+"^":"Ay0;O4:e<,Q,a,b,c,d",
+gxS:function(a){var z=this.Q
 return z.gxS(z)},
-MN:function(a){var z,y
-z=this.KL
-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,
-$isrx:true},
-ED:{
-"^":"Ay0;Bb>,T8>,KL,VO,tj,Xl,vO",
-gxS:function(a){var z=this.KL
+Lz:function(a){var z,y
+z=this.Q
+y=$.fs().p(0,z.gxS(z))
+if(J.mG(z.gxS(z),"!")){z=this.e.gXl()
+this.c=y.$1(z==null?!1:z)}else{z=this.e
+this.c=z.gXl()==null?null:y.$1(z.gXl())}},
+RR:function(a,b){return b.Hx(this)},
+$asAy0:function(){return[U.In]},
+$isIn:true,
+$isrN:true},
+ky:{
+"^":"Ay0;Bb:e>,T8:f>,Q,a,b,c,d",
+gxS:function(a){var z=this.Q
 return z.gxS(z)},
-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.gXl()
+Lz:function(a){var z,y,x
+z=this.Q
+y=$.RTI().p(0,z.gxS(z))
+if(J.mG(z.gxS(z),"&&")||J.mG(z.gxS(z),"||")){z=this.e.gXl()
 if(z==null)z=!1
-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.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())}}},
+x=this.f.gXl()
+this.c=y.$2(z,x==null?!1:x)}else if(J.mG(z.gxS(z),"==")||J.mG(z.gxS(z),"!="))this.c=y.$2(this.e.gXl(),this.f.gXl())
+else{x=this.e
+if(x.gXl()==null||this.f.gXl()==null)this.c=null
+else{if(J.mG(z.gxS(z),"|")&&!!J.t(x.gXl()).$iswn)this.b=H.Go(x.gXl(),"$iswn").gXF().yI(new K.cw(this,a))
+this.c=y.$2(x.gXl(),this.f.gXl())}}},
 RR:function(a,b){return b.ex(this)},
 $asAy0:function(){return[U.uku]},
 $isuku:true,
-$isrx:true},
-P8:{
-"^":"TpZ:12;a,b",
-$1:[function(a){return this.a.Yo(this.b)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
-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()},
+$isrN:true},
+cw:{
+"^":"r:14;Q,a",
+$1:[function(a){return this.Q.BZ(this.a)},"$1",null,2,0,null,15,"call"]},
+an:{
+"^":"Ay0;dc:e<,av:f<,rM:r<,Q,a,b,c,d",
+Lz:function(a){var z=this.e.gXl()
+this.c=(z==null?!1:z)===!0?this.f.gXl():this.r.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.x06]},
-$isx06:true,
-$isrx:true},
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
+$isrN:true},
 vl:{
-"^":"Ay0;Zs<,KL,VO,tj,Xl,vO",
-goc:function(a){var z=this.KL
+"^":"Ay0;hP:e<,Q,a,b,c,d",
+goc:function(a){var z=this.Q
 return z.goc(z)},
-MN:function(a){var z,y,x
-z=this.Zs.gXl()
-if(z==null){this.Xl=null
-return}y=this.KL
+Lz:function(a){var z,y,x
+z=this.e.gXl()
+if(z==null){this.c=null
+return}y=this.Q
 y=y.goc(y)
-x=$.Mg().xV.T4.t(0,y)
-this.Xl=$.cp().jD(z,x)
-y=J.x(z)
-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,
-$isrx:true},
-Vw:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+x=$.Mg().Q.f.p(0,y)
+this.c=$.cp().jD(z,x)
+y=J.t(z)
+if(!!y.$isd3)this.b=y.gqh(z).yI(new K.e9n(this,a,x))},
+RR:function(a,b){return b.T7(this)},
+$asAy0:function(){return[U.zg]},
+$iszg:true,
+$isrN:true},
+e9n:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.WKb(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
-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()
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
+iT:{
+"^":"Ay0;hP:e<,mU:f<,Q,a,b,c,d",
+Lz:function(a){var z,y,x
+z=this.e.gXl()
+if(z==null){this.c=null
+return}y=this.f.gXl()
 x=J.U6(z)
-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))},
+this.c=x.p(z,y)
+if(!!x.$iswn)this.b=z.gXF().yI(new K.tE(this,a,y))
+else if(!!x.$isd3)this.b=x.gqh(z).yI(new K.oD(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.vn]},
-$isvn:true,
-$isrx:true},
+$asAy0:function(){return[U.zX]},
+$iszX:true,
+$isrN:true},
 tE:{
-"^":"TpZ:12;a,b,c",
-$1:[function(a){if(J.VA(a,new K.eyp(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
-eyp:{
-"^":"TpZ:12;d",
-$1:[function(a){return a.aa(this.d)},"$1",null,2,0,null,85,"call"],
-$isEH:true},
-jai:{
-"^":"TpZ:12;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.GST(this.UI))===!0)this.e.Yo(this.f)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.GST(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 GST:{
-"^":"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,Xl,vO",
-gnK:function(a){var z=this.KL
-return z.gnK(z)},
-MN:function(a){var z,y,x,w
-z=this.re
+"^":"r:14;Q",
+$1:[function(a){return a.vP(this.Q)},"$1",null,2,0,null,85,"call"]},
+oD:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.zw(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
+zw:{
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isya&&J.mG(a.Q,this.Q)},"$1",null,2,0,null,85,"call"]},
+xJ:{
+"^":"Ay0;hP:e<,re:f<,Q,a,b,c,d",
+gbP:function(a){var z=this.Q
+return z.gbP(z)},
+Lz:function(a){var z,y,x,w
+z=this.f
 z.toString
-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.Xl=!!J.x(z).$iswS?B.Ha(z,null):z}else{z=z.gnK(z)
-w=$.Mg().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.BGc(this,a,w))}},
+y=H.J(new H.A8(z,new K.BGc()),[null,null]).br(0)
+x=this.e.gXl()
+if(x==null){this.c=null
+return}z=this.Q
+if(z.gbP(z)==null){z=H.eC(x,y,P.Te(null))
+this.c=!!J.t(z).$iscb?B.z4(z,null):z}else{z=z.gbP(z)
+w=$.Mg().Q.f.p(0,z)
+this.c=$.cp().Ol(x,w,y,!1,null)
+z=J.t(x)
+if(!!z.$isd3)this.b=z.gqh(x).yI(new K.WWJ(this,a,w))}},
 RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.RWc]},
 $isRWc:true,
-$isrx:true},
-vQ:{
-"^":"TpZ:12;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
-$isEH:true},
+$isrN:true},
 BGc:{
-"^":"TpZ:201;a,b,c",
-$1:[function(a){if(J.VA(a,new K.ho(this.c))===!0)this.a.Yo(this.b)},"$1",null,2,0,null,194,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,52,"call"]},
+WWJ:{
+"^":"r:206;Q,a,b",
+$1:[function(a){if(J.pb(a,new K.ho(this.b))===!0)this.Q.BZ(this.a)},"$1",null,2,0,null,194,"call"]},
 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},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(a).$isqI&&J.mG(a.a,this.Q)},"$1",null,2,0,null,85,"call"]},
 B03:{
-"^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gCR",0,0,73],
-static:{zq:function(a){return new K.B03(a)}}}}],["","",,U,{
+"^":"a;G1:Q>",
+X:[function(a){return"EvalException: "+this.Q},"$0","gCR",0,0,0],
+static:{du:function(a){return new K.B03(a)}}}}],["","",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -17896,428 +17274,388 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.xC(y,b[z]))return!1}return!0},
+if(!J.mG(y,b[z]))return!1}return!0},
 N4:function(a){a.toString
-return U.Le(H.n3(a,0,new U.lc()))},
+return U.Le(H.n3(a,0,new U.jf()))},
 C0C:function(a,b){var z=J.WB(a,b)
-if(typeof z!=="number")return H.s(z)
+if(typeof z!=="number")return H.o(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
-Le:function(a){if(typeof a!=="number")return H.s(a)
+Le:function(a){if(typeof a!=="number")return H.o(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.vn(b,c)},"$2","gvH",4,0,202,2,49]},
-rx:{
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,207,4,52]},
+rN:{
 "^":"a;",
-$isrx:true},
-WH:{
-"^":"rx;",
+$isrN:true},
+EO:{
+"^":"rN;",
 RR:function(a,b){return b.W9(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
+$isEO:true},
+Dv:{
+"^":"rN;M:Q>",
+RR:function(a,b){return b.I6(this)},
+X:[function(a){var z=this.Q
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-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)},
-$isnoG:true},
-c0:{
-"^":"rx;Bx<",
+z=H.RB(b,"$isDv",[H.u3(this,0)],"$asDv")
+return z&&J.mG(J.SW(b),this.Q)},
+giO:function(a){return J.v1(this.Q)},
+$isDv:true},
+Ej:{
+"^":"rN;MO:Q<",
 RR:function(a,b){return b.Zh(this)},
-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).$isc0&&U.Pu(b.gBx(),this.Bx)},
-giO:function(a){return U.N4(this.Bx)},
-$isc0:true},
+X:[function(a){return H.d(this.Q)},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isEj&&U.Pu(b.gMO(),this.Q)},
+giO:function(a){return U.N4(this.Q)},
+$isEj:true},
 Mm:{
-"^":"rx;Jq>",
+"^":"rN;Jq:Q>",
 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
+X:[function(a){return"{"+H.d(this.Q)+"}"},"$0","gCR",0,0,0],
+m: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.N4(this.Jq)},
+z=J.t(b)
+return!!z.$isMm&&U.Pu(z.gJq(b),this.Q)},
+giO:function(a){return U.N4(this.Q)},
 $isMm:true},
 nu:{
-"^":"rx;nl>,v4<",
+"^":"rN;G3:Q>,v4:a<",
 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
+X:[function(a){return this.Q.X(0)+": "+H.d(this.a)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isnu&&J.xC(z.gnl(b),this.nl)&&J.xC(b.gv4(),this.v4)},
+z=J.t(b)
+return!!z.$isnu&&J.mG(z.gG3(b),this.Q)&&J.mG(b.gv4(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.nl.P)
-y=J.v1(this.v4)
+z=J.v1(this.Q.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isnu:true},
 XC:{
-"^":"rx;o2",
+"^":"rN;Q",
 RR:function(a,b){return b.Hs(this)},
-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.o2,this.o2)},
-giO:function(a){return J.v1(this.o2)},
+X:[function(a){return"("+H.d(this.Q)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isXC&&J.mG(b.Q,this.Q)},
+giO:function(a){return J.v1(this.Q)},
 $isXC:true},
 fp:{
-"^":"rx;P>",
+"^":"rN;M:Q>",
 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
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isfp&&J.xC(z.gP(b),this.P)},
-giO:function(a){return J.v1(this.P)},
+z=J.t(b)
+return!!z.$isfp&&J.mG(z.gM(b),this.Q)},
+giO:function(a){return J.v1(this.Q)},
 $isfp:true},
-FH:{
-"^":"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
+In:{
+"^":"rN;xS:Q>,O4:a<",
+RR:function(a,b){return b.Hx(this)},
+X:[function(a){return H.d(this.Q)+" "+H.d(this.a)},"$0","gCR",0,0,0],
+m: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.go2(),this.o2)},
+z=J.t(b)
+return!!z.$isIn&&J.mG(z.gxS(b),this.Q)&&J.mG(b.gO4(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.xS)
-y=J.v1(this.o2)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isFH:true},
+$isIn:true},
 uku:{
-"^":"rx;xS>,Bb>,T8>",
+"^":"rN;xS:Q>,Bb:a>,T8:b>",
 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
+X:[function(a){return"("+H.d(this.a)+" "+H.d(this.Q)+" "+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+z=J.t(b)
+return!!z.$isuku&&J.mG(z.gxS(b),this.Q)&&J.mG(z.gBb(b),this.a)&&J.mG(z.gT8(b),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.xS)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=J.v1(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-x06:{
-"^":"rx;dc<,av<,eE<",
+Dc:{
+"^":"rN;dc:Q<,av:a<,rM:b<",
 RR:function(a,b){return b.RD(this)},
-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.geE(),this.eE)},
+X:[function(a){return"("+H.d(this.Q)+" ? "+H.d(this.a)+" : "+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isDc&&J.mG(b.gdc(),this.Q)&&J.mG(b.gav(),this.a)&&J.mG(b.grM(),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.dc)
-y=J.v1(this.av)
-x=J.v1(this.eE)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=J.v1(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isx06:true},
+$isDc:true},
 X7S:{
-"^":"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},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gCR",0,0,73],
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
+"^":"rN;Bb:Q>,T8:a>",
+RR:function(a,b){return b.MV(this)},
+gxG:function(){var z=this.Q
+return z.gM(z)},
+gkZ:function(a){return this.a},
+X:[function(a){return"("+H.d(this.Q)+" in "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isX7S&&b.Q.m(0,this.Q)&&J.mG(b.a,this.a)},
 giO:function(a){var z,y
-z=this.Bb
+z=this.Q
 z=z.giO(z)
-y=J.v1(this.T8)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
 $isDI:true},
-va:{
-"^":"rx;Bb>,T8>",
+NM:{
+"^":"rN;Bb:Q>,T8:a>",
 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).$isva&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
+gxG:function(){var z=this.a
+return z.gM(z)},
+gkZ:function(a){return this.Q},
+X:[function(a){return"("+H.d(this.Q)+" as "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isNM&&J.mG(b.Q,this.Q)&&b.a.m(0,this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
+z=J.v1(this.Q)
+y=this.a
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isva:true,
+$isNM:true,
 $isDI:true},
-vn:{
-"^":"rx;Zs<,mU<",
+zX:{
+"^":"rN;hP:Q<,mU:a<",
 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
-return!!J.x(b).$isvn&&J.xC(b.gZs(),this.Zs)&&J.xC(b.gmU(),this.mU)},
+X:[function(a){return H.d(this.Q)+"["+H.d(this.a)+"]"},"$0","gCR",0,0,0],
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$iszX&&J.mG(b.ghP(),this.Q)&&J.mG(b.gmU(),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Zs)
-y=J.v1(this.mU)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isvn:true},
-x9:{
-"^":"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
+$iszX:true},
+zg:{
+"^":"rN;hP:Q<,oc:a>",
+RR:function(a,b){return b.T7(this)},
+X:[function(a){return H.d(this.Q)+"."+H.d(this.a)},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gZs(),this.Zs)&&J.xC(z.goc(b),this.oc)},
+z=J.t(b)
+return!!z.$iszg&&J.mG(b.ghP(),this.Q)&&J.mG(z.goc(b),this.a)},
 giO:function(a){var z,y
-z=J.v1(this.Zs)
-y=J.v1(this.oc)
+z=J.v1(this.Q)
+y=J.v1(this.a)
 return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
+$iszg:true},
 RWc:{
-"^":"rx;Zs<,nK>,re<",
+"^":"rN;hP:Q<,bP:a>,re:b<",
 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
+X:[function(a){return H.d(this.Q)+"."+H.d(this.a)+"("+H.d(this.b)+")"},"$0","gCR",0,0,0],
+m:function(a,b){var z
 if(b==null)return!1
-z=J.x(b)
-return!!z.$isRWc&&J.xC(b.gZs(),this.Zs)&&J.xC(z.gnK(b),this.nK)&&U.Pu(b.gre(),this.re)},
+z=J.t(b)
+return!!z.$isRWc&&J.mG(b.ghP(),this.Q)&&J.mG(z.gbP(b),this.a)&&U.Pu(b.gre(),this.b)},
 giO:function(a){var z,y,x
-z=J.v1(this.Zs)
-y=J.v1(this.nK)
-x=U.N4(this.re)
+z=J.v1(this.Q)
+y=J.v1(this.a)
+x=U.N4(this.b)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isRWc:true},
-lc:{
-"^":"TpZ:81;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["","",,T,{
+jf:{
+"^":"r:80;",
+$2:function(a,b){return U.C0C(a,J.v1(b))}}}],["","",,T,{
 "^":"",
-FX:{
-"^":"a;Wi,f7,JR,V6",
-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)])
+X5:{
+"^":"a;Q,a,b,c",
+gQN:function(){return this.c.c},
+oK:function(){var z=this.a.zl()
+this.b=z
+this.c=H.J(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.Ff
-z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.V6.Ff
-z=z==null||!J.xC(J.Vm(z),b)}else z=!1
+return this.Kk()},
+It:function(a,b){var z
+if(a!=null){z=this.c.c
+z=z==null||!J.mG(J.Iz(z),a)}else z=!1
+if(!z)if(b!=null){z=this.c.c
+z=z==null||!J.mG(J.SW(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)},
-HM:function(a){return this.Jn(a,null)},
-VK:function(){if(this.V6.Ff==null){this.Wi.toString
-return C.x4}var z=this.ZR()
+if(z)throw H.b(Y.RV4("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQN())))
+this.c.D()},
+jz:function(){return this.It(null,null)},
+Bw:function(a){return this.It(a,null)},
+Kk:function(){if(this.c.c==null)return C.HI
+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"))
+Ay:function(a,b){var z,y,x
+for(;z=this.c.c,z!=null;)if(J.mG(J.Iz(z),9))if(J.mG(J.SW(this.c.c),"("))a=new U.RWc(a,null,this.Hr())
+else if(J.mG(J.SW(this.c.c),"["))a=new U.zX(a,this.FD())
+else break
+else if(J.mG(J.Iz(this.c.c),3)){this.jz()
+a=this.Ju(a,this.ZR())}else if(J.mG(J.Iz(this.c.c),10))if(J.mG(J.SW(this.c.c),"in")){if(!J.t(a).$isfp)H.vh(Y.RV4("in... statements must start with an identifier"))
 this.jz()
-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)
+a=new U.X7S(a,this.Kk())}else if(J.mG(J.SW(this.c.c),"as")){this.jz()
+y=this.Kk()
+if(!J.t(y).$isfp)H.vh(Y.RV4("'as' statements must end with an identifier"))
+a=new U.NM(a,y)}else break
+else{if(J.mG(J.Iz(this.c.c),8)){z=this.c.c.gG8()
+if(typeof z!=="number")return z.C()
+if(typeof b!=="number")return H.o(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.V6.Ff),"?")){this.Jn(8,"?")
-v=this.VK()
-this.HM(5)
-u=this.VK()
-this.Wi.toString
-a=new U.x06(a,v,u)}else a=this.Ax(a)
+if(z)if(J.mG(J.SW(this.c.c),"?")){this.It(8,"?")
+x=this.Kk()
+this.Bw(5)
+a=new U.Dc(a,x,this.Kk())}else a=this.Vg(a)
 else break}return a},
-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.Ff
+Ju:function(a,b){var z=J.t(b)
+if(!!z.$isfp)return new U.zg(a,z.gM(b))
+else if(!!z.$isRWc&&!!J.t(b.ghP()).$isfp)return new U.RWc(a,J.SW(b.ghP()),b.gre())
+else throw H.b(Y.RV4("expected identifier: "+H.d(b)))},
+Vg:function(a){var z,y,x,w,v
+z=this.c.c
 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))))
+if(!C.Nm.tg(C.fW,y.gM(z)))throw H.b(Y.RV4("unknown operator: "+H.d(y.gM(z))))
 this.jz()
 x=this.ZR()
-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()
+while(!0){w=this.c.c
+if(w!=null)if(J.mG(J.Iz(w),8)||J.mG(J.Iz(this.c.c),3)||J.mG(J.Iz(this.c.c),9)){w=this.c.c.gG8()
 v=z.gG8()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
+if(typeof w!=="number")return w.A()
+if(typeof v!=="number")return H.o(v)
 v=w>v
 w=v}else w=!1
 else w=!1
 if(!w)break
-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.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)
+x=this.Ay(x,this.c.c.gG8())}return new U.uku(y.gM(z),a,x)},
+ZR:function(){var z,y
+if(J.mG(J.Iz(this.c.c),8)){z=J.SW(this.c.c)
+y=J.t(z)
+if(y.m(z,"+")||y.m(z,"-")){this.jz()
+if(J.mG(J.Iz(this.c.c),6)){z=new U.Dv(H.BU(H.d(z)+H.d(J.SW(this.c.c)),null,null))
 z.$builtinTypeInfo=[null]
 this.jz()
-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)
+return z}else if(J.mG(J.Iz(this.c.c),7)){z=new U.Dv(H.RR(H.d(z)+H.d(J.SW(this.c.c)),null))
 z.$builtinTypeInfo=[null]
 this.jz()
-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.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()
+return z}else return new U.In(z,this.Ay(this.ar(),11))}else if(y.m(z,"!")){this.jz()
+return new U.In(z,this.Ay(this.ar(),11))}else throw H.b(Y.RV4("unexpected token: "+H.d(z)))}return this.ar()},
+ar:function(){var z,y
+switch(J.Iz(this.c.c)){case 10:z=J.SW(this.c.c)
+if(J.mG(z,"this")){this.jz()
+return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV4("unexpected keyword: "+H.d(z)))
+throw H.b(Y.RV4("unrecognized keyword: "+H.d(z)))
+case 2:return this.xh()
+case 1:return this.Gz()
+case 6:return this.Dp()
 case 7:return this.eD()
-case 9:if(J.xC(J.Vm(this.V6.Ff),"(")){this.jz()
-y=this.VK()
-this.Jn(9,")")
-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()
+case 9:if(J.mG(J.SW(this.c.c),"(")){this.jz()
+y=this.Kk()
+this.It(9,")")
+return new U.XC(y)}else if(J.mG(J.SW(this.c.c),"{"))return this.Hz()
+else if(J.mG(J.SW(this.c.c),"["))return this.U3()
 return
-case 5:throw H.b(Y.RV("unexpected token \":\""))
+case 5:throw H.b(Y.RV4("unexpected token \":\""))
 default:return}},
 U3:function(){var z,y
 z=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),"]"))break
-z.push(this.VK())
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
-this.Jn(9,"]")
-return new U.c0(z)},
-hR:function(){var z,y,x
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),"]"))break
+z.push(this.Kk())
+y=this.c.c}while(y!=null&&J.mG(J.SW(y),","))
+this.It(9,"]")
+return new U.Ej(z)},
+Hz:function(){var z,y,x
 z=[]
 do{this.jz()
-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]
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),"}"))break
+y=new U.Dv(J.SW(this.c.c))
+y.$builtinTypeInfo=[null]
 this.jz()
-this.Jn(5,":")
-z.push(new U.nu(x,this.VK()))
-y=this.V6.Ff}while(y!=null&&J.xC(J.Vm(y),","))
-this.Jn(9,"}")
+this.It(5,":")
+z.push(new U.nu(y,this.Kk()))
+x=this.c.c}while(x!=null&&J.mG(J.SW(x),","))
+this.It(9,"}")
 return new U.Mm(z)},
-Yj:function(){var z,y,x
-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)
+xh:function(){var z,y,x
+if(J.mG(J.SW(this.c.c),"true")){this.jz()
+return H.J(new U.Dv(!0),[null])}if(J.mG(J.SW(this.c.c),"false")){this.jz()
+return H.J(new U.Dv(!1),[null])}if(J.mG(J.SW(this.c.c),"null")){this.jz()
+return H.J(new U.Dv(null),[null])}if(!J.mG(J.Iz(this.c.c),2))H.vh(Y.RV4("expected identifier: "+H.d(this.gQN())+".value"))
+z=J.SW(this.c.c)
 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.Ff
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.V6.Ff),"(")){y=[]
+z=this.c.c
+if(z!=null&&J.mG(J.Iz(z),9)&&J.mG(J.SW(this.c.c),"(")){y=[]
 do{this.jz()
-if(J.xC(J.Iz(this.V6.Ff),9)&&J.xC(J.Vm(this.V6.Ff),")"))break
-y.push(this.VK())
-z=this.V6.Ff}while(z!=null&&J.xC(J.Vm(z),","))
-this.Jn(9,")")
+if(J.mG(J.Iz(this.c.c),9)&&J.mG(J.SW(this.c.c),")"))break
+y.push(this.Kk())
+z=this.c.c}while(z!=null&&J.mG(J.SW(z),","))
+this.It(9,")")
 return y}return},
-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,"]")
+FD:function(){var z,y
+z=this.c.c
+if(z!=null&&J.mG(J.Iz(z),9)&&J.mG(J.SW(this.c.c),"[")){this.jz()
+y=this.Kk()
+this.It(9,"]")
 return y}return},
-Dy:function(){var z,y
-z=J.Vm(this.V6.Ff)
-this.Wi.toString
-y=H.VM(new U.noG(z),[null])
+Gz:function(){var z=H.J(new U.Dv(J.SW(this.c.c)),[null])
 this.jz()
-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])
+return z},
+ldL:function(a){var z=H.J(new U.Dv(H.BU(H.d(a)+H.d(J.SW(this.c.c)),null,null)),[null])
 this.jz()
-return y},
-c9:function(){return this.Rb("")},
-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])
+return z},
+Dp:function(){return this.ldL("")},
+JL:function(a){var z=H.J(new U.Dv(H.RR(H.d(a)+H.d(J.SW(this.c.c)),null)),[null])
 this.jz()
-return y},
-eD:function(){return this.XO("")},
-static:{OD:function(a,b){var z,y,x
-z=H.VM([],[Y.qS])
+return z},
+eD:function(){return this.JL("")},
+static:{eHj:function(a,b){var z,y,x
+z=H.J([],[Y.PnY])
 y=P.p9("")
 x=new U.Fs()
-return new T.FX(x,new Y.dd(z,y,new P.ysG(a,0,0,null),null),null,null)}}}}],["","",,K,{
+return new T.X5(x,new Y.dd(z,y,new P.Kg(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],
-Aep:{
-"^":"a;vH>,P>",
-n:function(a,b){if(b==null)return!1
-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],
-$isAep:true},
+Dce:[function(a){return H.J(new K.Bt(a),[null])},"$1","HZg",2,0,72,73],
+O1:{
+"^":"a;vH:Q>,M:a>",
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isO1&&J.mG(b.Q,this.Q)&&J.mG(b.a,this.a)},
+giO:function(a){return J.v1(this.a)},
+X:[function(a){return"("+H.d(this.Q)+", "+H.d(this.a)+")"},"$0","gCR",0,0,0],
+$isO1:true},
 Bt:{
-"^":"mW;FD",
-gA:function(a){var z=new K.vR(J.mY(this.FD),0,null)
+"^":"mW;Q",
+gu:function(a){var z=new K.vR(J.Nx(this.Q),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-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))
+gv:function(a){return J.wS(this.Q)},
+gl0:function(a){return J.FN(this.Q)},
+gtH:function(a){var z=new K.O1(0,J.bP(this.Q))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 grZ:function(a){var z,y
-z=this.FD
+z=this.Q
 y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
+z=new K.O1(J.D5(y.gv(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
+$asmW:function(a){return[[K.O1,a]]},
+$asQV:function(a){return[[K.O1,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.Aep(this.vk++,z.gl()),[null])
-return!0}this.Uh=null
+"^":"Anv;Q,a,b",
+gk:function(){return this.b},
+D:function(){var z=this.Q
+if(z.D()){this.b=H.J(new K.O1(this.a++,z.gk()),[null])
+return!0}this.b=null
 return!1},
-$asAnv:function(a){return[[K.Aep,a]]}}}],["","",,Y,{
+$asAnv:function(a){return[[K.O1,a]]}}}],["","",,Y,{
 "^":"",
 Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -18325,376 +17663,376 @@
 case 116:return 9
 case 118:return 11
 default:return a}},
-qS:{
-"^":"a;fY>,P>,G8<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gCR",0,0,73],
-$isqS:true},
+PnY:{
+"^":"a;fY:Q>,M:a>,G8:b<",
+X:[function(a){return"("+this.Q+", '"+H.d(this.a)+"')"},"$0","gCR",0,0,0],
+$isPnY:true},
 dd:{
-"^":"a;Bv,Lz,LP,pV",
+"^":"a;Q,a,b,c",
 zl:function(){var z,y,x,w,v,u,t,s
-z=this.LP
-this.pV=z.G()?z.ft:null
-for(y=this.Bv;x=this.pV,x!=null;)if(x===32||x===9||x===160)this.pV=z.G()?z.ft:null
+z=this.b
+this.c=z.D()?z.c:null
+for(y=this.Q;x=this.c,x!=null;)if(x===32||x===9||x===160)this.c=z.D()?z.c:null
 else if(x===34||x===39)this.DS()
-else{if(typeof x!=="number")return H.s(x)
+else{if(typeof x!=="number")return H.o(x)
 if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
 else w=!0
 if(w)this.y3()
 else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.ft:null
-this.pV=x
-if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.e1()
-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.eT([v,x])
-if(C.Nm.tg(C.ip,u)){x=z.G()?z.ft:null
-this.pV=x
+else if(x===46){x=z.D()?z.c:null
+this.c=x
+if(typeof x!=="number")return H.o(x)
+if(48<=x&&x<=57)this.L8()
+else y.push(new Y.PnY(3,".",11))}else if(x===44){this.c=z.D()?z.c:null
+y.push(new Y.PnY(4,",",0))}else if(x===58){this.c=z.D()?z.c:null
+y.push(new Y.PnY(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.c
+x=z.D()?z.c:null
+this.c=x
+if(C.Nm.tg(C.bg,x)){u=P.Qe([v,this.c],0,null)
+if(C.Nm.tg(C.ip,u)){x=z.D()?z.c:null
+this.c=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.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},
+this.c=z.D()?z.c:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
+y.push(new Y.PnY(8,t,C.w0.p(0,t)))}else if(C.Nm.tg(C.ML,this.c)){s=H.mx(this.c)
+y.push(new Y.PnY(9,s,C.w0.p(0,s)))
+this.c=z.D()?z.c:null}else this.c=z.D()?z.c:null}return y},
 DS:function(){var z,y,x,w
-z=this.pV
-y=this.LP
-x=y.G()?y.ft:null
-this.pV=x
-for(w=this.Lz;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.ft:null
-this.pV=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
+z=this.c
+y=this.b
+x=y.D()?y.c:null
+this.c=x
+for(w=this.a;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV4("unterminated string"))
+if(x===92){x=y.D()?y.c:null
+this.c=x
+if(x==null)throw H.b(Y.RV4("unterminated string"))
 x=H.mx(Y.Ox(x))
-w.IN+=x}else{x=H.mx(x)
-w.IN+=x}x=y.G()?y.ft:null
-this.pV=x}this.Bv.push(new Y.qS(1,w.IN,0))
-w.IN=""
-this.pV=y.G()?y.ft:null},
+w.Q+=x}else{x=H.mx(x)
+w.Q+=x}x=y.D()?y.c:null
+this.c=x}x=w.Q
+this.Q.push(new Y.PnY(1,x.charCodeAt(0)==0?x:x,0))
+w.Q=""
+this.c=y.D()?y.c:null},
 y3:function(){var z,y,x,w,v
-z=this.LP
-y=this.Lz
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+z=this.b
+y=this.a
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
 else w=!0
 else w=!0}else w=!1
 if(!w)break
 x=H.mx(x)
-y.IN+=x
-this.pV=z.G()?z.ft:null}v=y.IN
-z=this.Bv
-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=""},
+y.Q+=x
+this.c=z.D()?z.c:null}z=y.Q
+v=z.charCodeAt(0)==0?z:z
+z=this.Q
+if(C.Nm.tg(C.oP,v))z.push(new Y.PnY(10,v,0))
+else z.push(new Y.PnY(2,v,0))
+y.Q=""},
 jj:function(){var z,y,x,w
-z=this.LP
-y=this.Lz
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+z=this.b
+y=this.a
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-y.IN+=x
-this.pV=z.G()?z.ft:null}if(x===46){z=z.G()?z.ft:null
-this.pV=z
-if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.e1()
-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
+y.Q+=x
+this.c=z.D()?z.c:null}if(x===46){z=z.D()?z.c:null
+this.c=z
+if(typeof z!=="number")return H.o(z)
+if(48<=z&&z<=57)this.L8()
+else this.Q.push(new Y.PnY(3,".",11))}else{z=y.Q
+this.Q.push(new Y.PnY(6,z.charCodeAt(0)==0?z:z,0))
+y.Q=""}},
+L8:function(){var z,y,x,w
+z=this.a
 z.KF(H.mx(46))
-y=this.LP
-while(!0){x=this.pV
-if(x!=null){if(typeof x!=="number")return H.s(x)
+y=this.b
+while(!0){x=this.c
+if(x!=null){if(typeof x!=="number")return H.o(x)
 w=48<=x&&x<=57}else w=!1
 if(!w)break
 x=H.mx(x)
-z.IN+=x
-this.pV=y.G()?y.ft:null}this.Bv.push(new Y.qS(7,z.IN,0))
-z.IN=""}},
+z.Q+=x
+this.c=y.D()?y.c:null}y=z.Q
+this.Q.push(new Y.PnY(7,y.charCodeAt(0)==0?y:y,0))
+z.Q=""}},
 hAN:{
-"^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gCR",0,0,73],
-static:{RV:function(a){return new Y.hAN(a)}}}}],["","",,S,{
+"^":"a;G1:Q>",
+X:[function(a){return"ParseException: "+this.Q},"$0","gCR",0,0,0],
+static:{RV4:function(a){return new Y.hAN(a)}}}}],["","",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,203,167]},
+DV:[function(a){return J.ph(a,this)},"$1","gnG",2,0,208,167]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Hs:function(a){a.o2.RR(0,this)
+Hs:function(a){a.Q.RR(0,this)
 this.xn(a)},
-Ci:function(a){J.okV(a.gZs(),this)
+T7:function(a){J.ph(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.okV(a.gZs(),this)
-J.okV(a.gmU(),this)
+CU:function(a){J.ph(a.ghP(),this)
+J.ph(a.gmU(),this)
 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.Ff,this)
+J.ph(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,this)
 this.xn(a)},
-I6W:function(a){this.xn(a)},
+I6:function(a){this.xn(a)},
 Zh:function(a){var z
-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)
+for(z=a.gMO(),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,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.Ff,this)
+for(z=a.gJq(a),z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.ph(z.c,this)
 this.xn(a)},
-YV:function(a){J.okV(a.gnl(a),this)
-J.okV(a.gv4(),this)
+YV:function(a){J.ph(a.gG3(a),this)
+J.ph(a.gv4(),this)
 this.xn(a)},
 qv:function(a){this.xn(a)},
-ex:function(a){J.okV(a.gBb(a),this)
-J.okV(a.gT8(a),this)
+ex:function(a){J.ph(a.gBb(a),this)
+J.ph(a.gT8(a),this)
 this.xn(a)},
-kb:function(a){J.okV(a.go2(),this)
+Hx:function(a){J.ph(a.gO4(),this)
 this.xn(a)},
-RD:function(a){J.okV(a.gdc(),this)
-J.okV(a.gav(),this)
-J.okV(a.geE(),this)
+RD:function(a){J.ph(a.gdc(),this)
+J.ph(a.gav(),this)
+J.ph(a.grM(),this)
 this.xn(a)},
-ky:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
+MV:function(a){a.Q.RR(0,this)
+a.a.RR(0,this)
 this.xn(a)},
-eS:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
+eS:function(a){a.Q.RR(0,this)
+a.a.RR(0,this)
 this.xn(a)}}}],["","",,T,{
 "^":"",
 ov:{
-"^":"V59;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)},
-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)},
-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},
-sxT:function(a,b){a.xo=this.ct(a,C.nt,a.xo,b)},
-giZ:function(a){return a.ZJ},
-siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
-gTj:function(a){return a.PZ},
-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)},
-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))
+"^":"V58;RZ,ij,TQ,ca,Jc,cw,bN,mT,Jr,IL,TO,S8,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtu:function(a){return a.RZ},
+stu:function(a,b){a.RZ=this.ct(a,C.PX,a.RZ,b)},
+gfg:function(a){return a.ij},
+sfg:function(a,b){a.ij=this.ct(a,C.A7,a.ij,b)},
+gGV:function(a){return a.TQ},
+sGV:function(a,b){a.TQ=this.ct(a,C.vY,a.TQ,b)},
+gLf:function(a){return a.ca},
+sLf:function(a,b){a.ca=this.ct(a,C.IT,a.ca,b)},
+gJb:function(a){return a.Jc},
+sJb:function(a,b){a.Jc=this.ct(a,C.Gr,a.Jc,b)},
+gML:function(a){return a.cw},
+sML:function(a,b){a.cw=this.ct(a,C.kI,a.cw,b)},
+gxT:function(a){return a.bN},
+sxT:function(a,b){a.bN=this.ct(a,C.nt,a.bN,b)},
+giZ:function(a){return a.mT},
+siZ:function(a,b){a.mT=this.ct(a,C.vs,a.mT,b)},
+gTj:function(a){return a.Jr},
+sTj:function(a,b){a.Jr=this.ct(a,C.uG,a.Jr,b)},
+gGd:function(a){return a.IL},
+sGd:function(a,b){a.IL=this.ct(a,C.SA,a.IL,b)},
+qV:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,16,45],
+vr:function(a){var z,y
+z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.cw))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
 else z.scrollIntoView()}},
-qA:[function(a,b,c){this.W7(a)},"$2","giH",4,0,204,205,206],
+pLm:[function(a,b,c){this.vr(a)},"$2","gcL",4,0,209,210,211],
 Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
+this.VM(a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
-if(z!=null){y=W.Ws(this.giH(a))
-a.Nf=y
+if(z!=null){y=W.Ws(this.gcL(a))
+a.TO=y
 C.S2.OT(y,z,!0)}},
-Lx:function(a){var z=a.Nf
+dQ:function(a){var z=a.TO
 if(z!=null){z.disconnect()
-a.Nf=null}Z.uL.prototype.Lx.call(this,a)},
+a.TO=null}this.eX(a)},
 mN:[function(a,b){this.Um(a)
-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],
+this.vr(a)},"$1","goL",2,0,20,61],
+Yo:[function(a,b){this.Um(a)},"$1","gLe",2,0,20,61],
+ib:[function(a,b){this.Um(a)},"$1","gRq",2,0,20,61],
+Vj:[function(a,b){this.Um(a)},"$1","grO",2,0,20,61],
 Um:function(a){var z,y,x
-a.PZ=this.ct(a,C.uG,a.PZ,!1)
-if(a.D6!=null)return
-z=a.Ny
+a.Jr=this.ct(a,C.uG,a.Jr,!1)
+if(a.S8!=null)return
+z=a.RZ
 if(z==null)return
-if(J.iS(z)!==!0){a.D6=J.SK(a.Ny).ml(new T.Es(a))
-return}z=a.Fd
-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.Ny.q6(z):null
-a.He=this.ct(a,C.kI,a.He,z)
-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.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
+if(J.iS(z)!==!0){a.S8=J.SK(a.RZ).ml(new T.cg(a))
+return}z=a.ca
+z=z!=null?a.RZ.q6(z):1
+a.bN=this.ct(a,C.nt,a.bN,z)
+z=a.TQ
+z=z!=null?a.RZ.q6(z):null
+a.cw=this.ct(a,C.kI,a.cw,z)
+z=a.Jc
+y=a.RZ
+z=z!=null?y.q6(z):J.wS(J.de(y))
+a.mT=this.ct(a,C.vs,a.mT,z)
+J.U2(a.IL)
+for(x=J.D5(a.bN,1);z=J.Wx(x),z.B(x,J.D5(a.mT,1));x=z.g(x,1))J.dH(a.IL,J.Tf(J.de(a.RZ),x))
+a.Jr=this.ct(a,C.uG,a.Jr,!0)},
+static:{T5i:function(a){var z,y,x,w,v
 z=R.tB([])
-y=P.L5(null,null,null,P.qU,W.I0)
-x=P.qU
-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.t7=null
-a.PZ=!1
-a.Kf=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
-C.za.LX(a)
-C.za.XI(a)
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.ij=null
+a.Jr=!1
+a.IL=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
+C.Fa.LX(a)
+C.Fa.XI(a)
 return a}}},
-V59:{
-"^":"uL+Pi;",
+V58:{
+"^":"uL+Piz;",
 $isd3:true},
-Es:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.Ny)===!0){z.D6=null
-J.XP(z)}},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+cg:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+if(J.iS(z.RZ)===!0){z.S8=null
+J.v7(z)}},"$1",null,2,0,null,15,"call"]},
 vr:{
-"^":"V60;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},
-sO9:function(a,b){a.pL=this.ct(a,C.S4,a.pL,b)},
+"^":"V59;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gRd:function(a){return a.RZ},
+sRd:function(a,b){a.RZ=this.ct(a,C.VI,a.RZ,b)},
+gO9:function(a){return a.ij},
+sO9:function(a,b){a.ij=this.ct(a,C.S4,a.ij,b)},
 SC:[function(a,b,c,d){var z,y
-z=a.pL
+z=a.ij
 if(z===!0)return
-a.pL=this.ct(a,C.S4,z,!0)
-z=a.X9.gqr()
-y=a.X9
-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],
+a.ij=this.ct(a,C.S4,z,!0)
+z=a.RZ.gqr()
+y=a.RZ
+if(z==null)J.wg(J.fx(y)).PI(J.fx(a.RZ),J.f2(a.RZ)).ml(new T.eE(a))
+else J.wg(J.fx(y)).Xu(a.RZ.gqr()).ml(new T.b3(a))},"$3","gQP",6,0,84,52,55,85],
 static:{aed: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.pL=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.FC.LX(a)
 C.FC.XI(a)
 return a}}},
-V60:{
-"^":"uL+Pi;",
+V59:{
+"^":"uL+Piz;",
 $isd3:true},
 eE:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.S4,z.ij,!1)},"$1",null,2,0,null,15,"call"]},
 b3:{
-"^":"TpZ:12;b",
-$1:[function(a){var z=this.b
-z.pL=J.NB(z,C.S4,z.pL,!1)},"$1",null,2,0,null,13,"call"],
-$isEH:true}}],["","",,A,{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+z.ij=J.Q5(z,C.S4,z.ij,!1)},"$1",null,2,0,null,15,"call"]}}],["","",,A,{
 "^":"",
 kn:{
-"^":"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
+"^":"oEY;TQ,cy$,db$,RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gBV:function(a){return a.TQ},
+sBV:function(a,b){a.TQ=this.ct(a,C.tW,a.TQ,b)},
+gJp:function(a){var z=a.RZ
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
-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
+return z.gzz()},
+J4:[function(a,b){this.at(a,null)},"$1","gIF",2,0,20,61],
+at:[function(a,b){var z=a.RZ
 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],
+this.ct(a,C.Fh,0,1)}},"$1","gRX",2,0,20,15],
 goc:function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
-if(J.J5(a.jJ,0)){z=J.iS(a.tY)
-y=a.tY
-if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gRy(a))}return Q.xI.prototype.goc.call(this,a)},
-gO3:function(a){if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0))if(J.iS(a.tY)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.jJ)
-else J.SK(a.tY).ml(this.gRy(a))
+if(a.RZ==null)return Q.xI.prototype.goc.call(this,a)
+if(J.u6(a.TQ,0)){z=J.iS(a.RZ)
+y=a.RZ
+if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.TQ))
+else J.SK(y).ml(this.gRX(a))}return Q.xI.prototype.goc.call(this,a)},
+gO3:function(a){if(a.RZ==null)return Q.xI.prototype.gO3.call(this,a)
+if(J.u6(a.TQ,0))if(J.iS(a.RZ)===!0)return Q.xI.prototype.gO3.call(this,a)+"---pos="+H.d(a.TQ)
+else J.SK(a.RZ).ml(this.gRX(a))
 return Q.xI.prototype.gO3.call(this,a)},
 static:{Thl: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.jJ=-1
-a.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.c07.LX(a)
-C.c07.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.TQ=-1
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Wa.LX(a)
+C.Wa.XI(a)
 return a}}},
 oEY:{
-"^":"xI+Pi;",
+"^":"xI+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 fI:{
-"^":"V61;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)},
+"^":"V60;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gtu:function(a){return a.RZ},
+stu:function(a,b){a.RZ=this.ct(a,C.PX,a.RZ,b)},
 Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
+this.VM(a)
+z=a.RZ
 if(z==null)return
 J.SK(z)},
-pA:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,19,102],
-m4:[function(a,b){J.y9(a.Uz).wM(b)},"$1","gDX",2,0,19,102],
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+m4:[function(a,b){J.y9(a.RZ).wM(b)},"$1","gaL",2,0,20,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.cJ0.LX(a)
 C.cJ0.XI(a)
 return a}}},
-V61:{
-"^":"uL+Pi;",
+V60:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,D,{
 "^":"",
-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
+Xm:[function(a,b){return J.FW(J.DA(a),J.DA(b))},"$2","I8",4,0,74],
+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
 default:return!1}},
 rO:function(a){switch(a){case"BoundedType":case"Type":case"TypeParameter":case"TypeRef":return!0
 default:return!1}},
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(b==null)return
 z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").hh("Malformed service object: "+H.d(b))
+z=z.p(b,"id")!=null&&z.p(b,"type")!=null
+if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
 z=J.U6(b)
-y=z.t(b,"type")
-x=J.Qe(y)
+y=z.p(b,"type")
+x=J.NH(y)
 if(x.nC(y,"@"))y=x.yn(y,1)
-if(z.t(b,"_vmType")!=null){z=z.t(b,"_vmType")
-x=J.Qe(z)
+if(z.p(b,"_vmType")!=null){z=z.p(b,"_vmType")
+x=J.NH(z)
 w=x.nC(z,"@")?x.yn(z,1):z}else w=y
 switch(y){case"Class":z=D.xB
 x=[]
@@ -18716,12 +18054,12 @@
 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.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)
+s=new D.dy(null,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)
 break
 case"Code":z=[]
-z.$builtinTypeInfo=[D.ta]
+z.$builtinTypeInfo=[D.Fc]
 x=[]
-x.$builtinTypeInfo=[D.ta]
+x.$builtinTypeInfo=[D.Fc]
 v=D.Q4
 u=[]
 u.$builtinTypeInfo=[v]
@@ -18758,9 +18096,9 @@
 case"Isolate":z=J.wp(a)
 x=new V.qC(P.YM(null,null,null,null,null),null,null)
 x.$builtinTypeInfo=[null,null]
-v=P.L5(null,null,null,P.qU,D.af)
+v=P.L5(null,null,null,P.I,D.af)
 u=[]
-u.$builtinTypeInfo=[P.qU]
+u.$builtinTypeInfo=[P.I]
 t=[]
 t.$builtinTypeInfo=[D.ER]
 r=D.dy
@@ -18773,13 +18111,13 @@
 p.$builtinTypeInfo=[r]
 p=new Q.wn(null,null,p,null,null)
 p.$builtinTypeInfo=[r]
-r=P.L5(null,null,null,P.qU,P.Vf)
+r=P.L5(null,null,null,P.I,P.CP)
 r=R.tB(r)
-o=P.qU
+o=P.I
 n=D.YX
 m=new V.qC(P.YM(null,null,null,o,n),null,null)
 m.$builtinTypeInfo=[o,n]
-o=P.qU
+o=P.I
 n=D.YX
 l=new V.qC(P.YM(null,null,null,o,n),null,null)
 l.$builtinTypeInfo=[o,n]
@@ -18812,12 +18150,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.Z9
+case"Object":switch(w){case"PcDescriptors":z=D.xb
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.Hx(null,null,x,null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.hn(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.")
@@ -18829,12 +18167,12 @@
 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.RA(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"TokenStream":s=new D.Ik(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)
 break
-case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
+case"ServiceEvent":s=new D.Mk(null,null,null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
 case"ServiceException":s=new D.Ix(null,null,null,null,null,a,null,null,null,!1,null,null,null,null,null)
 break
@@ -18843,1542 +18181,1518 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.A(null,null),P.A(null,null),null,null,a,null,null,null,!1,null,null,null,null,null)
 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.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
+default:s=D.Ep(y)||J.mG(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},
-UW:function(a){if(a.gHh())return
+vQ:function(a){if(a.gHh())return
 return a},
-bF:function(a){var z
+PG: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
+z=z.p(a,"id")!=null&&z.p(a,"type")!=null}else z=!1
 return z},
-kT:function(a,b){var z=J.x(a)
+kT:function(a,b){var z=J.t(a)
 if(!!z.$isvO)return
 if(!!z.$isqC)D.Gf(a,b)
 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.XG,y=0;y<z.length;++y){x=z[y]
-w=J.x(x)
+for(z=a.b,y=0;y<z.length;++y){x=z[y]
+w=J.t(x)
 v=!!w.$isqC
-if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
+if(v)u=w.p(x,"id")!=null&&w.p(x,"type")!=null
 else u=!1
-if(u)a.u(0,y,b.Qn(x))
+if(u)a.q(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
 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.aT(this.V0)},
-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.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")},
-gJE:function(){return J.xC(this.JK,"MirrorReference")},
-gl2:function(){return J.xC(this.JK,"WeakProperty")},
+"^":"Piz;px:e@,GR:f@",
+gXP:function(){return this.Q},
+gwv:function(a){return J.wp(this.Q)},
+god:function(a){return J.wg(this.Q)},
+gjO:function(a){return this.a},
+gt5:function(a){return this.b},
+gv5:function(){return this.c},
+glO:function(){return D.rO(this.b)},
+gjS:function(){return J.mG(this.b,"bool")},
+gzx:function(){return J.mG(this.b,"double")},
+gt3:function(){return J.mG(this.b,"Error")},
+gNs:function(){return D.Ep(this.b)},
+gSO:function(){return J.mG(this.b,"int")},
+gK4:function(a){return J.mG(this.b,"List")},
+gHh:function(){return J.mG(this.b,"null")},
+gfo:function(){return J.mG(this.b,"Sentinel")},
+gu7:function(){return J.mG(this.b,"String")},
+gOC:function(){return J.mG(this.c,"MirrorReference")},
+gl2:function(){return J.mG(this.c,"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.TU)},
-gox:function(a){return this.qu},
+gXM:function(){return J.mG(this.b,"Instance")&&!J.mG(this.c,"MirrorReference")&&!J.mG(this.c,"WeakProperty")&&!this.gBF()},
+gPj:function(a){return this.Q.Mq(this.a)},
+gox:function(a){return this.d},
 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))},
-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.TU,""))return P.Ab(this,null)
-if(this.qu&&this.gM8())return P.Ab(this,null)
-z=this.mQ
+goc:function(a){return this.gpx()},
+soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
+gzz:function(){return this.gGR()},
+szz:function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},
+xW:function(a){var z
+if(this.d){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}return this.VD(0)},
+VD:["BA",function(a){var z
+if(J.mG(this.a,"")){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}if(this.d&&this.gM8()){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z}z=this.r
 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},
+this.r=z}return z}],
 eC:function(a){var z,y,x,w
 z=J.U6(a)
-y=J.co(z.t(a,"type"),"@")
-x=z.t(a,"type")
-w=J.Qe(x)
+y=J.co(z.p(a,"type"),"@")
+x=z.p(a,"type")
+w=J.NH(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-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.R5(0,a,y)},
-YC:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,174,207],
+w=this.a
+if(w!=null&&!J.mG(w,z.p(a,"id")));this.a=z.p(a,"id")
+this.b=x
+if(z.NZ(a,"_vmType")===!0){z=z.p(a,"_vmType")
+w=J.NH(z)
+this.c=w.nC(z,"@")?w.yn(z,1):z}else this.c=this.b
+this.bF(0,a,y)},
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gua",2,0,174,212],
 $isaf:true},
 n1:{
-"^":"TpZ:209;a",
+"^":"r:214;Q",
 $1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.Qe(z)
+z=J.Tf(a,"type")
+y=J.NH(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.oU))return D.Nl(y.gXP(),a)
+y=this.Q
+if(!J.mG(z,y.b))return D.Nl(y.gXP(),a)
 y.eC(a)
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
+return y},"$1",null,2,0,null,213,"call"]},
 jI:{
-"^":"TpZ:76;b",
-$0:[function(){this.b.mQ=null},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.r=null},"$0",null,0,0,null,"call"]},
 boh:{
 "^":"a;",
-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,210]},
-P5:{
-"^":"TpZ:12;a",
+Yz:function(a){J.Me(a,new D.u9(this))},
+lh:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.TC(this))},"$0","gaL",0,0,215]},
+u9:{
+"^":"r:14;Q",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").lV(z.t(a,"hits"))},"$1",null,2,0,null,211,"call"],
-$isEH:true},
-Rv:{
-"^":"TpZ:209;a",
-$1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gt5(z),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,208,"call"],
-$isEH:true},
+z.p(a,"script").lV(z.p(a,"hits"))},"$1",null,2,0,null,216,"call"]},
+TC:{
+"^":"r:214;Q",
+$1:[function(a){var z=this.Q
+z.Yz(D.Nl(J.mG(z.gt5(z),"Isolate")?z:z.gXP(),a).p(0,"coverage"))},"$1",null,2,0,null,213,"call"]},
 xm:{
 "^":"af;"},
 wv:{
-"^":"O1w;Li<,G2<,Rk>",
+"^":"O1w;Xs:dy<,G2:fr<,Rk:fx>",
 gwv:function(a){return this},
 god:function(a){return},
-gi2:function(){var z=this.Qi
+gi2:function(){var z=this.go
 return z.gUQ(z)},
-gPj:function(a){return H.d(this.TU)},
-YC:[function(a){return H.d(a)},"$1","gua",2,0,174,207],
-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.kU},
-gJW:function(){return this.l7},
+gPj:function(a){return H.d(this.a)},
+Mq:[function(a){return H.d(a)},"$1","gua",2,0,174,212],
+gYe:function(a){return this.x},
+gJk:function(){return this.ch},
+gA3:function(){return this.cx},
+gdW:function(){return this.cy},
+gU6:function(){return this.db},
+gPE:function(){return this.dx},
 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.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.jy(z,this,w))},
+if(b!=null)J.H9(y,"_data",b)}catch(x){H.Ru(x)
+N.QM("").YX("Ignoring malformed event message: "+H.d(a))
+return}if(!J.mG(J.Tf(z.a,"type"),"ServiceEvent")){N.QM("").YX("Expected 'ServiceEvent' but found '"+H.d(J.Tf(z.a,"type"))+"'")
+return}w=J.Tf(J.Tf(z.a,"isolate"),"id")
+this.wD(w).ml(new D.mT(z,this,w))},
 EM:function(a){return this.hQ(a,null)},
 BC:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
+z=$.r0().R4(0,a)
 if(z==null)return
-y=z.pX
+y=z.a
 x=y.input
 w=y.index
 if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
+y=J.wS(y[0])
+if(typeof y!=="number")return H.o(y)
 return C.yo.yn(x,w+y)},
 ZS:function(a){var z,y,x
-z=$.PY().R4(0,a)
+z=$.Gi().R4(0,a)
 if(z==null)return""
-y=z.pX
+y=z.a
 x=y.index
 if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
+y=J.wS(y[0])
+if(typeof y!=="number")return H.o(y)
 return J.Nj(a,0,x+y)},
 Qn:function(a){throw H.b(P.nO(null))},
-wD:function(a){var z
-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.MZ(this,a))},
+wD:function(a){var z,y
+if(J.mG(a,"")){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(null)
+return z}y=this.go.p(0,a)
+if(y!=null){z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(y)
+return z}return this.VD(0).ml(new D.QQ(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.aEE(this,y))}x=this.uj.t(0,a)
+return this.wD(z).ml(new D.kk(this,y))}x=this.fy.p(0,a)
 if(x!=null)return J.LE(x)
-return this.jU(a).ml(new D.oew(this,a))},
-B5:[function(a,b){return b},"$2","gJ2",4,0,81],
+return this.jU(a).ml(new D.it(this,a))},
+Ah:[function(a,b){return b},"$2","gJ2",4,0,80],
 hb:function(a){var z,y,x
 z=null
-try{y=new P.c5(this.gJ2())
+try{y=new P.Mx(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.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())},
-R5:function(a,b,c){var z,y
+if(!D.PG(a)){z=P.B(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
+return P.Xo(D.Nl(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.mG(z.p(a,"type"),"ServiceError"))return P.Xo(D.Nl(this,a),null,null)
+else if(J.mG(z.p(a,"type"),"ServiceException"))return P.Xo(D.Nl(this,a),null,null)
+z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(a)
+return z},
+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.pa(this),new D.zA2())},
+bF:function(a,b,c){var z,y
 if(c)return
-this.qu=!0
+this.d=!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.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.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.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"))},
+y=z.p(b,"version")
+this.x=F.Wi(this,C.zn,this.x,y)
+y=z.p(b,"targetCPU")
+this.y=F.Wi(this,C.Bx,this.y,y)
+y=z.p(b,"architectureBits")
+this.z=F.Wi(this,C.hb,this.z,y)
+y=z.p(b,"uptime")
+this.ch=F.Wi(this,C.mh,this.ch,y)
+y=P.Wu(H.BU(z.p(b,"date"),null,null),!1)
+this.dx=F.Wi(this,C.GI,this.dx,y)
+y=z.p(b,"assertsEnabled")
+this.cx=F.Wi(this,C.ET,this.cx,y)
+y=z.p(b,"pid")
+this.db=F.Wi(this,C.uI,this.db,y)
+y=z.p(b,"typeChecksEnabled")
+this.cy=F.Wi(this,C.J2,this.cy,y)
+this.y8(z.p(b,"isolates"))},
 y8:function(a){var z,y,x,w,v,u
-z=this.Qi
-y=P.L5(null,null,null,P.qU,D.bv)
-for(x=J.mY(a);x.G();){w=x.gl()
-v=J.UQ(w,"id")
-u=z.t(0,v)
-if(u!=null)y.u(0,v,u)
+z=this.go
+y=P.L5(null,null,null,P.I,D.bv)
+for(x=J.Nx(a);x.D();){w=x.gk()
+v=J.Tf(w,"id")
+u=z.p(0,v)
+if(u!=null)y.q(0,v,u)
 else{u=D.Nl(this,w)
-y.u(0,v,u)
-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")
-this.uj.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
+y.q(0,v,u)
+N.QM("").To("New isolate '"+H.d(u.a)+"'")}}y.aN(0,new D.Yu())
+this.go=y},
+Lw:function(){this.e=this.ct(this,C.YS,this.e,"vm")
+this.f=this.ct(this,C.KS,this.f,"vm")
+this.fy.q(0,"vm",this)
+var z=P.B(["id","vm","type","@VM"],null,null)
 this.eC(R.tB(z))},
 $iswv:true},
 O1w:{
-"^":"xm+Pi;",
+"^":"xm+Piz;",
 $isd3:true},
-jy:{
-"^":"TpZ:12;a,b,c",
+mT:{
+"^":"r:14;Q,a,b",
 $1:[function(a){var z,y
-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,212,"call"],
-$isEH:true},
-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},
-aEE:{
-"^":"TpZ:12;a,b",
+if(a==null)N.QM("").YX("Ignoring event with unknown isolate id: "+H.d(this.b))
+else{z=D.Nl(a,this.Q.a)
+y=this.a.fx
+if(y.b>=4)H.vh(y.Pq())
+y.MW(z)}},"$1",null,2,0,null,217,"call"]},
+QQ:{
+"^":"r:14;Q,a",
+$1:[function(a){if(!J.t(a).$iswv)return
+return this.Q.go.p(0,this.a)},"$1",null,2,0,null,121,"call"]},
+kk:{
+"^":"r:14;Q,a",
 $1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.LE(a)
-else return a.cv(z)},"$1",null,2,0,null,6,"call"],
-$isEH:true},
-oew:{
-"^":"TpZ:209;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.Nl(z,a)
-if(y.gjm())z.uj.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
-QZ:{
-"^":"TpZ:76;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"TpZ:12;a,b",
-$1:[function(a){var z,y,x
+if(a==null)return this.Q
 z=this.a
+if(z==null)return J.LE(a)
+else return a.cv(z)},"$1",null,2,0,null,8,"call"]},
+it:{
+"^":"r:214;Q,a",
+$1:[function(a){var z,y
+z=this.Q
+y=D.Nl(z,a)
+if(y.gjm())z.fy.to(0,this.a,new D.K0(y))
+return y},"$1",null,2,0,null,213,"call"]},
+K0:{
+"^":"r:77;Q",
+$0:function(){return this.Q}},
+zA:{
+"^":"r:14;Q,a",
+$1:[function(a){var z,y,x
+z=this.Q
 y=z.hb(a)
-x=$.ax
-if(x!=null)x.ab("Received response for "+H.d(this.b),y)
-return z.OJ(y)},"$1",null,2,0,null,157,"call"],
-$isEH:true},
+x=$.hm
+if(x!=null)x.AS("Received response for "+H.d(this.a),y)
+return z.OJ(y)},"$1",null,2,0,null,157,"call"]},
 tm:{
-"^":"TpZ:12;c",
-$1:[function(a){var z=this.c.G2
-if(z.YM>=4)H.vh(z.Pq())
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.fr
+if(z.b>=4)H.vh(z.Pq())
 z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,23,"call"],
-$isEH:true},
+return P.Xo(a,null,null)},"$1",null,2,0,null,24,"call"]},
 mR:{
-"^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
-$isEH:true},
-hc:{
-"^":"TpZ:12;d",
-$1:[function(a){var z=this.d.Li
-if(z.YM>=4)H.vh(z.Pq())
-z.MW(a)
-return P.pz(a,null,null)},"$1",null,2,0,null,90,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){return!!J.t(a).$isN7},"$1",null,2,0,null,4,"call"]},
 pa:{
-"^":"TpZ:12;",
-$1:[function(a){return!!J.x(a).$isIx},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q.dy
+if(z.b>=4)H.vh(z.Pq())
+z.MW(a)
+return P.Xo(a,null,null)},"$1",null,2,0,null,90,"call"]},
+zA2:{
+"^":"r:14;",
+$1:[function(a){return!!J.t(a).$isIx},"$1",null,2,0,null,4,"call"]},
 Yu:{
-"^":"TpZ:81;",
-$2:function(a,b){J.LE(b)},
-$isEH:true},
+"^":"r:80;",
+$2:function(a,b){J.LE(b)}},
 ER:{
-"^":"a;SP,XE>,jf",
+"^":"a;Q,XE:a>,b",
 eK:function(a){var z,y,x,w,v
-z=this.XE
+z=this.a
+C.Nm.uy(z,"setAll")
 H.h8(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.jf
+for(y=z.length,x=0;x<y;++x){w=this.b
 v=z[x]
-if(typeof v!=="number")return H.s(v)
-this.jf=w+v}},
+if(typeof v!=="number")return H.o(v)
+this.b=w+v}},
 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)
+for(z=this.a,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.p(a,v)
 if(v>=w)return H.e(b,v)
-u=J.bI(u,b[v])
+u=J.D5(u,b[v])
 z[v]=u
-t=this.jf
-if(typeof u!=="number")return H.s(u)
-this.jf=t+u}},
-k5:[function(a,b){var z,y,x,w,v,u
+t=this.b
+if(typeof u!=="number")return H.o(u)
+this.b=t+u}},
+wY:[function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.XE
+y=this.a
 x=y.length
 w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=z.gv(b)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-u=z.t(b,w)
+u=z.p(b,w)
 if(w>=x)return H.e(y,w)
-y[w]=J.xZ(y[w],u)?y[w]:u;++w}},"$1","gA5",2,0,213,214],
+y[w]=J.vU(y[w],u)?y[w]:u;++w}},"$1","gA5",2,0,218,219],
 CJ:function(){var z,y,x
-for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
+for(z=this.a,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,Fw<,u1,Ob,Eq,kL",
-gvh:function(){return this.u1},
+"^":"a;fJ:Q<,lI:a<,b,c,d,e",
+gZ0:function(){return this.b},
 Qv:function(a,b){var z,y,x,w,v,u
-this.u1=a
+this.b=a
 z=J.U6(b)
-y=z.t(b,"counters")
-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
-if(typeof v!=="number")return H.s(v)
+y=z.p(b,"counters")
+x=this.Q
+if(x.length===0){C.Nm.FV(x,z.p(b,"names"))
+this.e=J.wS(z.p(b,"counters"))
+for(z=this.d,x=this.a,w=0;w<z;++w){v=this.e
+if(typeof v!=="number")return H.o(v)
 v=Array(v)
-v.fixed$length=init
+v.fixed$length=Array
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}z=this.kL
-if(typeof z!=="number")return H.s(z)
+x.push(u)}z=this.e
+if(typeof z!=="number")return H.o(z)
 z=Array(z)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.Ob=z
+z.fixed$length=Array
+z=new D.ER(0,H.J(z,[P.KN]),0)
+this.c=z
 z.eK(y)
-return}z=this.kL
-if(typeof z!=="number")return H.s(z)
+return}z=this.e
+if(typeof z!=="number")return H.o(z)
 z=Array(z)
-z.fixed$length=init
-u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.pg(y,this.Ob.XE)
-this.Ob.k5(0,y)
-z=this.Fw
+z.fixed$length=Array
+u=new D.ER(a,H.J(z,[P.KN]),0)
+u.pg(y,this.c.a)
+this.c.wY(0,y)
+z=this.a
 z.push(u)
-if(z.length>this.Eq)C.Nm.W4(z,0)}},
+if(z.length>this.d)C.Nm.W4(z,0)}},
 eK:{
-"^":"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},
-gqZ:function(){return this.hu},
+"^":"Piz;Q,a,b,c,d,e,cy$,db$",
+gcs:function(){return this.Q},
+gCs:function(){return this.a},
+gMX:function(){return this.b},
+gYk:function(){return this.c},
+gpy:function(){return this.d},
+goX:function(){return this.e},
 eC:function(a){var z,y
 z=J.U6(a)
-y=z.t(a,"used")
-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")
-this.j8=F.Wi(this,C.h7,this.j8,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-y=z.t(a,"time")
-this.Og=F.Wi(this,C.Jl,this.Og,y)
-z=z.t(a,"avgCollectionPeriodMillis")
-this.hu=F.Wi(this,C.BE,this.hu,z)}},
+y=z.p(a,"used")
+this.Q=F.Wi(this,C.LP,this.Q,y)
+y=z.p(a,"capacity")
+this.a=F.Wi(this,C.bV,this.a,y)
+y=z.p(a,"external")
+this.b=F.Wi(this,C.h7,this.b,y)
+y=z.p(a,"collections")
+this.c=F.Wi(this,C.J6,this.c,y)
+y=z.p(a,"time")
+this.d=F.Wi(this,C.bo,this.d,y)
+z=z.p(a,"avgCollectionPeriodMillis")
+this.e=F.Wi(this,C.T,this.e,z)}},
 bv:{
-"^":"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,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gwv:function(a){return this.V0},
+"^":"bvc;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,px:id@,GR:k1@,k2,k3,k4,UY:r1<,xQ:r2<,rx,ry,Np:x1<,x2,y1,is:y2<,TB,pG:ej<,Sn:lZ<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gwv:function(a){return this.Q},
 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.TU)},
-gBP:function(a){return this.Jr},
-gGL:function(){return this.EY},
-gaj:function(){return this.eU},
-gn0:function(){return this.yP},
-YC:[function(a){return"/"+H.d(this.TU)+"/"+H.d(a)},"$1","gua",2,0,174,207],
+gXE:function(a){return this.x},
+sXE:function(a,b){this.x=F.Wi(this,C.bJ,this.x,b)},
+gPj:function(a){return"/"+H.d(this.a)},
+gBP:function(a){return this.y},
+gGL:function(){return this.z},
+gaj:function(){return this.ch},
+gn0:function(){return this.cx},
+Mq:[function(a){return"/"+H.d(this.a)+"/"+H.d(a)},"$1","gua",2,0,174,212],
 N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
+z=H.J([],[D.kx])
 y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.I1()
+for(x=J.Nx(y.p(a,"codes"));x.D();)z.push(J.Tf(x.gk(),"code"))
+this.Id()
 this.nN(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.qo=this.Jm(w,z)},
-I1:function(){var z=this.uj
-z.gUQ(z).aN(0,new D.TV())},
+w=y.p(a,"exclusive_trie")
+if(w!=null)this.x1=this.Jm(w,z)},
+Id:function(){var z=this.db
+z.gUQ(z).aN(0,new D.S0())},
 nN:function(a,b){var z,y,x,w
 z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
+y=z.p(a,"codes")
+x=z.p(a,"samples")
+for(z=J.Nx(y);z.D();){w=z.gk()
+J.Tf(w,"code").Il(w,b,x)}},
 WR:function(){return this.cv("classes").ml(this.gLG()).ml(this.gHB())},
-d8:[function(a){var z,y,x,w
+xWD:[function(a){var z,y,x,w
 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.Ne(z,!1)},"$1","gLG",2,0,215,216],
-lKe:[function(a){var z,y,x,w
-z=this.AI
+for(y=J.Nx(J.Tf(a,"members"));y.D();){x=y.gk()
+w=J.t(x)
+if(!!w.$isdy)z.push(w.xW(x))}return P.hz(z,!1)},"$1","gLG",2,0,220,221],
+yQ:[function(a){var z,y,x,w
+z=this.fr
 z.V1(z)
-this.Wm=F.Wi(this,C.jo,this.Wm,null)
-for(y=J.mY(a);y.G();){x=y.gl()
+this.dy=F.Wi(this,C.as,this.dy,null)
+for(y=J.Nx(a);y.D();){x=y.gk()
 if(x.gAY()==null)z.h(0,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)
+if(J.mG(x.gzz(),"Object")&&J.mG(x.geh(),!1)){w=this.dy
+if(this.gnz(this)&&!J.mG(w,x)){w=new T.qI(this,C.as,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gHB",2,0,217,218],
+this.SZ(this,w)}this.dy=x}}z=this.dy
+y=H.J(new P.Gc(0,$.X3,null),[null])
+y.Xf(z)
+return y},"$1","gHB",2,0,222,223],
 Qn:function(a){var z,y,x
 if(a==null)return
-z=J.UQ(a,"id")
-y=this.uj
-x=y.t(0,z)
+z=J.Tf(a,"id")
+y=this.db
+x=y.p(0,z)
 if(x!=null)return x
 x=D.Nl(this,a)
-if(x!=null&&x.gjm())y.u(0,z,x)
+if(x!=null&&x.gjm())y.q(0,z,x)
 return x},
-cv:function(a){var z=this.uj.t(0,a)
+cv:function(a){var z=this.db.p(0,a)
 if(z!=null)return J.LE(z)
-return this.V0.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)},
-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)},
-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.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)},
-Bs:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-R5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+return this.Q.jU("/"+H.d(this.a)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gDZ:function(){return this.dy},
+gVc:function(){return this.fx},
+sVc:function(a){this.fx=F.Wi(this,C.eN,this.fx,a)},
+gvU:function(){return this.fy},
+gkw:function(){return this.go},
+goc:function(a){return this.id},
+soc:function(a,b){this.id=F.Wi(this,C.YS,this.id,b)},
+gzz:function(){return this.k1},
+szz:function(a){this.k1=F.Wi(this,C.KS,this.k1,a)},
+gIT:function(){return this.k2},
+gw2:function(){return this.k3},
+sw2:function(a){this.k3=F.Wi(this,C.tP,this.k3,a)},
+gkc:function(a){return this.ry},
+skc:function(a,b){this.ry=F.Wi(this,C.yh,this.ry,b)},
+WU:function(a){var z=J.U6(a)
+this.r1.eC(z.p(a,"new"))
+this.r2.eC(z.p(a,"old"))},
+bF: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)
-y=z.t(b,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)
-y=z.t(b,"name")
-this.f5=F.Wi(this,C.KS,this.f5,y)
+y=z.p(b,"mainPort")
+this.k2=F.Wi(this,C.wT,this.k2,y)
+y=z.p(b,"name")
+this.id=F.Wi(this,C.YS,this.id,y)
+y=z.p(b,"name")
+this.k1=F.Wi(this,C.KS,this.k1,y)
 if(c)return
-this.qu=!0
-this.yP=F.Wi(this,C.DY,this.yP,!1)
+this.d=!0
+this.cx=F.Wi(this,C.DY,this.cx,!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("").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.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(z.p(b,"rootLib")==null||z.p(b,"timers")==null||z.p(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
+return}y=z.p(b,"rootLib")
+this.fx=F.Wi(this,C.eN,this.fx,y)
+if(z.p(b,"entry")!=null){y=z.p(b,"entry")
+this.k3=F.Wi(this,C.tP,this.k3,y)}if(z.p(b,"topFrame")!=null){y=z.p(b,"topFrame")
+this.go=F.Wi(this,C.bc,this.go,y)}else this.go=F.Wi(this,C.bc,this.go,null)
+x=z.p(b,"tagCounters")
 if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
+w=y.p(x,"names")
+v=y.p(x,"counters")
 y=J.U6(v)
 u=0
 t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=y.gv(v)
+if(typeof s!=="number")return H.o(s)
 if(!(t<s))break
-s=y.t(v,t)
-if(typeof s!=="number")return H.s(s)
-u+=s;++t}s=P.Fl(null,null)
+s=y.p(v,t)
+if(typeof s!=="number")return H.o(s)
+u+=s;++t}s=P.A(null,null)
 s=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
+this.x=F.Wi(this,C.bJ,this.x,s)
 if(u===0){y=J.U6(w)
 t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
+while(!0){s=y.gv(w)
+if(typeof s!=="number")return H.o(s)
 if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
+J.H9(this.x,y.p(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)
+while(!0){r=s.gv(w)
+if(typeof r!=="number")return H.o(r)
 if(!(t<r))break
-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
+J.H9(this.x,s.p(w,t),C.CD.Sy(J.x4(y.p(v,t),u)*100,2)+"%");++t}}}q=P.A(null,null)
+J.Me(z.p(b,"timers"),new D.Qq(q))
+y=this.k4
 s=J.w1(y)
-s.u(y,"total",q.t(0,"time_total_runtime"))
-s.u(y,"compile",q.t(0,"time_compilation"))
-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.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)
+s.q(y,"total",q.p(0,"time_total_runtime"))
+s.q(y,"compile",q.p(0,"time_compilation"))
+s.q(y,"gc",0)
+s.q(y,"init",J.WB(J.WB(J.WB(q.p(0,"time_script_loading"),q.p(0,"time_creating_snapshot")),q.p(0,"time_isolate_initialization")),q.p(0,"time_bootstrap")))
+s.q(y,"dart",q.p(0,"time_dart_execution"))
+this.WU(z.p(b,"heaps"))
+p=z.p(b,"features")
+if(p!=null)for(y=J.Nx(p);y.D();)if(J.mG(y.gk(),"io")){s=this.cy
+if(this.gnz(this)&&!J.mG(s,!0)){s=new T.qI(this,C.iA,s,!0)
 s.$builtinTypeInfo=[null]
-this.nq(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
-y=F.Wi(this,C.yG,this.Jr,y)
-this.Jr=y
-y=y==null&&z.t(b,"topFrame")!=null
-this.EY=F.Wi(this,C.L2,this.EY,y)
-y=this.Jr==null&&z.t(b,"topFrame")==null
-this.eU=F.Wi(this,C.q2,this.eU,y)
-y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-y=this.tW
+this.SZ(this,s)}this.cy=!0}y=z.p(b,"pauseEvent")
+y=F.Wi(this,C.yG,this.y,y)
+this.y=y
+y=y==null&&z.p(b,"topFrame")!=null
+this.z=F.Wi(this,C.L2,this.z,y)
+y=this.y==null&&z.p(b,"topFrame")==null
+this.ch=F.Wi(this,C.q2,this.ch,y)
+y=z.p(b,"error")
+this.ry=F.Wi(this,C.yh,this.ry,y)
+y=this.fy
 y.V1(y)
-y.FV(0,z.t(b,"libraries"))
-y.GT(y,D.E0())},
-xB:function(){return this.V0.jU("/"+H.d(this.TU)+"/profile/tag").ml(new D.O5(this))},
-Jm:function(a,b){this.n5=0
-this.l9=a
+y.FV(0,z.p(b,"libraries"))
+y.GT(y,D.I8())},
+m7:function(){return this.Q.jU("/"+H.d(this.a)+"/profile/tag").ml(new D.O5(this))},
+Jm:function(a,b){this.x2=0
+this.y1=a
 if(a==null)return
-if(J.u6(J.q8(a),3))return
+if(J.UN(J.wS(a),3))return
 return this.ci(b)},
 ci:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.l9
-y=this.n5
+z=this.y1
+y=this.x2
 if(typeof y!=="number")return y.g()
-this.n5=y+1
-x=J.UQ(z,y)
+this.x2=y+1
+x=J.Tf(z,y)
 if(x>>>0!==x||x>=a.length)return H.e(a,x)
 w=a[x]
-y=this.l9
-z=this.n5
+y=this.y1
+z=this.x2
 if(typeof z!=="number")return z.g()
-this.n5=z+1
-v=J.UQ(y,z)
+this.x2=z+1
+v=J.Tf(y,z)
 z=[]
-z.$builtinTypeInfo=[D.D5]
-u=new D.D5(w,v,z,0)
-y=this.l9
-t=this.n5
+z.$builtinTypeInfo=[D.t9]
+u=new D.t9(w,v,z,0)
+y=this.y1
+t=this.x2
 if(typeof t!=="number")return t.g()
-this.n5=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
+this.x2=t+1
+s=J.Tf(y,t)
+if(typeof s!=="number")return H.o(s)
 r=0
 for(;r<s;++r){q=this.ci(a)
 z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-Eb:function(a){var z,y,x,w,v,u
+y=u.c
+t=q.a
+if(typeof t!=="number")return H.o(t)
+u.c=y+t}return u},
+Eb:function(a){var z,y,x,w
 z=J.U6(a)
-y=J.UQ(z.t(a,"location"),"script")
-x=J.UQ(z.t(a,"location"),"tokenPos")
+y=J.Tf(z.p(a,"location"),"script")
+x=J.Tf(z.p(a,"location"),"tokenPos")
 z=J.RE(y)
 if(z.gox(y)===!0){w=y.q6(x)
-J.UQ(z.gGd(y),J.bI(w,1)).sqr(a)}else{z=z.xW(y)
-z.toString
-v=$.X3
-u=new P.Gc(0,v,null,null,v.cR(new D.Ye(this,a)),null,P.VH(null,$.X3),null)
-u.$builtinTypeInfo=[null]
-z.xf(u)}},
+J.Tf(z.gGd(y),J.D5(w,1)).sqr(a)}else z.xW(y).ml(new D.Ye(this,a))},
 eF:function(a){var z,y,x,w,v,u
-z=this.iD
-if(z!=null)for(z=J.mY(J.UQ(z,"breakpoints"));z.G();){y=z.gl()
+z=this.y2
+if(z!=null)for(z=J.Nx(J.Tf(z,"breakpoints"));z.D();){y=z.gk()
 x=J.U6(y)
-w=J.UQ(x.t(y,"location"),"script")
-v=J.UQ(x.t(y,"location"),"tokenPos")
+w=J.Tf(x.p(y,"location"),"script")
+v=J.Tf(x.p(y,"location"),"tokenPos")
 x=J.RE(w)
 if(x.gox(w)===!0){u=w.q6(v)
-J.UQ(x.gGd(w),J.bI(u,1)).sqr(null)}}for(z=J.mY(J.UQ(a,"breakpoints"));z.G();)this.Eb(z.gl())
-this.iD=a},
-Xb:function(){var z=this.hz
+J.Tf(x.gGd(w),J.D5(u,1)).sqr(null)}}for(z=J.Nx(J.Tf(a,"breakpoints"));z.D();)this.Eb(z.gk())
+this.y2=a},
+Xb:function(){var z=this.TB
 if(z==null){z=this.cv("debug/breakpoints").ml(new D.y4(this)).wM(new D.Cm(this))
-this.hz=z}return z},
-G5:function(a,b){return this.cv(J.WB(J.eS(a),"/setBreakpoint?line="+H.d(b))).ml(new D.ad(this,a,b))},
+this.TB=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))},
 Xu:function(a){return this.cv(H.d(J.eS(a))+"/clear").ml(new D.fw(this,a))},
-WJ:[function(a){return this.cv("debug/pause").ml(new D.G4(this))},"$0","gX0",0,0,210],
-QE:[function(a){return this.cv("debug/resume").ml(new D.LO(this))},"$0","gDQ",0,0,210],
-Lg:[function(a){return this.cv("debug/resume?step=into").ml(new D.qD(this))},"$0","gLc",0,0,210],
-Fc:[function(a){return this.cv("debug/resume?step=over").ml(new D.A6(this))},"$0","gqF",0,0,210],
-h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.xK(this))},"$0","gZp",0,0,210],
-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],
+yy:[function(a){return this.cv("debug/pause").ml(new D.qU(this))},"$0","gX0",0,0,215],
+QE:[function(a){return this.cv("debug/resume").ml(new D.bL(this))},"$0","gbY",0,0,215],
+fV:[function(a){return this.cv("debug/resume?step=into").ml(new D.wX(this))},"$0","gLc",0,0,215],
+ks:[function(a){return this.cv("debug/resume?step=over").ml(new D.Ro(this))},"$0","gqF",0,0,215],
+h9:[function(a){return this.cv("debug/resume?step=out").ml(new D.pW(this))},"$0","gVX",0,0,215],
+Z6:function(a,b){return this.cv(a).ml(new D.oq(b))},
+VT:function(){return this.Z6("metrics",this.ej).ml(new D.y17(this))},
+X:[function(a){return"Isolate("+H.d(this.a)+")"},"$0","gCR",0,0,0],
 $isbv:true,
 static:{"^":"ZGx"}},
 PKX:{
 "^":"xm+boh;"},
 bvc:{
-"^":"PKX+Pi;",
+"^":"PKX+Piz;",
 $isd3:true},
-TV:{
-"^":"TpZ:12;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.kr,a.xM,0)
-a.Du=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)
-C.Nm.sB(a.hw,0)
-a.n3.V1(0)}},
-$isEH:true},
+S0:{
+"^":"r:14;",
+$1:function(a){if(!!J.t(a).$iskx){a.y=F.Wi(a,C.Kj,a.y,0)
+a.z=0
+a.ch=0
+a.fx=F.Wi(a,C.EF,a.fx,"")
+a.fy=F.Wi(a,C.uU,a.fy,"")
+C.Nm.sv(a.db,0)
+C.Nm.sv(a.dx,0)
+a.fr.V1(0)}}},
 KQ:{
-"^":"TpZ:209;a,b",
+"^":"r:214;Q,a",
 $1:[function(a){var z,y
-z=this.a
+z=this.Q
 y=D.Nl(z,a)
-if(y.gjm())z.uj.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,208,"call"],
-$isEH:true},
-Ea:{
-"^":"TpZ:76;c",
-$0:function(){return this.c},
-$isEH:true},
+if(y.gjm())z.db.to(0,this.a,new D.Eav(y))
+return y},"$1",null,2,0,null,213,"call"]},
+Eav:{
+"^":"r:77;Q",
+$0:function(){return this.Q}},
 Qq:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $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,219,"call"],
-$isEH:true},
+this.Q.q(0,z.p(a,"name"),z.p(a,"time"))},"$1",null,2,0,null,200,"call"]},
 O5:{
-"^":"TpZ:209;a",
-$1:[function(a){var z,y
-z=Date.now()
-new P.iP(z,!1).EK()
-y=this.a.KJ
-y.Qv(z/1000,a)
-return y},"$1",null,2,0,null,168,"call"],
-$isEH:true},
+"^":"r:214;Q",
+$1:[function(a){var z=this.Q.dx
+z.Qv(Date.now()/1000,a)
+return z},"$1",null,2,0,null,168,"call"]},
 Ye:{
-"^":"TpZ:12;a,b",
-$1:[function(a){this.a.Eb(this.b)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+"^":"r:14;Q,a",
+$1:[function(a){this.Q.Eb(this.a)},"$1",null,2,0,null,15,"call"]},
 y4:{
-"^":"TpZ:12;a",
-$1:[function(a){this.a.eF(a)},"$1",null,2,0,null,220,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){this.Q.eF(a)},"$1",null,2,0,null,224,"call"]},
 Cm:{
-"^":"TpZ:76;b",
-$0:[function(){this.b.hz=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-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"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){this.Q.TB=null},"$0",null,0,0,null,"call"]},
+JL:{
+"^":"r:14;Q,a,b",
+$1:[function(a){if(!!J.t(a).$iscn)J.Tf(J.de(this.a),J.D5(this.b,1)).sj9(!1)
+return this.Q.Xb()},"$1",null,2,0,null,121,"call"]},
 fw:{
-"^":"TpZ:12;a,b",
+"^":"r:14;Q,a",
 $1:[function(a){var z,y
-if(!!J.x(a).$iscn)N.QM("").hh(a.LD)
-z=this.a
-y=z.Jr
-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("").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("").hh(a.LD)
-return this.a.VD(0)},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-qD:{
-"^":"TpZ:12;a",
-$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},
-A6:{
-"^":"TpZ:12;a",
-$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},
-xK:{
-"^":"TpZ:12;a",
-$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},
+if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+z=this.Q
+y=z.y
+if(y!=null&&y.gYZ()!=null&&J.mG(J.Tf(z.y.gYZ(),"id"),J.Tf(this.a,"id")))return z.VD(0)
+else return z.Xb()},"$1",null,2,0,null,121,"call"]},
+qU:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+bL:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+wX:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+Ro:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
+pW:{
+"^":"r:14;Q",
+$1:[function(a){if(!!J.t(a).$iscn)N.QM("").YX(a.y)
+return this.Q.VD(0)},"$1",null,2,0,null,121,"call"]},
 oq:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x
-z=J.x(a)
-if(!!z.$iscn){N.QM("").hh(a.LD)
-return}y=this.a
+z=J.t(a)
+if(!!z.$iscn){N.QM("").YX(a.y)
+return}y=this.Q
 y.V1(0)
-for(z=J.mY(z.t(a,"members"));z.G();){x=z.gl()
-y.u(0,J.eS(x),x)}return y},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-y1:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-return z.WO("metrics/vm",z.Sn)},"$1",null,2,0,null,13,"call"],
-$isEH:true},
+for(z=J.Nx(z.p(a,"members"));z.D();){x=z.gk()
+y.q(0,J.eS(x),x)}return y},"$1",null,2,0,null,121,"call"]},
+y17:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+return z.Z6("metrics/vm",z.lZ)},"$1",null,2,0,null,15,"call"]},
 vO:{
-"^":"af;RF,V0,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)},
+"^":"af;x,Q,a,b,c,d,e,f,r,cy$,db$",
+gjm:function(){return(J.mG(this.b,"Class")||J.mG(this.b,"Function")||J.mG(this.b,"Field"))&&!J.co(this.a,$.RQ)},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x
-this.qu=!c
-z=this.RF
+bF:function(a,b,c){var z,y,x
+this.d=!c
+z=this.x
 z.V1(0)
 z.FV(0,b)
-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)},
-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.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.LL.t(0,b)},
-u:function(a,b,c){this.RF.u(0,b,c)
+y=z.Q
+x=y.p(0,"name")
+this.e=this.ct(0,C.YS,this.e,x)
+y=y.NZ(0,"vmName")?y.p(0,"vmName"):this.e
+this.f=this.ct(0,C.KS,this.f,y)
+D.kT(z,this.Q)},
+FV:function(a,b){return this.x.FV(0,b)},
+V1:function(a){return this.x.V1(0)},
+NZ:function(a,b){return this.x.Q.NZ(0,b)},
+aN:function(a,b){return this.x.Q.aN(0,b)},
+Rz:function(a,b){return this.x.Rz(0,b)},
+p:function(a,b){return this.x.Q.p(0,b)},
+q:function(a,b,c){this.x.q(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.LL
-return z.gB(z)===0},
-gor:function(a){var z=this.RF.LL
-return z.gB(z)!==0},
-gvc:function(a){var z=this.RF.LL
+gl0:function(a){var z=this.x.Q
+return z.gv(z)===0},
+gor:function(a){var z=this.x.Q
+return z.gv(z)!==0},
+gvc:function(a){var z=this.x.Q
 return z.gvc(z)},
-gUQ:function(a){var z=this.RF.LL
+gUQ:function(a){var z=this.x.Q
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.LL
-return z.gB(z)},
-HC:[function(a){var z=this.RF
+gv:function(a){var z=this.x.Q
+return z.gv(z)},
+HC:[function(a){var z=this.x
 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)},
-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
+SZ:function(a,b){var z=this.x
+return z.SZ(z,b)},
+ct:function(a,b,c,d){return F.Wi(this.x,b,c,d)},
+Tr:[function(a){return},"$0","gcm",0,0,1],
+dt:[function(a){this.x.cy$=null
+return},"$0","gl1",0,0,1],
+gqh:function(a){var z=this.x
 return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.Vg
-if(z!=null){y=z.iE
+z=this.x.cy$
+if(z!=null){y=z.c
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-bu:[function(a){return"ServiceMap("+P.vW(this.RF)+")"},"$0","gCR",0,0,73],
+X:[function(a){return"ServiceMap("+H.d(this.x)+")"},"$0","gCR",0,0,0],
 $isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
-$isT8:true,
-$asT8:function(){return[null,null]},
+$isw:true,
+$asw:function(){return[null,null]},
 $isd3:true,
 static:{"^":"RQ"}},
 cn:{
-"^":"wVq;I0,LD,jo,Ne,Vg,fn,V0,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)},
-R5:function(a,b,c){var z,y,x
+"^":"wVq;x,y,z,ch,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+gja:function(a){return this.z},
+sja:function(a,b){this.z=F.Wi(this,C.ne,this.z,b)},
+bF: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
-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"))
-this.Ne=F.Wi(this,C.HO,this.Ne,z)
-z="DartError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"DartError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+y=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,y)
+y=this.Q
+x=D.Nl(y,z.p(b,"exception"))
+this.z=F.Wi(this,C.ne,this.z,x)
+z=D.Nl(y,z.p(b,"stacktrace"))
+this.ch=F.Wi(this,C.Yh,this.ch,z)
+z="DartError "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"DartError("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $iscn:true},
 wVq:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 N7:{
-"^":"dZL;I0,LD,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gfY:function(a){return this.I0},
-gG1:function(a){return this.LD},
-R5:function(a,b,c){var z,y
-this.qu=!0
+"^":"dZL;x,y,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+bF:function(a,b,c){var z,y
+this.d=!0
 z=J.U6(b)
-y=z.t(b,"kind")
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-z=z.t(b,"message")
-this.LD=F.Wi(this,C.pX,this.LD,z)
-z="ServiceError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"ServiceError("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+z=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,z)
+z="ServiceError "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"ServiceError("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $isN7:true},
 dZL:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Ix:{
-"^":"w8F;I0,LD,IV,Vg,fn,V0,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},
-R5:function(a,b,c){var z,y
+"^":"w8F;x,y,z,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+gG1:function(a){return this.y},
+gS4:function(a){return this.z},
+bF: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)
-y=z.t(b,"message")
-this.LD=F.Wi(this,C.pX,this.LD,y)
-z=z.t(b,"response")
-this.IV=F.Wi(this,C.F3,this.IV,z)
-z="ServiceException "+H.d(this.I0)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-bu:[function(a){return"ServiceException("+H.d(this.LD)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"kind")
+this.x=F.Wi(this,C.Lc,this.x,y)
+y=z.p(b,"message")
+this.y=F.Wi(this,C.pX,this.y,y)
+z=z.p(b,"response")
+this.z=F.Wi(this,C.F3,this.z,z)
+z="ServiceException "+H.d(this.x)
+z=this.ct(this,C.YS,this.e,z)
+this.e=z
+this.f=this.ct(this,C.KS,this.f,z)},
+X:[function(a){return"ServiceException("+H.d(this.y)+")"},"$0","gCR",0,0,0],
 $isIx:true},
 w8F:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Mk:{
-"^":"V4b;eq,HQ,jo,ZK,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gfG:function(a){return this.eq},
-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},
-R5:function(a,b,c){var z,y
-this.qu=!0
-D.kT(b,this.V0)
+"^":"V4b;x,y,z,ch,cx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfG:function(a){return this.x},
+gYZ:function(){return this.y},
+gja:function(a){return this.z},
+sja:function(a,b){this.z=F.Wi(this,C.ne,this.z,b)},
+gRn:function(a){return this.ch},
+gAv:function(){return this.cx},
+bF:function(a,b,c){var z,y
+this.d=!0
+D.kT(b,this.Q)
 z=J.U6(b)
-y=z.t(b,"eventType")
-y=F.Wi(this,C.qR,this.eq,y)
-this.eq=y
+y=z.p(b,"eventType")
+y=F.Wi(this,C.qR,this.x,y)
+this.x=y
 y="ServiceEvent "+H.d(y)
-y=this.ct(this,C.YS,this.bN,y)
-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.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
-z="ServiceEvent of type "+H.d(this.eq)+" with "
-y=this.ZK
-return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,73],
+y=this.ct(this,C.YS,this.e,y)
+this.e=y
+this.f=this.ct(this,C.KS,this.f,y)
+if(z.p(b,"breakpoint")!=null){y=z.p(b,"breakpoint")
+this.y=F.Wi(this,C.hR,this.y,y)}if(z.p(b,"exception")!=null){y=z.p(b,"exception")
+this.z=F.Wi(this,C.ne,this.z,y)}if(z.p(b,"_data")!=null){y=z.p(b,"_data")
+this.ch=F.Wi(this,C.ee,this.ch,y)}if(z.p(b,"count")!=null){z=z.p(b,"count")
+this.cx=F.Wi(this,C.o9,this.cx,z)}},
+X:[function(a){var z,y
+z="ServiceEvent of type "+H.d(this.x)+" with "
+y=this.ch
+return z+H.d(y==null?0:J.pI(y))+" bytes of binary data"},"$0","gCR",0,0,0],
 $isMk:true},
 V4b:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 U4:{
-"^":"rG9;dj,Bm<,XR<,DD>,Z3<,mu<,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
-gO3:function(a){return this.dj},
+"^":"rG9;x,Pb:y<,XR:z<,DD:ch>,Z3:cx<,jV:cy<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gO3:function(a){return this.x},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w,v
+bF:function(a,b,c){var z,y,x,w
 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
+y=z.p(b,"url")
+x=F.Wi(this,C.Fh,this.x,y)
+this.x=x
+if(J.co(x,"file://")||J.co(this.x,"http://")){y=this.x
 w=J.U6(y)
-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)
+x=w.yn(y,w.cn(y,"/")+1)}y=z.p(b,"name")
+y=this.ct(this,C.YS,this.e,y)
+this.e=y
+if(J.FN(y)===!0)this.e=this.ct(this,C.YS,this.e,x)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-y=this.Bm
+this.d=!0
+D.kT(b,J.wg(this.Q))
+y=this.y
 y.V1(y)
-w=J.dF(z.t(b,"imports")).br(0)
-H.ig(w,D.E0())
+w=J.Ij(z.p(b,"imports")).br(0)
+C.Nm.uy(w,"sort")
+H.ig(w,D.I8())
 y.FV(0,w)
-y=this.XR
+w=this.z
+w.V1(w)
+y=J.Ij(z.p(b,"scripts")).br(0)
+C.Nm.uy(y,"sort")
+H.ig(y,D.I8())
+w.FV(0,y)
+y=this.ch
 y.V1(y)
-w=J.dF(z.t(b,"scripts")).br(0)
-H.ig(w,D.E0())
-y.FV(0,w)
-y=this.DD
+y.FV(0,z.p(b,"classes"))
+y.GT(y,D.I8())
+y=this.cx
 y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y.GT(y,D.E0())
-y=this.Z3
+y.FV(0,z.p(b,"variables"))
+y.GT(y,D.I8())
+y=this.cy
 y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y.GT(y,D.E0())
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())},
-bu:[function(a){return"Library("+H.d(this.dj)+")"},"$0","gCR",0,0,73],
+y.FV(0,z.p(b,"functions"))
+y.GT(y,D.I8())},
+X:[function(a){return"Library("+H.d(this.x)+")"},"$0","gCR",0,0,0],
 $isU4:true},
 T5W:{
 "^":"af+boh;"},
 rG9:{
-"^":"T5W+Pi;",
+"^":"T5W+Piz;",
 $isd3:true},
-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)},
-gfj:function(){return this.wY}},
+qp:{
+"^":"Piz;Q,a,cy$,db$",
+gWt:function(a){return this.Q},
+sWt:function(a,b){this.Q=F.Wi(this,C.yB,this.Q,b)},
+gET:function(){return this.a}},
 Iy:{
-"^":"a;EJ<,l<",
+"^":"a;EJ:Q<,k:a<",
 eC:function(a){var z,y,x
-z=this.EJ
+z=this.Q
 y=J.U6(a)
-x=y.t(a,6)
-z.wf=F.Wi(z,C.yB,z.wf,x)
-x=y.t(a,7)
-z.wY=F.Wi(z,C.hN,z.wY,x)
-x=this.l
-z=J.WB(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.WB(y.t(a,3),y.t(a,5))
-x.wY=F.Wi(x,C.hN,x.wY,y)},
+x=y.p(a,6)
+z.Q=F.Wi(z,C.yB,z.Q,x)
+x=y.p(a,7)
+z.a=F.Wi(z,C.hN,z.a,x)
+x=this.a
+z=J.WB(y.p(a,2),y.p(a,4))
+x.Q=F.Wi(x,C.yB,x.Q,z)
+y=J.WB(y.p(a,3),y.p(a,5))
+x.a=F.Wi(x,C.hN,x.a,y)},
 static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,Whu"}},
 dy:{
-"^":"cOr;Gz,ar,Lh,GQ,GU,J1,E8,eH,dN,yv,UY<,xQ<,dQ,tJ<,mu<,k9,p2<,LT<,Vg,fn,V0,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},
-gRs:function(){return this.GQ},
-geh:function(){return this.J1},
-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},
-skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
+"^":"cOr;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,UY:fy<,xQ:go<,id,tJ:k1<,jV:k2<,k3,p2:k4<,LT:r1<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gHt:function(a){return this.x},
+sHt:function(a,b){this.x=F.Wi(this,C.EV,this.x,b)},
+gtu:function(a){return this.y},
+stu:function(a,b){this.y=F.Wi(this,C.PX,this.y,b)},
+gvo:function(){return this.z},
+gRh:function(){return this.ch},
+geh:function(){return this.cy},
+gVF:function(){return this.dx},
+sVF:function(a){this.dx=F.Wi(this,C.dA,this.dx,a)},
+gLK:function(){return this.dy},
+sLK:function(a){this.dy=F.Wi(this,C.Fe,this.dy,a)},
+gkc:function(a){return this.fr},
+skc:function(a,b){this.fr=F.Wi(this,C.yh,this.fr,b)},
 gMp:function(){var z,y
-z=this.UY
-y=z.EJ
-if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1
-if(z){z=this.xQ
-y=z.EJ
-if(J.xC(y.wf,0)&&J.xC(y.wY,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.wY,0)}else z=!1}else z=!1
+z=this.fy
+y=z.Q
+if(J.mG(y.Q,0)&&J.mG(y.a,0)){z=z.a
+z=J.mG(z.Q,0)&&J.mG(z.a,0)}else z=!1
+if(z){z=this.go
+y=z.Q
+if(J.mG(y.Q,0)&&J.mG(y.a,0)){z=z.a
+z=J.mG(z.Q,0)&&J.mG(z.a,0)}else z=!1}else z=!1
 return z},
-gAY:function(){return this.k9},
-sAY:function(a){this.k9=F.Wi(this,C.FZ,this.k9,a)},
+gAY:function(){return this.k3},
+sAY:function(a){this.k3=F.Wi(this,C.FZ,this.k3,a)},
 gjm:function(){return!0},
 gM8:function(){return!1},
-R5:function(a,b,c){var z,y,x,w
+bF: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)
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+y=H.BU(J.ZZ(this.a,8),null,null)
+this.fx=F.Wi(this,C.qo,this.fx,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-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")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"abstract")
-this.Lh=F.Wi(this,C.XH,this.Lh,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"finalized")
-this.GU=F.Wi(this,C.WV,this.GU,y)
-y=z.t(b,"patch")
-this.J1=F.Wi(this,C.XL,this.J1,y)
-y=z.t(b,"implemented")
-this.E8=F.Wi(this,C.tA,this.E8,y)
-y=z.t(b,"tokenPos")
-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.LT
+this.d=!0
+D.kT(b,J.wg(this.Q))
+if(!!J.t(z.p(b,"library")).$isU4){y=z.p(b,"library")
+this.x=F.Wi(this,C.EV,this.x,y)}else this.x=F.Wi(this,C.EV,this.x,null)
+y=z.p(b,"script")
+this.y=F.Wi(this,C.PX,this.y,y)
+y=z.p(b,"abstract")
+this.z=F.Wi(this,C.XH,this.z,y)
+y=z.p(b,"const")
+this.ch=F.Wi(this,C.Nr,this.ch,y)
+y=z.p(b,"finalized")
+this.cx=F.Wi(this,C.yz,this.cx,y)
+y=z.p(b,"patch")
+this.cy=F.Wi(this,C.XL,this.cy,y)
+y=z.p(b,"implemented")
+this.db=F.Wi(this,C.Ih,this.db,y)
+y=z.p(b,"tokenPos")
+this.dx=F.Wi(this,C.dA,this.dx,y)
+y=z.p(b,"endTokenPos")
+this.dy=F.Wi(this,C.Fe,this.dy,y)
+y=this.r1
 y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y.GT(y,D.E0())
-y=this.tJ
+y.FV(0,z.p(b,"subclasses"))
+y.GT(y,D.I8())
+y=this.k1
 y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y.GT(y,D.E0())
-y=this.mu
+y.FV(0,z.p(b,"fields"))
+y.GT(y,D.I8())
+y=this.k2
 y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y.GT(y,D.E0())
-y=z.t(b,"super")
-y=F.Wi(this,C.FZ,this.k9,y)
-this.k9=y
-if(y!=null&&J.xC(J.DA(y),"Object"))this.k9.u2(this)
-y=z.t(b,"error")
-this.yv=F.Wi(this,C.yh,this.yv,y)
-x=z.t(b,"allocationStats")
+y.FV(0,z.p(b,"functions"))
+y.GT(y,D.I8())
+y=z.p(b,"super")
+y=F.Wi(this,C.FZ,this.k3,y)
+this.k3=y
+if(y!=null&&J.mG(J.DA(y),"Object"))this.k3.u2(this)
+y=z.p(b,"error")
+this.fr=F.Wi(this,C.yh,this.fr,y)
+x=z.p(b,"allocationStats")
 if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))
-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.LT
+this.fy.eC(z.p(x,"new"))
+this.go.eC(z.p(x,"old"))
+y=this.id
+w=z.p(x,"promotedInstances")
+y.Q=F.Wi(y,C.yB,y.Q,w)
+z=z.p(x,"promotedBytes")
+y.a=F.Wi(y,C.hN,y.a,z)}},
+u2:function(a){var z=this.r1
 if(z.tg(z,a))return
 z.h(0,a)
-z.GT(z,D.E0())},
-cv:function(a){return J.aT(this.V0).cv(J.WB(this.TU,"/"+H.d(a)))},
-bu:[function(a){return"Class("+H.d(this.GR)+")"},"$0","gCR",0,0,73],
+z.GT(z,D.I8())},
+cv:function(a){return J.wg(this.Q).cv(J.WB(this.a,"/"+H.d(a)))},
+X:[function(a){return"Class("+H.d(this.f)+")"},"$0","gCR",0,0,0],
 $isdy:true},
 ZzQ:{
 "^":"af+boh;"},
 cOr:{
-"^":"ZzQ+Pi;",
+"^":"ZzQ+Piz;",
 $isd3:true},
 uq:{
-"^":"Zqa;df,MD,lA,fQ,ni,Iv,bN:di@,cM,F6,oI,dG,Rf,z0,TG,tk,FA,Vg,fn,V0,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)},
-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.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)},
-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)},
-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},
-sCM:function(a){this.TG=F.Wi(this,C.Tc,this.TG,a)},
-gnl:function(a){return this.tk},
-snl:function(a,b){this.tk=F.Wi(this,C.z6,this.tk,b)},
-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},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.V0))
+"^":"Zqa;x,y,z,ch,cx,cy,px:db@,dx,dy,fr,fx,fy,go,id,k1,k2,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
+gHD:function(){return this.z},
+gae:function(){return this.ch},
+gwz:function(){return this.cx},
+swz:function(a){this.cx=F.Wi(this,C.aw,this.cx,a)},
+gu5:function(){return this.cy},
+su5:function(a){this.cy=F.Wi(this,C.mM,this.cy,a)},
+goc:function(a){return this.db},
+soc:function(a,b){this.db=F.Wi(this,C.YS,this.db,b)},
+gv:function(a){return this.dx},
+sv:function(a,b){this.dx=F.Wi(this,C.Wn,this.dx,b)},
+gQR:function(){return this.dy},
+sQR:function(a){this.dy=F.Wi(this,C.hx,this.dy,a)},
+gtJ:function(){return this.fr},
+stJ:function(a){this.fr=F.Wi(this,C.fV,this.fr,a)},
+gDm:function(){return this.fx},
+gnS:function(a){return this.fy},
+snS:function(a,b){this.fy=F.Wi(this,C.mw,this.fy,b)},
+gCM:function(){return this.id},
+sCM:function(a){this.id=F.Wi(this,C.Tc,this.id,a)},
+gG3:function(a){return this.k1},
+sG3:function(a,b){this.k1=F.Wi(this,C.z6,this.k1,b)},
+gM:function(a){return this.k2},
+sM:function(a,b){this.k2=F.Wi(this,C.zd,this.k2,b)},
+gBF:function(){return this.cx!=null},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=z.t(b,"valueAsString")
-this.lA=F.Wi(this,C.Db,this.lA,y)
-y=J.xC(z.t(b,"valueAsStringIsTruncated"),!0)
-this.fQ=F.Wi(this,C.aF,this.fQ,y)
-y=z.t(b,"closureFunc")
-this.ni=F.Wi(this,C.aw,this.ni,y)
-y=z.t(b,"closureCtxt")
-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")
-this.cM=F.Wi(this,C.Wn,this.cM,y)
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=z.p(b,"valueAsString")
+this.z=F.Wi(this,C.Db,this.z,y)
+y=J.mG(z.p(b,"valueAsStringIsTruncated"),!0)
+this.ch=F.Wi(this,C.aF,this.ch,y)
+y=z.p(b,"closureFunc")
+this.cx=F.Wi(this,C.aw,this.cx,y)
+y=z.p(b,"closureCtxt")
+this.cy=F.Wi(this,C.mM,this.cy,y)
+y=z.p(b,"name")
+this.db=F.Wi(this,C.YS,this.db,y)
+y=z.p(b,"length")
+this.dx=F.Wi(this,C.Wn,this.dx,y)
 if(c)return
-y=z.t(b,"nativeFields")
-this.dG=F.Wi(this,C.uw,this.dG,y)
-y=z.t(b,"fields")
-this.oI=F.Wi(this,C.fV,this.oI,y)
-y=z.t(b,"elements")
-this.Rf=F.Wi(this,C.mw,this.Rf,y)
-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.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.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]},
+y=z.p(b,"nativeFields")
+this.fx=F.Wi(this,C.uw,this.fx,y)
+y=z.p(b,"fields")
+this.fr=F.Wi(this,C.fV,this.fr,y)
+y=z.p(b,"elements")
+this.fy=F.Wi(this,C.mw,this.fy,y)
+y=z.p(b,"type_class")
+this.dy=F.Wi(this,C.hx,this.dy,y)
+y=z.p(b,"user_name")
+this.go=F.Wi(this,C.ct,this.go,y)
+y=z.p(b,"referent")
+this.id=F.Wi(this,C.Tc,this.id,y)
+y=z.p(b,"key")
+this.k1=F.Wi(this,C.z6,this.k1,y)
+z=z.p(b,"value")
+this.k2=F.Wi(this,C.zd,this.k2,z)
+this.d=!0},
+X:[function(a){var z=this.z
+return"Instance("+H.d(z!=null?z:"a "+H.d(J.DA(this.x)))+")"},"$0","gCR",0,0,0]},
 Zqa:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 lI:{
-"^":"D3i;df,MD,Jx,cM,A6,Vg,fn,V0,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)},
-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)},
-R5:function(a,b,c){var z,y
-D.kT(b,J.aT(this.V0))
+"^":"D3i;x,y,z,ch,cx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
+gqH:function(){return this.z},
+sqH:function(a){this.z=F.Wi(this,C.BV,this.z,a)},
+gv:function(a){return this.ch},
+sv:function(a,b){this.ch=F.Wi(this,C.Wn,this.ch,b)},
+gZ3:function(){return this.cx},
+sZ3:function(a){this.cx=F.Wi(this,C.xw,this.cx,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=z.t(b,"length")
-this.cM=F.Wi(this,C.Wn,this.cM,y)
-y=z.t(b,"parent")
-this.Jx=F.Wi(this,C.BV,this.Jx,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=z.p(b,"length")
+this.ch=F.Wi(this,C.Wn,this.ch,y)
+y=z.p(b,"parent")
+this.z=F.Wi(this,C.BV,this.z,y)
 if(c)return
-y=z.t(b,"class")
-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.qu=!0},
-bu:[function(a){return"Context("+H.d(this.cM)+")"},"$0","gCR",0,0,73]},
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+z=z.p(b,"variables")
+this.cx=F.Wi(this,C.xw,this.cx,z)
+this.d=!0},
+X:[function(a){return"Context("+H.d(this.ch)+")"},"$0","gCR",0,0,0]},
 D3i:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
-ma:{
-"^":"a;Sf",
-bu:[function(a){return this.Sf},"$0","gCR",0,0,76],
-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",Ih:function(a){switch(a){case"kRegularFunction":return $.qu()
-case"kClosureFunction":return $.xq()
-case"kGetterFunction":return $.xW()
-case"kSetterFunction":return $.Kw()
+r2:{
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,77],
+Q2:function(){return C.Nm.tg([$.Ps(),$.Nk(),$.PY(),$.dh()],this)},
+static:{"^":"et,jX,PZ,Bs,G8,xs,ab,Sp,Pc,Ll,fJ,bt,dQ,Oq,Gh,XK",Hn:function(a){switch(a){case"kRegularFunction":return $.xK()
+case"kClosureFunction":return $.HU()
+case"kGetterFunction":return $.rQ()
+case"kSetterFunction":return $.en()
 case"kConstructor":return $.kj()
 case"kImplicitGetter":return $.d9()
 case"kImplicitSetter":return $.AH()
-case"kStaticInitializer":return $.y5()
-case"kMethodExtractor":return $.Ot()
+case"kStaticInitializer":return $.aC()
+case"kMethodExtractor":return $.kL()
 case"kNoSuchMethodDispatcher":return $.E7()
-case"kInvokeFieldDispatcher":return $.f6()
-case"Collected":return $.b1()
-case"Native":return $.YK()
-case"Tag":return $.zx()
-case"Reused":return $.dh()}return $.lC()}}},
+case"kInvokeFieldDispatcher":return $.bh()
+case"Collected":return $.Ps()
+case"Native":return $.Nk()
+case"Tag":return $.PY()
+case"Reused":return $.dh()}return $.h4()}}},
 Kp:{
-"^":"S6L;Pp,EG,bV,GQ,fd,ar,eH,dN,v5,NM,vf,H7,I0,XN,Ni,kE,Z4,Vg,fn,V0,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},
-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.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},
-stT:function(a,b){this.v5=F.Wi(this,C.i4,this.v5,b)},
-gjW:function(){return this.NM},
-sjW:function(a){this.NM=F.Wi(this,C.OU,this.NM,a)},
-gW1:function(){return this.vf},
-gho:function(){return this.H7},
-gfY:function(a){return this.I0},
-guh:function(){return this.XN},
-gUx:function(){return this.Ni},
-gSu:function(){return this.kE},
-gMA:function(){return this.Z4},
-R5:function(a,b,c){var z,y
+"^":"S6L;x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,id,k1,k2,k3,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gP2:function(){return this.x},
+sP2:function(a){this.x=F.Wi(this,C.YV,this.x,a)},
+gxH:function(){return this.y},
+sxH:function(a){this.y=F.Wi(this,C.If,this.y,a)},
+gFo:function(){return this.z},
+gRh:function(){return this.ch},
+geT:function(a){return this.cx},
+seT:function(a,b){this.cx=F.Wi(this,C.nX,this.cx,b)},
+gtu:function(a){return this.cy},
+stu:function(a,b){this.cy=F.Wi(this,C.PX,this.cy,b)},
+gVF:function(){return this.db},
+sVF:function(a){this.db=F.Wi(this,C.dA,this.db,a)},
+gLK:function(){return this.dx},
+sLK:function(a){this.dx=F.Wi(this,C.Fe,this.dx,a)},
+gtT:function(a){return this.dy},
+stT:function(a,b){this.dy=F.Wi(this,C.i4,this.dy,b)},
+gjW:function(){return this.fr},
+sjW:function(a){this.fr=F.Wi(this,C.OU,this.fr,a)},
+gW1:function(){return this.fx},
+gxL:function(){return this.fy},
+gfY:function(a){return this.go},
+gOs:function(){return this.id},
+gUx:function(){return this.k1},
+gSu:function(){return this.k2},
+gni:function(){return this.k3},
+bF: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.aT(this.V0))
-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
-this.EG=F.Wi(this,C.If,this.EG,y)
-y=D.Ih(z.t(b,"kind"))
-y=F.Wi(this,C.Lc,this.I0,y)
-this.I0=y
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+D.kT(b,J.wg(this.Q))
+y=z.NZ(b,"owningClass")===!0?z.p(b,"owningClass"):null
+this.x=F.Wi(this,C.YV,this.x,y)
+y=z.NZ(b,"owningLibrary")===!0?z.p(b,"owningLibrary"):null
+this.y=F.Wi(this,C.If,this.y,y)
+y=D.Hn(z.p(b,"kind"))
+y=F.Wi(this,C.Lc,this.go,y)
+this.go=y
 y=y.Q2()
-this.Z4=F.Wi(this,C.a0,this.Z4,!y)
+this.k3=F.Wi(this,C.a0,this.k3,!y)
 if(c)return
-y=z.t(b,"static")
-this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"parent")
-this.fd=F.Wi(this,C.nX,this.fd,y)
-y=z.t(b,"script")
-this.ar=F.Wi(this,C.PX,this.ar,y)
-y=z.t(b,"tokenPos")
-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.UW(z.t(b,"code"))
-this.v5=F.Wi(this,C.i4,this.v5,y)
-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)
-y=z.t(b,"inlinable")
-this.H7=F.Wi(this,C.MY,this.H7,y)
-y=z.t(b,"deoptimizations")
-this.XN=F.Wi(this,C.eR,this.XN,y)
-z=z.t(b,"usageCounter")
-this.kE=F.Wi(this,C.yv,this.kE,z)
-z=this.fd
-if(z==null){z=this.Pp
-z=z!=null?H.d(J.DA(z))+"."+H.d(this.bN):this.bN
-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)}},
+y=z.p(b,"static")
+this.z=F.Wi(this,C.AT,this.z,y)
+y=z.p(b,"const")
+this.ch=F.Wi(this,C.Nr,this.ch,y)
+y=z.p(b,"parent")
+this.cx=F.Wi(this,C.nX,this.cx,y)
+y=z.p(b,"script")
+this.cy=F.Wi(this,C.PX,this.cy,y)
+y=z.p(b,"tokenPos")
+this.db=F.Wi(this,C.dA,this.db,y)
+y=z.p(b,"endTokenPos")
+this.dx=F.Wi(this,C.Fe,this.dx,y)
+y=D.vQ(z.p(b,"code"))
+this.dy=F.Wi(this,C.i4,this.dy,y)
+y=D.vQ(z.p(b,"unoptimizedCode"))
+this.fr=F.Wi(this,C.OU,this.fr,y)
+y=z.p(b,"optimizable")
+this.fx=F.Wi(this,C.Vl,this.fx,y)
+y=z.p(b,"inlinable")
+this.fy=F.Wi(this,C.MY,this.fy,y)
+y=z.p(b,"deoptimizations")
+this.id=F.Wi(this,C.eR,this.id,y)
+z=z.p(b,"usageCounter")
+this.k2=F.Wi(this,C.yv,this.k2,z)
+z=this.cx
+if(z==null){z=this.x
+z=z!=null?H.d(J.DA(z))+"."+H.d(this.e):this.e
+this.k1=F.Wi(this,C.AO,this.k1,z)}else{z=H.d(z.gUx())+"."+H.d(this.e)
+this.k1=F.Wi(this,C.AO,this.k1,z)}},
 $isKp:true},
 wvY:{
 "^":"af+boh;"},
 S6L:{
-"^":"wvY+Pi;",
+"^":"wvY+Piz;",
 $isd3:true},
 xB:{
-"^":"Pqb;qy,Br,bV,f3,GQ,FA,bN:T6@,GR:vS@,ND,lw,ne,ar,eH,Vg,fn,V0,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},
-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)},
-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.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.V0))
+"^":"Pqb;x,y,z,ch,cx,cy,px:db@,GR:dx@,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gXP:function(){return this.x},
+sXP:function(a){this.x=F.Wi(this,C.Yp,this.x,a)},
+gOF:function(){return this.y},
+sOF:function(a){this.y=F.Wi(this,C.yC,this.y,a)},
+gFo:function(){return this.z},
+gV5:function(a){return this.ch},
+gRh:function(){return this.cx},
+gM:function(a){return this.cy},
+sM:function(a,b){this.cy=F.Wi(this,C.zd,this.cy,b)},
+goc:function(a){return this.db},
+soc:function(a,b){this.db=F.Wi(this,C.YS,this.db,b)},
+gzz:function(){return this.dx},
+szz:function(a){this.dx=F.Wi(this,C.KS,this.dx,a)},
+gRl:function(){return this.dy},
+gZD:function(){return this.fr},
+sZD:function(a){this.fr=F.Wi(this,C.ft,this.fr,a)},
+gtu:function(a){return this.fy},
+stu:function(a,b){this.fy=F.Wi(this,C.PX,this.fy,b)},
+gVF:function(){return this.go},
+sVF:function(a){this.go=F.Wi(this,C.dA,this.go,a)},
+bF:function(a,b,c){var z,y
+D.kT(b,J.wg(this.Q))
 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.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")
-this.bV=F.Wi(this,C.AT,this.bV,y)
-y=z.t(b,"final")
-this.f3=F.Wi(this,C.dR,this.f3,y)
-y=z.t(b,"const")
-this.GQ=F.Wi(this,C.Nr,this.GQ,y)
-y=z.t(b,"value")
-this.FA=F.Wi(this,C.zd,this.FA,y)
+y=z.p(b,"name")
+this.db=F.Wi(this,C.YS,this.db,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.db
+this.dx=F.Wi(this,C.KS,this.dx,y)
+y=z.p(b,"owner")
+this.x=F.Wi(this,C.Yp,this.x,y)
+y=z.p(b,"declaredType")
+this.y=F.Wi(this,C.yC,this.y,y)
+y=z.p(b,"static")
+this.z=F.Wi(this,C.AT,this.z,y)
+y=z.p(b,"final")
+this.ch=F.Wi(this,C.dR,this.ch,y)
+y=z.p(b,"const")
+this.cx=F.Wi(this,C.Nr,this.cx,y)
+y=z.p(b,"value")
+this.cy=F.Wi(this,C.zd,this.cy,y)
 if(c)return
-y=z.t(b,"guardNullable")
-this.ND=F.Wi(this,C.dr,this.ND,y)
-y=z.t(b,"guardClass")
-this.lw=F.Wi(this,C.ft,this.lw,y)
-y=z.t(b,"guardLength")
-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.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],
+y=z.p(b,"guardNullable")
+this.dy=F.Wi(this,C.dr,this.dy,y)
+y=z.p(b,"guardClass")
+this.fr=F.Wi(this,C.ft,this.fr,y)
+y=z.p(b,"guardLength")
+this.fx=F.Wi(this,C.fX,this.fx,y)
+y=z.p(b,"script")
+this.fy=F.Wi(this,C.PX,this.fy,y)
+z=z.p(b,"tokenPos")
+this.go=F.Wi(this,C.dA,this.go,z)
+this.d=!0},
+X:[function(a){return"Field("+H.d(J.DA(this.x))+"."+H.d(this.db)+")"},"$0","gCR",0,0,0],
 $isxB:true},
 Pqb:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 c2:{
-"^":"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},
-sqr:function(a){var z=this.Yp
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.WC,z,a)
+"^":"Piz;tu:Q>,Rd:a>,a4:b>,c,d,e,cy$,db$",
+gc1:function(){return this.c},
+sc1:function(a){this.c=F.Wi(this,C.Ss,this.c,a)},
+gqr:function(){return this.d},
+sqr:function(a){var z=this.d
+if(this.gnz(this)&&!J.mG(z,a)){z=new T.qI(this,C.M,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.Yp=a},
-gj9:function(){return this.am},
-sj9:function(a){this.am=F.Wi(this,C.Jf,this.am,a)},
+this.SZ(this,z)}this.d=a},
+gj9:function(){return this.e},
+sj9:function(a){this.e=F.Wi(this,C.Jf,this.e,a)},
 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.aT(z.V0).giD(),"breakpoints")),x=this.Rd;y.G();){w=y.gl()
+z=D.y8(this.b)
+this.e=F.Wi(this,C.Jf,this.e,!z)
+for(z=this.Q,y=J.Nx(J.Tf(J.wg(z.Q).gis(),"breakpoints")),x=this.a;y.D();){w=y.gk()
 v=J.U6(w)
-u=J.UQ(v.t(w,"location"),"script")
-t=J.UQ(v.t(w,"location"),"tokenPos")
-if(J.xC(u,z)&&J.xC(u.q6(t),x)){v=this.Yp
-if(this.gnz(this)&&!J.xC(v,w)){v=new T.qI(this,C.WC,v,w)
+u=J.Tf(v.p(w,"location"),"script")
+t=J.Tf(v.p(w,"location"),"tokenPos")
+if(J.mG(u,z)&&J.mG(u.q6(t),x)){v=this.d
+if(this.gnz(this)&&!J.mG(v,w)){v=new T.qI(this,C.M,v,w)
 v.$builtinTypeInfo=[null]
-this.nq(this,v)}this.Yp=w}}},
+this.SZ(this,v)}this.d=w}}},
 $isc2:true,
 static:{Fu:function(a){var z,y
-z=J.x(a)
-if(z.n(a,"else"))return!0
+z=J.t(a)
+if(z.m(a,"else"))return!0
 z=z.Fr(a,"")
 y=new H.a7(z,z.length,0,null)
 y.$builtinTypeInfo=[H.u3(z,0)]
-for(;y.G();)switch(y.Ff){case"{":case"}":case"(":case")":case";":break
+for(;y.D();)switch(y.c){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.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))
+z=J.BQ(a,new H.VR("(\\s)+",H.Vq("(\\s)+",!1,!0,!1),null,null))
+for(y=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);y.D();){x=J.BQ(y.c,new H.VR("(\\b)",H.Vq("(\\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.Ff))return!1}return!0},NQ:function(a,b,c){var z=new D.c2(a,b,c,null,null,!0,null,null)
+for(;w.D();)if(!D.Fu(w.c))return!1}return!0},Yo: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,E4,nE,EG,yc,zD,MO,aQ,Vg,fn,V0,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)},
+"^":"vix;Gd:x>,y,z,ch,cx,cy,db,dx,dy,fr,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.z},
+gxH:function(){return this.cy},
+sxH:function(a){this.cy=F.Wi(this,C.If,this.cy,a)},
 gjm:function(){return!0},
 gM8:function(){return!0},
-Vw:function(a){var z,y
-z=J.bI(a,1)
-y=this.Gd.XG
+rK:function(a){var z,y
+z=J.D5(a,1)
+y=this.x.b
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 return y[z]},
-q6:function(a){return this.MO.t(0,a)},
-R5:function(a,b,c){var z,y,x,w
-D.kT(b,J.aT(this.V0))
+q6:function(a){return this.dy.p(0,a)},
+bF:function(a,b,c){var z,y,x
+D.kT(b,J.wg(this.Q))
 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
+y=z.p(b,"kind")
+this.z=F.Wi(this,C.Lc,this.z,y)
+y=z.p(b,"name")
+this.dx=y
 x=J.U6(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)
+y=x.yn(y,x.cn(y,"/")+1)
+this.db=y
+this.e=this.ct(this,C.YS,this.e,y)
+y=this.dx
+this.f=this.ct(this,C.KS,this.f,y)
 if(c)return
-this.Aj(z.t(b,"source"))
-this.YG(z.t(b,"tokenPosTable"))
-z=z.t(b,"owningLibrary")
-this.EG=F.Wi(this,C.If,this.EG,z)},
+this.Aj(z.p(b,"source"))
+this.YG(z.p(b,"tokenPosTable"))
+z=z.p(b,"owningLibrary")
+this.cy=F.Wi(this,C.If,this.cy,z)},
 YG:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 if(a==null)return
-z=this.MO
+z=this.dy
 z.V1(0)
-y=this.aQ
+y=this.fr
 y.V1(0)
-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()
+this.ch=F.Wi(this,C.Gd,this.ch,null)
+this.cx=F.Wi(this,C.qa,this.cx,null)
+x=P.fM(null,null,null,null)
+for(w=J.Nx(a);w.D();){v=w.gk()
 u=J.U6(v)
-t=u.t(v,0)
+t=u.p(v,0)
 x.h(0,t)
 s=1
-while(!0){r=u.gB(v)
-if(typeof r!=="number")return H.s(r)
+while(!0){r=u.gv(v)
+if(typeof r!=="number")return H.o(r)
 if(!(s<r))break
-q=u.t(v,s)
-p=u.t(v,s+1)
-r=this.E4
-if(r==null){if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.Gd,r,q)
+q=u.p(v,s)
+p=u.p(v,s+1)
+r=this.ch
+if(r==null){if(this.gnz(this)&&!J.mG(r,q)){r=new T.qI(this,C.Gd,r,q)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.E4=q
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,q)){r=new T.qI(this,C.kA,r,q)
+this.SZ(this,r)}this.ch=q
+r=this.cx
+if(this.gnz(this)&&!J.mG(r,q)){r=new T.qI(this,C.qa,r,q)
 r.$builtinTypeInfo=[null]
-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)
+this.SZ(this,r)}this.cx=q}else{r=J.W1(r,q)?this.ch:q
+o=this.ch
+if(this.gnz(this)&&!J.mG(o,r)){o=new T.qI(this,C.Gd,o,r)
 o.$builtinTypeInfo=[null]
-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.kA,o,r)
+this.SZ(this,o)}this.ch=r
+r=J.u6(this.cx,q)?this.cx:q
+o=this.cx
+if(this.gnz(this)&&!J.mG(o,r)){o=new T.qI(this,C.qa,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.Ff
+this.SZ(this,o)}this.cx=r}z.q(0,q,t)
+y.q(0,q,p)
+s+=2}}for(z=this.x,z=z.gu(z);z.D();){v=z.c
 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)
-y=this.p3
+y=this.y
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=z.t(a,x)
-u=z.t(a,x+1)
-t=y.t(0,v)
-y.u(0,v,t!=null?J.WB(u,t):u)
+v=z.p(a,x)
+u=z.p(a,x+1)
+t=y.p(0,v)
+y.q(0,v,t!=null?J.WB(u,t):u)
 x+=2}this.f2()},
 Aj:function(a){var z,y,x,w
-this.qu=!1
+this.d=!1
 if(a==null)return
 z=J.BQ(a,"\n")
 if(z.length===0)return
-this.qu=!0
-y=this.Gd
+this.d=!0
+y=this.x
 y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.zD))
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.dx))
 for(x=0;x<z.length;x=w){w=x+1
-y.h(0,D.NQ(this,w,z[x]))}this.f2()},
+y.h(0,D.Yo(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)))}},
+for(z=this.x,z=z.gu(z),y=this.y;z.D();){x=z.c
+x.sc1(y.p(0,J.f2(x)))}},
 $isvx:true},
 Vlh:{
 "^":"af+boh;"},
 vix:{
-"^":"Vlh+Pi;",
+"^":"Vlh+Piz;",
 $isd3:true},
 uA:{
-"^":"a;Yu<,Du<,fF<",
+"^":"a;Yu:Q<,bu:a<,fF:b<",
 $isuA:true},
-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)},
-gmE:function(){return this.up},
+xb:{
+"^":"Piz;Yu:Q<,a,VF:b<,c,fY:d>,e,f,cy$,db$",
+gtu:function(a){return this.e},
+stu:function(a,b){this.e=F.Wi(this,C.PX,this.e,b)},
+gP3:function(){return this.f},
 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","gkA",0,0,73],
-bR:function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,null)
-z=this.VF
-if(J.xC(z,-1))return
+z=this.a
+y=J.t(z)
+if(y.m(z,-1))return"N/A"
+return y.X(z)},"$0","gkA",0,0,0],
+va:function(a){var z,y
+this.e=F.Wi(this,C.PX,this.e,null)
+z=this.b
+if(J.mG(z,-1))return
 y=a.q6(z)
 if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.yO(a.Vw(y))
-this.up=F.Wi(this,C.oI,this.up,z)},
-$isZ9:true},
-Hx:{
-"^":"nla;df,MD,uH<,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+this.e=F.Wi(this,C.PX,this.e,a)
+z=J.dY(a.rK(y))
+this.f=F.Wi(this,C.oI,this.f,z)},
+$isxb:true},
+hn:{
+"^":"nla;x,y,uH:z<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=this.uH
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=this.z
 y.V1(y)
-for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+for(z=J.Nx(z.p(b,"members"));z.D();){x=z.gk()
 w=J.U6(x)
-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))}}},
+y.h(0,new D.xb(H.BU(w.p(x,"pc"),16,null),w.p(x,"deoptId"),w.p(x,"tokenPos"),w.p(x,"tryIndex"),J.Q7(w.p(x,"kind")),null,null,null,null))}}},
 nla:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 oC:{
-"^":"Pi;oc>,vH>,eb,Ml>,ePv,fY>,Vg,fn",
+"^":"Piz;oc:Q>,vH:a>,b,Jb:c>,d,fY:e>,cy$,db$",
 $isoC:true},
 Mi:{
-"^":"Fba;df,MD,uH<,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+"^":"Fba;x,y,uH:z<,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y,x,w
+bF:function(a,b,c){var z,y,x,w
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-y=this.uH
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+y=this.z
 y.V1(y)
-for(z=J.mY(z.t(b,"members"));z.G();){x=z.gl()
+for(z=J.Nx(z.p(b,"members"));z.D();){x=z.gk()
 w=J.U6(x)
-y.h(0,new D.oC(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))}}},
+y.h(0,new D.oC(w.p(x,"name"),w.p(x,"index"),w.p(x,"beginPos"),w.p(x,"endPos"),w.p(x,"scopeId"),J.Q7(w.p(x,"kind")),null,null))}}},
 Fba:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
-RA:{
-"^":"laa;df,MD,C9,Vg,fn,V0,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)},
-gyT:function(a){return this.MD},
+Ik:{
+"^":"laa;x,y,z,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gUP:function(){return this.x},
+sUP:function(a){this.x=F.Wi(this,C.Wt,this.x,a)},
+gky:function(a){return this.y},
 gjm:function(){return!1},
 gM8:function(){return!0},
-R5:function(a,b,c){var z,y
+bF:function(a,b,c){var z,y
 if(c)return
-D.kT(b,J.aT(this.V0))
+D.kT(b,J.wg(this.Q))
 z=J.U6(b)
-y=z.t(b,"class")
-this.df=F.Wi(this,C.Wt,this.df,y)
-y=z.t(b,"size")
-this.MD=F.Wi(this,C.da,this.MD,y)
-z=z.t(b,"privateKey")
-this.C9=F.Wi(this,C.rm,this.C9,z)}},
+y=z.p(b,"class")
+this.x=F.Wi(this,C.Wt,this.x,y)
+y=z.p(b,"size")
+this.y=F.Wi(this,C.da,this.y,y)
+z=z.p(b,"privateKey")
+this.z=F.Wi(this,C.yt,this.z,z)}},
 laa:{
-"^":"af+Pi;",
+"^":"af+Piz;",
 $isd3:true},
 Q4:{
-"^":"Pi;Yu<,m7E,u0<,dh,uH<,Vg,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-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
+"^":"Piz;Yu:Q<,a,u0:b<,c,uH:d<,cy$,db$",
+gSS:function(){return this.c},
+gUB:function(){return J.mG(this.Q,0)},
+gvN:function(){return this.d.b.length>0},
+dV:[function(){var z,y
+z=this.Q
+y=J.t(z)
+if(y.m(z,0))return""
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,0],
+Io:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gmQ().Q.p(0,this.Q)
 if(z==null)return""
-if(J.xC(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,221,78],
-P7:[function(a){var z
+if(J.mG(z.gfF(),z.gbu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,225,79],
+HUv:[function(a){var z
 if(a==null)return""
-z=a.gn3().LL.t(0,this.Yu)
+z=a.gmQ().Q.p(0,this.Q)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,221,78],
+return D.Tn(z.gbu(),a.glt())+" ("+H.d(z.gbu())+")"},"$1","gAX",2,0,225,79],
 lF:function(){var z,y,x,w
-y=J.BQ(this.u0," ")
+y=J.BQ(this.b," ")
 x=y.length
 if(x!==2)return 0
 if(1>=x)return H.e(y,1)
@@ -20388,983 +19702,966 @@
 return x}catch(w){H.Ru(w)
 return 0}},
 pj:function(a){var z,y,x,w,v
-z=this.u0
+z=this.b
 if(!J.co(z,"j"))return
 y=this.lF()
-x=J.x(y)
-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)
+x=J.t(y)
+if(x.m(y,0)){N.QM("").YX("Could not determine jump address for "+H.d(z))
+return}for(z=a.b,w=0;w<z.length;++w){v=z[w]
+if(J.mG(v.gYu(),y)){z=this.c
+if(this.gnz(this)&&!J.mG(z,v)){z=new T.qI(this,C.b5,z,v)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=v
-return}}N.QM("").hh("Could not find instruction at "+x.WZ(y,16))},
+this.SZ(this,z)}this.c=v
+return}}N.QM("").YX("Could not find instruction at "+x.WZ(y,16))},
 $isQ4:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+static:{Tn:function(a,b){return C.CD.Sy(100*J.x4(a,b),2)+"%"}}},
 WAE:{
-"^":"a;uX",
-bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-static:{"^":"Oci,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
-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.yP
-else if(z.n(a,"Tag"))return C.Z7
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+static:{"^":"ql,l8R,WAg,yP0,Z7U",CQ:function(a){var z=J.t(a)
+if(z.m(a,"Native"))return C.Oc
+else if(z.m(a,"Dart"))return C.l8
+else if(z.m(a,"Collected"))return C.WA
+else if(z.m(a,"Reused"))return C.yP
+else if(z.m(a,"Tag"))return C.Ea
 N.QM("").j2("Unknown code kind "+H.d(a))
 throw H.b(P.a9())}}},
-ta:{
-"^":"a;tT>,Av<",
-$ista:true},
-D5:{
-"^":"a;tT>,Av<,ks>,Jv",
-$isD5:true},
+Fc:{
+"^":"a;tT:Q>,Av:a<",
+$isFc:true},
+t9:{
+"^":"a;tT:Q>,Av:a<,wd:b>,c",
+$ist9:true},
 kx:{
-"^":"w29;I0,xM,Du<,fF<,vg,uE,VS,hw,va<,n3<,mM,rF,fo,uG,ar,MH,Mk,Vg,fn,V0,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},
-gan:function(){return this.rF},
-gL1:function(){return this.fo},
-sL1:function(a){this.fo=F.Wi(this,C.zO,this.fo,a)},
-gig:function(a){return this.uG},
-sig:function(a,b){this.uG=F.Wi(this,C.nf,this.uG,b)},
-gtu:function(a){return this.ar},
-stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-goF:function(){return this.MH},
+"^":"w26;x,y,bu:z<,fF:ch<,cx,cy,db,dx,GA:dy<,mQ:fr<,fx,fy,go,id,k1,k2,k3,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
+gfY:function(a){return this.x},
+glt:function(){return this.y},
+gS7:function(){return this.fx},
+ga3:function(){return this.fy},
+gL1:function(){return this.go},
+sL1:function(a){this.go=F.Wi(this,C.zO,this.go,a)},
+gig:function(a){return this.id},
+sig:function(a,b){this.id=F.Wi(this,C.nf,this.id,b)},
+gtu:function(a){return this.k1},
+stu:function(a,b){this.k1=F.Wi(this,C.PX,this.k1,b)},
+goF:function(){return this.k2},
 gjm:function(){return!0},
 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.Ff.guH(),y=y.gA(y);y.G();)y.Ff.bR(a)},"$1","gH8",2,0,222,223],
-QW:function(){if(this.ar!=null)return
-if(!J.xC(this.I0,C.l8))return
-var z=this.uG
+this.k1=F.Wi(this,C.PX,this.k1,a)
+for(z=this.dy,z=z.gu(z);z.D();)for(y=z.c.guH(),y=y.gu(y);y.D();)y.c.va(a)},"$1","gH8",2,0,226,227],
+QW:function(){if(this.k1!=null)return
+if(!J.mG(this.x,C.l8))return
+var z=this.id
 if(z==null)return
-if(J.zE(z)==null){J.SK(this.uG).ml(new D.Ik(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)},
-ui:function(a,b,c){var z,y,x,w,v
+if(J.fx(z)==null){J.SK(this.id).ml(new D.fA(this))
+return}J.SK(J.fx(this.id)).ml(this.gH8())},
+VD:function(a){var z
+if(J.mG(this.x,C.l8))return this.BA(this)
+z=H.J(new P.Gc(0,$.X3,null),[null])
+z.Xf(this)
+return z},
+GK:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
 y=0
-while(!0){x=z.gB(b)
-if(typeof x!=="number")return H.s(x)
+while(!0){x=z.gv(b)
+if(typeof x!=="number")return H.o(x)
 if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
+w=H.BU(z.p(b,y),null,null)
+v=H.BU(z.p(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.fx())},
+a.push(new D.Fc(c[w],v))
+y+=2}C.Nm.uy(a,"sort")
+H.ig(a,new D.jm())},
 Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.kr,this.xM,c)
+this.y=F.Wi(this,C.Kj,this.y,c)
 z=J.U6(a)
-this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
-this.Du=H.BU(z.t(a,"exclusive_ticks"),null,null)
-this.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.Mg(y)
-z=D.Vb0(this.fF,this.xM)+" ("+H.d(this.fF)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Vb0(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.rF=F.Wi(this,C.uU,this.rF,z)},
-R5:function(a,b,c){var z,y,x,w,v,u
+this.ch=H.BU(z.p(a,"inclusive_ticks"),null,null)
+this.z=H.BU(z.p(a,"exclusive_ticks"),null,null)
+this.GK(this.db,z.p(a,"callers"),b)
+this.GK(this.dx,z.p(a,"callees"),b)
+y=z.p(a,"ticks")
+if(y!=null)this.Zk(y)
+z=D.HP(this.ch,this.y)+" ("+H.d(this.ch)+")"
+this.fx=F.Wi(this,C.EF,this.fx,z)
+z=D.HP(this.z,this.y)+" ("+H.d(this.z)+")"
+this.fy=F.Wi(this,C.uU,this.fy,z)},
+bF: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)
-y=z.NZ(b,"vmName")===!0?z.t(b,"vmName"):this.bN
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=z.t(b,"optimized")!=null&&z.t(b,"optimized")
-this.MH=F.Wi(this,C.pY,this.MH,y)
-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.uE=H.BU(z.t(b,"end"),16,null)
-y=this.V0
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.NZ(b,"vmName")===!0?z.p(b,"vmName"):this.e
+this.f=this.ct(this,C.KS,this.f,y)
+y=z.p(b,"optimized")!=null&&z.p(b,"optimized")
+this.k2=F.Wi(this,C.pY,this.k2,y)
+y=D.CQ(z.p(b,"kind"))
+this.x=F.Wi(this,C.Lc,this.x,y)
+this.cx=H.BU(z.p(b,"start"),16,null)
+this.cy=H.BU(z.p(b,"end"),16,null)
+y=this.Q
 x=J.RE(y)
-w=x.god(y).Qn(z.t(b,"function"))
-this.uG=F.Wi(this,C.nf,this.uG,w)
-y=x.god(y).Qn(z.t(b,"objectPool"))
-this.fo=F.Wi(this,C.zO,this.fo,y)
-v=z.t(b,"disassembly")
+w=x.god(y).Qn(z.p(b,"function"))
+this.id=F.Wi(this,C.nf,this.id,w)
+y=x.god(y).Qn(z.p(b,"objectPool"))
+this.go=F.Wi(this,C.zO,this.go,y)
+v=z.p(b,"disassembly")
 if(v!=null)this.cr(v)
-u=z.t(b,"descriptors")
-if(u!=null)this.Xd(J.UQ(u,"members"))
-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},
+u=z.p(b,"descriptors")
+if(u!=null)this.Xd(J.Tf(u,"members"))
+z=this.dy.b
+this.d=z.length!==0||!J.mG(this.x,C.l8)
+z=z.length!==0&&J.mG(this.x,C.l8)
+this.k3=F.Wi(this,C.zS,this.k3,z)},
+gUa:function(){return this.k3},
 cr:function(a){var z,y,x,w,v,u,t,s
-z=this.va
+z=this.dy
 z.V1(z)
 y=J.U6(a)
 x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-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.Z9
+v=y.p(a,x+1)
+u=y.p(a,x+2)
+t=!J.mG(y.p(a,x),"")?H.BU(y.p(a,x),null,null):0
+w=D.xb
 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.Ff.pj(z)},
+x+=3}for(y=z.gu(z);y.D();)y.c.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.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))
+y=H.BU(z.p(a,"pc"),16,null)
+x=z.p(a,"deoptId")
+w=z.p(a,"tokenPos")
+v=z.p(a,"tryIndex")
+u=J.Q7(z.p(a,"kind"))
+for(z=this.dy,z=z.gu(z);z.D();){t=z.c
+if(J.mG(t.gYu(),y)){t.guH().h(0,new D.xb(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())},
-Mg:function(a){var z,y,x,w,v
+for(z=J.Nx(a);z.D();)this.MY(z.gk())},
+Zk:function(a){var z,y,x,w,v
 z=J.U6(a)
-y=this.n3
+y=this.fr
 x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=z.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-v=H.BU(z.t(a,x),16,null)
-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)))
+v=H.BU(z.p(a,x),16,null)
+y.q(0,v,new D.uA(v,H.BU(z.p(a,x+1),null,null),H.BU(z.p(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.uE)},
-gcE:function(){return J.xC(this.I0,C.l8)},
+return z.C(b,this.cx)&&z.w(b,this.cy)},
+gkU:function(){return J.mG(this.x,C.l8)},
 $iskx:true,
-static:{Vb0:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-w29:{
-"^":"af+Pi;",
+static:{HP:function(a,b){return C.CD.Sy(100*J.x4(a,b),2)+"%"}}},
+w26:{
+"^":"af+Piz;",
 $isd3:true},
-Ik:{
-"^":"TpZ:12;a",
+fA:{
+"^":"r:14;Q",
 $1:[function(a){var z,y
-z=this.a
-y=J.zE(z.uG)
+z=this.Q
+y=J.fx(z.id)
 if(y==null)return
-J.SK(y).ml(z.gH8())},"$1",null,2,0,null,152,"call"],
-$isEH:true},
-fx:{
-"^":"TpZ:81;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
+J.SK(y).ml(z.gH8())},"$1",null,2,0,null,152,"call"]},
+jm:{
+"^":"r:80;",
+$2:function(a,b){return J.D5(b.gAv(),a.gAv())}},
 M9x:{
-"^":"a;uX",
-bu:[function(a){return this.uX},"$0","gCR",0,0,73],
-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
-else if(z.n(a,"Internal"))return C.wj
+"^":"a;Q",
+X:[function(a){return this.Q},"$0","gCR",0,0,0],
+static:{"^":"Cnk,lTU,FJy,wr",AR:function(a){var z=J.t(a)
+if(z.m(a,"Listening"))return C.Cn
+else if(z.m(a,"Normal"))return C.lT
+else if(z.m(a,"Pipe"))return C.FJ
+else if(z.m(a,"Internal"))return C.wj
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"w30;ip@,jel,IHj,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w27;V8:x@,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,id,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 gjm:function(){return!0},
-gHY:function(){return J.xC(this.I0,C.FJ)},
-gfY:function(a){return this.I0},
-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},
-gki:function(){return this.zw},
-giP:function(){return this.tO},
-gfJ:function(){return this.HO},
-gNS:function(){return this.u8},
-gzK:function(){return this.EC},
-R5:function(a,b,c){var z,y
+gHY:function(){return J.mG(this.ch,C.FJ)},
+gfY:function(a){return this.ch},
+gA8:function(a){return this.cx},
+gm8:function(){return this.cy},
+gaU:function(){return this.db},
+gSf:function(){return this.dx},
+gzM:function(){return this.dy},
+gkE:function(){return this.fr},
+giP:function(){return this.fx},
+gmd:function(){return this.fy},
+gNS:function(){return this.go},
+guh:function(){return this.id},
+bF: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.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=D.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.p(b,"name")
+this.f=this.ct(this,C.KS,this.f,y)
+y=D.AR(z.p(b,"kind"))
+this.ch=F.Wi(this,C.Lc,this.ch,y)
 if(c)return
-this.qu=!0
-D.kT(b,J.aT(this.V0))
-y=z.t(b,"readClosed")
-this.DB=F.Wi(this,C.I7,this.DB,y)
-y=z.t(b,"writeClosed")
-this.XK=F.Wi(this,C.Uy,this.XK,y)
-y=z.t(b,"closing")
-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")
-this.vu=F.Wi(this,C.AY,this.vu,y)
-y=z.t(b,"localAddress")
-this.tO=F.Wi(this,C.Lx,this.tO,y)
-y=z.t(b,"localPort")
-this.HO=F.Wi(this,C.M3,this.HO,y)
-y=z.t(b,"remoteAddress")
-this.u8=F.Wi(this,C.dx,this.u8,y)
-y=z.t(b,"remotePort")
-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.ip=z.t(b,"owner")}},
-w30:{
-"^":"af+Pi;",
+this.d=!0
+D.kT(b,J.wg(this.Q))
+y=z.p(b,"readClosed")
+this.cy=F.Wi(this,C.I7,this.cy,y)
+y=z.p(b,"writeClosed")
+this.db=F.Wi(this,C.Uy,this.db,y)
+y=z.p(b,"closing")
+this.dx=F.Wi(this,C.To,this.dx,y)
+y=z.p(b,"listening")
+this.dy=F.Wi(this,C.cc,this.dy,y)
+y=z.p(b,"protocol")
+this.cx=F.Wi(this,C.AY,this.cx,y)
+y=z.p(b,"localAddress")
+this.fx=F.Wi(this,C.Lx,this.fx,y)
+y=z.p(b,"localPort")
+this.fy=F.Wi(this,C.M3,this.fy,y)
+y=z.p(b,"remoteAddress")
+this.go=F.Wi(this,C.dx,this.go,y)
+y=z.p(b,"remotePort")
+this.id=F.Wi(this,C.ni,this.id,y)
+y=z.p(b,"fd")
+this.fr=F.Wi(this,C.R3,this.fr,y)
+this.x=z.p(b,"owner")}},
+w27:{
+"^":"af+Piz;",
 $isd3:true},
 G9:{
-"^":"a;P>,Fl<",
+"^":"a;M:Q>,Fl:a<",
 $isG9:true},
 YX:{
-"^":"w31;L5,mw@,Jk<,wE,Qd,FA,zn,LV,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"w28;x,mw:y@,tB:z<,ch,cx,cy,db,dx,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 gjm:function(){return!0},
 gM8:function(){return!1},
-ghM:function(){return this.wE},
-shM:function(a){this.wE=a
+ghM:function(){return this.ch},
+shM:function(a){this.ch=a
 this.Hi()},
-NT:function(a){this.Jk.h(0,a)
+Ck:function(a){this.z.h(0,a)
 this.Hi()},
 Hi:function(){var z,y,x
-z=this.Jk
-y=z.XG.length
-x=this.wE
-if(typeof x!=="number")return H.s(x)
+z=this.z
+y=z.b.length
+x=this.ch
+if(typeof x!=="number")return H.o(x)
 if(y>x)z.oq(0,0,y-x)},
-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.LV},
-R5:function(a,b,c){var z,y
+gN0:function(){return this.cx},
+gM:function(a){return this.cy},
+sM:function(a,b){this.cy=F.Wi(this,C.zd,this.cy,b)},
+gBp:function(a){return this.db},
+gA5:function(a){return this.dx},
+bF: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.t(b,"description")
-this.Qd=F.Wi(this,C.LS,this.Qd,y)
-y=z.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-y=z.t(b,"value")
-this.FA=F.Wi(this,C.zd,this.FA,y)
-y=z.t(b,"min")
-this.zn=F.Wi(this,C.a2,this.zn,y)
-z=z.t(b,"max")
-this.LV=F.Wi(this,C.qi,this.LV,z)},
-bu:[function(a){return"ServiceMetric("+H.d(this.TU)+")"},"$0","gCR",0,0,73],
+y=z.p(b,"name")
+this.e=this.ct(this,C.YS,this.e,y)
+y=z.p(b,"description")
+this.cx=F.Wi(this,C.LS,this.cx,y)
+y=z.p(b,"name")
+this.f=this.ct(this,C.KS,this.f,y)
+y=z.p(b,"value")
+this.cy=F.Wi(this,C.zd,this.cy,y)
+y=z.p(b,"min")
+this.db=F.Wi(this,C.a2,this.db,y)
+z=z.p(b,"max")
+this.dx=F.Wi(this,C.qi,this.dx,z)},
+X:[function(a){return"ServiceMetric("+H.d(this.a)+")"},"$0","gCR",0,0,0],
 $isYX:true},
-w31:{
-"^":"af+Pi;",
+w28:{
+"^":"af+Piz;",
 $isd3:true},
-W1:{
-"^":"a;Jb<,MT>,Cb",
-Gv:function(){var z=this.Cb
+xx:{
+"^":"a;fj:Q<,MT:a>,b",
+wE:[function(a){this.b=P.SZ(this.a,this.gia(this))},"$0","gJ",0,0,1],
+Gv:function(){var z=this.b
 if(z!=null)z.Gv()
-this.Cb=null},
-Lyg:[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)
-w.$builtinTypeInfo=[null]
-y.xf(w)}},"$1","gia",2,0,19,13],
-$isW1:true},
+this.b=null},
+Y0:[function(a,b){var z
+for(z=this.Q,z=H.J(new H.a7(z,z.length,0,null),[H.u3(z,0)]);z.D();)J.LE(z.c).ml(new D.r6())},"$1","gia",2,0,20,15],
+$isxx:true},
 r6:{
-"^":"TpZ:12;",
-$1:[function(a){var z,y
-z=J.Vm(a)
-y=new P.iP(Date.now(),!1)
-y.EK()
-a.NT(new D.G9(z,y))},"$1",null,2,0,null,168,"call"],
-$isEH:true},
+"^":"r:14;",
+$1:[function(a){a.Ck(new D.G9(J.SW(a),new P.iP(Date.now(),!1)))},"$1",null,2,0,null,168,"call"]},
 Qf:{
-"^":"TpZ:81;a,b",
+"^":"r:80;Q,a",
 $2:function(a,b){var z,y
-z=J.x(b)
+z=J.t(b)
 y=!!z.$isqC
-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,{
+if(y&&D.PG(b))this.Q.q(0,a,this.a.Qn(b))
+else if(!!z.$iswn)D.f3(b,this.a)
+else if(y)D.Gf(b,this.a)}}}],["","",,L,{
 "^":"",
 Z5:{
-"^":"a;eX@,A9<,oc*,w8<",
-gp8:function(){return this.A9!==!0},
-Lt:function(){return P.EF(["lastConnectionTime",this.eX,"chrome",this.A9,"name",this.oc,"networkAddress",this.w8],null,null)},
+"^":"a;EH:Q@,A9:a<,oc:b*,w8:c<",
+gp8:function(){return this.a!==!0},
+Lt:function(){return P.B(["lastConnectionTime",this.Q,"chrome",this.a,"name",this.b,"networkAddress",this.c],null,null)},
 UT:function(a){var z=J.U6(a)
-this.eX=z.t(a,"lastConnectionTime")
-this.A9=z.t(a,"chrome")
-this.oc=z.t(a,"name")
-z=z.t(a,"networkAddress")
-this.w8=z
-if(this.oc==null)this.oc=z},
+this.Q=z.p(a,"lastConnectionTime")
+this.a=z.p(a,"chrome")
+this.b=z.p(a,"name")
+z=z.p(a,"networkAddress")
+this.c=z
+if(this.b==null)this.b=z},
 $isZ5:true,
 static:{K9:function(a){var z=new L.Z5(0,!1,null,null)
 z.UT(a)
 return z}}},
 nm:{
-"^":"a;jO>,qT<",
+"^":"a;jO:Q>,mh:a<",
 $isnm:true},
 Uon:{
-"^":"wv;N>",
-gEH:function(){return this.Tn.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.M0()
+"^":"wv;K:k2>",
+ghX:function(){return this.id.Q},
+FZ:function(){if(!this.rx)return
+var z=this.k1
+if(z.Q.Q===0){N.QM("").To("WebSocketVM connection error: "+H.d(this.k2.gw8()))
+z.aM(0,this)}},
+giG:function(a){return this.k1.Q},
+je:function(a){if(this.r2)this.x1.Q.close()
+this.QZ()
 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])
+if(!this.r2){this.r2=!0
+this.x1.Tc(this.k2.gw8(),this.gkQ(),this.gM3(),this.gAo(),this.gNu())}z=C.jn.X(this.r1++)
+y=P.I
+y=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[y])),[y])
 x=new L.nm(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.M0()
-this.FZ()},"$0","gNu",0,0,17],
-Xs:[function(){this.M0()
-this.FZ()},"$0","gCW",0,0,17],
-LNZ:[function(){var z,y
-z=this.N
-y=Date.now()
-new P.iP(y,!1).EK()
-z.seX(y)
+if(this.x1.Q.readyState===1)this.Mf(z,x)
+else this.k3.q(0,z,x)
+return y.Q},
+abp:[function(){this.QZ()
+this.FZ()},"$0","gNu",0,0,1],
+IdG:[function(){this.QZ()
+this.FZ()},"$0","gAo",0,0,1],
+LN:[function(){var z,y
+z=this.k2
+z.sEH(Date.now())
 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.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"))
-w=J.UQ(y.t(z,"params"),"data")}else{y=J.U6(z)
-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("").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.aZ(this))
+this.rx=!0
+y=this.id
+if(y.Q.Q===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
+y.aM(0,this)}},"$0","gkQ",0,0,1],
+GF:[function(a){var z,y,x,w,v
+if(typeof a!=="string"){this.x1.OI(a).ml(new L.jF(this))
+return}z=C.xr.kV(a)
+if(z==null){N.QM("").YX("WebSocketVM got empty message")
+return}if(this.k2.gA9()===!0){y=J.U6(z)
+if(!J.mG(y.p(z,"method"),"Dart.observatoryData"))return
+x=J.Lz(J.Tf(y.p(z,"params"),"id"))
+w=J.Tf(y.p(z,"params"),"data")}else{y=J.U6(z)
+x=y.p(z,"seq")
+w=y.p(z,"response")}if(x==null){this.EM(w)
+return}v=this.k4.Rz(0,x)
+if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
+return}v.gmh().aM(0,w)},"$1","gM3",2,0,20],
+ck:function(a){a.aN(0,new L.dV(this))
 a.V1(0)},
-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.")
+QZ:function(){var z=this.k4
+if(z.Q>0){N.QM("").To("Cancelling all pending requests.")
+this.ck(z)}z=this.k3
+if(z.Q>0){N.QM("").To("Cancelling all delayed requests.")
 this.ck(z)}},
-e2:function(){var z=this.WE
-if(z.X5===0)return
+e2:function(){var z=this.k3
+if(z.Q===0)return
 N.QM("").To("Sending all delayed requests.")
 z.aN(0,this.ge8())
 z.V1(0)},
 Mf:[function(a,b){var z,y
 z=J.RE(b)
-if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
-this.Td.u(0,a,b)
-y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.Ra.bs.send(y)},"$2","ge8",4,0,224]},
+if(!J.ie(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.k2.gw8()))
+this.k4.q(0,a,b)
+y=this.k2.gA9()===!0?C.xr.KP(P.B(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.B(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.B(["seq",a,"request",z.gjO(b)],null,null))
+this.x1.Q.send(y)},"$2","ge8",4,0,228]},
 jF:{
-"^":"TpZ:225;a",
+"^":"r:229;Q",
 $1:[function(a){var z,y,x,w,v,u,t
 z=J.RE(a)
-y=z.mt(a,0,C.it)
-x=this.a
+y=z.mt(a,0,C.eL)
+x=this.Q
 w=z.gbg(a)
-v=z.gVl(a)
+v=z.grv(a)
 if(typeof v!=="number")return v.g()
 w.toString
-u=x.Ur.Sw(H.z4(w,v+8,y))
+u=x.ry.WJ(H.GG(w,v+8,y))
 t=C.jn.g(8,y)
 v=z.gbg(a)
-w=z.gVl(a)
+w=z.grv(a)
 if(typeof w!=="number")return w.g()
 z=z.gH3(a)
-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},
-aZ:{
-"^":"TpZ:226;a",
-$2:function(a,b){var z,y
-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"))
-z.Xf(y)},
-$isEH:true}}],["","",,R,{
+if(typeof z!=="number")return z.T()
+v.toString
+x.hQ(u,H.eb(v,w+t,z-t))},"$1",null,2,0,null,17,"call"]},
+dV:{
+"^":"r:230;Q",
+$2:function(a,b){b.gmh().aM(0,C.xr.KP(P.B(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null)))}}}],["","",,R,{
 "^":"",
 zM:{
-"^":"V62;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:{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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+"^":"V61;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gkc:function(a){return a.RZ},
+skc:function(a,b){a.RZ=this.ct(a,C.yh,a.RZ,b)},
+static:{ZmK:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.U0.LX(a)
 C.U0.XI(a)
 return a}}},
-V62:{
-"^":"uL+Pi;",
+V61:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,D,{
 "^":"",
 Rk:{
-"^":"V63;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)},
+"^":"V62;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gja:function(a){return a.RZ},
+sja:function(a,b){a.RZ=this.ct(a,C.ne,a.RZ,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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.Vd.LX(a)
 C.Vd.XI(a)
 return a}}},
-V63:{
-"^":"uL+Pi;",
+V62:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,U,{
 "^":"",
 hA:{
-"^":"a;bs",
-Tc:function(a,b,c,d,e){var z=W.P0(a,null)
-this.bs=z
-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
+"^":"a;Q",
+Tc:function(a,b,c,d,e){var z=W.D7(a,null)
+this.Q=z
+z=H.J(new W.vG(z,"close",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.lo(e)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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=H.J(new W.vG(z,"error",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.j3(d)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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=H.J(new W.vG(z,"open",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.Fz(b)),z.b),[H.u3(z,0)]).P6()
+z=this.Q
 z.toString
-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()},
+z=H.J(new W.vG(z,"message",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(new U.tv(c)),z.b),[H.u3(z,0)]).P6()},
+wR:function(a,b){this.Q.send(b)},
+xO:function(a){this.Q.close()},
 OI:function(a){var z,y
 z=new FileReader()
 z.readAsArrayBuffer(a)
-y=H.VM(new W.RO(z,C.G5.fA,!1),[null])
-return y.gqG(y).ml(new U.OW(z))}},
+y=H.J(new W.vG(z,"loadend",!1),[null])
+return y.gtH(y).ml(new U.OW(z))}},
 lo:{
-"^":"TpZ:12;a",
-$1:[function(a){return this.a.$0()},"$1",null,2,0,null,227,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,231,"call"]},
 j3:{
-"^":"TpZ:12;b",
-$1:[function(a){return this.b.$0()},"$1",null,2,0,null,228,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,232,"call"]},
 Fz:{
-"^":"TpZ:12;c",
-$1:[function(a){return this.c.$0()},"$1",null,2,0,null,228,"call"],
-$isEH:true},
-oy:{
-"^":"TpZ:229;d",
-$1:[function(a){return this.d.$1(J.Qd(a))},"$1",null,2,0,null,87,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.$0()},"$1",null,2,0,null,232,"call"]},
+tv:{
+"^":"r:233;Q",
+$1:[function(a){return this.Q.$1(J.ns(a))},"$1",null,2,0,null,87,"call"]},
 OW:{
-"^":"TpZ:12;a",
-$1:[function(a){return J.cm(C.kL.gyG(this.a),0,null)},"$1",null,2,0,null,2,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){var z,y,x,w
+z=C.MO.gyG(this.Q)
+y=J.RE(z)
+x=y.gbg(z)
+w=y.grv(z)
+y=y.gv(z)
+x.toString
+return H.eb(x,w,y)},"$1",null,2,0,null,4,"call"]},
 KM:{
-"^":"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,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"Uon;id,k1,k2,k3,k4,r1,r2,rx,ry,x1,x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 $isKM:true},
 dS:{
-"^":"wv;eG,rp,S3,yb,Ox,GY,RW,Ts,Va,kU,l7,Li,G2,Rk,uj,Qi,Vg,fn,V0,TU,oU,JK,qu,bN,GR,mQ,Vg,fn",
+"^":"wv;id,k1,k2,k3,x,y,z,ch,cx,cy,db,dx,dy,fr,fx,fy,go,cy$,db$,Q,a,b,c,d,e,f,r,cy$,db$",
 je:function(a){},
-gEH:function(){return this.eG.MM},
-giG:function(a){return this.rp.MM},
+ghX:function(){return this.id.Q},
+giG:function(a){return this.k1.Q},
 j03:[function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.UQ(z.gRn(a),"id")
-x=J.UQ(z.gRn(a),"name")
-w=J.UQ(z.gRn(a),"data")
-if(!J.xC(x,"observatoryData"))return
-z=this.S3
-v=z.t(0,y)
+y=J.Tf(z.gRn(a),"id")
+x=J.Tf(z.gRn(a),"name")
+w=J.Tf(z.gRn(a),"data")
+if(!J.mG(x,"observatoryData"))return
+z=this.k2
+v=z.p(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gDi",2,0,19,230],
+J.Af(v,w)},"$1","gDi",2,0,20,234],
 z6:function(a,b){var z,y,x
-z=""+this.yb
-y=P.Fl(null,null)
-y.u(0,"id",z)
-y.u(0,"method","observatoryQuery")
-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)
+z=""+this.k3
+y=P.A(null,null)
+y.q(0,"id",z)
+y.q(0,"method","observatoryQuery")
+y.q(0,"query",H.d(b));++this.k3
+x=H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null])
+this.k2.q(0,z,x)
 J.tT(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},
-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,{
+return x.Q},
+ZH:function(){var z=H.J(new W.vG(window,"message",!1),[null])
+H.J(new W.Ov(0,z.Q,z.a,W.Yt(this.gDi()),z.b),[H.u3(z,0)]).P6()
+this.id.aM(0,this)}}}],["","",,U,{
 "^":"",
 Ti:{
-"^":"V64;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},
-sl6:function(a,b){a.Sa=this.ct(a,C.Zg,a.Sa,b)},
+"^":"V63;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gWA:function(a){return a.RZ},
+sWA:function(a,b){a.RZ=this.ct(a,C.td,a.RZ,b)},
+gl6:function(a){return a.ij},
+sl6:function(a,b){a.ij=this.ct(a,C.Z,a.ij,b)},
 bc:function(a){var z
-switch(J.zH(a.Ll)){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
+switch(J.zH(a.RZ)){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.RZ)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
+J.oJ(z,a.RZ)
 return z
 case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
+J.NZ(z,a.RZ)
 return z
 case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
+J.T5(z,a.RZ)
 return z
 case"Context":z=W.r3("context-view",null)
-J.Hf(z,a.Ll)
+J.Hf(z,a.RZ)
 return z
 case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
+J.Qr(z,a.RZ)
 return z
 case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
+J.JZ(z,a.RZ)
 return z
 case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
+J.vJ(z,a.RZ)
 return z
 case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
+J.C3(z,a.RZ)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
+J.Nf(z,a.RZ)
 return z
 case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
+J.mU(z,a.RZ)
 return z
 case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
+J.fb(z,a.RZ)
 return z
 case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(z,a.Ll)
+J.i0(z,a.RZ)
 return z
 case"Object":z=W.r3("object-view",null)
-J.h9(z,a.Ll)
+J.h9(z,a.RZ)
 return z
 case"SocketList":z=W.r3("io-socket-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"Socket":z=W.r3("io-socket-view",null)
-J.Cu(z,a.Ll)
+J.Cu(z,a.RZ)
 return z
 case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
+J.w7(z,a.RZ)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.Rp(z,a.Ll)
+J.uM(z,a.RZ)
 return z
 case"Library":z=W.r3("library-view",null)
-J.cl(z,a.Ll)
+J.cl(z,a.RZ)
 return z
 case"ProcessList":z=W.r3("io-process-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"Process":z=W.r3("io-process-view",null)
-J.rL(z,a.Ll)
+J.rL(z,a.RZ)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.Ll)
+J.CJ(z,a.RZ)
 return z
 case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
-J.A4(z,a.Ll)
+J.A4(z,a.RZ)
 return z
 case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
+J.uF(z,a.RZ)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.Ll)
+J.Qr(z,a.RZ)
 return z
 case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
+J.BC(z,a.RZ)
 return z
 case"Script":z=W.r3("script-view",null)
-J.ry(z,a.Ll)
+J.ry(z,a.RZ)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.NH(z,a.Ll)
+J.tQ(z,a.RZ)
 return z
-default:if(a.Ll.gNs()||a.Ll.gl5()){z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
+default:if(a.RZ.gNs()||a.RZ.gfo()){z=W.r3("instance-view",null)
+J.Qy(z,a.RZ)
 return z}else{z=W.r3("json-view",null)
-J.wD(z,a.Ll)
+J.wD(z,a.RZ)
 return z}}},
-xJ:[function(a,b){var z,y,x
-this.D4(a)
-z=a.Ll
+Hfg:[function(a,b){var z,y,x
+this.ay(a)
+z=a.RZ
 if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gdr()
+return}y=z.gv5()
 x=this.bc(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,14,61],
 $isTi:true,
 static:{Gvt: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Uv.LX(a)
-C.Uv.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Ns.LX(a)
+C.Ns.XI(a)
 return a}}},
-V64:{
-"^":"uL+Pi;",
+V63:{
+"^":"uL+Piz;",
 $isd3:true},
 Um:{
-"^":"V65;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)},
+"^":"V64;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gBN:function(a){return a.RZ},
+sBN:function(a,b){a.RZ=this.ct(a,C.nE,a.RZ,b)},
 static:{T21: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Uav.LX(a)
-C.Uav.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.Rr.LX(a)
+C.Rr.XI(a)
 return a}}},
-V65:{
-"^":"uL+Pi;",
+V64:{
+"^":"uL+Piz;",
 $isd3:true},
 VZ:{
-"^":"V66;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},
+"^":"V65;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gIr:function(a){return a.RZ},
 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)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,168],
-Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,168],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,231,232,102],
+sIr:function(a,b){a.RZ=this.ct(a,C.SR,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+ITt:[function(a,b){return!!J.t(b).$isw},"$1","gEE",2,0,93,168],
+Cpp:[function(a,b){return!!J.t(b).$isWO},"$1","gK4",2,0,93,168],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){a.ij=this.ct(a,C.B0,a.ij,b)
+c.$0()},"$2","gNe",4,0,235,236,102],
 static:{Wzx: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.OX.LX(a)
-C.OX.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.vmJ.LX(a)
+C.vmJ.XI(a)
 return a}}},
-V66:{
-"^":"uL+Pi;",
+V65:{
+"^":"uL+Piz;",
 $isd3:true},
 WG:{
-"^":"V67;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)},
-hF:[function(a,b){return!!J.x(b).$isT8},"$1","gEE",2,0,93,168],
-Cpp:[function(a,b){return!!J.x(b).$isWO},"$1","gK4",2,0,93,168],
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,76],
-Po:[function(a,b,c){a.C7=this.ct(a,C.B0,a.C7,b)
-c.$0()},"$2","gus",4,0,231,232,102],
+"^":"V66;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gjx:function(a){return a.RZ},
+sjx:function(a,b){a.RZ=this.ct(a,C.vp,a.RZ,b)},
+git:function(a){return a.ij},
+sit:function(a,b){a.ij=this.ct(a,C.B0,a.ij,b)},
+ITt:[function(a,b){return!!J.t(b).$isw},"$1","gEE",2,0,93,168],
+Cpp:[function(a,b){return!!J.t(b).$isWO},"$1","gK4",2,0,93,168],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,77],
+SF:[function(a,b,c){a.ij=this.ct(a,C.B0,a.ij,b)
+c.$0()},"$2","gNe",4,0,235,236,102],
 static:{KTC: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.DX.LX(a)
-C.DX.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.dl.LX(a)
+C.dl.XI(a)
 return a}}},
-V67:{
-"^":"uL+Pi;",
+V66:{
+"^":"uL+Piz;",
 $isd3:true}}],["","",,Q,{
 "^":"",
 xI:{
-"^":"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.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))
+"^":"Dsd;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
+gjT:function(a){return a.ij},
+sjT:function(a,b){a.ij=this.ct(a,C.uu,a.ij,b)},
+Qj:["rb",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","gLe",2,0,19,59],
-gO3:function(a){var z=a.tY
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gBj",2,0,20,61],
+gO3:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
 z=J.Ds(z)
-this.gi6(a).Z6
+this.giJ(a).b
 return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
+gJp:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
-return z.gTE()},
-goc:function(a){var z=a.tY
+return z.gzz()},
+goc:function(a){var z=a.RZ
 if(z==null)return"NULL REF"
 return J.DA(z)},
 gWw:function(a){return this.goc(a)==null||J.FN(this.goc(a))===!0},
 static:{lKH: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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.HRc.LX(a)
 C.HRc.XI(a)
 return a}}},
 Dsd:{
-"^":"uL+Pi;",
+"^":"uL+Piz;",
 $isd3:true},
 f7:{
-"^":"V68;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)},
+"^":"V67;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gnv:function(a){return a.RZ},
+snv:function(a,b){a.RZ=this.ct(a,C.kY,a.RZ,b)},
 pY:function(a){var z
-switch(J.zH(a.tY)){case"Class":z=W.r3("class-ref",null)
-J.PP(z,a.tY)
+switch(J.zH(a.RZ)){case"Class":z=W.r3("class-ref",null)
+J.PP(z,a.RZ)
 return z
 case"Code":z=W.r3("code-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Context":z=W.r3("context-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Error":z=W.r3("error-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Field":z=W.r3("field-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Function":z=W.r3("function-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Library":z=W.r3("library-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Object":z=W.r3("object-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
 case"Script":z=W.r3("script-ref",null)
-J.PP(z,a.tY)
+J.PP(z,a.RZ)
 return z
-default:if(a.tY.gNs()||a.tY.gl5()){z=W.r3("instance-ref",null)
-J.PP(z,a.tY)
+default:if(a.RZ.gNs()||a.RZ.gfo()){z=W.r3("instance-ref",null)
+J.PP(z,a.RZ)
 return z}else{z=W.r3("span",null)
-J.t3(z,"<<Unknown service ref: "+H.d(a.tY)+">>")
+J.t3(z,"<<Unknown service ref: "+H.d(a.RZ)+">>")
 return z}}},
 Qj:[function(a,b){var z,y,x
-this.D4(a)
-z=a.tY
+this.ay(a)
+z=a.RZ
 if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gdr()
+return}y=z.gv5()
 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","gLe",2,0,12,59],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gBj",2,0,14,61],
 static:{wzV: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J9.LX(a)
 C.J9.XI(a)
 return a}}},
-V68:{
-"^":"uL+Pi;",
+V67:{
+"^":"uL+Piz;",
 $isd3:true},
 Ce:{
-"^":"xI;tY,Pe,Vg,fn,tB,Qf,Vg,fn,Vg,fn,IX,Bd,f4,bb,TT,MJ,OD,n7,kK,ZM,ZQ,qJ,wy",
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
 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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.ji.LX(a)
 C.ji.XI(a)
 return a}}}}],["","",,Q,{
 "^":"",
 CY:{
-"^":"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.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,116,2,233,107],
+"^":"ImK;LD,kX,RZ,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gd4:function(a){return a.LD},
+sd4:function(a,b){a.LD=this.ct(a,C.bk,a.LD,b)},
+gEu:function(a){return a.kX},
+sEu:function(a,b){a.kX=this.ct(a,C.lH,a.kX,b)},
+gRY:function(a){return a.RZ},
+sRY:function(a,b){a.RZ=this.ct(a,C.zU,a.RZ,b)},
+oew:[function(a,b,c,d){var z=J.rp((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.LD=this.ct(a,C.bk,a.LD,z)},"$3","gQU",6,0,116,4,237,107],
 static:{AlS: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.K6L.LX(a)
-C.K6L.XI(a)
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.zb.LX(a)
+C.zb.XI(a)
 return a}}},
 ImK:{
-"^":"xc+Pi;",
+"^":"xc+Piz;",
 $isd3:true}}],["","",,A,{
 "^":"",
-rv:{
-"^":"a;kl,IW,Ya,Yx,ER,Ja,BY,rM",
-xZ:function(a,b){return this.rM.$1(b)},
-bu:[function(a){var z=P.p9("")
+yM:{
+"^":"a;Q,a,b,c,d,e,f,r",
+WO:function(a,b){return this.r.$1(b)},
+X:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.kl?"fields ":"")
-z.KF(this.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Ya?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.BY))
-z.KF(this.rM!=null?"with matcher":"")
+z.KF(this.Q?"fields ":"")
+z.KF(this.a?"properties ":"")
+z.KF(this.e?"methods ":"")
+z.KF(this.b?"inherited ":"_")
+z.KF(this.d?"no finals ":"")
+z.KF("annotations: "+H.d(this.f))
+z.KF(this.r!=null?"with matcher":"")
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73]},
+z=z.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0]},
 ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
-gZI:function(){return this.fY===C.nU},
-gRS:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.hU},
-giO:function(a){var z=this.oc
+"^":"a;oc:Q>,fY:a>,V5:b>,t5:c>,Fo:d<,Dv:e<",
+gHO:function(){return this.a===C.nU},
+gRS:function(){return this.a===C.BM},
+gUA:function(){return this.a===C.hU},
+giO:function(a){var z=this.Q
 return z.giO(z)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
-bu:[function(a){var z=P.p9("")
+m:function(a,b){if(b==null)return!1
+return!!J.t(b).$isES&&this.Q.m(0,b.Q)&&this.a===b.a&&this.b===b.b&&this.c.m(0,b.c)&&this.d===b.d&&X.W4(this.e,b.e,!1)},
+X:[function(a){var z=P.p9("")
 z.KF("(declaration ")
-z.KF(this.oc)
-z.KF(this.fY===C.BM?" (property) ":" (method) ")
-z.KF(this.V5?"final ":"")
-z.KF(this.Fo?"static ":"")
-z.KF(this.Dv)
+z.KF(this.Q)
+z.KF(this.a===C.BM?" (property) ":" (method) ")
+z.KF(this.b?"final ":"")
+z.KF(this.d?"static ":"")
+z.KF(this.e)
 z.KF(")")
-return z.IN},"$0","gCR",0,0,73],
+z=z.Q
+return z.charCodeAt(0)==0?z:z},"$0","gCR",0,0,0],
 $isES:true},
 iYn:{
-"^":"a;fY>"}}],["","",,X,{
+"^":"a;fY:Q>"}}],["","",,X,{
 "^":"",
 Na:function(a,b,c){var z,y
 z=a.length
 if(z<b){y=Array(b)
-y.fixed$length=init
+y.fixed$length=Array
+C.Nm.uy(y,"set range")
 H.qG(y,0,z,a,0)
 return y}if(z>c){z=Array(c)
-z.fixed$length=init
+z.fixed$length=Array
+C.Nm.uy(z,"set range")
 H.qG(z,0,c,a,0)
 return z}return a},
 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.Ff
-b.length
+for(;z.D();){y=z.c
 x=new H.a7(b,1,0,null)
 x.$builtinTypeInfo=[H.u3(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.Ff
-if(w.n(y,v))return!0
-if(!!J.x(v).$isLz){u=w.gbx(y)
-u=$.mX().xs(u,v)}else u=!1
+w=J.t(y)
+for(;x.D();){v=x.c
+if(w.m(y,v))return!0
+if(!!J.t(v).$isUU){u=w.gbx(y)
+u=$.II().xs(u,v)}else u=!1
 if(u)return!0}}return!1},
-na:function(a){var z,y
+Cz:function(a){var z,y
 z=H.G3()
 y=H.KT(z).Zg(a)
 if(y)return 0
@@ -21375,7 +20672,7 @@
 z=H.KT(z,[z,z,z]).Zg(a)
 if(z)return 3
 return 4},
-RI:function(a){var z,y
+aA:function(a){var z,y
 z=H.G3()
 y=H.KT(z,[z,z,z]).Zg(a)
 if(y)return 3
@@ -21390,170 +20687,166 @@
 z=a.length
 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.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.Ff
-v=x.t(0,w)
+if(c){x=P.A(null,null)
+for(z=H.J(new H.a7(b,y,0,null),[H.u3(b,0)]);z.D();){w=z.c
+v=x.p(0,w)
+x.q(0,w,J.WB(v==null?0:v,1))}for(z=H.J(new H.a7(a,a.length,0,null),[H.u3(a,0)]);z.D();){w=z.c
+v=x.p(0,w)
 if(v==null)return!1
 if(v===1)x.Rz(0,w)
-else x.u(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
+else x.q(0,w,v-1)}return x.gl0(x)}else for(u=0;u<z;++u){t=a[u]
 if(u>=y)return H.e(b,u)
 if(t!==b[u])return!1}return!0}}],["","",,D,{
 "^":"",
 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;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.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))},
+"^":"a;Q,a,b,c,d,fJ:e<,f,r",
+FV:function(a,b){this.Q.FV(0,b.gE4())
+this.a.FV(0,b.gF8())
+this.b.FV(0,b.gZG())
+O.PV(this.c,b.gYK())
+O.PV(this.d,b.gt6())
+this.e.FV(0,b.gfJ())
+b.gfJ().aN(0,new O.W2(this))},
+IZ:function(a,b,c,d,e,f,g){this.e.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)
+z=P.A(null,null)
+y=P.A(null,null)
 z=new O.Oj(c,f,e,b,y,d,z,a)
 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()
+for(z=b.gvc(b),z=z.gu(z);z.D(),!1;){y=z.gk()
 a.to(0,y,new O.oQ())
-J.bj(a.t(0,y),b.t(0,y))}}}},
+J.bj(a.p(0,y),b.p(0,y))}}}},
 PO:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.T4.u(0,b,a)},
-$isEH:true},
-T6:{
-"^":"TpZ:81;a",
-$2:function(a,b){this.a.T4.u(0,b,a)},
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.f.q(0,b,a)}},
+W2:{
+"^":"r:80;Q",
+$2:function(a,b){this.Q.f.q(0,b,a)}},
 oQ:{
-"^":"TpZ:76;",
-$0:function(){return P.Fl(null,null)},
-$isEH:true},
+"^":"r:77;",
+$0:function(){return P.A(null,null)}},
 fH:{
-"^":"a;xV",
-jD: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)))
+"^":"a;Q",
+jD:function(a,b){var z=this.Q.Q.p(0,b)
+if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(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)))
+Q1:function(a,b,c){var z=this.Q.a.p(0,b)
+if(z==null)throw H.b(O.lA("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,r
+Ol:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r
 z=null
-x=!!J.x(a).$isLz&&!J.xC(b,C.QL)
-w=this.xV
-if(x){v=w.F3.t(0,a)
-z=v==null?null:J.UQ(v,b)}else{u=w.II.t(0,b)
-z=u==null?null:u.$1(a)}if(z==null)throw H.b(O.Fm("method \""+H.d(b)+"\" in "+H.d(a)))
+x=!!J.t(a).$isUU&&!J.mG(b,C.QL)
+w=this.Q
+if(x){v=w.d.p(0,a)
+z=v==null?null:J.Tf(v,b)}else{u=w.Q.p(0,b)
+z=u==null?null:u.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){t=X.na(z)
+if(d){t=X.Cz(z)
 if(t>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,t,P.y(t,J.q8(c)))}else{s=X.RI(z)
-x=s>=0?s:J.q8(c)
+c=X.Na(c,t,P.u(t,J.wS(c)))}else{s=X.aA(z)
+x=s>=0?s:J.wS(c)
 c=X.Na(c,t,x)}}try{x=H.eC(z,c,P.Te(null))
-return x}catch(r){if(!!J.x(H.Ru(r)).$isJS){if(y!=null)P.FL(y)
+return x}catch(r){if(!!J.t(H.Ru(r)).$isJS){if(y!=null)P.FL(y)
 throw r}else throw r}}},
-bY:{
-"^":"a;xV",
+mO:{
+"^":"a;Q",
 xs:function(a,b){var z,y,x
-if(J.xC(a,b)||J.xC(b,C.Vc))return!0
-for(z=this.xV,y=z.ZG;!J.xC(a,C.Vc);a=x){x=y.t(0,a)
-if(J.xC(x,b))return!0
-if(x==null){if(!z.nX)return!1
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\" ("+H.d(x)+")"))}}return!1},
+if(J.mG(a,b)||J.mG(b,C.AP))return!0
+for(z=this.Q,y=z.b;!J.mG(a,C.AP);a=x){x=y.p(0,a)
+if(J.mG(x,b))return!0
+if(x==null){if(!z.r)return!1
+throw H.b(O.lA("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.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)
+z=this.Q
+y=z.c.p(0,a)
+if(y==null){if(!z.r)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}x=J.Tf(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.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
+if(z==null){if(!this.Q.r)return
+throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+WT:function(a,b,c){var z,y,x,w,v,u
 z=[]
-if(c.Ya){y=this.xV
-x=y.ZG.t(0,b)
-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.gRS())continue
-if(c.ER&&J.or(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.rM!=null&&c.xZ(0,J.DA(v))!==!0)continue
-u=c.BY
+if(c.b){y=this.Q
+x=y.b.p(0,b)
+if(x==null){if(y.r)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!J.mG(x,c.c))z=this.WT(0,x,c)}y=this.Q
+w=y.c.p(0,b)
+if(w==null){if(!y.r)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(y=J.Nx(J.U8(w));y.D();){v=y.gk()
+if(!c.Q&&v.gHO())continue
+if(!c.a&&v.gRS())continue
+if(c.d&&J.or(v)===!0)continue
+if(!c.e&&v.gUA())continue
+if(c.r!=null&&c.WO(0,J.DA(v))!==!0)continue
+u=c.f
 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.xV,y=z.ZG,x=z.of;!J.xC(a,C.Vc);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.nX)return
-throw H.b(O.Fm("superclass of \""+H.d(a)+"\""))}}return}},
+for(z=this.Q,y=z.b,x=z.c;!J.mG(a,C.AP);a=u){w=x.p(0,a)
+if(w!=null){v=J.Tf(w,b)
+if(v!=null)return v}u=y.p(0,a)
+if(u==null){if(!z.r)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
 ut:{
-"^":"a;xV"},
+"^":"a;Q"},
 tk:{
-"^":"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)}}}}],["","",,M,{
+"^":"a;N0:Q<",
+X:[function(a){return"Missing "+this.Q+". Code generation for the smoke package seems incomplete."},"$0","gCR",0,0,0],
+static:{lA:function(a){return new O.tk(a)}}}}],["","",,M,{
 "^":"",
-Wa:function(a,b){var z,y,x,w,v,u
-z=M.pNz(a,b)
+iX:function(a,b){var z,y,x,w,v,u
+z=M.pN(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.Wa(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.ks=w
+for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(w==null){w=Array(y.gdH(a).Q.childNodes.length)
+w.fixed$length=Array}if(v>=w.length)return H.e(w,v)
+w[v]=u}z.a=w
 return z},
-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.T0(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)
+Ch:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Qm(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.JW(w):null,e,f,g,null)
+if(d.ghK()){M.uH(z).Jh(a)
+if(f!=null)J.NA(M.uH(z),f)}M.mV(z,d,e,g)
 return z},
-aR:function(a,b){return!!J.x(a).$isUn&&J.xC(b,"text")?"textContent":b},
+b1:function(a,b){return!!J.t(a).$iskJ&&J.mG(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.VB(a)},
+z=J.Tf(a,"__dartBindable")
+return!!J.t(z).$isAp?z:new M.dP(a)},
 fg:function(a){var z,y,x
-if(!!J.x(a).$isVB)return a.qf
+if(!!J.t(a).$isdP)return a.Q
 z=$.X3
-y=new M.Ra(z)
+y=new M.Vf(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.Wb(a)),"deliver",y.$1(new M.SLX(a)),"__dartBindable",a],null,null))},
-cao:function(a){var z
-for(;z=J.ra5(a),z!=null;a=z);return a},
+return P.jT(P.B(["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))},
+tA:function(a){var z
+for(;z=J.Cd(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.cao(a)
+for(;!0;){a=M.tA(a)
 y=$.nR()
 y.toString
-x=H.VKg(a,"expando$values")
-w=x==null?null:H.VKg(x,y.V2())
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.By())
 y=w==null
-if(!y&&w.gcA()!=null)v=J.yR(w.gcA(),z)
-else{u=J.x(a)
-v=!!u.$isYN||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
+if(!y&&w.gad()!=null)v=J.Eh(w.gad(),z)
+else{u=J.t(a)
+v=!!u.$isSy||!!u.$isBn||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
 if(y)return
-a=w.gXD()
+a=w.gBr()
 if(a==null)return}},
 ah:function(a,b,c){if(c==null)return
-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.$isUn){y=S.j9(a.textContent,M.ah("text",a,b))
+return new M.aR(a,b,c)},
+pN:function(a,b){var z,y
+z=J.t(a)
+if(!!z.$isz2)return M.F5(a,b)
+if(!!z.$iskJ){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="{{}}"
@@ -21567,600 +20860,583 @@
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
+v=new M.vz(null,null,null,z,null,null)
 z=M.rJ(a,"if",b)
-v.Z0=z
+v.c=z
 x=M.rJ(a,"bind",b)
-v.lC=x
+v.d=x
 u=M.rJ(a,"repeat",b)
-v.vJ=u
-if(z!=null&&x==null&&u==null)v.lC=S.j9("{{}}",M.ah("bind",a,b))
+v.e=u
+if(z!=null&&x==null&&u==null)v.d=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.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)
-if(typeof w!=="number")return H.s(w)
+og:function(a,b,c,d){var z,y,x,w,v,u,t
+if(b.gqz()){z=b.Ly(0)
+y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
+return b.gaW()?y:b.iy(y)}x=J.U6(b)
+w=x.gv(b)
+if(typeof w!=="number")return H.o(w)
 v=Array(w)
-v.fixed$length=init
+v.fixed$length=Array
 w=v.length
 u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
+while(!0){t=x.gv(b)
+if(typeof t!=="number")return H.o(t)
 if(!(u<t))break
-z=b.cf(u)
-t=z!=null?z.$3(d,c,!1):b.Pn(u).WK(d)
+z=b.Ly(u)
+t=z!=null?z.$3(d,c,!1):b.Pn(u).Tl(d)
 if(u>=w)return H.e(v,u)
-v[u]=t;++u}return b.qm(v)},
-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.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=[]
+v[u]=t;++u}return b.iy(v)},
+G5:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.geq())return M.og(a,b,c,d)
+if(b.gqz()){z=b.Ly(0)
+y=z!=null?z.$3(d,c,!1):new L.WR(L.hk(b.Pn(0)),d,null,null,null,null,$.qF)
+return b.gaW()?y:new Y.aU(y,b.gPf(),null,null,null)}y=new L.NV(null,!1,[],null,null,null,$.qF)
+y.b=[]
 x=J.U6(b)
 w=0
-while(!0){v=x.gB(b)
-if(typeof v!=="number")return H.s(v)
+while(!0){v=x.gv(b)
+if(typeof v!=="number")return H.o(v)
 if(!(w<v))break
-c$0:{u=b.AX(w)
-z=b.cf(w)
+c$0:{u=b.U0(w)
+z=b.Ly(w)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else y.YU(t)
+else y.Qs(t)
 break c$0}s=b.Pn(w)
-if(u===!0)y.ti(s.WK(d))
-else y.WX(d,s)}++w}return new Y.cU(y,b.gPf(),null,null,null)},
+if(u===!0)y.ti(s.Tl(d))
+else y.WX(d,s)}++w}return new Y.aU(y,b.gPf(),null,null,null)},
 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).$isvy?a:M.Xi(a)
+x=!!J.t(a).$ishs?a:M.uH(a)
 w=J.U6(y)
 v=J.RE(x)
 u=0
-while(!0){t=w.gB(y)
-if(typeof t!=="number")return H.s(t)
+while(!0){t=w.gv(y)
+if(typeof t!=="number")return H.o(t)
 if(!(u<t))break
-s=w.t(y,u)
-r=w.t(y,u+1)
-q=v.nR(x,s,M.jb(s,r,a,c),r.gau())
+s=w.p(y,u)
+r=w.p(y,u+1)
+q=v.nR(x,s,M.G5(s,r,a,c),r.geq())
 if(q!=null&&!0)d.push(q)
-u+=2}v.lL(x)
-if(!z.$isqf)return
-p=M.Xi(a)
-p.sQk(c)
+u+=2}v.x5(x)
+if(!z.$isvz)return
+p=M.uH(a)
+p.sLn(c)
 o=p.KI(b)
 if(o!=null&&!0)d.push(o)},
-Xi:function(a){var z,y,x,w
-z=$.as()
+uH:function(a){var z,y,x,w
+z=$.rw()
 z.toString
-y=H.VKg(a,"expando$values")
-x=y==null?null:H.VKg(y,z.V2())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.By())
 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.bq.NZ(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+w=J.t(a)
+if(!!w.$isz2)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).Q.hasAttribute("template")===!0&&C.lY.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.XY(a),null):new M.vy(a,P.XY(a),null)
-z.u(0,a,x)
+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)
+z.q(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.bq.NZ(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+CF:function(a){var z=J.t(a)
+if(!!z.$isz2)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).Q.hasAttribute("template")===!0&&C.lY.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:{
-"^":"a;oe",
+VE:{
+"^":"a;Q",
 op:function(a,b,c){return},
 static:{"^":"ac"}},
 XI:{
-"^":"a;Cd>,ks>,rz>",
+"^":"a;Cd:Q>,wd:a>,rz:b>",
 ghK:function(){return!1},
-T0:function(a){var z=this.ks
+JW:function(a){var z=this.a
 if(z==null||a>=z.length)return
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
-qf:{
-"^":"XI;Z0,lC,vJ,Cd,ks,rz",
+vz:{
+"^":"XI;c,d,e,Q,a,b",
 ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;KB<,qf,qL?",
-gCd:function(a){var z=J.UQ(this.qf,"bindings_")
+$isvz:true},
+hs:{
+"^":"a;KB:Q<,a,qL:b?",
+gCd:function(a){var z=J.Tf(this.a,"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.kW(this.qf,"bindings_",P.jT(P.Fl(null,null)))
+if(z==null){J.H9(this.a,"bindings_",P.jT(P.A(null,null)))
 z=this.gCd(this)}z.FV(0,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")},
-gmb:function(a){var z=this.qL
+nR:["vZ",function(a,b,c,d){b=M.b1(this.gKB(),b)
+if(!d&&!!J.t(c).$isAp)c=M.fg(c)
+return M.xa(this.a.Z("bind",[b,c,d]))},"$3$oneTime","gDT",4,3,null,71],
+x5:function(a){return this.a.nQ("bindFinished")},
+gCn:function(a){var z=this.b
 if(z!=null);else if(J.Lp(this.gKB())!=null){z=J.Lp(this.gKB())
-z=J.re(!!J.x(z).$isvy?z:M.Xi(z))}else z=null
+z=J.OC(!!J.t(z).$ishs?z:M.uH(z))}else z=null
 return z},
-$isvy:true},
+$ishs: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).$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).$isUn&&J.xC(b,"text"))b="textContent"
-J.kW(this.dn,b,M.fg(c))},
+"^":"ilb;KB:Q<,dn:a<",
+gvc:function(a){return J.kl(J.Tf($.Xw(),"Object").Z("keys",[this.a]),new M.Tl(this))},
+p:function(a,b){if(!!J.t(this.Q).$iskJ&&J.mG(b,"text"))b="textContent"
+return M.xa(J.Tf(this.a,b))},
+q:function(a,b,c){if(!!J.t(this.Q).$iskJ&&J.mG(b,"text"))b="textContent"
+J.H9(this.a,b,M.fg(c))},
 Rz:[function(a,b){var z,y,x
-z=this.KB
-b=M.aR(z,b)
-y=this.dn
-x=M.xa(J.UQ(y,M.aR(z,b)))
+z=this.Q
+b=M.b1(z,b)
+y=this.a
+x=M.xa(J.Tf(y,M.b1(z,b)))
 y.Ji(b)
-return x},"$1","gUS",2,0,234,58],
+return x},"$1","gUS",2,0,238,60],
 V1:function(a){J.Me(this.gvc(this),this.gUS(this))},
-$asilb:function(){return[P.qU,A.Ap]},
-$asT8:function(){return[P.qU,A.Ap]}},
+$asilb:function(){return[P.I,A.Ap]},
+$asw:function(){return[P.I,A.Ap]}},
 Tl:{
-"^":"TpZ:12;a",
-$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},
-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")},
-$isVB:true},
-Ra:{
-"^":"TpZ:12;a",
-$1:function(a){return this.a.xi(a,!1)},
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return!!J.t(this.Q.Q).$iskJ&&J.mG(a,"textContent")?"text":a},"$1",null,2,0,null,60,"call"]},
+dP:{
+"^":"Ap;Q",
+TR:function(a,b){return this.Q.Z("open",[$.X3.mS(b)])},
+xO:function(a){return this.Q.nQ("close")},
+gM:function(a){return this.Q.nQ("discardChanges")},
+sM:function(a,b){this.Q.Z("setValue",[b])},
+fR:function(){return this.Q.nQ("deliver")},
+$isdP:true},
+Vf:{
+"^":"r:14;Q",
+$1:function(a){return this.Q.xi(a,!1)}},
 aY:{
-"^":"TpZ:12;b",
-$1:function(a){return this.b.rO(a,!1)},
-$isEH:true},
+"^":"r:14;Q",
+$1:function(a){return this.Q.oj(a,!1)}},
 SL:{
-"^":"TpZ:12;c",
-$1:[function(a){return J.mu(this.c,new M.Au(a))},"$1",null,2,0,null,40,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return J.mu(this.Q,new M.Au(a))},"$1",null,2,0,null,42,"call"]},
 Au:{
-"^":"TpZ:12;d",
-$1:[function(a){return this.d.PO([a])},"$1",null,2,0,null,182,"call"],
-$isEH:true},
+"^":"r:14;Q",
+$1:[function(a){return this.Q.PO([a])},"$1",null,2,0,null,182,"call"]},
 no:{
-"^":"TpZ:76;e",
-$0:[function(){return J.yd(this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){return J.xl(this.Q)},"$0",null,0,0,null,"call"]},
 uD:{
-"^":"TpZ:76;f",
-$0:[function(){return J.Vm(this.f)},"$0",null,0,0,null,"call"],
-$isEH:true},
+"^":"r:77;Q",
+$0:[function(){return J.SW(this.Q)},"$0",null,0,0,null,"call"]},
+eT:{
+"^":"r:14;Q",
+$1:[function(a){J.Ja(this.Q,a)
+return a},"$1",null,2,0,null,182,"call"]},
 Wb:{
-"^":"TpZ:12;UI",
-$1:[function(a){J.Fc(this.UI,a)
-return a},"$1",null,2,0,null,182,"call"],
-$isEH:true},
-SLX:{
-"^":"TpZ:76;bK",
-$0:[function(){return this.bK.fR()},"$0",null,0,0,null,"call"],
-$isEH:true},
-qU9:{
-"^":"a;k8>,tA,MC"},
+"^":"r:77;Q",
+$0:[function(){return this.Q.fR()},"$0",null,0,0,null,"call"]},
+ze:{
+"^":"a;k8:Q>,a,b"},
 DT:{
-"^":"vy;Qk?,Rc,kr<,pK,Gw?,Yz?,CS?,dK,Fe,XA,KB,qf,qL",
-gKB:function(){return this.KB},
+"^":"hs;Ln:c?,d,CL:e<,f,Gw:r?,M5:x?,CS:y?,z,ch,cx,Q,a,b",
+gKB:function(){return this.Q},
 nR:function(a,b,c,d){var z,y
-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)
+if(!J.mG(b,"ref"))return this.vZ(this,b,c,d)
+z=d?c:J.mu(c,new M.Aj(this))
+J.Vs(this.Q).Q.setAttribute("ref",z)
 this.NB()
 if(d)return
-if(this.gCd(this)==null)this.sCd(0,P.Fl(null,null))
+if(this.gCd(this)==null)this.sCd(0,P.A(null,null))
 y=this.gCd(this)
-J.kW(y.dn,M.aR(y.KB,"ref"),M.fg(c))
+J.H9(y.a,M.b1(y.Q,"ref"),M.fg(c))
 return c},
-KI:function(a){var z=this.kr
-if(z!=null)z.la()
-if(a.Z0==null&&a.lC==null&&a.vJ==null){z=this.kr
+KI:function(a){var z=this.e
+if(z!=null)z.qT()
+if(a.c==null&&a.d==null&&a.e==null){z=this.e
 if(z!=null){z.xO(0)
-this.kr=null}return}z=this.kr
+this.e=null}return}z=this.e
 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($.ik(),this.KB,["ref"],!0)
-return this.kr},
-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.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 $.fT0()
+this.e=z}z.FE(a,this.c)
+J.ZW($.TQ(),this.Q,["ref"],!0)
+return this.e},
+ZK: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.d
+z=this.cx
+if(z==null){z=this.gws()
+z=J.NB(!!J.t(z).$ishs?z:M.uH(z))
+this.cx=z}y=J.RE(z)
+if(y.gPZ(z)==null)return $.fT0()
 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.Wa(z,x)
-x.oe.u(0,z,v)}w=this.dK
-if(w==null){u=J.lu(this.KB)
-w=$.Ou()
-t=w.t(0,u)
+w=x.Q
+if(w==null){w=H.J(new P.nj(null),[null])
+x.Q=w}v=w.p(0,z)
+if(v==null){v=M.iX(z,x)
+x.Q.q(0,z,v)}w=this.z
+if(w==null){u=J.Do(this.Q)
+w=$.p2()
+t=w.p(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
-$.Ks().u(0,t,!0)
+$.Tg().q(0,t,!0)
 M.AL(t)
-w.u(0,u,t)}this.dK=t
-w=t}s=J.UF(w)
+w.q(0,u,t)}this.z=t
+w=t}s=J.bs(w)
 w=[]
 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.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.T0(n):null
-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.MC=s.lastChild
-r.cA=null
-r.XD=null
+r.b=this.Q
+r.c=z
+q.q(0,s,r)
+p=new M.ze(b,null,null)
+M.uH(s).sqL(p)
+for(o=y.gPZ(z),z=v!=null,n=0,m=!1;o!=null;o=o.nextSibling,++n){if(o.nextSibling==null)m=!0
+l=z?v.JW(n):null
+k=M.Ch(o,s,this.z,l,b,c,w,null)
+M.uH(k).sqL(p)
+if(m)r.a=k}p.a=s.firstChild
+p.b=s.lastChild
+r.c=null
+r.b=null
 return s},
-gk8:function(a){return this.Qk},
-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
-z=this.kr
-if(z!=null){z.z1=!1
-z.iz=null
-z.Mv=null}},
+gk8:function(a){return this.c},
+gG5:function(a){return this.d},
+sG5:function(a,b){var z
+if(this.d!=null)throw H.b(P.s("Template must be cleared before a new bindingDelegate can be assigned"))
+this.d=b
+this.ch=null
+z=this.e
+if(z!=null){z.cx=!1
+z.cy=null
+z.db=null}},
 NB:function(){var z,y
-if(this.kr!=null){z=this.XA
-y=this.gPI()
-y=J.f5(!!J.x(y).$isvy?y:M.Xi(y))
+if(this.e!=null){z=this.cx
+y=this.gws()
+y=J.NB(!!J.t(y).$ishs?y:M.uH(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.OP(z.Tf())},
+this.cx=null
+this.e.Oo(null)
+z=this.e
+z.uP(z.Tf())},
 V1:function(a){var z,y
-this.Qk=null
-this.Rc=null
+this.c=null
+this.d=null
 if(this.gCd(this)!=null){z=this.gCd(this).Rz(0,"ref")
-if(z!=null)z.xO(0)}this.XA=null
-y=this.kr
+if(z!=null)z.xO(0)}this.cx=null
+y=this.e
 if(y==null)return
 y.Oo(null)
-this.kr.xO(0)
-this.kr=null},
-gPI:function(){var z,y
+this.e.xO(0)
+this.e=null},
+gws:function(){var z,y
 this.xk()
-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.Xi(z).gPI()
+z=M.cS(this.Q,J.Vs(this.Q).Q.getAttribute("ref"))
+if(z==null){z=this.r
+if(z==null)return this.Q}y=M.uH(z).gws()
 return y!=null?y:z},
 grz:function(a){var z
 this.xk()
-z=this.Yz
-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
+z=this.x
+return z!=null?z:H.Go(this.Q,"$isyY").content},
+Jh:function(a){var z,y,x,w,v,u,t
+if(this.y===!0)return!1
 M.oR()
 M.Tr()
-this.CS=!0
-z=!!J.x(this.KB).$isOH
+this.y=!0
+z=!!J.t(this.Q).$isyY
 y=!z
-if(y){x=this.KB
+if(y){x=this.Q
 w=J.RE(x)
-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).$isvy?v:M.Xi(v)
+if(w.gQg(x).Q.hasAttribute("template")===!0&&C.lY.NZ(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.p("instanceRef should not be supplied for attribute templates."))
+v=M.pZ(this.Q)
+v=!!J.t(v).$ishs?v:M.uH(v)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH
-u=!0}else{x=this.KB
+z=!!J.t(v.gKB()).$isyY
+u=!0}else{x=this.Q
 w=J.RE(x)
-if(w.gns(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.Q
 w=J.RE(x)
-t=w.gJ8(x).createElement("template",null)
-w.gAd(x).insertBefore(t,x)
+t=w.gM0(x).createElement("template",null)
+w.gKV(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).$isvy?t:M.Xi(t)
+v=!!J.t(t).$ishs?t:M.uH(t)
 v.sCS(!0)
-z=!!J.x(v.gKB()).$isOH}else{v=this
+z=!!J.t(v.gKB()).$isyY}else{v=this
 z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sYz(J.UF(M.TA(v.gKB())))
+u=!1}if(!z)v.sM5(J.bs(M.TA(v.gKB())))
 if(a!=null)v.sGw(a)
-else if(y)M.O1(v,this.KB,u)
-else M.Af(J.f5(v))
+else if(y)M.KE(v,this.Q,u)
+else M.Kh(J.NB(v))
 return!0},
-xk:function(){return this.cl(null)},
+xk:function(){return this.Jh(null)},
 $isDT:true,
-static:{"^":"Ub,v2,YO,vU,Xa,joK",TA:function(a){var z,y,x,w
-z=J.lu(a)
+static:{"^":"Ub,kR,YO,v8,Hg,joK",TA:function(a){var z,y,x,w
+z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
-y=$.B8().t(0,z)
+y=$.B8().p(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
+if(w!=null)w.removeChild(x)}$.B8().q(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
 z=J.RE(a)
-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.Ff
-switch(w){case"template":v=z.gQg(a).dA
+y=z.gM0(a).createElement("template",null)
+z.gKV(a).insertBefore(y,a)
+for(x=z.gQg(a),x=C.Nm.br(x.gvc(x)),x=H.J(new H.a7(x,x.length,0,null),[H.u3(x,0)]);x.D();){w=x.c
+switch(w){case"template":v=z.gQg(a).Q
 v.getAttribute(w)
 v.removeAttribute(w)
 break
 case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).dA
+v=z.gQg(a).Q
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-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
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.NB(a)
+if(c){J.RV(z,b)
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.MM(z,w)},Kh:function(a){var z,y
 z=new M.CE()
 y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.vU===!0)return
-$.vU=!0
+y.aN(y,z)},oR:function(){if($.v8===!0)return
+$.v8=!0
 var z=document.createElement("style",null)
 J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},Tr:function(){var z,y
-if($.Xa===!0)return
-$.Xa=!0
+if($.Hg===!0)return
+$.Hg=!0
 z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
+if(!!J.t(z).$isyY){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.PA(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
-J.dc(z,document.baseURI)
-J.PA(a).appendChild(z)}}},
-De:{
-"^":"TpZ:12;a",
-$1:[function(a){var z=this.a
-J.Vs(z.KB).dA.setAttribute("ref",a)
-z.NB()},"$1",null,2,0,null,235,"call"],
-$isEH:true},
+if(J.Tw(y).querySelector("base")==null)M.AL(y)}},AL:function(a){var z=a.createElement("base",null)
+J.Fd(z,document.baseURI)
+J.Tw(a).appendChild(z)}}},
+Aj:{
+"^":"r:14;Q",
+$1:[function(a){var z=this.Q
+J.Vs(z.Q).Q.setAttribute("ref",a)
+z.NB()},"$1",null,2,0,null,239,"call"]},
 CE:{
-"^":"TpZ:19;",
-$1:function(a){if(!M.Xi(a).cl(null))M.Af(J.f5(!!J.x(a).$isvy?a:M.Xi(a)))},
-$isEH:true},
-DOe:{
-"^":"TpZ:12;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,141,"call"],
-$isEH:true},
-Ufa:{
-"^":"TpZ:81;",
+"^":"r:20;",
+$1:function(a){if(!M.uH(a).Jh(null))M.Kh(J.NB(!!J.t(a).$ishs?a:M.uH(a)))}},
+W6o:{
+"^":"r:14;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,202,"call"]},
+YJG:{
+"^":"r:80;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Xi(J.l2(z.gl())).NB()},"$2",null,4,0,null,185,13,"call"],
-$isEH:true},
-Raa:{
-"^":"TpZ:76;",
+for(z=J.Nx(a);z.D();)M.uH(J.Zu(z.gk())).NB()},"$2",null,4,0,null,185,15,"call"]},
+DOe:{
+"^":"r:77;",
 $0:function(){var z=document.createDocumentFragment()
-$.nR().u(0,z,new M.Fi([],null,null,null))
-return z},
-$isEH:true},
+$.nR().q(0,z,new M.Fi([],null,null,null))
+return z}},
 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},
+"^":"a;dn:Q<,PQ:a<,Br:b<,ad:c<"},
+aR:{
+"^":"r:14;Q,a,b",
+$1:function(a){return this.b.op(a,this.Q,this.a)}},
 fE:{
-"^":"TpZ:81;a,b,c,d",
+"^":"r:80;Q,a,b,c",
 $2:function(a,b){var z,y,x,w
-for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
-if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
+for(;z=J.U6(a),J.mG(z.p(a,0),"_");)a=z.yn(a,1)
+if(this.c)z=z.m(a,"bind")||z.m(a,"if")||z.m(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.ah(a,this.b,this.c))
-if(y!=null){z=this.a
+y=S.j9(b,M.ah(a,this.a,this.b))
+if(y!=null){z=this.Q
 x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},
-$isEH:true},
+z.push(y)}}},
 TGm:{
-"^":"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},
-la:function(){var z,y
-z=this.Up
-y=J.x(z)
+"^":"Ap;Q,a,b,c,d,e,f,r,x,y,z,ch,cx,cy,db",
+Hf:function(a){return this.cy.$1(a)},
+TR:function(a,b){return H.vh(P.s("binding already opened"))},
+gM:function(a){return this.f},
+qT:function(){var z,y
+z=this.e
+y=J.t(z)
 if(!!y.$isAp){y.xO(z)
-this.Up=null}z=this.h6
-y=J.x(z)
+this.e=null}z=this.f
+y=J.t(z)
 if(!!y.$isAp){y.xO(z)
-this.h6=null}},
+this.f=null}},
 FE:function(a,b){var z,y,x,w,v
-this.la()
-z=this.yQ.KB
-y=a.Z0
+this.qT()
+z=this.Q.Q
+y=a.c
 x=y!=null
-this.dz=x
-this.Gi=a.vJ!=null
-if(x){this.vj=y.au
-w=M.jb("if",y,z,b)
-this.Up=w
-y=this.vj===!0
+this.r=x
+this.x=a.e!=null
+if(x){this.y=y.a
+w=M.G5("if",y,z,b)
+this.e=w
+y=this.y===!0
 if(y)x=!(null!=w&&!1!==w)
 else x=!1
 if(x){this.Oo(null)
 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.jb("repeat",y,z,b)
-this.h6=y
-v=y}else{y=a.lC
-this.lH=y.au
-y=M.jb("bind",y,z,b)
-this.h6=y
-v=y}if(this.lH!==!0)v=J.mu(v,this.gVN())
+if(this.x===!0){y=a.e
+this.z=y.a
+y=M.G5("repeat",y,z,b)
+this.f=y
+v=y}else{y=a.d
+this.z=y.a
+y=M.G5("bind",y,z,b)
+this.f=y
+v=y}if(this.z!==!0)v=J.mu(v,this.gVN())
 if(!(null!=w&&!1!==w)){this.Oo(null)
 return}this.Ca(v)},
 Tf:function(){var z,y
-z=this.h6
-y=this.lH
-return!(null!=y&&y)?J.Vm(z):z},
+z=this.f
+y=this.z
+return!(null!=y&&y)?J.SW(z):z},
 YSS:[function(a){if(!(null!=a&&!1!==a)){this.Oo(null)
-return}this.Ca(this.Tf())},"$1","ge7",2,0,19,236],
-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],
-Ca:function(a){this.Oo(this.Gi!==!0?[a]:a)},
+return}this.Ca(this.Tf())},"$1","ge7",2,0,20,240],
+uP:[function(a){var z
+if(this.r===!0){z=this.e
+if(this.y!==!0){H.Go(z,"$isAp")
+z=z.gM(z)}if(!(null!=z&&!1!==z)){this.Oo([])
+return}}this.Ca(a)},"$1","gVN",2,0,20,21],
+Ca:function(a){this.Oo(this.x!==!0?[a]:a)},
 Oo:function(a){var z,y
-z=J.x(a)
+z=J.t(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.nH
+z=this.b
 if(a===z)return
-this.ud()
-this.dO=a
-if(!!J.x(a).$iswn&&this.Gi===!0&&this.lH!==!0){if(a.glr()!=null)a.slr([])
-this.AB=a.gXF().yI(this.gSp())}y=this.dO
+this.Lx()
+this.c=a
+if(!!J.t(a).$iswn&&this.x===!0&&this.z!==!0){if(a.glr()!=null)a.slr([])
+this.ch=a.gXF().yI(this.gaH())}y=this.c
 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.yQ.KB
+this.LA(G.jj(y,0,J.wS(y),z,0,z.length))},
+VS:function(a){var z,y,x,w
+if(J.mG(a,-1))return this.Q.Q
 z=$.nR()
-y=this.tM
+y=this.a
 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.yQ.KB)return x
-w=M.Xi(x).gkr()
+x=z.p(0,y[a]).gPQ()
+if(x==null)return this.VS(a-1)
+if(!M.CF(x)||x===this.Q.Q)return x
+w=M.uH(x).gCL()
 if(w==null)return x
-return w.Dk(w.tM.length-1)},
+return w.VS(w.a.length-1)},
 C8:function(a){var z,y,x,w,v,u,t
-z=this.Dk(J.bI(a,1))
-y=this.Dk(a)
-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)
+z=this.VS(J.D5(a,1))
+y=this.VS(a)
+J.Cd(this.Q.Q)
+x=C.Nm.W4(this.a,a)
+for(w=J.RE(x),v=J.RE(z);!J.mG(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},
+w.MM(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
-if(this.vx||J.FN(a)===!0)return
-u=this.yQ
-t=u.KB
-if(J.ra5(t)==null){this.xO(0)
-return}s=this.nH
-Q.Oi(s,this.dO,a)
-z=u.Rc
-if(!this.z1){this.z1=!0
-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.Ff
+if(this.d||J.FN(a)===!0)return
+u=this.Q
+t=u.Q
+if(J.Cd(t)==null){this.xO(0)
+return}s=this.b
+Q.Oi(s,this.c,a)
+z=u.d
+if(!this.cx){this.cx=!0
+r=J.Ee(!!J.t(u.Q).$isDT?u.Q:u)
+if(r!=null){this.cy=r.a.CE(t)
+this.db=null}}q=P.YM(P.N3(),null,null,null,null)
+for(p=J.w1(a),o=p.gu(a),n=0;o.D();){m=o.gk()
+for(l=m.gRt(),l=l.gu(l),k=J.RE(m);l.D();){j=l.c
 i=this.C8(J.WB(k.gvH(m),n))
-if(!J.xC(i,$.fT0()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-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)
+if(!J.mG(i,$.fT0()))q.q(0,j,i)}l=m.gNg()
+if(typeof l!=="number")return H.o(l)
+n-=l}for(p=p.gu(a),o=this.a;p.D();){m=p.gk()
+for(l=J.RE(m),h=l.gvH(m);J.UN(h,J.WB(l.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(x==null)try{if(this.cy!=null)y=this.Hf(y)
 if(y==null)x=$.fT0()
-else x=u.v3(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.oP(g,null)
-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=$.fT0()}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,237,238],
-vB:[function(a){var z,y
+else x=u.ZK(0,y,z)}catch(g){k=H.Ru(g)
+w=k
+v=new H.XO(g,null)
+k=new P.Gc(0,$.X3,null)
+k.$builtinTypeInfo=[null]
+k=new P.Zf(k)
+k.$builtinTypeInfo=[null]
+k.w0(w,v)
+x=$.fT0()}k=x
+f=this.VS(h-1)
+e=J.Cd(u.Q)
+C.Nm.aP(o,h,k)
+e.insertBefore(k,J.p7(f))}}for(u=q.gUQ(q),u=H.J(new H.MH(null,J.Nx(u.Q),u.a),[H.u3(u,0),H.u3(u,1)]);u.D();)this.Wf(u.Q)},"$1","gaH",2,0,241,242],
+Wf:[function(a){var z,y
 z=$.nR()
 z.toString
-y=H.VKg(a,"expando$values")
-for(z=J.mY((y==null?null:H.VKg(y,z.V2())).gdn());z.G();)J.yd(z.gl())},"$1","gJO",2,0,239],
-ud:function(){var z=this.AB
+y=H.of(a,"expando$values")
+for(z=J.Nx((y==null?null:H.of(y,z.By())).gdn());z.D();)J.xl(z.gk())},"$1","gJO",2,0,243],
+Lx:function(){var z=this.ch
 if(z==null)return
 z.Gv()
-this.AB=null},
+this.ch=null},
 xO:function(a){var z
-if(this.vx)return
-this.ud()
-z=this.tM
-H.bQ(z,this.gJO())
-C.Nm.sB(z,0)
-this.la()
-this.yQ.kr=null
-this.vx=!0}}}],["","",,S,{
+if(this.d)return
+this.Lx()
+z=this.a
+C.Nm.aN(z,this.gJO())
+C.Nm.sv(z,0)
+this.qT()
+this.Q.e=null
+this.d=!0}}}],["","",,S,{
 "^":"",
 VH2:{
-"^":"a;qN,au<,ll",
-gqz:function(){return this.qN.length===5},
+"^":"a;Q,eq:a<,b",
+gqz:function(){return this.Q.length===5},
 gaW:function(){var z,y
-z=this.qN
+z=this.Q
 y=z.length
 if(y===5){if(0>=y)return H.e(z,0)
-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
+if(J.mG(z[0],"")){if(4>=z.length)return H.e(z,4)
+z=J.mG(z[4],"")}else z=!1}else z=!1
 return z},
-gPf:function(){return this.ll},
-qm:function(a){return this.gPf().$1(a)},
-gB:function(a){return C.jn.BU(this.qN.length,4)},
-AX:function(a){var z,y
-z=this.qN
+gPf:function(){return this.b},
+iy:function(a){return this.gPf().$1(a)},
+gv:function(a){return C.jn.BU(this.Q.length,4)},
+U0:function(a){var z,y
+z=this.Q
 y=a*4+1
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 Pn:function(a){var z,y
-z=this.qN
+z=this.Q
 y=a*4+2
 if(y>=z.length)return H.e(z,y)
 return z[y]},
-cf:function(a){var z,y
-z=this.qN
+Ly:function(a){var z,y
+z=this.Q
 y=a*4+3
 if(y>=z.length)return H.e(z,y)
 return z[y]},
 xTd:[function(a){var z,y,x,w
 if(a==null)a=""
-z=this.qN
+z=this.Q
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 x=z.length
 w=C.jn.BU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gSG",2,0,240,20],
-QY:[function(a){var z,y,x,w,v,u,t,s
-z=this.qN
+return y+H.d(z[w])},"$1","gSG",2,0,244,21],
+QYW:[function(a){var z,y,x,w,v,u,t,s
+z=this.Q
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
 x=C.jn.BU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.IN+=typeof u==="string"?u:H.d(u);++v
+for(w=J.U6(a),v=0;v<x;){u=w.p(a,v)
+if(u!=null)y.Q+=typeof u==="string"?u:H.d(u);++v
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.IN+=typeof s==="string"?s:H.d(s)}return y.IN},"$1","gYF",2,0,241,242],
-l3:function(a,b){this.ll=this.qN.length===5?this.gSG():this.gYF()},
+y.Q+=typeof s==="string"?s:H.d(s)}z=y.Q
+return z.charCodeAt(0)==0?z:z},"$1","gYF",2,0,245,246],
+nH:function(a,b){this.b=this.Q.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
@@ -22185,312 +21461,300 @@
 w.push(m)
 v=o+2}if(v===z)w.push("")
 y=new S.VH2(w,u,null)
-y.l3(w,u)
+y.nH(w,u)
 return y}}}}],["","",,Z,{
 "^":"",
 d8:function(a){var z,y
-z=J.x(a)
-if(!!z.$isT8){y=P.Fl(null,null)
+z=J.t(a)
+if(!!z.$isw){y=P.A(null,null)
 z.aN(a,new Z.mZ(y))
 return y}else if(!!z.$isWO){y=[]
 z.aN(a,new Z.WJ(y))
 return y}else return a},
 mZ:{
-"^":"TpZ:81;a",
-$2:[function(a,b){this.a.u(0,a,Z.d8(b))},"$2",null,4,0,null,79,80,"call"],
-$isEH:true},
+"^":"r:80;Q",
+$2:function(a,b){this.Q.q(0,a,Z.d8(b))}},
 WJ:{
-"^":"TpZ:12;b",
-$1:function(a){this.b.push(Z.d8(a))},
-$isEH:true},
-lX:{
-"^":"a;NP,G1>,Ir*",
-gEa:function(a){return"T+"+H.d(this.NP)+"us"},
-bu:[function(a){return"["+("T+"+H.d(this.NP)+"us")+"] "+this.G1},"$0","gCR",0,0,73],
-ez:function(a,b){return this.Ir.$1(b)},
-$islX:true},
+"^":"r:14;Q",
+$1:function(a){this.Q.push(Z.d8(a))}},
+H3:{
+"^":"a;Q,G1:a>,Ir:b*",
+gee:function(a){return"T+"+H.d(this.Q)+"us"},
+X:[function(a){return"["+("T+"+H.d(this.Q)+"us")+"] "+this.a},"$0","gCR",0,0,0],
+ez:function(a,b){return this.b.$1(b)},
+$isH3:true},
 KZ:{
-"^":"d3;RV,NP,Rk*,ro,XY,cU",
-Gv:function(){this.RV.Gv()},
-ab:function(a,b){var z=new Z.lX(J.Cl(J.vX(this.NP.giU(),1000000),$.Ji),a,null)
-z.Ir=Z.d8(b)
-J.bi(this.Rk,z)
+"^":"d3;Q,a,Rk:b*,dx$,dy$,fr$",
+Gv:function(){this.Q.Gv()},
+AS:function(a,b){var z=new Z.H3(J.bI(J.lX(this.a.gTY(),1000000),$.Ji),a,null)
+z.b=Z.d8(b)
+J.dH(this.b,z)
 return z},
-ZF:function(a){return this.ab(a,null)},
+WL:function(a){return this.AS(a,null)},
 l8:function(){var z=new P.VV(null,null)
-H.Xe()
+H.w4()
 $.Ji=$.xG
-this.NP=z
-z.D5(0)
-this.RV=N.QM("").gSZ().yI(new Z.Ym(this))
-this.NP.CH(0)
-J.U2(this.Rk)},
-static:{"^":"ax",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.lX),null,null,null)
+this.a=z
+z.wE(0)
+this.Q=N.QM("").gY().yI(new Z.Ym(this))
+this.a.CH(0)
+J.U2(this.b)},
+static:{"^":"hm",JQ:function(){var z=new Z.KZ(null,null,Q.pT(null,Z.H3),null,null,null)
 z.l8()
 return z}}},
 Ym:{
-"^":"TpZ:172;a",
-$1:[function(a){this.a.ZF(a.gOR().oc+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"],
-$isEH:true}}],["","",,G,{
+"^":"r:172;Q",
+$1:[function(a){this.Q.WL(a.gOR().Q+": "+H.d(J.Oh(a)))},"$1",null,2,0,null,171,"call"]}}],["","",,G,{
 "^":"",
-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,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))},
+YZ:{
+"^":"mW;Q,a,b",
+gu:function(a){var z=this.a
+return new G.ay(this.Q,z-1,z+this.b)},
+gv:function(a){return this.b},
+Og:function(a,b,c){var z=this.a
+if(z>this.Q.Q.length)throw H.b(P.D(z,null,null))
+if(this.b<0)throw H.b(P.D(this.b,null,null))
+z=this.b+z
+if(z>this.Q.Q.length)throw H.b(P.D(z,null,null))},
 $asmW:function(){return[null]},
 $asQV:function(){return[null]}},
-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,{
+ay:{
+"^":"a;Q,a,b",
+gk:function(){return C.yo.O2(this.Q.Q,this.a)},
+D:function(){return++this.a<this.b},
+eR:function(a,b){this.a+=b}}}],["","",,Z,{
 "^":"",
 kb:{
-"^":"a;aH,Rr,O4",
-gA:function(a){return this},
-gl:function(){return this.O4},
-G:function(){var z,y,x,w,v,u
-this.O4=null
-z=this.aH
-y=++z.D1
-x=z.c0
+"^":"a;Q,a,b",
+gu:function(a){return this},
+gk:function(){return this.b},
+D:function(){var z,y,x,w,v,u
+this.b=null
+z=this.Q
+y=++z.a
+x=z.b
 if(y>=x)return!1
-w=z.f9.vF
-v=C.yo.j(w,y)
+w=z.Q.Q
+v=C.yo.O2(w,y)
 if(v>=55296)y=v>57343&&v<=65535
 else y=!0
-if(y)this.O4=v
-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.D1
-this.O4=this.Rr}}else this.O4=this.Rr
+if(y)this.b=v
+else if(v<56320&&++z.a<x){u=C.yo.O2(w,z.a)
+if(u>=56320&&u<=57343)this.b=(v-55296<<10>>>0)+(65536+(u-56320))
+else{if(u>=55296&&u<56320)--z.a
+this.b=this.a}}else this.b=this.a
 return!0}}}],["","",,U,{
 "^":"",
 LQ:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.vF.length-b
-new G.GMB(a,b,z).a0(a,b,c)
+z=a.Q.length-b
+new G.YZ(a,b,z).Og(a,b,c)
 z=b+z
 y=b-1
-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
+x=new Z.kb(new G.ay(a,y,z),d,null)
+w=H.J(Array(z-y-1),[P.KN])
+for(z=w.length,v=0;x.D();v=u){u=v+1
+y=x.b
 if(v>=z)return H.e(w,v)
 w[v]=y}if(v===z)return w
 else{z=Array(v)
-z.fixed$length=init
-t=H.VM(z,[P.KN])
+z.fixed$length=Array
+t=H.J(z,[P.KN])
+C.Nm.uy(t,"set range")
 H.qG(t,0,v,w,0)
 return t}}}],["","",,V,{
 "^":"",
 Pa:{
-"^":"V69;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
+"^":"V68;RZ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gK:function(a){return a.RZ},
+sK:function(a,b){a.RZ=this.ct(a,C.pD,a.RZ,b)},
+gX8:function(a){var z=a.RZ
 if(z==null)return!1
 return z.gA9()},
-gnI:function(a){var z=$.Kh.Nv
+gR1:function(a){var z=$.Pi.c
 if(z==null)return!1
-return J.xC(H.Go(z,"$isKM").N,a.GG)},
-xX:[function(a,b,c,d){var z,y,x,w
+return J.mG(H.Go(z,"$isKM").k2,a.RZ)},
+f8D:[function(a,b,c,d){var z,y,x,w
 z=J.RE(b)
-y=z.gEV(b)
-if(typeof y!=="number")return y.D()
-if(y>0||z.gNl(b)===!0||z.gEX(b)===!0||z.gqx(b)===!0||z.gYK(b)===!0)return
+y=z.gpL(b)
+if(typeof y!=="number")return y.A()
+if(y>0||z.gNl(b)===!0||z.gAE(b)===!0||z.gqx(b)===!0||z.gw4(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.nm),P.L5(null,null,null,P.qU,L.nm),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=$.Pi.c
+if(x==null||!J.mG(J.Zu(x),a.RZ)){z=$.Pi
+y=a.RZ
+y=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),y,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,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,173,87,106,188],
-Fh:[function(a,b,c,d){var z,y,x,w
-z=$.Kh.m2
-y=a.GG
-x=z.bq
+z.swv(0,y)}w=J.Vs(d).Q.getAttribute("href")
+$.Pi.b.bo(0,w)},"$3","gkD",6,0,173,87,106,188],
+MeB:[function(a,b,c,d){var z,y,x,w
+z=$.Pi.d
+y=a.RZ
+x=z.a
 x.Rz(0,y)
 z.TV()
 z.TV()
-w=z.wo.IU+".history"
+w=z.Q.Q+".history"
 $.Vy().setItem(w,C.xr.KP(x))},"$3","gFb",6,0,173,87,106,188],
 static:{fXx: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
 C.J57.LX(a)
 C.J57.XI(a)
 return a}}},
-V69:{
-"^":"uL+Pi;",
+V68:{
+"^":"uL+Piz;",
 $isd3:true},
 D2:{
-"^":"V70;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.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.iW(a)},
-VP:function(a,b){if(J.co(b,"ws://"))return b
+"^":"V69;RZ,ij,TQ,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gvm:function(a){return a.RZ},
+svm:function(a,b){a.RZ=this.ct(a,C.uX,a.RZ,b)},
+gHL:function(a){return a.ij},
+sHL:function(a,b){a.ij=this.ct(a,C.oE,a.ij,b)},
+gFK:function(a){return a.TQ},
+sFK:function(a,b){a.TQ=this.ct(a,C.am,a.TQ,b)},
+yY:function(a){this.Wd(a)},
+wT: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.fD(b)
-z=this.VP(a,a.ot)
-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.nm),P.L5(null,null,null,P.qU,L.nm),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)
+ny:[function(a,b,c,d){var z,y,x
+J.Kr(b)
+z=this.wT(a,a.RZ)
+d=$.Pi.d.J8(z)
+y=$.Pi
+x=new U.KM(H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null]),d,P.L5(null,null,null,P.I,L.nm),P.L5(null,null,null,P.I,L.nm),0,!1,!1,new P.GY(!1),new U.hA(null),"unknown",null,null,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.I,D.af),P.L5(null,null,null,P.I,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","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)},
+$.Pi.b.bo(0,"#/vm")},"$3","gMt",6,0,116,4,106,107],
+jLH:[function(a,b,c,d){J.Kr(b)
+this.Wd(a)},"$3","gzG",6,0,116,4,106,107],
+Wd:function(a){G.QX(a.ij).ml(new V.Vn(a)).OA(new V.oU(a))},
+Kq:function(a){var z=P.xC(0,0,0,0,0,1)
+a.LD=this.ct(a,C.O9,a.LD,z)},
 static:{n5p: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
-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.ot=""
-a.YE="localhost:9222"
-a.E6=z
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=y
-a.ZQ=x
-a.qJ=w
-a.wy=v
+y=P.L5(null,null,null,P.I,W.Bn)
+x=P.I
+x=H.J(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
+w=P.A(null,null)
+v=P.A(null,null)
+a.RZ=""
+a.ij="localhost:9222"
+a.TQ=z
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=y
+a.z$=x
+a.ch$=w
+a.cx$=v
 C.aXh.LX(a)
 C.aXh.XI(a)
 C.aXh.Kq(a)
 return a}}},
-V70:{
-"^":"uL+Pi;",
+V69:{
+"^":"uL+Piz;",
 $isd3:true},
 Vn:{
-"^":"TpZ:12;a",
+"^":"r:14;Q",
 $1:[function(a){var z,y,x,w
-z=this.a
-J.U2(z.E6)
+z=this.Q
+J.U2(z.TQ)
 if(a==null)return
 y=J.U6(a)
 x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(w)
+while(!0){w=y.gv(a)
+if(typeof w!=="number")return H.o(w)
 if(!(x<w))break
-c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.E6,y.t(a,x))}++x}},"$1",null,2,0,null,243,"call"],
-$isEH:true},
+c$0:{if(y.p(a,x).gw8()==null)break c$0
+J.dH(z.TQ,y.p(a,x))}++x}},"$1",null,2,0,null,247,"call"]},
 oU:{
-"^":"TpZ:12;b",
-$1:[function(a){J.U2(this.b.E6)},"$1",null,2,0,null,2,"call"],
-$isEH:true}}],["","",,X,{
+"^":"r:14;Q",
+$1:[function(a){J.U2(this.Q.TQ)},"$1",null,2,0,null,4,"call"]}}],["","",,X,{
 "^":"",
 I5:{
-"^":"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.Pe=!1
-a.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.cw.LX(a)
-C.cw.XI(a)
+"^":"xI;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+static:{cFd:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.ij=!1
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.vA.LX(a)
+C.vA.XI(a)
 return a}}}}],["","",,U,{
 "^":"",
 el:{
-"^":"V71;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},
-skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-pA:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,19,102],
-static:{oH: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.f4=[]
-a.OD=!1
-a.kK=!1
-a.ZM=z
-a.ZQ=y
-a.qJ=x
-a.wy=w
-C.Hd.LX(a)
-C.Hd.XI(a)
+"^":"V70;RZ,ij,cy$,db$,LD,kX,cy$,db$,cy$,db$,Q$,a$,b$,c$,d$,e$,f$,r$,x$,y$,z$,ch$,cx$",
+gwv:function(a){return a.RZ},
+swv:function(a,b){a.RZ=this.ct(a,C.RJ,a.RZ,b)},
+gkc:function(a){return a.ij},
+skc:function(a,b){a.ij=this.ct(a,C.yh,a.ij,b)},
+SK:[function(a,b){J.LE(a.RZ).wM(b)},"$1","gvC",2,0,20,102],
+static:{oHO:function(a){var z,y,x,w
+z=P.L5(null,null,null,P.I,W.Bn)
+y=P.I
+y=H.J(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
+x=P.A(null,null)
+w=P.A(null,null)
+a.b$=[]
+a.f$=!1
+a.x$=!1
+a.y$=z
+a.z$=y
+a.ch$=x
+a.cx$=w
+C.dm.LX(a)
+C.dm.XI(a)
 return a}}},
-V71:{
-"^":"uL+Pi;",
+V70:{
+"^":"uL+Piz;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
 ;(function(){var z=!0,y
 y=P.KN
 y.$isKN=z
-y.$islf=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
-y=P.Vf
-y.$isVf=z
-y.$islf=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=W.KV
 y.$isKV=z
 y.$isa=z
 W.vKL.$isa=z
-y=P.qU
-y.$isqU=z
+y=P.I
+y.$isI=z
 y.$isfRn=z
-y.$asfRn=[P.qU]
+y.$asfRn=[P.I]
 y.$isa=z
-W.QI.$isa=z
-y=P.lf
-y.$islf=z
+W.M5K.$isa=z
+y=P.FK
+y.$isFK=z
 y.$isfRn=z
-y.$asfRn=[P.lf]
+y.$asfRn=[P.FK]
 y.$isa=z
 y=N.Ng
 y.$isfRn=z
@@ -22501,75 +21765,82 @@
 y.$isfRn=z
 y.$asfRn=[P.a6]
 y.$isa=z
-y=W.h4
-y.$ish4=z
-y.$isKV=z
-y.$isa=z
+P.a.$isa=z
+P.Od.$isa=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
+P.oz.$isa=z
+y=W.z2
+y.$isz2=z
+y.$isKV=z
 y.$isa=z
-y=U.x06
-y.$isrx=z
+y=K.O1
+y.$isO1=z
 y.$isa=z
-y=U.FH
-y.$isrx=z
+y=U.Dc
+y.$isrN=z
+y.$isa=z
+y=U.In
+y.$isrN=z
 y.$isa=z
 y=U.uku
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.fp
 y.$isfp=z
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.nu
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
 y=U.Mm
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
-y=U.c0
-y.$isrx=z
+y=U.Ej
+y.$isrN=z
 y.$isa=z
-y=U.noG
-y.$isrx=z
+y=U.Dv
+y.$isrN=z
 y.$isa=z
 y=U.RWc
-y.$isrx=z
+y.$isrN=z
 y.$isa=z
-y=U.vn
-y.$isvn=z
-y.$isrx=z
+y=U.zX
+y.$iszX=z
+y.$isrN=z
 y.$isa=z
-y=U.x9
-y.$isrx=z
+y=U.zg
+y.$isrN=z
 y.$isa=z
-y=U.WH
-y.$isWH=z
-y.$isrx=z
+y=U.EO
+y.$isEO=z
+y.$isrN=z
 y.$isa=z
 y=P.IN
 y.$isIN=z
 y.$isa=z
-y=P.Lz
-y.$isLz=z
+y=P.UU
+y.$isUU=z
 y.$isa=z
 N.TJ.$isa=z
 y=T.yj
 y.$isyj=z
 y.$isa=z
-y=W.Iv
-y.$ish4=z
-y.$isKV=z
+F.d3.$isa=z
+A.XP.$isa=z
+W.O7.$isa=z
+y=P.SQ
+y.$isSQ=z
+y.$isa=z
+G.MQ.$isa=z
+y=D.Mk
+y.$isMk=z
+y.$isaf=z
 y.$isa=z
 y=L.nm
 y.$isnm=z
@@ -22580,7 +21851,11 @@
 y=D.bv
 y.$isaf=z
 y.$isa=z
-D.ta.$isa=z
+y=G.Zq
+y.$isZq=z
+y.$isyj=z
+y.$isa=z
+D.Fc.$isa=z
 D.ER.$isa=z
 y=D.xB
 y.$isaf=z
@@ -22605,132 +21880,105 @@
 y.$isvx=z
 y.$isaf=z
 y.$isa=z
-D.Z9.$isa=z
+D.xb.$isa=z
 D.oC.$isa=z
 D.c2.$isa=z
-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=P.SQ
-y.$isSQ=z
-y.$isa=z
-y=W.ew7
-y.$isea=z
-y.$isa=z
-W.fJ.$isa=z
+Z.H3.$isa=z
+D.xx.$isa=z
+P.A5.$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.$isBo=z
+y.$isz2=z
+y.$isKV=z
+y.$isa=z
 y=D.kx
 y.$iskx=z
 y.$isaf=z
 y.$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.Tj.$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
-Z.lX.$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
+D.t9.$isa=z
 y=N.HV
 y.$isHV=z
 y.$isa=z
 H.HX.$isa=z
 H.IY.$isa=z
-H.aX.$isa=z
-y=W.I0
+H.Du.$isa=z
+y=W.Bn
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z
-y=W.AD
-y.$isAD=z
-y.$isea=z
+y=P.cb
+y.$iscb=z
 y.$isa=z
-y=P.wS
-y.$iswS=z
+y=P.yX
+y.$isyX=z
 y.$isa=z
-y=P.MO
-y.$isMO=z
-y.$isa=z
-Y.qS.$isa=z
-y=U.rx
-y.$isrx=z
+Y.PnY.$isa=z
+y=U.rN
+y.$isrN=z
 y.$isa=z
 y=L.Z5
 y.$isZ5=z
 y.$isa=z
-G.Ni.$isa=z
-y=V.qC
-y.$isqC=z
-y.$isT8=z
+G.E8.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.JBS
+y.$isJBS=z
+y.$isa=z
+y=P.kWp
+y.$iskWp=z
 y.$isa=z
 y=P.BpP
 y.$isBpP=z
 y.$isa=z
-y=P.V2
-y.$isV2=z
+y=V.qC
+y.$isqC=z
+y.$isw=z
+y.$isa=z
+y=W.cxu
+y.$iscxu=z
+y.$isea=z
+y.$isa=z
+y=P.Wy
+y.$isWy=z
+y.$isa=z
+y=P.JIw
+y.$isJIw=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
 y.$isa=z
 y=P.KA
 y.$isKA=z
 y.$isNOT=z
-y.$isMO=z
-y.$isa=z
-y=P.LR
-y.$isLR=z
-y.$isKA=z
-y.$isNOT=z
-y.$isMO=z
+y.$isyX=z
 y.$isa=z
 y=D.vO
 y.$isvO=z
 y.$isaf=z
 y.$isqC=z
 y.$asqC=[null,null]
-y.$isT8=z
-y.$asT8=[null,null]
+y.$isw=z
+y.$asw=[null,null]
 y.$isa=z
 y=D.uq
 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=W.vn
+y.$isvn=z
+y.$isea=z
 y.$isa=z
 y=P.fRn
 y.$isfRn=z
@@ -22738,11 +21986,11 @@
 y=P.n7
 y.$isn7=z
 y.$isa=z
-y=P.T8
-y.$isT8=z
+y=P.w
+y.$isw=z
 y.$isa=z
-y=P.dX
-y.$isdX=z
+y=P.OH
+y.$isOH=z
 y.$isa=z
 y=P.QV
 y.$isQV=z
@@ -22756,16 +22004,32 @@
 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=O.Hz
-y.$isHz=z
+y=P.fIm
+y.$isfIm=z
+y.$isa=z
+y=W.Bo
+y.$isBo=z
+y.$isz2=z
+y.$isKV=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.na
+y.$isna=z
+y.$isa=z
+y=W.f5
+y.$isf5=z
+y.$isea=z
 y.$isa=z
 y=D.wv
 y.$iswv=z
@@ -22782,8 +22046,8 @@
 y=A.ES
 y.$isES=z
 y.$isa=z
-y=A.rv
-y.$isrv=z
+y=A.yM
+y.$isyM=z
 y.$isa=z
 y=L.ARh
 y.$isARh=z
@@ -22793,343 +22057,336 @@
 y.$ishsw=z
 y.$isKV=z
 y.$isa=z})()
-J.Qc=function(a){if(typeof a=="number")return J.P.prototype
-if(typeof a=="string")return J.O.prototype
-if(a==null)return a
-if(!(a instanceof P.a))return J.kdQ.prototype
-return a}
-J.Qe=function(a){if(typeof a=="string")return J.O.prototype
+J.NH=function(a){if(typeof a=="string")return J.E.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.U6=function(a){if(typeof a=="string")return J.O.prototype
+return J.MZ(a)}
+J.U6=function(a){if(typeof a=="string")return J.E.prototype
 if(a==null)return a
-if(a.constructor==Array)return J.Q.prototype
+if(a.constructor==Array)return J.G.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
-J.Wx=function(a){if(typeof a=="number")return J.P.prototype
+return J.MZ(a)}
+J.Wx=function(a){if(typeof a=="number")return J.F.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
-J.w1=function(a){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.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
+J.rv=function(a){if(typeof a=="number")return J.F.prototype
+if(typeof a=="string")return J.E.prototype
+if(a==null)return a
+if(!(a instanceof P.a))return J.kdQ.prototype
+return a}
+J.t=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
+return J.VA.prototype}if(typeof a=="string")return J.E.prototype
 if(a==null)return J.CDU.prototype
 if(typeof a=="boolean")return J.yEe.prototype
-if(a.constructor==Array)return J.Q.prototype
+if(a.constructor==Array)return J.G.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.aN(a)}
+return J.MZ(a)}
+J.w1=function(a){if(a==null)return a
+if(a.constructor==Array)return J.G.prototype
+if(typeof a!="object")return a
+if(a instanceof P.a)return a
+return J.MZ(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.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.A6=function(a,b){return J.RE(a).sdl(a,b)}
+J.AE=function(a,b){return J.RE(a).sJb(a,b)}
 J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AW=function(a){return J.RE(a).gnl(a)}
+J.AJ=function(a){return J.RE(a).gLF(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.As=function(a){return J.Wx(a).gVz(a)}
+J.Af=function(a,b){return J.RE(a).aM(a,b)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
+J.Al=function(a){return J.RE(a).goH(a)}
 J.At=function(a){return J.RE(a).gvC(a)}
 J.Aw=function(a){return J.RE(a).gb6(a)}
+J.Ay=function(a){return J.RE(a).gGs(a)}
 J.B9=function(a,b){return J.RE(a).shN(a,b)}
 J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BI=function(a){return J.RE(a).gl6(a)}
 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.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.BQ=function(a,b){return J.NH(a).Fr(a,b)}
+J.BS2=function(a){return J.RE(a).gEu(a)}
 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.C5=function(a){return J.RE(a).gCd(a)}
+J.CA=function(a){return J.RE(a).gil(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-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.Cd=function(a){return J.RE(a).gKV(a)}
+J.Co=function(a,b){return J.RE(a).szH(a,b)}
+J.Cr=function(a){return J.RE(a).gEQ(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.Cw=function(a,b,c){return J.U6(a).eM(a,b,c)}
+J.D5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
+return J.Wx(a).T(a,b)}
 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.DZ=function(a,b){return J.t(a).P(a,b)}
+J.Do=function(a){return J.RE(a).gM0(a)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Dv=function(a){return J.Wx(a).zQ(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
+J.E1=function(a){return J.RE(a).gi0(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.EFh=function(a){if(typeof a=="number")return-a
+return J.Wx(a).G(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Ed=function(a,b){return J.RE(a).sFK(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.Ee=function(a){return J.RE(a).gG5(a)}
+J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Em=function(a){return J.RE(a).guo(a)}
-J.Eo=function(a,b){return J.RE(a).sDQ(a,b)}
 J.Er=function(a){return J.RE(a).gu6(a)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.Ez=function(a,b){return J.RE(a).sIH(a,b)}
 J.F9=function(a){return J.RE(a).gvm(a)}
+J.FH=function(a,b){return J.RE(a).sVX(a,b)}
 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.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.FS1=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FU=function(a,b){return J.RE(a).zc(a,b)}
+J.FW=function(a,b){return J.rv(a).iM(a,b)}
+J.FWx=function(a,b){return J.Wx(a).V(a,b)}
+J.Fd=function(a,b){return J.RE(a).sLU(a,b)}
+J.Ff=function(a){return J.RE(a).gLc(a)}
 J.Fv=function(a,b){return J.RE(a).sFR(a,b)}
 J.Fy=function(a){return J.RE(a).h9(a)}
+J.G2=function(a){return J.RE(a).gS4(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).goH(a)}
-J.GL=function(a){return J.RE(a).gBp(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
+J.GGs=function(a){return J.RE(a).gEE(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.GZ=function(a,b){return J.RE(a).sph(a,b)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
+J.Gt=function(a){return J.RE(a).gRY(a)}
 J.H1=function(a){return J.RE(a).gLe(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.H9=function(a,b,c){if((a.constructor==Array||H.wVW(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+return J.w1(a).q(a,b,c)}
 J.HB=function(a){return J.RE(a).gxT(a)}
-J.HP=function(a){return J.RE(a).gFK(a)}
+J.HL=function(a){return J.RE(a).gvq(a)}
+J.HO=function(a){return J.RE(a).Zi(a)}
 J.HT=function(a,b){return J.RE(a).sLc(a,b)}
+J.Ha=function(a,b){return J.RE(a).QV(a,b)}
+J.Hd=function(a,b,c){return J.w1(a).oq(a,b,c)}
 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.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.Hm=function(a){return J.RE(a).gTK(a)}
+J.Hy=function(a){return J.RE(a).gnx(a)}
+J.I0=function(a,b){return J.RE(a).bA(a,b)}
 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.IC=function(a,b){return J.NH(a).O2(a,b)}
+J.IE=function(a,b,c){return J.RE(a).f8(a,b,c)}
 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).gkZ(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.IR=function(a){return J.RE(a).gYt(a)}
+J.IS=function(a){return J.RE(a).gnv(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){return J.RE(a).gIH(a)}
-J.Ir=function(a){return J.RE(a).gyK(a)}
+J.Ir=function(a){return J.RE(a).ghf(a)}
 J.Iz=function(a){return J.RE(a).gfY(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.J2g=function(a){return J.RE(a).UV(a)}
+J.JA=function(a,b,c){return J.NH(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.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a){return J.RE(a).gWA(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.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.KG=function(a){return J.RE(a).guz(a)}
+J.Ja=function(a,b){return J.RE(a).sM(a,b)}
+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.KU=function(a,b){return J.RE(a).T2(a,b)}
-J.Kj=function(a){return J.RE(a).gYt(a)}
 J.Kl=function(a){return J.RE(a).gBP(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.Km=function(a,b,c){return J.RE(a).ZK(a,b,c)}
+J.Kr=function(a){return J.RE(a).e6(a)}
+J.Kt=function(a){return J.RE(a).gG3(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.LE=function(a){return J.RE(a).VD(a)}
-J.LM=function(a){return J.RE(a).gn9(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.LF=function(a){return J.RE(a).gpf(a)}
+J.LL=function(a){return J.RE(a).gFK(a)}
+J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LY4=function(a){return J.RE(a).gBp(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.Lz=function(a){return J.t(a).X(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).sQR(a,b)}
-J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MT=function(a){return J.RE(a).guc(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.Mh=function(a){return J.RE(a).gMt(a)}
 J.N1=function(a){return J.RE(a).Es(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).gNG(a)}
-J.NDJ=function(a){return J.RE(a).gWt(a)}
+J.NA=function(a,b){return J.RE(a).sG5(a,b)}
+J.NB=function(a){return J.RE(a).grz(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.NV=function(a){return J.RE(a).gYe(a)}
+J.NQ=function(a){return J.Wx(a).zQ(a)}
 J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nb=function(a){return J.RE(a).gdH(a)}
+J.Nb=function(a){return J.RE(a).gt0(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.Nk=function(a){return J.RE(a).gtT(a)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
+J.Nj=function(a,b,c){return J.NH(a).Nj(a,b,c)}
+J.Nx=function(a){return J.w1(a).gu(a)}
 J.O8=function(a){return J.RE(a).Sd(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
+J.OC=function(a){return J.RE(a).gCn(a)}
+J.OD=function(a){return J.RE(a).gwd(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
+J.OP=function(a,b){return J.w1(a).uk(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
+J.OX=function(a){return J.NH(a).gNq(a)}
 J.Oh=function(a){return J.RE(a).gG1(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
+J.Okq=function(a){return J.RE(a).ghU(a)}
+J.Ot=function(a){return J.RE(a).gRO(a)}
+J.Ou=function(a){return J.RE(a).gaL(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
+J.P3=function(a){return J.RE(a).goL(a)}
+J.P5=function(a){return J.RE(a).gHo(a)}
 J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
-J.PA=function(a){return J.RE(a).gQr(a)}
-J.PG=function(a){return J.RE(a).gEE(a)}
-J.PK=function(a){return J.RE(a).gQR(a)}
+J.PK=function(a){return J.RE(a).gdA(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.PR=function(a){return J.RE(a).gA5(a)}
-J.PS=function(a){return J.x(a).gCR(a)}
+J.PQ=function(a){return J.RE(a).gVY(a)}
+J.PS=function(a){return J.t(a).gCR(a)}
 J.PW=function(a){return J.RE(a).gVb(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.Pp=function(a){return J.RE(a).gDf(a)}
 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,b){return J.U6(a).OY(a,b)}
+J.Q0=function(a){return J.RE(a).gwh(a)}
 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.Q7=function(a){return J.NH(a).bS(a)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QE=function(a){return J.RE(a).gCd(a)}
+J.QD=function(a){return J.RE(a).gdB(a)}
+J.QI=function(a){return J.Wx(a).gfE(a)}
+J.QP=function(a){return J.RE(a).gWq(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.QY=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.Qd=function(a){return J.RE(a).gRn(a)}
+J.QZ=function(a){return J.RE(a).gpM(a)}
+J.Qd=function(a,b){return J.RE(a).sR9(a,b)}
 J.Ql=function(a,b){return J.RE(a).sdu(a,b)}
+J.Qm=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
-J.Qt=function(a,b){return J.RE(a).sML(a,b)}
 J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
+J.QvL=function(a){return J.RE(a).gSs(a)}
 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.RC=function(a){return J.RE(a).gTA(a)}
+J.RI=function(a){return J.RE(a).gRT(a)}
+J.RS=function(a,b){return J.U6(a).sv(a,b)}
+J.RV=function(a,b){return J.RE(a).MM(a,b)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
+J.Rb=function(a,b){return J.RE(a).sCd(a,b)}
 J.Rd=function(a,b){return J.RE(a).sO7(a,b)}
-J.Rp=function(a,b){return J.RE(a).sod(a,b)}
-J.Rr=function(a){return J.RE(a).ga7(a)}
-J.Ry=function(a){return J.RE(a).gVE(a)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
+J.S5=function(a){return J.RE(a).gIF(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.Sf=function(a,b){return J.RE(a).sXE(a,b)}
+J.SS=function(a){return J.RE(a).gQP(a)}
+J.SW=function(a){return J.RE(a).gM(a)}
+J.Sf=function(a,b){return J.RE(a).sGV(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.TH=function(a){return J.RE(a).gGp(a)}
 J.TM=function(a){return J.RE(a).gOd(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.Tg=function(a){return J.RE(a).gCI(a)}
-J.Tm=function(a){return J.RE(a).grX(a)}
+J.TR=function(a,b){return J.RE(a).saL(a,b)}
+J.TZQ=function(a,b){return J.RE(a).sN(a,b)}
+J.Ta=function(a){return J.Wx(a).yu(a)}
+J.Tf=function(a,b){if(a.constructor==Array||typeof a=="string"||H.wVW(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
+return J.U6(a).p(a,b)}
 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.Tw=function(a){return J.RE(a).gKa(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){return J.RE(a).gEQ(a)}
-J.UA=function(a){return J.RE(a).gP2(a)}
+J.U8=function(a){return J.RE(a).gUQ(a)}
 J.UE=function(a){return J.w1(a).git(a)}
-J.UF=function(a){return J.RE(a).JP(a)}
-J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
+J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 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.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.US=function(a){return J.RE(a).gWt(a)}
+J.UZ=function(a){return J.RE(a).gIb(a)}
+J.Ua=function(a){return J.RE(a).gkZ(a)}
+J.Ul=function(a){return J.RE(a).ay(a)}
 J.Ux=function(a){return J.RE(a).geo(a)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VA=function(a,b){return J.w1(a).Vr(a,b)}
-J.VU=function(a,b){return J.RE(a).PN(a,b)}
+J.V2=function(a,b,c){return J.w1(a).aP(a,b,c)}
 J.Vj=function(a,b){return J.RE(a).Md(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.Vk=function(a,b){return J.w1(a).ev(a,b)}
+J.Vr=function(a,b){return J.RE(a).sG3(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
-J.W3w=function(a,b){return J.RE(a).Ft(a,b)}
+J.W1=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
+return J.Wx(a).B(a,b)}
 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).sLF(a,b)}
+return J.rv(a).g(a,b)}
+J.WI=function(a,b){return J.RE(a).soc(a,b)}
+J.WN=function(a){return J.RE(a).gIi(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WU=function(a,b){return J.RE(a).sK(a,b)}
+J.WV=function(a){return J.RE(a).gPe(a)}
+J.WX7=function(a){return J.RE(a).gbJ(a)}
 J.We=function(a,b){return J.RE(a).sNJ(a,b)}
-J.Wf=function(a){return J.RE(a).D4(a)}
-J.Wy=function(a,b){return J.RE(a).sBk(a,b)}
 J.X7=function(a){return J.RE(a).gcH(a)}
-J.X9=function(a){return J.RE(a).gTK(a)}
+J.X9=function(a,b,c,d){return J.RE(a).hV(a,b,c,d)}
+J.XB=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XHl=function(a){return J.Wx(a).yu(a)}
-J.XP=function(a){return J.RE(a).Um(a)}
+J.Xa=function(a){return J.RE(a).gXc(a)}
 J.Xf=function(a){return J.RE(a).gbq(a)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xr=function(a){return J.RE(a).gEa(a)}
+J.Xi=function(a){return J.RE(a).gr9(a)}
+J.Xp=function(a){return J.RE(a).gzH(a)}
 J.Xu=function(a,b){return J.RE(a).sFL(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
-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.Yd=function(a){return J.RE(a).gBV(a)}
+J.YH=function(a){return J.RE(a).gnS(a)}
+J.YN=function(a,b){return J.RE(a).WO(a,b)}
+J.YQ=function(a,b){return J.U6(a).OY(a,b)}
 J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yo=function(a,b,c){return J.RE(a).f8(a,b,c)}
-J.Yq=function(a){return J.RE(a).gph(a)}
+J.Yj=function(a){return J.RE(a).gIq(a)}
+J.Yq=function(a){return J.RE(a).gSR(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a,b){return J.RE(a).sP9(a,b)}
+J.Z8=function(a){return J.RE(a).gCf(a)}
+J.ZC=function(a){return J.RE(a).gph(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)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 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.ZZ=function(a,b){return J.NH(a).yn(a,b)}
 J.Zo=function(a){return J.RE(a).gK4(a)}
-J.Zs=function(a){return J.RE(a).gcY(a)}
+J.Zs=function(a){return J.RE(a).grO(a)}
+J.Zu=function(a){return J.RE(a).gK(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.ae=function(a){return J.RE(a).gke(a)}
-J.an=function(a,b){return J.RE(a).Id(a,b)}
+J.aAQ=function(a){return J.RE(a).gzY(a)}
+J.aN=function(a){return J.RE(a).fV(a)}
+J.aO=function(a,b){return J.RE(a).Rg(a,b)}
+J.aP=function(a,b){return J.RE(a).sXE(a,b)}
+J.aW=function(a){return J.RE(a).gJp(a)}
+J.aX=function(a){return J.RE(a).gR9(a)}
 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.bB=function(a){return J.t(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).ghS(a)}
-J.bS=function(a){return J.RE(a).gUo(a)}
-J.bT=function(a){return J.w1(a).gqG(a)}
-J.bb=function(a){return J.RE(a).gHy(a)}
-J.bh=function(a){return J.RE(a).geZ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
+J.bI=function(a,b){return J.Wx(a).W(a,b)}
+J.bP=function(a){return J.w1(a).gtH(a)}
+J.bU=function(a,b){return J.RE(a).sbY(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.c7=function(a){return J.RE(a).guS(a)}
+J.cC=function(a){return J.RE(a).gke(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)}
@@ -23137,244 +22394,255 @@
 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.dE=function(a){return J.RE(a).gGs(a)}
-J.dF=function(a){return J.w1(a).zH(a)}
-J.dK=function(a){return J.RE(a).gWk(a)}
-J.dc=function(a,b){return J.RE(a).smH(a,b)}
+J.cm=function(a,b){return J.w1(a).srZ(a,b)}
+J.co=function(a,b){return J.NH(a).nC(a,b)}
+J.dH=function(a,b){return J.w1(a).h(a,b)}
+J.dY=function(a){return J.RE(a).ga4(a)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a){return J.RE(a).QE(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.eM=function(a){return J.RE(a).gws(a)}
+J.dn=function(a){return J.RE(a).gNa(a)}
+J.dw=function(a){return J.RE(a).gJ6(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.er=function(a){return J.RE(a).gyW(a)}
-J.ev=function(a){return J.RE(a).gkD(a)}
+J.ex=function(a){return J.RE(a).ks(a)}
 J.f2=function(a){return J.RE(a).gRd(a)}
-J.f5=function(a){return J.RE(a).grz(a)}
-J.f9c=function(a){return J.RE(a).gJQ(a)}
-J.fA=function(a){return J.RE(a).gJp(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.f6=function(a,b){return J.RE(a).sGq(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.fe=function(a){return J.RE(a).gNG(a)}
 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.h3=function(a){return J.RE(a).gHL(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.hfy=function(a){return J.RE(a).gDX(a)}
-J.hn=function(a){return J.RE(a).gEu(a)}
+J.hW=function(a){return J.RE(a).gql(a)}
 J.ht=function(a){return J.RE(a).gZ2(a)}
 J.hw=function(a,b){return J.RE(a).sGp(a,b)}
 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.i8=function(a){return J.RE(a).gzU(a)}
 J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iB=function(a){return J.RE(a).giC(a)}
+J.iF=function(a){return J.RE(a).gTU(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.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
+J.ie=function(a,b){return J.NH(a).C1(a,b)}
+J.ik=function(a){return J.RE(a).gHt(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){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.ix=function(a,b){return J.RE(a).sXc(a,b)}
+J.j1=function(a){return J.RE(a).giJ(a)}
+J.j8v=function(a){return J.RE(a).gO7(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.jd=function(a){return J.RE(a).gZm(a)}
-J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
-J.jq=function(a,b){return J.RE(a).sZp(a,b)}
+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.jy=function(a,b){return J.RE(a).sPe(a,b)}
 J.k0=function(a){return J.RE(a).giZ(a)}
+J.k4=function(a,b){return J.RE(a).syG(a,b)}
 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.kc=function(a){return J.RE(a).gGV(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kv=function(a){return J.RE(a).gDf(a)}
+J.ksQ=function(a){return J.RE(a).gB1(a)}
+J.kv=function(a){return J.RE(a).glp(a)}
 J.l2=function(a){return J.RE(a).gN(a)}
-J.lA=function(a){return J.RE(a).gLc(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.lF=function(a,b){return J.RE(a).snS(a,b)}
+J.lK=function(a){return J.RE(a).gbw(a)}
+J.lX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
+return J.rv(a).R(a,b)}
+J.lk=function(a){return J.RE(a).gRq(a)}
+J.ll=function(a){return J.RE(a).gUt(a)}
+J.ls=function(a,b,c,d,e,f,g,h){return J.RE(a).kN(a,b,c,d,e,f,g,h)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.m8=function(a,b){return J.RE(a).sEu(a,b)}
 J.mF=function(a){return J.RE(a).gHn(a)}
-J.mN=function(a){return J.RE(a).gRO(a)}
+J.mG=function(a,b){if(a==null)return b==null
+if(typeof a!="object")return b!=null&&a===b
+return J.t(a).m(a,b)}
+J.mI=function(a,b){return J.RE(a).rW(a,b)}
+J.mP=function(a){return J.RE(a).gzj(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).gO(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){return J.RE(a).gkD(a)}
 J.nG=function(a){return J.RE(a).gv8(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.ns=function(a){return J.RE(a).gRn(a)}
 J.nv=function(a){return J.RE(a).gLW(a)}
-J.o6=function(a){return J.RE(a).Lx(a)}
+J.o3=function(a,b){return J.Wx(a).L(a,b)}
 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.oH=function(a){return J.RE(a).gjT(a)}
 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.oS=function(a,b,c,d){return J.RE(a).hV(a,b,c,d)}
-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.ocJ=function(a,b){return J.RE(a).yU(a,b)}
 J.op=function(a){return J.RE(a).gD7(a)}
 J.or=function(a){return J.RE(a).gV5(a)}
-J.p5=function(a){return J.RE(a).gO7(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).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.q8=function(a){return J.U6(a).gB(a)}
+J.pU=function(a){return J.RE(a).gYe(a)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
+J.pg=function(a){return J.RE(a).gBj(a)}
+J.ph=function(a,b){return J.RE(a).RR(a,b)}
+J.pr=function(a){return J.RE(a).guS(a)}
+J.pz=function(a){return J.RE(a).gwe(a)}
+J.q0=function(a){return J.RE(a).guz(a)}
+J.q8=function(a){return J.RE(a).gvc(a)}
 J.qA=function(a){return J.w1(a).br(a)}
-J.ql=function(a){return J.RE(a).gaB(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.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.qq=function(a){return J.RE(a).dQ(a)}
+J.qv=function(a,b){return J.NH(a).dd(a,b)}
 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.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).gS(a)}
+J.rn=function(a){return J.w1(a).grZ(a)}
 J.ro=function(a){return J.RE(a).gOB(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
+J.rp=function(a){return J.RE(a).gd4(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.tG=function(a){return J.RE(a).Zi(a)}
-J.tH=function(a,b){return J.RE(a).sHy(a,b)}
+J.tC=function(a){return J.RE(a).gj8(a)}
+J.tQ=function(a,b){return J.RE(a).swv(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).gCK(a)}
+J.tX=function(a){return J.RE(a).gtT(a)}
+J.tl=function(a){return J.RE(a).gyK(a)}
+J.tw=function(a){return J.RE(a).je(a)}
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
-J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return 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.uH=function(a,b){return J.RE(a).sP2(a,b)}
-J.uN=function(a){return J.RE(a).gHo(a)}
+J.uF=function(a,b){return J.RE(a).sMZ(a,b)}
+J.uM=function(a,b){return J.RE(a).sod(a,b)}
+J.uN=function(a){return J.RE(a).gbY(a)}
+J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
 J.uW=function(a){return J.RE(a).gyG(a)}
-J.uf=function(a){return J.RE(a).gQU(a)}
 J.ufU=function(a){return J.RE(a).gxr(a)}
+J.ui=function(a){return J.RE(a).gTw(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.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).gwX(a)}
-J.vA=function(a,b){return J.RE(a).sRk(a,b)}
+J.v1=function(a){return J.t(a).giO(a)}
+J.v6=function(a){return J.RE(a).yy(a)}
+J.v7=function(a){return J.RE(a).Um(a)}
+J.v9=function(a){return J.RE(a).gX8(a)}
+J.vE=function(a){return J.RE(a).gMZ(a)}
+J.vI=function(a){return J.RE(a).gVX(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.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)}
+J.vP=function(a,b){return J.RE(a).QS(a,b)}
+J.vU=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+return J.Wx(a).A(a,b)}
+J.vX=function(a){return J.w1(a).wg(a)}
+J.vo=function(a){return J.RE(a).gZJ(a)}
+J.vu=function(a,b){return J.RE(a).So(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 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.wK=function(a,b){return J.RE(a).xZ(a,b)}
+J.wS=function(a){return J.U6(a).gv(a)}
 J.wd=function(a){return J.RE(a).gqw(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.wg=function(a){return J.RE(a).god(a)}
 J.wl=function(a,b){return J.RE(a).Ch(a,b)}
 J.wm=function(a){return J.RE(a).goN(a)}
+J.wo=function(a,b){return J.RE(a).GE(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.x4=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).S(a,b)}
 J.x5=function(a){return J.RE(a).gpE(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).geZ(a)}
+J.xl=function(a){return J.RE(a).xO(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
-J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y1=function(a){return J.RE(a).gJ(a)}
 J.y3=function(a){return J.RE(a).gFL(a)}
+J.y5=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
+return J.Wx(a).s(a,b)}
+J.y6=function(a,b){return J.w1(a).GT(a,b)}
 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).gih(a)}
-J.yO=function(a){return J.RE(a).ga4(a)}
-J.yR=function(a,b){return J.RE(a).XT(a,b)}
-J.yd=function(a){return J.RE(a).xO(a)}
+J.yI=function(a){return J.RE(a).gLf(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.yz=function(a){return J.RE(a).gLF(a)}
+J.yr=function(a){return J.RE(a).gJb(a)}
 J.z7Y=function(a,b,c,d,e){return J.RE(a).GM(a,b,c,d,e)}
-J.zE=function(a){return J.RE(a).gtu(a)}
-J.zF=function(a){return J.RE(a).gHL(a)}
+J.z8=function(a){return J.RE(a).gGq(a)}
+J.zB=function(a){return J.RE(a).gee(a)}
+J.zD=function(a){return J.RE(a).gEl(a)}
+J.zF=function(a){return J.RE(a).gih(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.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)}
 J.zv=function(a,b){return J.RE(a).suo(a,b)}
+I.uL=function(a){a.immutable$list=Array
+a.fixed$length=Array
+return a}
 C.Gx=X.hV.prototype
 C.J9=Q.f7.prototype
-C.Gkp=Y.hg.prototype
-C.QD=B.G6.prototype
+C.Gkp=Y.G0.prototype
+C.C8=B.G6.prototype
 C.FC=T.vr.prototype
 C.ic=A.wM.prototype
-C.i3=Q.eW.prototype
-C.fe=O.eo.prototype
+C.YZz=Q.eW.prototype
+C.RD=O.eo.prototype
 C.ka=Z.ak.prototype
 C.tWO=O.VY.prototype
 C.ux=F.Be.prototype
 C.vS=T.uV.prototype
-C.dZE=U.NY.prototype
+C.oS=U.NY.prototype
 C.O0=R.JI.prototype
+C.lG=W.DG4.prototype
 C.Pj=O.Hi.prototype
 C.AuX=O.NF.prototype
-C.mk=O.ts.prototype
-C.BKH=O.AK.prototype
-C.uyw=O.ys.prototype
+C.Y7=O.ts.prototype
+C.va=O.AK.prototype
+C.Yw=O.ys.prototype
 C.BB=G.Tk.prototype
-C.On=F.ZP.prototype
+C.a3=F.ZP.prototype
 C.Jh=L.nJ.prototype
 C.qL=R.Eg.prototype
 C.MC=D.i7.prototype
-C.LTI=A.Gk.prototype
-C.kL=W.H05.prototype
+C.by=A.Gk.prototype
+C.MO=W.H0.prototype
 C.ls6=X.MJ.prototype
 C.n0=X.J3.prototype
-C.Xo=U.DK.prototype
+C.XoJ=U.DK.prototype
 C.PJ8=N.BS.prototype
-C.wc=O.Vb.prototype
-C.xut=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
+C.Cs=O.Vb.prototype
+C.Vc=K.Ly.prototype
+C.Dt=W.O7.prototype
+C.Ug=E.WS.prototype
 C.GII=E.H8.prototype
-C.Ie=E.mO.prototype
+C.Ie=E.IH.prototype
 C.Ig=E.DE.prototype
 C.VLs=E.U1.prototype
 C.ej=E.qM.prototype
@@ -23382,386 +22650,372 @@
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
 C.RVQ=E.wN.prototype
-C.yr=E.ds.prototype
+C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.ozm=E.oF.prototype
-C.IXz=E.qh.prototype
+C.wK=E.qh.prototype
 C.rU=E.Q6.prototype
-C.j1o=E.L4.prototype
-C.ijR=E.Zn.prototype
-C.Fw=E.uE.prototype
-C.aVr=E.n5.prototype
+C.za=E.L4.prototype
+C.ag=E.Zn.prototype
+C.RrX=E.uE.prototype
+C.Dw=E.n5.prototype
 C.QFk=O.Im.prototype
 C.uRw=B.pR.prototype
 C.yKx=Z.EZ.prototype
 C.aXP=D.Z4.prototype
-C.rCJ=D.Qh.prototype
+C.kd=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
-C.mb=D.Oz.prototype
-C.OoF=D.St.prototype
-C.hys=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.VA7.prototype
+C.YGo=D.Oz.prototype
+C.ta=D.St.prototype
+C.Xe=L.qk.prototype
+C.Nm=J.G.prototype
+C.YI=J.VA.prototype
 C.jn=J.imn.prototype
 C.jN=J.CDU.prototype
-C.CD=J.P.prototype
-C.yo=J.O.prototype
-C.Du=Z.vj.prototype
+C.CD=J.F.prototype
+C.yo=J.E.prototype
+C.GB=Z.vj.prototype
 C.xA=A.UK.prototype
 C.Z3=R.LU.prototype
-C.ag=M.CX.prototype
-C.DX=U.WG.prototype
-C.OX=U.VZ.prototype
-C.Ax=N.I2.prototype
-C.Mw=N.FB.prototype
+C.MG=M.CX.prototype
+C.dl=U.WG.prototype
+C.vmJ=U.VZ.prototype
+C.pc=N.I2.prototype
+C.h1=N.FB.prototype
 C.po=N.qn.prototype
 C.S2=W.x76.prototype
 C.yp=H.eEV.prototype
-C.aV=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
+C.Jm=H.V6.prototype
+C.kDK=A.md.prototype
+C.pl=A.ye.prototype
+C.YY=A.Bm.prototype
 C.nn=A.Ya.prototype
-C.BJj=A.Co.prototype
+C.BJj=A.NK.prototype
 C.L8=A.Zx.prototype
 C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.h5=L.qV.prototype
+C.t5=W.dX.prototype
+C.br=L.qV.prototype
 C.ji=Q.Ce.prototype
-C.LQi=L.NT.prototype
+C.Lj=L.NT.prototype
 C.YpE=V.F1.prototype
 C.Pfz=Z.uL.prototype
-C.Sx=J.iCW.prototype
-C.GBL=A.xc.prototype
-C.za=T.ov.prototype
-C.c07=A.kn.prototype
+C.ZQ=J.iCW.prototype
+C.Ki=A.xc.prototype
+C.Fa=T.ov.prototype
+C.Wa=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
-C.Uv=U.Ti.prototype
+C.Ns=U.Ti.prototype
 C.HRc=Q.xI.prototype
-C.K6L=Q.CY.prototype
+C.zb=Q.CY.prototype
 C.OKl=A.G1.prototype
-C.Uav=U.Um.prototype
+C.Rr=U.Um.prototype
 C.vB=J.kdQ.prototype
 C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
-C.cw=X.I5.prototype
-C.Hd=U.el.prototype
-C.ole=W.K5.prototype
+C.vA=X.I5.prototype
+C.dm=U.el.prototype
+C.ol=W.K5.prototype
 C.Kn=new H.i6()
-C.x4=new U.WH()
+C.HI=new U.EO()
 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.zr=new L.iNc()
+C.aZ=new L.iNc()
 C.fQ=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
-C.Z7=new D.WAE("Tag")
+C.Ea=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.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.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)
+C.Jny=H.K('U4')
+C.B10=new K.vly()
+C.PC=new A.A2(!1)
+C.cs=I.uL([C.B10,C.PC])
+C.V0=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.cs)
 C.kY=new H.tx("ref")
-C.SXK=H.Kxv('qC')
-C.rT=new A.ES(C.kY,C.BM,!1,C.SXK,!1,C.ucP)
-C.Zg=new H.tx("args")
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.jJ=H.K('qC')
+C.rT=new A.ES(C.kY,C.BM,!1,C.jJ,!1,C.cs)
+C.mi=new H.tx("text")
+C.yE=H.K('I')
+C.VB=new A.ES(C.mi,C.BM,!1,C.yE,!1,C.cs)
+C.Z=new H.tx("args")
+C.b7=new A.ES(C.Z,C.BM,!1,C.jJ,!1,C.cs)
 C.SR=new H.tx("map")
-C.MR1=H.Kxv('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
+C.BY=H.K('vO')
+C.S9=new A.ES(C.SR,C.BM,!1,C.BY,!1,C.cs)
+C.aH=new H.tx("displayCutoff")
+C.J19=new K.iv()
+C.y0=I.uL([C.B10,C.J19])
+C.Ei=new A.ES(C.aH,C.BM,!1,C.yE,!1,C.y0)
 C.ld=new H.tx("events")
-C.Gsc=H.Kxv('wn')
-C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.ucP)
-C.aP=new H.tx("active")
-C.Ow=H.Kxv('SQ')
-C.oh=new A.ES(C.aP,C.BM,!1,C.Ow,!1,C.ucP)
+C.Gsc=H.K('wn')
+C.Gw=new A.ES(C.ld,C.BM,!1,C.Gsc,!1,C.cs)
+C.Gs=new H.tx("sampleCount")
+C.Wq=new A.ES(C.Gs,C.BM,!1,C.yE,!1,C.y0)
+C.Dj=new H.tx("refreshTime")
+C.kA=new A.ES(C.Dj,C.BM,!1,C.yE,!1,C.y0)
+C.S=new H.tx("active")
+C.nd=H.K('SQ')
+C.oh=new A.ES(C.S,C.BM,!1,C.nd,!1,C.cs)
 C.UL=new H.tx("profileChanged")
-C.yQP=H.Kxv('EH')
-C.xD=I.uLC([])
+C.yQP=H.K('EH')
+C.xD=I.uL([])
 C.bG=new A.ES(C.UL,C.hU,!1,C.yQP,!1,C.xD)
 C.TU=new H.tx("endPosChanged")
 C.Cp=new A.ES(C.TU,C.hU,!1,C.yQP,!1,C.xD)
+C.uX=new H.tx("standaloneVmAddress")
+C.VM=new A.ES(C.uX,C.BM,!1,C.yE,!1,C.cs)
 C.Wm=new H.tx("refChanged")
 C.QW=new A.ES(C.Wm,C.hU,!1,C.yQP,!1,C.xD)
 C.UY=new H.tx("result")
-C.SmN=H.Kxv('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
+C.Ct=H.K('af')
+C.n6=new A.ES(C.UY,C.BM,!1,C.Ct,!1,C.cs)
 C.SA=new H.tx("lines")
-C.hAX=H.Kxv('WO')
-C.J19=new K.iv()
-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.lY,!1,C.ucP)
+C.zJ=H.K('WO')
+C.KI=new A.ES(C.SA,C.BM,!1,C.zJ,!1,C.y0)
 C.mr=new H.tx("expanded")
-C.iz=new A.ES(C.mr,C.BM,!1,C.Ow,!1,C.esx)
+C.iz=new A.ES(C.mr,C.BM,!1,C.nd,!1,C.y0)
 C.VI=new H.tx("line")
-C.lhY=H.Kxv('c2')
-C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.ucP)
+C.lhY=H.K('c2')
+C.w6=new A.ES(C.VI,C.BM,!1,C.lhY,!1,C.cs)
 C.IT=new H.tx("startPos")
-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.lY,!1,C.ucP)
+C.yw=H.K('KN')
+C.NL=new A.ES(C.IT,C.BM,!1,C.yw,!1,C.cs)
 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)
+C.Q56=H.K('uq')
+C.Kk=new A.ES(C.fn,C.BM,!1,C.Q56,!1,C.cs)
+C.zU=new H.tx("uncheckedText")
+C.OS=new A.ES(C.zU,C.BM,!1,C.yE,!1,C.cs)
+C.PM=new H.tx("status")
+C.Jr=new A.ES(C.PM,C.BM,!1,C.yE,!1,C.y0)
 C.QK=new H.tx("qualified")
-C.P9=new A.ES(C.QK,C.BM,!1,C.Ow,!1,C.ucP)
+C.P9=new A.ES(C.QK,C.BM,!1,C.nd,!1,C.cs)
 C.tf=new H.tx("selectedMetric")
-C.cdY=H.Kxv('YX')
-C.q6=new A.ES(C.tf,C.BM,!1,C.cdY,!1,C.esx)
+C.cdY=H.K('YX')
+C.q6=new A.ES(C.tf,C.BM,!1,C.cdY,!1,C.y0)
 C.XA=new H.tx("cls")
-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.lY,!1,C.esx)
+C.Ks=H.K('dy')
+C.dq=new A.ES(C.XA,C.BM,!1,C.Ks,!1,C.cs)
 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.lY,!1,C.ucP)
+C.S8=H.K('bv')
+C.xY=new A.ES(C.rB,C.BM,!1,C.S8,!1,C.y0)
 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")
 C.Ml=new A.ES(C.CG,C.hU,!1,C.yQP,!1,C.xD)
 C.yh=new H.tx("error")
-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.lY,!1,C.esx)
+C.oUD=H.K('N7')
+C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.cs)
 C.oj=new H.tx("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
+C.GT=new A.ES(C.oj,C.BM,!1,C.BY,!1,C.cs)
 C.td=new H.tx("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
+C.Zk=new A.ES(C.td,C.BM,!1,C.Ct,!1,C.cs)
 C.pD=new H.tx("target")
-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.lY,!1,C.esx)
-C.FQ=new H.tx("scriptHeight")
-C.OS=new A.ES(C.FQ,C.BM,!1,C.lY,!1,C.esx)
+C.NBK=H.K('Z5')
+C.Gz=new A.ES(C.pD,C.BM,!1,C.NBK,!1,C.cs)
+C.t6=new H.tx("mapAsString")
+C.Hk=new A.ES(C.t6,C.BM,!1,C.yE,!1,C.y0)
 C.vp=new H.tx("list")
-C.Rz=new A.ES(C.vp,C.BM,!1,C.hAX,!1,C.ucP)
+C.Rz=new A.ES(C.vp,C.BM,!1,C.zJ,!1,C.cs)
+C.P=new H.tx("anchor")
+C.TE=new A.ES(C.P,C.BM,!1,C.yE,!1,C.cs)
 C.uO=new H.tx("inboundReferences")
-C.JT=new A.ES(C.uO,C.BM,!1,C.MR1,!1,C.ucP)
+C.JT=new A.ES(C.uO,C.BM,!1,C.BY,!1,C.cs)
 C.B0=new H.tx("expand")
-C.iH=new A.ES(C.B0,C.BM,!1,C.Ow,!1,C.ucP)
+C.iH=new A.ES(C.B0,C.BM,!1,C.nd,!1,C.cs)
 C.ba=new H.tx("pollPeriodChanged")
-C.kQ=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
+C.yV=new A.ES(C.ba,C.hU,!1,C.yQP,!1,C.xD)
 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.lY,!1,C.esx)
 C.EP=new H.tx("page")
-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.VW=H.K('JM')
+C.db=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.cs)
+C.zz=new H.tx("timeSpan")
+C.mb=new A.ES(C.zz,C.BM,!1,C.yE,!1,C.y0)
+C.CZi=H.K('cn')
+C.tO=new A.ES(C.yh,C.BM,!1,C.CZi,!1,C.cs)
 C.Ys=new H.tx("pad")
-C.Cg=new A.ES(C.Ys,C.BM,!1,C.Ow,!1,C.ucP)
+C.Cg=new A.ES(C.Ys,C.BM,!1,C.nd,!1,C.cs)
 C.nr=new H.tx("context")
-C.cL5=H.Kxv('lI')
-C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.ucP)
+C.cL5=H.K('lI')
+C.BO=new A.ES(C.nr,C.BM,!1,C.cL5,!1,C.cs)
 C.WQ=new H.tx("field")
-C.n8S=H.Kxv('xB')
-C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.ucP)
+C.n8S=H.K('xB')
+C.on=new A.ES(C.WQ,C.BM,!1,C.n8S,!1,C.cs)
 C.qX=new H.tx("fragmentationChanged")
 C.dO=new A.ES(C.qX,C.hU,!1,C.yQP,!1,C.xD)
 C.UX=new H.tx("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
+C.Pt=new A.ES(C.UX,C.BM,!1,C.BY,!1,C.cs)
 C.rP=new H.tx("mapChanged")
 C.Nt=new A.ES(C.rP,C.hU,!1,C.yQP,!1,C.xD)
 C.kB=new H.tx("metric")
-C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.ucP)
+C.nq=new A.ES(C.kB,C.BM,!1,C.cdY,!1,C.cs)
 C.nf=new H.tx("function")
-C.QJ7=H.Kxv('Kp')
-C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.ucP)
-C.NK=new H.tx("activeFrame")
-C.ZX=new A.ES(C.NK,C.BM,!1,C.yw,!1,C.ucP)
+C.QJ7=H.K('Kp')
+C.wR=new A.ES(C.nf,C.BM,!1,C.QJ7,!1,C.cs)
+C.N=new H.tx("activeFrame")
+C.ZX=new A.ES(C.N,C.BM,!1,C.yw,!1,C.cs)
 C.ne=new H.tx("exception")
-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.lY,!1,C.ucP)
+C.Mda=H.K('Ix')
+C.bp=new A.ES(C.ne,C.BM,!1,C.Mda,!1,C.cs)
 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)
+C.M7=H.K('WP')
+C.X4=new A.ES(C.Ve,C.BM,!1,C.M7,!1,C.cs)
 C.nt=new H.tx("startLine")
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.esx)
+C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.y0)
 C.tg=new H.tx("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.esx)
+C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.y0)
+C.eh=new H.tx("lineMode")
+C.IP=new A.ES(C.eh,C.BM,!1,C.yE,!1,C.y0)
 C.vY=new H.tx("currentPos")
-C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.ucP)
+C.ZS=new A.ES(C.vY,C.BM,!1,C.yw,!1,C.cs)
 C.p8=new H.tx("event")
-C.Kp2=H.Kxv('Mk')
-C.uc=new A.ES(C.p8,C.BM,!1,C.Kp2,!1,C.ucP)
+C.x8=H.K('Mk')
+C.uc=new A.ES(C.p8,C.BM,!1,C.x8,!1,C.cs)
 C.rX=new H.tx("stack")
-C.Wp=new A.ES(C.rX,C.BM,!1,C.MR1,!1,C.ucP)
-C.YD=new H.tx("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.lY,!1,C.esx)
+C.Wp=new A.ES(C.rX,C.BM,!1,C.BY,!1,C.cs)
 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.lY,!1,C.esx)
+C.k5=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.y0)
 C.qs=new H.tx("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
+C.MN=new A.ES(C.qs,C.BM,!1,C.BY,!1,C.cs)
 C.QH=new H.tx("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
+C.C4=new A.ES(C.QH,C.BM,!1,C.BY,!1,C.cs)
 C.bk=new H.tx("checked")
-C.NS=new A.ES(C.bk,C.BM,!1,C.Ow,!1,C.ucP)
+C.NS=new A.ES(C.bk,C.BM,!1,C.nd,!1,C.cs)
 C.yL=new H.tx("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
+C.j5=new A.ES(C.yL,C.BM,!1,C.BY,!1,C.cs)
 C.pH=new H.tx("small")
-C.xV=new A.ES(C.pH,C.BM,!1,C.Ow,!1,C.ucP)
+C.xV=new A.ES(C.pH,C.BM,!1,C.nd,!1,C.cs)
 C.Wj=new H.tx("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.mi=new H.tx("text")
-C.eQ=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.ucP)
+C.Ah=new A.ES(C.Wj,C.BM,!1,C.BY,!1,C.cs)
 C.LH=new H.tx("metricChanged")
 C.oB=new A.ES(C.LH,C.hU,!1,C.yQP,!1,C.xD)
 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.lY,!1,C.esx)
-C.PM=new H.tx("status")
-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.lY,!1,C.esx)
-C.lH=new H.tx("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.lY,!1,C.ucP)
+C.fz=new A.ES(C.He,C.BM,!1,C.nd,!1,C.y0)
 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.lW=new A.ES(C.VK,C.BM,!1,C.nd,!1,C.cs)
 C.vs=new H.tx("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.esx)
+C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.y0)
+C.TN=new H.tx("lastServiceGC")
+C.K1=new A.ES(C.TN,C.BM,!1,C.yE,!1,C.y0)
 C.li=new H.tx("startPosChanged")
 C.Tz=new A.ES(C.li,C.hU,!1,C.yQP,!1,C.xD)
 C.ox=new H.tx("countersChanged")
 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.MR1,!1,C.ucP)
-C.GO=new A.ES(C.EP,C.BM,!1,C.wIp,!1,C.esx)
+C.Tt=new A.ES(C.XM,C.BM,!1,C.BY,!1,C.cs)
+C.GO=new A.ES(C.EP,C.BM,!1,C.VW,!1,C.y0)
 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.lY,!1,C.esx)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.cs)
+C.kw=H.K('w')
+C.hS=new A.ES(C.SR,C.BM,!1,C.kw,!1,C.cs)
+C.Zi=new H.tx("lastAccumulatorReset")
+C.vC=new A.ES(C.Zi,C.BM,!1,C.yE,!1,C.y0)
+C.hf=new H.tx("label")
+C.BT=new A.ES(C.hf,C.BM,!1,C.yE,!1,C.cs)
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.xD)
+C.mJ=new H.tx("color")
+C.Dx=new A.ES(C.mJ,C.BM,!1,C.yE,!1,C.cs)
 C.YT=new H.tx("expr")
-C.wG=H.Kxv('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
+C.wG=H.K('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.cs)
+C.FQ=new H.tx("scriptHeight")
+C.Ow=new A.ES(C.FQ,C.BM,!1,C.yE,!1,C.y0)
 C.yB=new H.tx("instances")
-C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
+C.vZ=new A.ES(C.yB,C.BM,!1,C.BY,!1,C.y0)
 C.jU=new H.tx("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
+C.bw=new A.ES(C.jU,C.BM,!1,C.BY,!1,C.cs)
 C.xS=new H.tx("tagSelectorChanged")
 C.hd=new A.ES(C.xS,C.hU,!1,C.yQP,!1,C.xD)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
+C.RU=new A.ES(C.rB,C.BM,!1,C.S8,!1,C.cs)
+C.nH=new A.ES(C.mi,C.BM,!1,C.yE,!1,C.y0)
 C.uu=new H.tx("internal")
-C.NJ=new A.ES(C.uu,C.BM,!1,C.Ow,!1,C.ucP)
+C.NJ=new A.ES(C.uu,C.BM,!1,C.nd,!1,C.cs)
 C.YE=new H.tx("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.tx("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.lY,!1,C.esx)
+C.Wl=new A.ES(C.YE,C.BM,!1,C.BY,!1,C.cs)
 C.Gr=new H.tx("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
+C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.cs)
+C.bE=new H.tx("sampleDepth")
+C.Dh=new A.ES(C.bE,C.BM,!1,C.yE,!1,C.y0)
 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.lY,!1,C.ucP)
+C.U0P=H.K('wv')
+C.BP=new A.ES(C.RJ,C.BM,!1,C.U0P,!1,C.cs)
 C.PX=new H.tx("script")
-C.KB=H.Kxv('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
+C.c3=H.K('vx')
+C.jz=new A.ES(C.PX,C.BM,!1,C.c3,!1,C.cs)
 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.MR1,!1,C.ucP)
-C.i4=new H.tx("code")
-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)
-C.kI=new H.tx("currentLine")
-C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.esx)
-C.kG=new H.tx("classTable")
-C.m7I=H.Kxv('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.m7I,!1,C.esx)
-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.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")
-C.aj=new A.ES(C.S4,C.BM,!1,C.Ow,!1,C.esx)
-C.TI=new H.tx("showConsole")
-C.NU=new A.ES(C.TI,C.BM,!1,C.Ow,!1,C.ucP)
-C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.esx)
-C.am=new H.tx("chromeTargets")
-C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.esx)
+C.lH=new H.tx("checkedText")
+C.M6=new A.ES(C.lH,C.BM,!1,C.yE,!1,C.cs)
 C.oE=new H.tx("chromiumAddress")
-C.r2=new A.ES(C.oE,C.BM,!1,C.lY,!1,C.ucP)
+C.py=new A.ES(C.oE,C.BM,!1,C.yE,!1,C.cs)
+C.o0=new A.ES(C.vp,C.BM,!1,C.BY,!1,C.cs)
+C.i4=new H.tx("code")
+C.pM=H.K('kx')
+C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.cs)
+C.nE=new H.tx("tracer")
+C.CS=H.K('KZ')
+C.FM=new A.ES(C.nE,C.BM,!1,C.CS,!1,C.cs)
+C.kI=new H.tx("currentLine")
+C.Bf=new A.ES(C.kI,C.BM,!1,C.yw,!1,C.y0)
+C.kG=new H.tx("classTable")
+C.cz=H.K('UC')
+C.Pr=new A.ES(C.kG,C.BM,!1,C.cz,!1,C.y0)
+C.uk=new H.tx("last")
+C.rY=new A.ES(C.uk,C.BM,!1,C.nd,!1,C.cs)
+C.OO=new H.tx("flag")
+C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.cs)
+C.S4=new H.tx("busy")
+C.aj=new A.ES(C.S4,C.BM,!1,C.nd,!1,C.y0)
+C.TI=new H.tx("showConsole")
+C.NU=new A.ES(C.TI,C.BM,!1,C.nd,!1,C.cs)
+C.O9=new H.tx("pollPeriod")
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.y0)
+C.am=new H.tx("chromeTargets")
+C.JD=new A.ES(C.am,C.BM,!1,C.Gsc,!1,C.y0)
+C.A7=new H.tx("height")
+C.cD=new A.ES(C.A7,C.BM,!1,C.yE,!1,C.cs)
+C.U=new H.tx("callback")
+C.Fyq=H.K('Sa')
+C.k1=new A.ES(C.U,C.BM,!1,C.Fyq,!1,C.cs)
+C.TW=new H.tx("tagSelector")
+C.B3=new A.ES(C.TW,C.BM,!1,C.yE,!1,C.y0)
 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")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
+C.f0=new A.ES(C.Mc,C.BM,!1,C.BY,!1,C.cs)
+C.kV=new H.tx("link")
+C.RZ=new A.ES(C.kV,C.BM,!1,C.yE,!1,C.cs)
 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.lY,!1,C.ucP)
-C.ngm=I.uLC([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nqy,!1,C.ngm)
-C.yV=new A.ES(C.mi,C.BM,!1,C.lY,!1,C.esx)
+C.B7=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.cs)
+C.Gp=I.uL([C.J19])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.Gp)
+C.YD=new H.tx("sampleRate")
+C.bl=new A.ES(C.YD,C.BM,!1,C.yE,!1,C.y0)
 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)
+C.Qc=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.cs)
+C.TO=new A.ES(C.kY,C.BM,!1,C.Ct,!1,C.cs)
 C.uG=new H.tx("linesReady")
-C.Df=new A.ES(C.uG,C.BM,!1,C.Ow,!1,C.esx)
-C.IBq=H.Kxv('T8')
-C.xR=new A.ES(C.SR,C.BM,!1,C.IBq,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
+C.Df=new A.ES(C.uG,C.BM,!1,C.nd,!1,C.y0)
+C.Qp=new A.ES(C.U,C.BM,!1,C.wG,!1,C.cs)
 C.vb=new H.tx("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!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.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.rt=H.VM(new W.FkO("keydown"),[W.AD])
-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.Mq=new A.ES(C.vb,C.BM,!1,C.BY,!1,C.cs)
+C.KK=new A.ES(C.uO,C.BM,!1,C.Gsc,!1,C.y0)
+C.RT=new P.a6(0)
+C.eL=new P.moY(!1)
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -23895,77 +23149,80 @@
 }
 C.Vu=function(_, letter) { return letter.toUpperCase(); }
 C.xr=new P.byg(null,null)
-C.A3=new P.c5(null)
-C.cb=new P.ojF(null,null)
-C.EkO=new N.Ng("FINER",400)
-C.t4=new N.Ng("FINE",500)
+C.A3=new P.Mx(null)
+C.Sr=new P.ojF(null,null)
+C.Ab=new N.Ng("FINER",400)
+C.R5=new N.Ng("FINE",500)
 C.IF=new N.Ng("INFO",800)
-C.oOA=new N.Ng("OFF",2000)
+C.oO=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.Q5=I.uLC([1,6])
-C.rz=I.uLC([0,0,32776,33792,1,10240,0,0])
+C.Gb=H.J(I.uL([127,2047,65535,1114111]),[P.KN])
+C.jb=I.uL([1,6])
+C.rz=I.uL([0,0,32776,33792,1,10240,0,0])
 C.SY=new H.tx("keys")
 C.l4=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-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.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.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.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.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.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.Rj=I.uLC(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.Rj)
-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.WK=I.uL([C.SY,C.l4,C.Wn,C.ai,C.nZ])
+C.o5=I.uL([0,0,65490,45055,65535,34815,65534,18431])
+C.fW=H.J(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.I])
+C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
+C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
+C.bT=new H.tx("attribute")
+C.nx=I.uL([C.bT])
+C.lw=H.K('iv')
+C.fo=I.uL([C.lw])
+C.ip=I.uL(["==","!=","<=",">=","||","&&"])
+C.oP=I.uL(["as","in","this"])
+C.jx=I.uL([0,0,32722,12287,65534,34815,65534,18431])
+C.Jp=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.kg=I.uL([0,0,24576,1023,65534,34815,65534,18431])
+C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
+C.ZJ=I.uL([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uL([0,0,32722,12287,65535,34815,65534,18431])
+C.ML=I.uL([40,41,91,93,123,125])
+C.bm=I.uL(["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.bm)
+C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.lyV=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.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
+C.pv=new H.LPe(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+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.Y1)
+C.MEG=I.uL(["enumerate"])
 C.mB=new H.LPe(1,{enumerate:K.HZg()},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.m8=new A.rv(!0,!0,!0,C.tq,!1,!1,C.Qnw,null)
-C.jUO=H.Kxv('xn')
-C.erP=I.uLC([C.jUO])
-C.V4=new A.rv(!0,!0,!0,C.tq,!1,!1,C.erP,null)
+C.tq=H.K('Bo')
+C.eq=H.K('we')
+C.VLY=I.uL([C.eq])
+C.SM=new A.yM(!1,!1,!0,C.tq,!1,!0,C.VLY,null)
+C.iI=H.K('Sh')
+C.o2y=I.uL([C.iI])
+C.h5=new A.yM(!0,!0,!0,C.tq,!1,!1,C.o2y,null)
+C.Vm=H.K('A2')
+C.RN=I.uL([C.Vm])
+C.BK=new A.yM(!0,!0,!0,C.tq,!1,!1,C.RN,null)
 C.wj=new D.M9x("Internal")
 C.Cn=new D.M9x("Listening")
 C.lT=new D.M9x("Normal")
 C.FJ=new D.M9x("Pipe")
-C.BE=new H.tx("averageCollectionPeriodInMillis")
-C.IH=new H.tx("address")
-C.j2=new H.tx("app")
-C.US=new H.tx("architecture")
-C.Wq=new H.tx("asStringLiteral")
+C.T=new H.tx("averageCollectionPeriodInMillis")
+C.X=new H.tx("address")
+C.V=new H.tx("app")
+C.hb=new H.tx("architectureBits")
+C.W=new H.tx("asStringLiteral")
 C.ET=new H.tx("assertsEnabled")
-C.WC=new H.tx("bpt")
+C.M=new H.tx("bpt")
 C.hR=new H.tx("breakpoint")
-C.Ro=new H.tx("buttonClick")
+C.R=new H.tx("buttonClick")
 C.hN=new H.tx("bytes")
 C.Ka=new H.tx("call")
 C.bV=new H.tx("capacity")
 C.C0=new H.tx("change")
 C.eZ=new H.tx("changeSort")
+C.q3=new H.tx("children")
 C.OI=new H.tx("classes")
 C.Wt=new H.tx("clazz")
 C.I9=new H.tx("closeItem")
@@ -23977,6 +23234,7 @@
 C.p1=new H.tx("columns")
 C.yJ=new H.tx("connectStandalone")
 C.la=new H.tx("connectToVm")
+C.o9=new H.tx("count")
 C.Je=new H.tx("current")
 C.RG=new H.tx("currentPage")
 C.hJ=new H.tx("dartMetrics")
@@ -24011,7 +23269,7 @@
 C.VF=new H.tx("formattedExclusive")
 C.uU=new H.tx("formattedExclusiveTicks")
 C.YJ=new H.tx("formattedInclusive")
-C.eF=new H.tx("formattedInclusiveTicks")
+C.EF=new H.tx("formattedInclusiveTicks")
 C.oI=new H.tx("formattedLine")
 C.ST=new H.tx("formattedTotalCollectionTime")
 C.EI=new H.tx("functions")
@@ -24026,6 +23284,7 @@
 C.zS=new H.tx("hasDisassembly")
 C.YA=new H.tx("hasNoAllocations")
 C.Ge=new H.tx("hashLinkWorkaround")
+C.Xt=new H.tx("hidden")
 C.im=new H.tx("history")
 C.Ss=new H.tx("hits")
 C.k6=new H.tx("hoverText")
@@ -24052,8 +23311,8 @@
 C.bR=new H.tx("isDouble")
 C.ob=new H.tx("isError")
 C.dR=new H.tx("isFinal")
-C.WV=new H.tx("isFinalized")
-C.tA=new H.tx("isImplemented")
+C.yz=new H.tx("isFinalized")
+C.Ih=new H.tx("isImplemented")
 C.MY=new H.tx("isInlinable")
 C.Wg=new H.tx("isInt")
 C.tD=new H.tx("isList")
@@ -24073,7 +23332,7 @@
 C.b5=new H.tx("jumpTarget")
 C.z6=new H.tx("key")
 C.Lc=new H.tx("kind")
-C.kA=new H.tx("lastTokenPos")
+C.qa=new H.tx("lastTokenPos")
 C.GI=new H.tx("lastUpdate")
 C.ur=new H.tx("lib")
 C.VN=new H.tx("libraries")
@@ -24094,7 +23353,7 @@
 C.BJ=new H.tx("newSpace")
 C.OV=new H.tx("noSuchMethod")
 C.c6=new H.tx("notifications")
-C.jo=new H.tx("objectClass")
+C.as=new H.tx("objectClass")
 C.zO=new H.tx("objectPool")
 C.vg=new H.tx("oldSpace")
 C.Yp=new H.tx("owner")
@@ -24108,7 +23367,7 @@
 C.yG=new H.tx("pauseEvent")
 C.uI=new H.tx("pid")
 C.Jf=new H.tx("possibleBpt")
-C.rm=new H.tx("privateKey")
+C.yt=new H.tx("privateKey")
 C.AY=new H.tx("protocol")
 C.AO=new H.tx("qualifiedName")
 C.Xd=new H.tx("reachable")
@@ -24119,7 +23378,7 @@
 C.KX=new H.tx("refreshCoverage")
 C.ja=new H.tx("refreshGC")
 C.mn=new H.tx("refreshRateChange")
-C.c86=new H.tx("registerCallback")
+C.L9=new H.tx("registerCallback")
 C.ir=new H.tx("relativeLink")
 C.dx=new H.tx("remoteAddress")
 C.ni=new H.tx("remotePort")
@@ -24142,14 +23401,16 @@
 C.Si=new H.tx("slotIsField")
 C.jM=new H.tx("socketOwner")
 C.rd=new H.tx("source")
-C.HO=new H.tx("stacktrace")
+C.Yh=new H.tx("stacktrace")
 C.W5=new H.tx("standalone")
 C.ks=new H.tx("stepInto")
 C.Om=new H.tx("stepOut")
 C.iC=new H.tx("stepOver")
+C.AF=new H.tx("style")
 C.Nv=new H.tx("subclass")
 C.Wo=new H.tx("subclasses")
 C.FZ=new H.tx("superclass")
+C.Bx=new H.tx("targetCPU")
 C.QF=new H.tx("targets")
 C.eO=new H.tx("timeStamp")
 C.hO=new H.tx("tipExclusive")
@@ -24157,6 +23418,7 @@
 C.HK=new H.tx("tipParent")
 C.je=new H.tx("tipTicks")
 C.Ef=new H.tx("tipTime")
+C.eM=new H.tx("title")
 C.QL=new H.tx("toString")
 C.RH=new H.tx("toStringAsFixed")
 C.SP=new H.tx("toggleBreakpoint")
@@ -24164,8 +23426,8 @@
 C.ID=new H.tx("toggleExpanded")
 C.dA=new H.tx("tokenPos")
 C.bc=new H.tx("topFrame")
-C.Jl=new H.tx("totalCollectionTimeInSeconds")
-C.kr=new H.tx("totalSamplesInProfile")
+C.bo=new H.tx("totalCollectionTimeInSeconds")
+C.Kj=new H.tx("totalSamplesInProfile")
 C.ep=new H.tx("tree")
 C.hB=new H.tx("type")
 C.J2=new H.tx("typeChecksEnabled")
@@ -24176,7 +23438,7 @@
 C.Fh=new H.tx("url")
 C.yv=new H.tx("usageCounter")
 C.LP=new H.tx("used")
-C.Gy=new H.tx("userName")
+C.ct=new H.tx("userName")
 C.jh=new H.tx("v")
 C.zd=new H.tx("value")
 C.Db=new H.tx("valueAsString")
@@ -24184,156 +23446,156 @@
 C.fj=new H.tx("variable")
 C.xw=new H.tx("variables")
 C.zn=new H.tx("version")
+C.qo=new H.tx("vmCid")
 C.Sk=new H.tx("vmMetrics")
 C.KS=new H.tx("vmName")
 C.MA=new H.tx("vmType")
 C.Uy=new H.tx("writeClosed")
-C.hP=H.Kxv('uz')
-C.V7=H.Kxv('NF')
-C.Qb=H.Kxv('J3')
-C.Mf=H.Kxv('G1')
-C.q0S=H.Kxv('Dg')
-C.Dl=H.Kxv('F1')
-C.mK=H.Kxv('Mb')
-C.UJ=H.Kxv('oa')
-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.V8=H.Kxv('ts')
-C.Ke=H.Kxv('EZ')
-C.Vx=H.Kxv('MJ')
-C.Vh=H.Kxv('Pz')
-C.rR=H.Kxv('wN')
-C.hM=H.Kxv('AK')
-C.kt=H.Kxv('Um')
-C.yS=H.Kxv('G6')
-C.z7=H.Kxv('Co')
-C.Sb=H.Kxv('kn')
-C.Vc=H.Kxv('a')
-C.Yc=H.Kxv('iP')
-C.kH=H.Kxv('NY')
-C.IZ=H.Kxv('oF')
-C.vw=H.Kxv('UK')
-C.Jo=H.Kxv('i7')
-C.ON=H.Kxv('ov')
-C.jR=H.Kxv('Be')
-C.uC=H.Kxv('Im')
-C.al=H.Kxv('es')
-C.OP=H.Kxv('UZ')
-C.PT=H.Kxv('CX')
-C.iD=H.Kxv('Vb')
-C.ce=H.Kxv('kK')
-C.dD=H.Kxv('av')
-C.FA=H.Kxv('Ya')
-C.PFz=H.Kxv('yyN')
-C.Th=H.Kxv('fI')
-C.cz=H.Kxv('Vf')
-C.tU=H.Kxv('L4')
-C.cK=H.Kxv('I5')
-C.jA=H.Kxv('Eg')
-C.K4=H.Kxv('hV')
-C.Mt=H.Kxv('hu')
-C.ca=H.Kxv('Z4')
-C.pJ=H.Kxv('Q6')
-C.Yy=H.Kxv('uE')
-C.WU=H.Kxv('lf')
-C.nC=H.Kxv('cQ')
-C.JX=H.Kxv('ys')
-C.u9=H.Kxv('yc')
-C.Yxm=H.Kxv('Pg')
-C.il=H.Kxv('xI')
-C.lp=H.Kxv('LU')
-C.u4=H.Kxv('VZ')
-C.oG=H.Kxv('ds')
-C.EG=H.Kxv('Oz')
-C.nw=H.Kxv('eo')
-C.OG=H.Kxv('eW')
-C.km=H.Kxv('fl')
-C.jV=H.Kxv('rF')
-C.rC=H.Kxv('qV')
-C.OZ=H.Kxv('Ce')
-C.Tq=H.Kxv('vj')
-C.ou=H.Kxv('ak')
-C.JW=H.Kxv('Ww')
-C.CT=H.Kxv('St')
-C.wH=H.Kxv('zM')
-C.Mz=H.Kxv('uL')
-C.LT=H.Kxv('md')
-C.Wh=H.Kxv('H8')
-C.Zj=H.Kxv('U1')
-C.FG=H.Kxv('qh')
-C.bC=H.Kxv('D2')
-C.Nw=H.Kxv('vr')
-C.kq=H.Kxv('NT')
-C.a8=H.Kxv('Zx')
-C.Wd=H.Kxv('Hi')
-C.YZ=H.Kxv('zt')
-C.Fn=H.Kxv('qn')
-C.DD=H.Kxv('Zn')
-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.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.wk=H.Kxv('nJ')
-C.Bi=H.Kxv('Tk')
-C.te=H.Kxv('BS')
-C.ms=H.Kxv('Bm')
-C.ws=H.Kxv('Pa')
-C.qJ=H.Kxv('pG')
-C.pK=H.Kxv('Rk')
-C.lE=H.Kxv('DK')
-C.fU=H.Kxv('I2')
-C.Az=H.Kxv('Gk')
-C.GX=H.Kxv('c8')
-C.R9=H.Kxv('f7')
-C.QP=H.Kxv('vi')
-C.X8=H.Kxv('Ti')
-C.Lg=H.Kxv('JI')
-C.Ju=H.Kxv('Ly')
-C.mq=H.Kxv('qk')
-C.XW=H.Kxv('uV')
-C.XWY=H.Kxv('uEY')
-C.oT=H.Kxv('VY')
-C.jK=H.Kxv('el')
+C.hP=H.K('uz')
+C.V7=H.K('NF')
+C.Qb=H.K('J3')
+C.Mf=H.K('G1')
+C.Dl=H.K('F1')
+C.mK=H.K('Mb')
+C.UJ=H.K('oa')
+C.E0=H.K('aI')
+C.Y3=H.K('CY')
+C.QJ=H.K('WG')
+C.ra=H.K('Nn')
+C.j4=H.K('IW')
+C.V8=H.K('ts')
+C.Ke=H.K('EZ')
+C.Vx=H.K('MJ')
+C.Vh=H.K('Pz')
+C.HC=H.K('F0')
+C.rR=H.K('wN')
+C.hM=H.K('AK')
+C.kt=H.K('Um')
+C.yS=H.K('G6')
+C.Sb=H.K('kn')
+C.AP=H.K('a')
+C.Yc=H.K('iP')
+C.kH=H.K('NY')
+C.IZ=H.K('oF')
+C.vw=H.K('UK')
+C.Jo=H.K('i7')
+C.QG=H.K('hh')
+C.ON=H.K('ov')
+C.jR=H.K('Be')
+C.uC=H.K('Im')
+C.al=H.K('es')
+C.PT=H.K('CX')
+C.iD=H.K('Vb')
+C.ce=H.K('kK')
+C.dD=H.K('av')
+C.FA=H.K('Ya')
+C.T1=H.K('Wy')
+C.Th=H.K('fI')
+C.tU=H.K('L4')
+C.yT=H.K('FK')
+C.cK=H.K('I5')
+C.jA=H.K('Eg')
+C.K4=H.K('hV')
+C.Mt=H.K('hu')
+C.hc=H.K('CP')
+C.ca=H.K('Z4')
+C.pJ=H.K('Q6')
+C.Yy=H.K('uE')
+C.JX=H.K('ys')
+C.iN=H.K('yc')
+C.CR=H.K('G0')
+C.il=H.K('xI')
+C.lp=H.K('LU')
+C.u4=H.K('VZ')
+C.oG=H.K('ds')
+C.EG=H.K('Oz')
+C.nw=H.K('eo')
+C.OG=H.K('eW')
+C.hD=H.K('lM')
+C.km=H.K('fl')
+C.jV=H.K('rF')
+C.rC=H.K('qV')
+C.OZ=H.K('Ce')
+C.Ho=H.K('zt')
+C.Tq=H.K('vj')
+C.ou=H.K('ak')
+C.JW=H.K('Ww')
+C.CT=H.K('St')
+C.wH=H.K('zM')
+C.Mz=H.K('uL')
+C.LT=H.K('md')
+C.Wh=H.K('H8')
+C.Zj=H.K('U1')
+C.FG=H.K('qh')
+C.bC=H.K('D2')
+C.Nw=H.K('vr')
+C.kq=H.K('NT')
+C.a8=H.K('Zx')
+C.Wd=H.K('Hi')
+C.Fn=H.K('qn')
+C.DD=H.K('Zn')
+C.Ev=H.K('Un')
+C.Ey=H.K('wM')
+C.pF=H.K('WS')
+C.qZ=H.K('DE')
+C.jw=H.K('xc')
+C.NW=H.K('ye')
+C.pi=H.K('FB')
+C.Xv=H.K('n5')
+C.KO=H.K('ZP')
+C.he=H.K('qM')
+C.Wz=H.K('pR')
+C.tc=H.K('Ma')
+C.Io=H.K('Qh')
+C.Qt=H.K('NK')
+C.wk=H.K('nJ')
+C.Bi=H.K('Tk')
+C.te=H.K('BS')
+C.ms=H.K('Bm')
+C.ws=H.K('Pa')
+C.It=H.K('IH')
+C.qJ=H.K('pG')
+C.pK=H.K('Rk')
+C.lE=H.K('DK')
+C.fU=H.K('I2')
+C.Az=H.K('Gk')
+C.GX=H.K('c8')
+C.R9=H.K('f7')
+C.J0=H.K('vi')
+C.X8=H.K('Ti')
+C.Lg=H.K('JI')
+C.Ju=H.K('Ly')
+C.mq=H.K('qk')
+C.XW=H.K('uV')
+C.oT=H.K('VY')
+C.jK=H.K('el')
 C.xM=new P.u5F(!1)
-C.NA=new P.Uf(C.fQ,P.RN())
-C.Xk=new P.Uf(C.fQ,P.Dk())
-C.F6=new P.Uf(C.fQ,P.VbA())
-C.Rt=new P.Uf(C.fQ,P.wLZ())
-C.Sq=new P.Uf(C.fQ,P.zci())
-C.mc=new P.Uf(C.fQ,P.OjX())
-C.uo=new P.Uf(C.fQ,P.uy1())
-C.pj=new P.Uf(C.fQ,P.W7())
-C.lk=new P.Uf(C.fQ,P.qKH())
-C.zf=new P.Uf(C.fQ,P.xd())
-C.Yl=new P.Uf(C.fQ,P.pl())
-C.Zc=new P.Uf(C.fQ,P.yA())
-C.zb=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
-$.libraries_to_load = {}
+C.rj=new P.Ls(C.fQ,P.CDt())
+C.Xk=new P.Ls(C.fQ,P.Dkr())
+C.pm=new P.Ls(C.fQ,P.tLD())
+C.TP=new P.Ls(C.fQ,P.wLZ())
+C.Sq=new P.Ls(C.fQ,P.zci())
+C.QE=new P.Ls(C.fQ,P.vxv())
+C.mc=new P.Ls(C.fQ,P.Wk())
+C.uo=new P.Ls(C.fQ,P.hI())
+C.pj=new P.Ls(C.fQ,P.eF())
+C.Fj=new P.Ls(C.fQ,P.AIG())
+C.Gu=new P.Ls(C.fQ,P.iy())
+C.Yl=new P.Ls(C.fQ,P.O5z())
+C.Zc=new P.Ls(C.fQ,P.yA())
+C.z3=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null,null)
+init.isHunkLoaded=function(a){return!!$dart_deferred_initializers[a]}
+init.initializeLoadedHunk=function(a){$dart_deferred_initializers[a](S0u,$)}
+init.deferredLibraryUris={}
+init.deferredLibraryHashes={}
 $.VzC=null
 $.tye=1
-$.H9="$cachedFunction"
+$.z7="$cachedFunction"
 $.Mr="$cachedInvocation"
 $.xG=null
-$.hG=null
+$.Zg=null
 $.OK=0
-$.mJs=null
+$.bf=null
 $.P4=null
 $.lcs=!1
 $.dZ=null
@@ -24342,7 +23604,7 @@
 $.q4=null
 $.vv=null
 $.Bv=null
-$.Kh=null
+$.Pi=null
 $.NR=null
 $.oK=null
 $.S6=null
@@ -24351,7 +23613,7 @@
 $.v5=!1
 $.X3=C.fQ
 $.Cb=null
-$.Km=0
+$.Kc=0
 $.Ji=null
 $.Qz=null
 $.EM=null
@@ -24361,113 +23623,120 @@
 $.RL=!1
 $.DR=C.IF
 $.xO=0
-$.Nc=0
+$.dL=0
 $.Oo=null
 $.Td=!1
-$.jq1=0
+$.qF=0
 $.ljh=1
-$.ls=2
+$.H2=2
 $.rf=null
 $.ok=!1
-$.HE=!1
-$.M6=null
+$.DG=!1
+$.MU=null
 $.UG=!0
 $.RQ="objects/"
-$.vU=null
-$.Xa=null
-$.ax=null
-$.AuW=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.V7,O.NF,{created:O.eqi},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.KTC},C.j4,D.IW,{created:D.dmb},C.V8,O.ts,{created:O.wy},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.hM,O.AK,{created:O.rV},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.VHR},C.z7,A.Co,{created:A.Xii},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.JX,O.ys,{created:O.Jt},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.dH},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.vle},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.zga},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.n5p},C.Nw,T.vr,{created:T.aed},C.kq,L.NT,{created:L.di},C.a8,A.Zx,{created:A.yno},C.Wd,O.Hi,{created:O.Uo},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.O3},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.hGU},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.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.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}]
+$.v8=null
+$.Hg=null
+$.hm=null
+$.uv=[C.tq,W.Bo,{},C.hP,E.uz,{created:E.z1},C.V7,O.NF,{created:O.eqi},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8h},C.Dl,V.F1,{created:V.JT8},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.zr},C.V8,O.ts,{created:O.wy},C.Ke,Z.EZ,{created:Z.CoW},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.wZ7},C.hM,O.AK,{created:O.Rzb},C.kt,U.Um,{created:U.T21},C.yS,B.G6,{created:B.t4},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.T5i},C.jR,F.Be,{created:F.FeK},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.osd},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.P5Z},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cFd},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.egu},C.JX,O.ys,{created:O.RIs},C.CR,Y.G0,{created:Y.Ifw},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.zga},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.iLU},C.a8,A.Zx,{created:A.zC},C.Wd,O.Hi,{created:O.kQ},C.Fn,N.qn,{created:N.hYg},C.DD,E.Zn,{created:E.kf},C.Ey,A.wM,{created:A.ZTA},C.pF,E.WS,{created:E.l5},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.iO},C.KO,F.ZP,{created:F.hGU},C.he,E.qM,{created:E.TEI},C.Wz,B.pR,{created:B.luW},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.kgI},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rpj},C.Bi,G.Tk,{created:G.WF},C.te,N.BS,{created:N.p71},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.It,E.IH,{created:E.O0h},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.E5W},C.fU,N.I2,{created:N.rI3},C.Az,A.Gk,{created:A.cYO},C.R9,Q.f7,{created:Q.wzV},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.fRK},C.Ju,K.Ly,{created:K.EDe},C.mq,L.qk,{created:L.Qtp},C.XW,T.uV,{created:T.CvM},C.oT,O.VY,{created:O.E3U},C.jK,U.el,{created:U.oHO}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","qv",function(){return H.VM(new P.qo(null),[P.KN])})
+I.$lazy($,"workerIds","rS","AW",function(){return H.J(new P.nj(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","xq","bN",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","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Y9",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.v4("isolates/.*/metrics",!1,!0,!1),null,null)})
-I.$lazy($,"_isolateMatcher","HH","clJ",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($,"_completer","IQ","Ib",function(){return H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[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","AG",function(){return new H.VR("isolates/.*/",H.Vq("isolates/.*/",!1,!0,!1),null,null)})
+I.$lazy($,"POLL_PERIODS","Bw","yO",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","OL",function(){return P.YM(null,null,null,null,null)})
+I.$lazy($,"_rootMap","ln","wb",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($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return H.Za("_$dart_dartObject")})
+I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return H.Za("_$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","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","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","dY","RZ",function(){return new L.vH([])})
-I.$lazy($,"_identRegExp","pVY","cx",function(){return new L.lPa().$0()})
+I.$lazy($,"_freeColor","nK","Su",function(){return[255,255,255,255]})
+I.$lazy($,"_pageSeparationColor","Uw","v2",function(){return[0,0,0,255]})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.A(P.I,N.TJ)})
+I.$lazy($,"_logger","y7","aT",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","HS","Nc",function(){return new L.vH([])})
+I.$lazy($,"_identRegExp","fZ","EN",function(){return new L.MdQ().$0()})
 I.$lazy($,"_logger","y7Y","Nd",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","BT","lQ",function(){return P.L5(null,null,null,P.qU,P.Lz)})
-I.$lazy($,"_declarations","Ej","vu",function(){return P.L5(null,null,null,P.qU,A.So)})
-I.$lazy($,"_hasShadowDomPolyfill","Yx","Snm",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","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","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","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","FR","ek",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.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(),"|",new K.w28()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w10(),"-",new K.w11(),"!",new K.w12()],null,null)})
+I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.I,L.Tv)})
+I.$lazy($,"_polymerSyntax","Kb","Cl",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_OBSERVATION_BLACKLIST","Il","js",function(){var z=P.Ca(null,null,null,null)
+z.FV(0,C.nx)
+return z})
+I.$lazy($,"_PROPERTY_NAME_BLACKLIST","x9","c0",function(){var z=P.Ca(null,null,null,null)
+z.FV(0,[C.q3,C.Yb,C.Xt,C.AF,C.eM,C.OI])
+return z})
+I.$lazy($,"_typesByName","ly","lC",function(){return P.L5(null,null,null,P.I,P.UU)})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.I,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","PR","oo",function(){return $.Xw().Bm("ShadowDOMPolyfill")})
+I.$lazy($,"_ShadowCss","qP","lx",function(){var z=$.ev()
+return z!=null?J.Tf(z,"ShadowCSS"):null})
+I.$lazy($,"_sheetLog","pe","eU",function(){return N.QM("polymer.stylesheet")})
+I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.yM(!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($,"_WebComponents","rW","ev",function(){return J.Tf($.Xw(),"WebComponents")})
+I.$lazy($,"_Polymer","kz","uj",function(){return J.Tf($.Xw(),"Polymer")})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.Vq("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_onReady","T8g","j6",function(){return H.J(new P.Zf(H.J(new P.Gc(0,$.X3,null),[null])),[null])})
+I.$lazy($,"_observeLog","WH","FX",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","mf","Uk",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","zG",function(){return N.QM("polymer.ready")})
+I.$lazy($,"_PolymerGestures","Yd","Op",function(){return J.Tf($.Xw(),"PolymerGestures")})
+I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
+I.$lazy($,"_typeHandlers","lq","RO",function(){return P.B([C.yE,new Z.DO(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.nd,new Z.Ra(),C.yw,new Z.wJY(),C.hc,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","HfW","RTI",function(){return P.B(["+",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(),"|",new K.w25()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.B(["+",new K.lPa(),"-",new K.Ufa(),"!",new K.Raa()],null,null)})
 I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",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($,"_currentIsolateMatcher","tV","Gi",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.r2("function")})
+I.$lazy($,"kClosureFunction","jX","HU",function(){return new D.r2("closure function")})
+I.$lazy($,"kGetterFunction","PZ","rQ",function(){return new D.r2("getter function")})
+I.$lazy($,"kSetterFunction","Bs","en",function(){return new D.r2("setter function")})
+I.$lazy($,"kConstructor","G8","kj",function(){return new D.r2("constructor")})
+I.$lazy($,"kImplicitGetterFunction","xs","d9",function(){return new D.r2("implicit getter function")})
+I.$lazy($,"kImplicitSetterFunction","ab","AH",function(){return new D.r2("implicit setter function")})
+I.$lazy($,"kStaticInitializer","Sp","aC",function(){return new D.r2("static initializer")})
+I.$lazy($,"kMethodExtractor","Pc","kL",function(){return new D.r2("method extractor")})
+I.$lazy($,"kNoSuchMethodDispatcher","Ll","E7",function(){return new D.r2("noSuchMethod dispatcher")})
+I.$lazy($,"kInvokeFieldDispatcher","fJ","bh",function(){return new D.r2("invoke field dispatcher")})
+I.$lazy($,"kCollected","bt","Ps",function(){return new D.r2("Collected")})
+I.$lazy($,"kNative","dQ","Nk",function(){return new D.r2("Native")})
+I.$lazy($,"kTag","Oq","PY",function(){return new D.r2("Tag")})
+I.$lazy($,"kReused","Gh","dh",function(){return new D.r2("Reused")})
+I.$lazy($,"kUNKNOWN","XK","h4",function(){return new D.r2("UNKNOWN")})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","II",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-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","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","fT0",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])})
+I.$lazy($,"_DEFAULT","ac","Bu",function(){return new M.VE(null)})
+I.$lazy($,"_contentsOwner","Ub","B8",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_ownerStagingDocument","kR","p2",function(){return H.J(new P.nj(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","fT0",function(){return new M.DOe().$0()})
+I.$lazy($,"_instanceExtension","nB","nR",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_isStagingDocument","Fg","Tg",function(){return H.J(new P.nj(null),[null])})
+I.$lazy($,"_expando","fF","rw",function(){return H.J(new P.nj("template_binding"),[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.dX,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"T9",void:true}]},"duration","callback",{func:"zk",ret:P.dX,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"JX",void:true,args:[P.dX]}]},{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:"vQ",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",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"Tw",args:[P.a]},{func:"YP",void:true,opt:[null]},{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:"N5B",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",{func:"c0r",args:[W.AD]},{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:"hNI",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:"T2k",void:true,args:[P.qU,L.nm]},{func:"Riv",args:[P.V2]},{func:"T3G",args:[P.qU,L.nm]},"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","targets",];$=null
+
+init.metadata=[{func:"I0",ret:P.I},{func:"kl",void:true},"object","sender","e",{func:"WD",args:[P.I]},{func:"f9",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.I,args:[P.KN]},"bytes",{func:"ju",ret:P.I,args:[null]},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"Se",void:true,args:[null]},"value",{func:"Vx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.JBS,P.e4y,P.JBS,null,P.BpP]},"self","parent","zone",{func:"LE",args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},"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:"rl",ret:{func:"NT"},args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"ms",ret:{func:"aB",args:[null]},args:[P.JBS,P.e4y,P.JBS,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.JBS,P.e4y,P.JBS,{func:"bh",args:[null,null]}]},{func:"Lr",ret:P.OH,args:[P.JBS,P.e4y,P.JBS,P.a,P.BpP]},{func:"iV",void:true,args:[P.JBS,P.e4y,P.JBS,{func:"NT"}]},{func:"oo",ret:P.kWp,args:[P.JBS,P.e4y,P.JBS,P.a6,{func:"kl",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:"Zb",void:true,args:[P.JBS,P.e4y,P.JBS,P.I]},"line",{func:"xM",void:true,args:[P.I]},{func:"Nf",ret:P.JBS,args:[P.JBS,P.e4y,P.JBS,P.n7,P.w]},"specification","zoneValues",{func:"BT",ret:P.SQ,args:[null,null]},{func:"bX",ret:P.KN,args:[null]},"a",{func:"uJ",ret:P.a,args:[null]},{func:"Dl",ret:P.KN,args:[P.fRn,P.fRn]},"b",{func:"I8",ret:P.SQ,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"jn",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.SQ,args:[P.IN]},"symbol","v",{func:"qC",ret:U.rN,args:[P.I]},{func:"ZU",args:[U.rN,null],named:{globals:[P.w,P.I,P.a],oneTime:null}},!1,{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable",{func:"dR",ret:P.KN,args:[D.af,D.af]},"invocation","fractionDigits",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.I,null]},{func:"TS",args:[null,P.I]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"zZ",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.f5]},"obj","i","responseText",{func:"vB",args:[L.Z5,L.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Hj",ret:P.I,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.z2]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.I]},"text",{func:"fn",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"le",args:[D.uq]},{func:"pt",void:true,args:[W.ea,null,W.KV]},{func:"x6",args:[D.kx]},{func:"MN",void:true,args:[P.SQ,P.EH]},"expand","onDone","result",{func:"Qe",void:true,args:[P.EH]},{func:"xe",args:[{func:"kl",void:true}]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"rf",args:[P.a]},{func:"Qk",void:true,opt:[null]},{func:"yV",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:"bb",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each",0,{func:"DR",ret:P.KN,args:[null,P.KN]},{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"SP",ret:P.KN,args:[P.I]},{func:"u8",ret:P.CP,args:[P.I]},{func:"N4",ret:P.SQ,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"lu",void:true,args:[P.I],opt:[null]},"xhr","func",{func:"PK",args:[W.vn]},{func:"bB",void:true,args:[W.v3]},{func:"Me",args:[D.af]},{func:"IS",ret:O.na},"response","st",{func:"Mg",void:true,args:[D.vO]},"newProfile",{func:"xo",ret:P.I,args:[P.SQ]},"newSpace",{func:"Z5",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"YE",ret:P.QV,args:[{func:"WD",args:[P.I]}]},{func:"IA",ret:P.QV,args:[{func:"uW",ret:P.QV,args:[P.I]}]},"s","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IMM",args:[N.HV]},{func:"d4C",void:true,args:[W.v3,null,W.z2]},{func:"zs",ret:P.I,args:[P.I]},"url",{func:"nxg",ret:P.I,args:[P.CP]},"time",{func:"FJ",ret:P.I,args:[P.I],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:"Bd",args:[L.Tv,null]},"model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"cC",void:true,args:[P.I,P.I]},{func:"aA",void:true,args:[P.WO,P.w,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"changes",{func:"df",void:true,args:[{func:"kl",void:true}],opt:[P.a6]},"wait","jsElem","extendee",{func:"t7",args:[null,P.I,P.I]},"timer",{func:"F6",args:[P.kWp]},"k",{func:"EW",args:[null,W.KV,P.SQ]},{func:"Nwc",ret:P.SQ,args:[null],named:{skipChanges:P.SQ}},"skipChanges",{func:"D8",args:[[P.WO,T.yj]]},{func:"ppm",ret:U.zX,args:[U.rN,U.rN]},{func:"qo",args:[U.rN]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"No",args:[V.qC]},{func:"rl6",ret:P.b8},"scriptCoverage","owningIsolate",{func:"PzC",void:true,args:[[P.WO,P.KN]]},"counters",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"ze",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","newBpts",{func:"NuY",ret:P.I,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script",{func:"T2k",void:true,args:[P.I,L.nm]},{func:"Ys",args:[P.Wy]},{func:"Kg",args:[P.I,L.nm]},"CloseEvent","Event",{func:"cOy",args:[W.cxu]},"msg",{func:"uA",void:true,args:[P.SQ,null]},"exp","details",{func:"kn",ret:A.Ap,args:[P.I]},"ref","ifValue",{func:"nEN",void:true,args:[[P.WO,G.Zq]]},"splices",{func:"U8",void:true,args:[W.hsw]},{func:"Xv",ret:P.I,args:[P.a]},{func:"i8",ret:P.I,args:[[P.WO,P.a]]},"values","targets",];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -24498,7 +23767,7 @@
 X = convertToFastObject(X)
 Y = convertToFastObject(Y)
 Z = convertToFastObject(Z)
-function init(){I.p={}
+function init(){I.p=Object.create(null)
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
 var w=x.length
@@ -24525,93 +23794,95 @@
 var l="function("+p+"){"+n+"}"
 if(u)b.push(m+"$reflectable("+l+");\n")
 else b.push(m+l+";\n")}}return x}I.p.$generateAccessor=generateAccessor
-function defineClass(a,b,c){var y=[]
-var x="function "+b+"("
+function defineClass(a,b){var y=[]
+var x="function "+a+"("
 var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
+for(var v=0;v<b.length;v++){if(v!=0)x+=", "
+var u=generateAccessor(b[v],y,a)
 var t="parameter_"+u
 x+=t
 w+="this."+u+" = "+t+";\n"}x+=") {\n"+w+"}\n"
-x+=b+".builtin$cls=\""+a+"\";\n"
-x+="$desc=$collectedClasses."+b+";\n"
+x+=a+".builtin$cls=\""+a+"\";\n"
+x+="$desc=$collectedClasses."+a+";\n"
 x+="if($desc instanceof Array) $desc = $desc[1];\n"
-x+=b+".prototype = $desc;\n"
-if(typeof defineClass.name!="string"){x+=b+".name=\""+b+"\";\n"}x+=y.join("")
+x+=a+".prototype = $desc;\n"
+if(typeof defineClass.name!="string"){x+=a+".name=\""+a+"\";\n"}x+=y.join("")
 return x}var z=function(){function tmp(){}var y=Object.prototype.hasOwnProperty
 return function(a,b){tmp.prototype=b.prototype
 var x=new tmp()
 var w=a.prototype
-for(var v in w)if(y.call(w,v))x[v]=w[v]
-x.constructor=a
+for(var v in w){if(y.call(w,v)){x[v]=w[v]}}x.constructor=a
 a.prototype=x
 return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
+I.$finishClasses=function(a,b,c){var y=Object.create(null)
 var x=init.allClasses
-var w=Object.prototype.hasOwnProperty
-if(typeof dart_precompiled=="function"){var v=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
-var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
+var w
+var v=Object.prototype.hasOwnProperty
+if(typeof dart_precompiled=="function"){w=dart_precompiled(a)}else{var u="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
+var t=[]}for(var s in a){var r=a[s]
 if(r instanceof Array)r=r[1]
-var q=r["^"],p,o=s,n=q
-if(typeof q=="string"){var m=q.split("/")
-if(m.length==2){o=m[0]
-n=m[1]}}var l=n.split(";")
-n=l[1]==""?[]:l[1].split(",")
-p=l[0]
-m=p.split(":")
-if(m.length==2){p=m[0]
-var k=m[1]
-if(k)r.$signature=function(d){return function(){return init.metadata[d]}}(k)}if(p&&p.indexOf("+")>0){l=p.split("+")
-p=l[0]
-var j=a[l[1]]
-if(j instanceof Array)j=j[1]
-for(var i in j){if(w.call(j,i)&&!w.call(r,i))r[i]=j[i]}}if(typeof dart_precompiled!="function"){u+=defineClass(o,s,n)
-t.push(s)}if(p)y[s]=p}}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
-var v=new Function("$collectedClasses",u)(a)
-u=null}for(var h=0;h<v.length;h++){var g=v[h]
-var s=g.name
+var q=r["^"],p,o=q
+var n=o.split(";")
+o=n[1]==""?[]:n[1].split(",")
+p=n[0]
+split=p.split(":")
+if(split.length==2){p=split[0]
+var m=split[1]
+if(m)r.$signature=function(d){return function(){return init.metadata[d]}}(m)}if(p&&p.indexOf("+")>0){n=p.split("+")
+p=n[0]
+var l=a[n[1]]
+if(l instanceof Array)l=l[1]
+for(var k in l){if(v.call(l,k)&&!v.call(r,k))r[k]=l[k]}}if(typeof dart_precompiled!="function"){u+=defineClass(s,o)
+t.push(s)}if(p)y[s]=p}if(typeof dart_precompiled!="function"){u+="return [\n  "+t.join(",\n  ")+"\n]"
+var w=new Function("$collectedClasses",u)(a)
+u=null}for(var j=0;j<w.length;j++){var i=w[j]
+var s=i.name
 var r=a[s]
-var f=b
-if(r instanceof Array){f=r[0]||b
-r=r[1]}x[s]=g
-f[s]=g}v=null
-var e={}
+var h=b
+if(r instanceof Array){h=r[0]||b
+r=r[1]}x[s]=i
+h[s]=i}w=null
+var g=init.finishedClasses
+function finishClass(a6){if(g[a6])return
+g[a6]=true
+var f=y[a6]
+if(!f||typeof f!="string")return
+finishClass(f)
+var e=x[f]
+if(!e)e=c[f]
+var d=x[a6]
+var a0=z(d,e)
+if(Object.prototype.hasOwnProperty.call(a0,"%")){var a1=a0["%"].split(";")
+if(a1[0]){var a2=a1[0].split("|")
+for(var a3=0;a3<a2.length;a3++){init.interceptorsByTag[a2[a3]]=d
+init.leafTags[a2[a3]]=true}}if(a1[1]){a2=a1[1].split("|")
+if(a1[2]){var a4=a1[2].split("|")
+for(var a3=0;a3<a4.length;a3++){var a5=x[a4[a3]]
+a5.$nativeSuperclassTag=a2[0]}}for(a3=0;a3<a2.length;a3++){init.interceptorsByTag[a2[a3]]=d
+init.leafTags[a2[a3]]=false}}}}for(var s in y)finishClass(s)};(function(){init.allClasses=Object.create(null)
 init.interceptorsByTag=Object.create(null)
-init.leafTags={}
-function finishClass(a9){var d=Object.prototype.hasOwnProperty
-if(d.call(e,a9))return
-e[a9]=true
-var a0=y[a9]
-if(!a0||typeof a0!="string")return
-finishClass(a0)
-var a1=x[a9]
-var a2=x[a0]
-if(!a2)a2=c[a0]
-var a3=z(a1,a2)
-if(d.call(a3,"%")){var a4=a3["%"].split(";")
-if(a4[0]){var a5=a4[0].split("|")
-for(var a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=true}}if(a4[1]){a5=a4[1].split("|")
-if(a4[2]){var a7=a4[2].split("|")
-for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
-a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
-init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){var y={}
+init.leafTags=Object.create(null)
+init.finishedClasses=Object.create(null)})()
+I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies=Object.create(null)
+init.lazies[c]=d
+var y={}
 var x={}
 a[c]=y
 a[d]=function(){var w=$[c]
 try{if(w===y){$[c]=x
-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]}}}}
+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]}}}}
 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]
-function ForceEfficientMap(){}ForceEfficientMap.prototype=this
-new ForceEfficientMap()}Isolate.prototype=a.prototype
+var v=init.lazies
+for(var u in v){this[v[u]]=null}function ForceEfficientMap(){}ForceEfficientMap.prototype=this
+new ForceEfficientMap()
+for(var u in v){var t=v[u]
+this[t]=y[t]}}Isolate.prototype=a.prototype
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.uLC=a.uLC
+Isolate.uL=a.uL
 return Isolate}}
 !function(){function intern(a){var u={}
 u[a]=1
@@ -24628,5 +23899,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.jk(),b)},[])}else{(function(b){H.wW(E.jk(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.VQk(),b)},[])}else{(function(b){H.wW(E.VQk(),b)})([])}})
 })()
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/boot.js b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/boot.js
index 419ebb1..bdb1df4 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/boot.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/boot.js
@@ -111,7 +111,7 @@
 
   // TODO(jmesserly): we're using this function because DOMContentLoaded can
   // be fired too soon: https://www.w3.org/Bugs/Public/show_bug.cgi?id=23526
-  HTMLImports.whenImportsReady(function() {
+  HTMLImports.whenReady(function() {
     // Append a new script tag that initializes everything.
     var newScript = document.createElement('script');
     newScript.type = "application/dart";
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/polymer.html b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/polymer.html
index 6affec8..0c0103d 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/polymer.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/polymer.html
@@ -17,5 +17,5 @@
 
 <!-- unminified for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
-<script src="src/js/polymer/polymer.concat.js"></script>
+<script src="src/js/polymer/polymer.js"></script>
 -->
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/build/generated/messages.html b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/build/generated/messages.html
new file mode 100644
index 0000000..5ef165b
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/build/generated/messages.html
@@ -0,0 +1,545 @@
+<!doctype html>
+<!--
+  This file is autogenerated with polymer/tool/create_message_details_page.dart
+-->
+<html>
+<style>
+@font-face {
+  font-family: 'Montserrat';
+  font-style: normal;
+  font-weight: 400;
+  src: url(https://themes.googleusercontent.com/static/fonts/montserrat/v4/zhcz-_WihjSQC0oHJ9TCYL3hpw3pgy2gAi-Ip7WPMi0.woff) format('woff');
+}
+@font-face {
+  font-family: 'Montserrat';
+  font-style: normal;
+  font-weight: 700;
+  src: url(https://themes.googleusercontent.com/static/fonts/montserrat/v4/IQHow_FEYlDC4Gzy_m8fcnbFhgvWbfSbdVg11QabG8w.woff) format('woff');
+}
+@font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 300;
+  src: url(https://themes.googleusercontent.com/static/fonts/roboto/v10/Hgo13k-tfSpn0qi1SFdUfbO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
+}
+@font-face {
+  font-family: 'Roboto';
+  font-style: normal;
+  font-weight: 400;
+  src: url(https://themes.googleusercontent.com/static/fonts/roboto/v10/CrYjSnGjrRCn0pd9VQsnFOvvDin1pK8aKteLpeZ5c0A.woff) format('woff');
+}
+
+body {
+  width: 80vw;
+  margin: 20px;
+  font-family: Roboto, sans-serif;
+  background-color: #f0f0f0;
+}
+
+h2 {
+  font-family: Montserrat, sans-serif;
+  box-sizing: border-box;
+  color: rgb(72, 72, 72);
+  display: block;
+  font-style: normal;
+  font-variant: normal;
+  font-weight: normal;
+}
+
+div:target {
+  background-color: #fff;
+  border: 1px solid #888;
+  border-radius: 5px;
+  padding: 0px 10px 2px 10px;
+  box-shadow: 7px 7px 5px #888888;
+  margin-bottom: 15px;
+}
+
+
+h3 {
+  font-family: Montserrat, sans-serif;
+  box-sizing: border-box;
+  color: rgb(72, 72, 72);
+  display: block;
+  font-style: normal;
+  font-variant: normal;
+  font-weight: normal;
+}
+
+div:target > h3 {
+  font-weight: bold;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  color: #333;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+
+code {
+   font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
+   box-sizing: border-box;
+   padding: 0;
+   font-size: 90%;
+   color: #0084c5;
+   white-space: nowrap;
+   border-radius: 4px;
+   background-color: #f9f2f4;
+}
+
+pre code {
+   white-space: inherit;
+   color: inherit;
+   background-color: inherit;
+}
+
+a {
+  color: rgb(42, 100, 150);
+}
+
+h3 > a {
+  display: none;
+  font-size: 0.8em;
+}
+
+h3:hover > a {
+  display: inline;
+}
+</style>
+<body>
+<h2>Messages from package <code>code_transformers</code></h2>
+<hr />
+
+<div id="code_transformers_1"><h3>Absolute paths not allowed <a href="#code_transformers_1">#1</a></h3>
+<p>The transformers processing your code were trying to resolve a URL and identify
+a file that they correspond to. Currently only relative paths can be resolved.</p>
+</div><hr />
+
+<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 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>
+<p>URLs that refer to assets in other packages need to explicitly mention the
+<code>packages/</code> directory. In the future this requirement might be removed, but for
+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>.</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 />
+
+<div id="observe_1"><h3><code>@observable</code> not supported on libraries <a href="#observe_1">#1</a></h3>
+<p>Only instance fields on <code>Observable</code> classes can be observable,
+and you must explicitly annotate each observable field as <code>@observable</code>.</p>
+<p>Support for using the <code>@observable</code> annotation in libraries, classes, and
+elsewhere is deprecated.</p>
+</div><hr />
+
+<div id="observe_2"><h3><code>@observable</code> not supported on top-level fields <a href="#observe_2">#2</a></h3>
+<p>Only instance fields on <code>Observable</code> classes can be observable,
+and you must explicitly annotate each observable field as <code>@observable</code>.</p>
+<p>Support for using the <code>@observable</code> annotation in libraries, classes, and
+elsewhere is deprecated.</p>
+</div><hr />
+
+<div id="observe_3"><h3><code>@observable</code> not supported on classes <a href="#observe_3">#3</a></h3>
+<p>Only instance fields on <code>Observable</code> classes can be observable,
+and you must explicitly annotate each observable field as <code>@observable</code>.</p>
+<p>Support for using the <code>@observable</code> annotation in libraries, classes, and
+elsewhere is deprecated.</p>
+</div><hr />
+
+<div id="observe_4"><h3><code>@observable</code> not supported on static fields <a href="#observe_4">#4</a></h3>
+<p>Only instance fields on <code>Observable</code> classes can be observable,
+and you must explicitly annotate each observable field as <code>@observable</code>.</p>
+<p>Support for using the <code>@observable</code> annotation in libraries, classes, and
+elsewhere is deprecated.</p>
+</div><hr />
+
+<div id="observe_5"><h3><code>@observable</code> field not in an <code>Observable</code> class <a href="#observe_5">#5</a></h3>
+<p>Only instance fields on <code>Observable</code> classes can be observable,
+and you must explicitly annotate each observable field as <code>@observable</code>.</p>
+<p>Support for using the <code>@observable</code> annotation in libraries, classes, and
+elsewhere is deprecated.</p>
+</div><hr /><h2>Messages from package <code>polymer</code></h2>
+<hr />
+
+<div id="polymer_1"><h3>Import not found <a href="#polymer_1">#1</a></h3>
+<p>An HTML import seems to be broken. This could be because the file doesn't exist
+or because the link URL is incorrect.</p>
+</div><hr />
+
+<div id="polymer_2"><h3>Duplicate definition <a href="#polymer_2">#2</a></h3>
+<p>Custom element names are global and can only be defined once. Some common
+reasons why you might get two definitions:</p><ul><li>Two different elements are declared with the same name.</li><li>
+<p>A single HTML file defining an element, has been imported using two different
+URLs.</p></li></ul>
+</div><hr />
+
+<div id="polymer_3"><h3>Missing import to polymer.html <a href="#polymer_3">#3</a></h3>
+<p>Starting with polymer 0.11.0, each file that uses the definition
+of polymer-element must import it either directly or transitively.</p>
+</div><hr />
+
+<div id="polymer_4"><h3>Invalid import inside &lt;polymer-element> <a href="#polymer_4">#4</a></h3>
+<p>HTML imports are expected at the top of each document, outside of any
+polymer-element definitions. The polymer build process combines all your HTML
+files together so you can deploy a single HTML file with your application. This
+build process ignores imports that appear to be in the wrong location.</p>
+</div><hr />
+
+<div id="polymer_5"><h3>Missing call to <code>initPolymer()</code> <a href="#polymer_5">#5</a></h3>
+<p>Your application entry point didn't have any Dart script tags, so it's missing
+some initialization needed for polymer.dart.</p>
+</div><hr />
+
+<div id="polymer_6"><h3>Script tags with experimental bootstrap <a href="#polymer_6">#6</a></h3>
+<p>This experimental feature is no longer supported.</p>
+</div><hr />
+
+<div id="polymer_7"><h3>Multiple Dart script tags per document <a href="#polymer_7">#7</a></h3>
+<p>Dartium currently allows only one script tag per document. Any
+additional script tags might be ignored or result in an error. This will
+likely change in the future, but for now, combine the script tags together into
+a single Dart library.</p>
+</div><hr />
+
+<div id="polymer_8"><h3>Imports before script tags <a href="#polymer_8">#8</a></h3>
+<p>It is good practice to put all your HTML imports at the beginning of the
+document, above any Dart script tags. Today, the execution of Dart script tags
+is not synchronous in Dartium, so the difference is not noticeable. However,
+Dartium that will eventually change and make the timing of script tags execution
+match how they are in JavaScript. At that point the order of your imports with
+respect to script tags will be important. Following the practice of putting
+imports first protects your app from a future breaking change in this respect.</p>
+</div><hr />
+
+<div id="polymer_9"><h3>Missing href on a <code>&lt;link&gt;</code> tag <a href="#polymer_9">#9</a></h3>
+<p>All <code>&lt;link&gt;</code> tags should have a valid URL to a resource.</p>
+</div><hr />
+
+<div id="polymer_10"><h3><code>&lt;element&gt;</code> is deprecated <a href="#polymer_10">#10</a></h3>
+<p>Long ago <code>&lt;polymer-element&gt;</code> used to be called <code>&lt;element&gt;</code>. You probably ran
+into this error if you were migrating code that was written on a very early
+version of polymer.</p>
+</div><hr />
+
+<div id="polymer_11"><h3>Definition of a custom element not found <a href="#polymer_11">#11</a></h3>
+<p>The polymer build was not able to find the definition of a custom element. This
+can happen if an element is defined with a <code>&lt;polymer-element&gt;</code> tag, but you are
+missing an HTML import or the import link is incorrect.</p>
+<p>This warning can also be a false alarm. For instance, when an element is defined
+programatically using <code>document.registerElement</code>. In that case the polymer build
+will not be able to see the definition and will produce this warning.</p>
+</div><hr />
+
+<div id="polymer_12"><h3>Empty script tag <a href="#polymer_12">#12</a></h3>
+<p>Script tags should either have a <code>src</code> attribute or a non-empty body.</p>
+</div><hr />
+
+<div id="polymer_13"><h3>Expected Dart mime-type <a href="#polymer_13">#13</a></h3>
+<p>You seem to have a <code>.dart</code> extension on a script tag, but the mime-type
+doesn't match <code>application/dart</code>.</p>
+</div><hr />
+
+<div id="polymer_14"><h3>Expected Dart file extension <a href="#polymer_14">#14</a></h3>
+<p>You are using the <code>application/dart</code> mime-type on a script tag, so
+the URL to the script source URL should have a <code>.dart</code> extension.</p>
+</div><hr />
+
+<div id="polymer_15"><h3>Script with both src and inline text <a href="#polymer_15">#15</a></h3>
+<p>You have a script tag that includes both a <code>src</code> attribute and inline script
+text. You must choose one or the other.</p>
+</div><hr />
+
+<div id="polymer_16"><h3>Incorrect instantiation: missing base tag in instantiation <a href="#polymer_16">#16</a></h3>
+<p>When you declare that a custom element extends from a base tag, for example:</p>
+<pre><code>&lt;polymer-element name="my-example" extends="ul"&gt;
+</code></pre>
+<p>or:</p>
+<pre><code>&lt;polymer-element name="my-example2" extends="ul"&gt;
+&lt;polymer-element name="my-example" extends="my-example2"&gt;
+</code></pre>
+<p>You should instantiate <code>my-example</code> by using this syntax:</p>
+<pre><code>&lt;ul is="my-example"&gt;
+</code></pre>
+<p>And not:</p>
+<pre><code>&lt;my-example&gt;
+</code></pre>
+<p>Only elements that don't extend from existing HTML elements are created using
+the latter form.</p>
+<p>This is because browsers first create the base element, and then upgrade it to
+have the extra functionality of your custom element. In the example above, using
+<code>&lt;ul&gt;</code> tells the browser which base type it must create before
+doing the upgrade.</p>
+</div><hr />
+
+<div id="polymer_17"><h3>Incorrect instantiation: extra <code>is</code> attribute or missing <code>extends</code> in declaration <a href="#polymer_17">#17</a></h3>
+<p>Creating a custom element using the syntax:</p>
+<pre><code>&lt;ul is="my-example"&gt;
+</code></pre>
+<p>means that the declaration of <code>my-example</code> extends transitively from <code>ul</code>. This
+error message is shown if the definition of <code>my-example</code> doesn't declare this
+extension. It might be that you no longer extend from the base element, in which
+case the fix is to change the instantiation to:</p>
+<pre><code>&lt;my-example&gt;
+</code></pre>
+<p>Another possibility is that the declaration needs to be fixed to include the
+<code>extends</code> attribute, for example:</p>
+<pre><code>&lt;polymer-element name="my-example" extends="ul"&gt;
+</code></pre>
+</div><hr />
+
+<div id="polymer_18"><h3>Incorrect instantiation: base tag seems wrong <a href="#polymer_18">#18</a></h3>
+<p>It seems you have a declaration like:</p>
+<pre><code>&lt;polymer-element name="my-example" extends="div"&gt;
+</code></pre>
+<p>but an instantiation like:</p>
+<pre><code>&lt;span is="my-example"&gt;
+</code></pre>
+<p>Both the declaration and the instantiation need to match on the base type. So
+either the instantiation needs to be fixed to be more like:</p>
+<pre><code>&lt;span is="my-example"&gt;
+</code></pre>
+<p>or the declaration should be fixed to be like:</p>
+<pre><code>&lt;polymer-element name="my-example" extends="span"&gt;
+</code></pre>
+</div><hr />
+
+<div id="polymer_19"><h3>No dashes allowed in custom attributes <a href="#polymer_19">#19</a></h3>
+<p>Polymer used to recognize attributes with dashes like <code>my-name</code> and convert them
+to match properties where dashes were removed, and words follow the camelCase
+style (for example <code>myName</code>). This feature is no longer available. Now simply
+use the same name as the property.</p>
+<p>Because HTML attributes are case-insensitive, you can also write the name of
+your property entirely in lowercase. Just be sure that your custom-elements
+don't declare two properties with the same name but different capitalization.</p>
+</div><hr />
+
+<div id="polymer_20"><h3>Event handlers not supported here <a href="#polymer_20">#20</a></h3>
+<p>Bindings of the form <code>{{ }}</code> are supported inside <code>&lt;template&gt;</code> nodes, even outside
+of <code>&lt;polymer-element&gt;</code> declarations. However, those bindings only support binding
+values into the content of a node or an attribute.</p>
+<p>Inline event handlers of the form <code>on-click="{{method}}"</code> are a special feature
+of polymer elements, so they are only supported inside <code>&lt;polymer-element&gt;</code>
+definitions.</p>
+</div><hr />
+
+<div id="polymer_21"><h3>No expressions allowed in event handler bindings <a href="#polymer_21">#21</a></h3>
+<p>Unlike data bindings, event handler bindings of the form <code>on-click="{{method}}"</code>
+are not evaluated as expressions. They are meant to just contain a simple name
+that resolves to a method in your polymer element's class definition.</p>
+</div><hr />
+
+<div id="polymer_22"><h3>Nested polymer element definitions not allowed <a href="#polymer_22">#22</a></h3>
+<p>Because custom element names are global, there is no need to have a
+<code>&lt;polymer-element&gt;</code> definition nested within a <code>&lt;polymer-element&gt;</code>. If you have
+a definition inside another, move the second definition out.</p>
+<p>You might see this error if you have an HTML import within a polymer element.
+You should be able to move the import out of the element definition.</p>
+</div><hr />
+
+<div id="polymer_23"><h3>Polymer element definitions without a name <a href="#polymer_23">#23</a></h3>
+<p>Polymer element definitions must have a name. You can include a name by using
+the <code>name</code> attribute in <code>&lt;polymer-element&gt;</code> for example:</p>
+<pre><code>&lt;polymer-element name="my-example"&gt;
+</code></pre>
+</div><hr />
+
+<div id="polymer_24"><h3>Custom element name missing a dash <a href="#polymer_24">#24</a></h3>
+<p>Custom element names must have a dash (<code>-</code>) and can't be any of the following
+reserved names:</p><ul><li><code>annotation-xml</code></li><li><code>color-profile</code></li><li><code>font-face</code></li><li><code>font-face-src</code></li><li><code>font-face-uri</code></li><li><code>font-face-format</code></li><li><code>font-face-name</code></li><li><code>missing-glyph</code></li></ul>
+</div><hr />
+
+<div id="polymer_25"><h3>Error while inlining an import <a href="#polymer_25">#25</a></h3>
+<p>An error occurred while inlining an import in the polymer build. This is often
+the result of a broken HTML import.</p>
+</div><hr />
+
+<div id="polymer_26"><h3>Error while inlining a stylesheet <a href="#polymer_26">#26</a></h3>
+<p>An error occurred while inlining a stylesheet in the polymer build. This is
+often the result of a broken URL in a <code>&lt;link rel="stylesheet" href="..."&gt;</code>.</p>
+</div><hr />
+
+<div id="polymer_27"><h3>URL to a script file might be incorrect <a href="#polymer_27">#27</a></h3>
+<p>An error occurred trying to read a script tag on a given URL. This is often the
+result of a broken URL in a <code>&lt;script src="..."&gt;</code>.</p>
+</div><hr />
+
+<div id="polymer_28"><h3>Attribute missing "_" prefix <a href="#polymer_28">#28</a></h3>
+<p>Not all browsers support bindings to certain attributes, especially URL
+attributes. Some browsers might sanitize attributes and result in an
+incorrect value. For this reason polymer provides a special set of attributes
+that let you bypass any browser internal attribute validation. The name of the
+attribute is the same as the original attribute, but with a leading underscore.
+For example, instead of writing:</p>
+<pre><code>&lt;img src="{{binding}}"&gt;
+</code></pre>
+<p>you can write:</p>
+<pre><code>&lt;img _src="{{binding}}"&gt;
+</code></pre>
+<p>For more information, see <a href="http://goo.gl/5av8cU">http://goo.gl/5av8cU</a>.</p>
+</div><hr />
+
+<div id="polymer_29"><h3>Attribute with extra "_" prefix <a href="#polymer_29">#29</a></h3>
+<p>A special attribute exists to support bindings on URL attributes. For example,
+this correctly binds the <code>src</code> attribute in an image:</p>
+<pre><code>&lt;img _src="{{binding}}"&gt;
+</code></pre>
+<p>However, this special <code>_src</code> attribute is only available for bindings. If you
+just have a URL, use the normal <code>src</code> attribute instead.</p>
+</div><hr />
+
+<div id="polymer_30"><h3>Internal error: don't know how to include a URL <a href="#polymer_30">#30</a></h3>
+<p>Sorry, you just ran into a bug in the polymer transformer code. Please file a
+bug at <a href="http://dartbug.com/new">http://dartbug.com/new</a> including, if possible, some example code that
+can help the team reproduce the issue.</p>
+</div><hr />
+
+<div id="polymer_31"><h3>Internal error: phases run out of order <a href="#polymer_31">#31</a></h3>
+<p>Sorry, you just ran into a bug in the polymer transformer code. Please file a
+bug at <a href="http://dartbug.com/new">http://dartbug.com/new</a> including, if possible, some example code that
+can help the team reproduce the issue.</p>
+</div><hr />
+
+<div id="polymer_32"><h3><code>@CustomTag</code> used on a private class <a href="#polymer_32">#32</a></h3>
+<p>The <code>@CustomTag</code> annotation is currently only supported on public classes. If
+you need to register a custom element whose implementation is a private class
+(that is, a class whose name starts with <code>_</code>), you can still do so by invoking
+<code>Polymer.register</code> within a public method marked with <code>@initMethod</code>.</p>
+</div><hr />
+
+<div id="polymer_33"><h3><code>@initMethod</code> is on a private function <a href="#polymer_33">#33</a></h3>
+<p>The <code>@initMethod</code> annotation is currently only supported on public top-level
+functions.</p>
+</div><hr />
+
+<div id="polymer_34"><h3>Missing argument in annotation <a href="#polymer_34">#34</a></h3>
+<p>The annotation expects one argument, but the argument was not provided.</p>
+</div><hr />
+
+<div id="polymer_35"><h3>Invalid argument in annotation <a href="#polymer_35">#35</a></h3>
+<p>The polymer transformer was not able to extract a constant value for the
+annotation argument. This can happen if your code is currently in a state that
+can't be analyzed (for example, it has parse errors) or if the expression passed
+as an argument is invalid (for example, it is not a compile-time constant).</p>
+</div><hr />
+
+<div id="polymer_36"><h3>No polymer initializers found <a href="#polymer_36">#36</a></h3>
+<p>No polymer initializers were found. Make sure to either 
+annotate your polymer elements with @CustomTag or include a 
+top level method annotated with @initMethod that registers your 
+elements. Both annotations are defined in the polymer library (
+package:polymer/polymer.dart).</p>
+</div><hr />
+
+<div id="polymer_37"><h3>Event bindings with @ are no longer supported <a href="#polymer_37">#37</a></h3>
+<p>For a while there was an undocumented feature that allowed users to include
+expressions in event bindings using the <code>@</code> prefix, for example:</p>
+<pre><code>&lt;div on-click="{{@a.b.c}}"&gt;
+
+</code></pre>
+<p>This feature is no longer supported.</p>
+</div><hr />
+
+<div id="polymer_38"><h3>Private symbol in event handler <a href="#polymer_38">#38</a></h3>
+<p>Currently private members can't be used in event handler bindings. So you can't
+write:</p>
+<pre><code>&lt;div on-click="{{_method}}"&gt;
+</code></pre>
+<p>This restriction might be removed in the future, but for now, you need to make
+your event handlers public.</p>
+</div><hr />
+
+<div id="polymer_39"><h3>Private symbol in binding expression <a href="#polymer_39">#39</a></h3>
+<p>Private members can't be used in binding expressions. For example, you can't
+write:</p>
+<pre><code>&lt;div&gt;{{a.b._c}}&lt;/div&gt;
+</code></pre>
+</div><hr />
+
+<div id="polymer_40"><h3>A warning was found while parsing the HTML document <a href="#polymer_40">#40</a></h3>
+<p>The polymer transformer uses a parser that implements the HTML5 spec
+(<code>html5lib</code>). This message reports a
+warning that the parser detected.</p>
+</div><hr />
+
+<div id="polymer_41"><h3>Possible flash of unstyled content <a href="#polymer_41">#41</a></h3>
+<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 />
+
+<div id="polymer_43"><h3>"dart_support.js" injected automatically <a href="#polymer_43">#43</a></h3>
+<p>The script <code>packages/web_components/dart_support.js</code> is still used, but you no
+longer need to put it in your application's entrypoint.</p>
+<p>In the past this file served two purposes:</p><ul><li>to make dart2js work well with the web_components polyfills, and</li><li>to support registering Dart APIs for JavaScript custom elements.</li></ul>
+<p>Now, the code from <code>dart_support.js</code> is split in two halves. The half for
+dart2js is now injected by the polymer transformers automatically during <code>pub
+build</code>. The <code>web_components</code> package provides an HTML file containing the other
+half.  Developers of packages that wrap JavaScript custom elements (like
+<code>core_elements</code> and <code>paper_elements</code>) will import that file directly, so
+application developers don't have to worry about it anymore.</p>
+</div><hr />
+
+<div id="polymer_44"><h3>Dart script file included more than once. <a href="#polymer_44">#44</a></h3>
+<p>Duplicate dart scripts often happen if you have multiple html imports that
+include the same script. The simplest workaround for this is to move your dart
+script to its own html file, and import that instead of the script (html imports
+are automatically deduped).</p>
+<p>For example:</p>
+<pre><code>&lt;script type="application/dart" src="foo.dart"&gt;&lt;/script&gt;
+</code></pre>
+<p>Should turn into:</p>
+<pre><code>&lt;link rel="import" href="foo.html"&gt;
+</code></pre>
+<p>And <code>foo.html</code> should look like:</p>
+<pre><code>&lt;script type="application/dart" src="foo.dart"&gt;&lt;/script&gt;
+</code></pre>
+</div><hr />
+
+<div id="polymer_45"><h3>"webcomponents.js" injected automatically <a href="#polymer_45">#45</a></h3>
+<p>The script <code>packages/web_components/webcomponents.js</code> is still used, but you no
+longer need to put it in your application's entrypoint.</p>
+<p>The polyfills provided by this file are no longer required in chrome and will
+automatically be added during <code>pub build</code> and <code>pub serve</code>.</p>
+</div><hr />
+
+<div id="polymer_46"><h3>"platform.js" renamed to "webcomponents.js". <a href="#polymer_46">#46</a></h3>
+<p>The script <code>packages/web_components/platform.js</code> has been renamed to
+<code>packages/web_components/webcomponents.js</code>. This is automatically fixed in
+<code>pub serve</code> and <code>pub build</code> but we may remove this functionality in the next
+breaking version of Polymer.</p>
+<p>In addition, it is no longer required that you include this file directly, as
+<code>pub build</code> and <code>pub serve</code> will inject it for you, and its not required when
+running in dartium with a local server.</p>
+</div><hr /></body>
+</html>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
index dd25319..1434eb0 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/build.log
@@ -1,35 +1,38 @@
 BUILD LOG
 ---------
-Build Time: 2014-09-22T10:46:42
+Build Time: 2014-10-07T17:56:07
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.29
+nodejs: v0.10.21
 chai: 1.9.1
-grunt: 0.4.5
-grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.3
-grunt-contrib-uglify: 0.5.1
+grunt: 0.4.5
 grunt-contrib-concat: 0.4.0
-grunt-karma: 0.8.3
+grunt-contrib-uglify: 0.5.1
 grunt-string-replace: 0.2.7
+grunt-audit: 0.0.3
+grunt-contrib-yuidoc: 0.5.2
+karma: 0.12.19
+karma-chrome-launcher: 0.1.4
+grunt-karma: 0.8.3
 karma-firefox-launcher: 0.1.3
+karma-crbot-reporter: 0.0.4
+karma-mocha: 0.1.6
 karma-ie-launcher: 0.1.5
+mocha: 1.20.1
 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: 64d6aea8ec8d9ce65767bfd7cdc2d2bc9b60af26
-polymer-gestures: ee0798a8698b6731fe16be4a51c70333374a1c57
-polymer-dev: d61654b747438384fb934e97cfbba910b0c0bb04
-HTMLImports: 77efd89e04ae63a3ee7c88cb7e1d2784cf60dcb1
-TemplateBinding: a6df3b77d75bf8225a4cc30362cf80ed76480c3e
+polymer-gestures: 93902f7166ae932503450441641e352b5205afa2
+polymer-expressions: 9f1748ec7b34b445c29941920962ea3eac8e9b80
+HTMLImports: 6dea2dd969dc4dfb594ae33d4b072130c4890da5
+observe-js: fa70c37099026225876f7c7a26bdee7c48129f1c
+NodeBind: a3e4046d5d6e240945abea02dd70ae596e7b1110
+TemplateBinding: 41e95ea0e4b45543a29ea5240cd4f0defc7208c1
 
 BUILD HASHES
 ============
-build/polymer.js: 709f82c7212d81e8e19927b53d5ce27c0f90ea9e
\ No newline at end of file
+build/polymer.js: fba96097f878a55bc1fefd1b157fdb0c60225eb7
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.html b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.html
index 7e3d8f1..8b38742 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.html
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.html
@@ -9,4 +9,4 @@
 
 <link rel="import" href="layout.html">
 
-<script src="polymer.js"></script>
+<script src="polymer.min.js"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
index 3fbcd70..b8b62b0 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.js
@@ -7,8 +7,11823 @@
  * 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.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}})}();
\ No newline at end of file
+// @version 0.5.1
+window.PolymerGestures = {};
+
+(function(scope) {
+  var HAS_FULL_PATH = false;
+
+  // test for full event path support
+  var pathTest = document.createElement('meta');
+  if (pathTest.createShadowRoot) {
+    var sr = pathTest.createShadowRoot();
+    var s = document.createElement('span');
+    sr.appendChild(s);
+    pathTest.addEventListener('testpath', function(ev) {
+      if (ev.path) {
+        // if the span is in the event path, then path[0] is the real source for all events
+        HAS_FULL_PATH = ev.path[0] === s;
+      }
+      ev.stopPropagation();
+    });
+    var ev = new CustomEvent('testpath', {bubbles: true});
+    // must add node to DOM to trigger event listener
+    document.head.appendChild(pathTest);
+    s.dispatchEvent(ev);
+    pathTest.parentNode.removeChild(pathTest);
+    sr = s = null;
+  }
+  pathTest = null;
+
+  var target = {
+    shadow: function(inEl) {
+      if (inEl) {
+        return inEl.shadowRoot || inEl.webkitShadowRoot;
+      }
+    },
+    canTarget: function(shadow) {
+      return shadow && Boolean(shadow.elementFromPoint);
+    },
+    targetingShadow: function(inEl) {
+      var s = this.shadow(inEl);
+      if (this.canTarget(s)) {
+        return s;
+      }
+    },
+    olderShadow: function(shadow) {
+      var os = shadow.olderShadowRoot;
+      if (!os) {
+        var se = shadow.querySelector('shadow');
+        if (se) {
+          os = se.olderShadowRoot;
+        }
+      }
+      return os;
+    },
+    allShadows: function(element) {
+      var shadows = [], s = this.shadow(element);
+      while(s) {
+        shadows.push(s);
+        s = this.olderShadow(s);
+      }
+      return shadows;
+    },
+    searchRoot: function(inRoot, x, y) {
+      var t, st, sr, os;
+      if (inRoot) {
+        t = inRoot.elementFromPoint(x, y);
+        if (t) {
+          // found element, check if it has a ShadowRoot
+          sr = this.targetingShadow(t);
+        } else if (inRoot !== document) {
+          // check for sibling roots
+          sr = this.olderShadow(inRoot);
+        }
+        // search other roots, fall back to light dom element
+        return this.searchRoot(sr, x, y) || t;
+      }
+    },
+    owner: function(element) {
+      if (!element) {
+        return document;
+      }
+      var s = element;
+      // walk up until you hit the shadow root or document
+      while (s.parentNode) {
+        s = s.parentNode;
+      }
+      // the owner element is expected to be a Document or ShadowRoot
+      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
+        s = document;
+      }
+      return s;
+    },
+    findTarget: function(inEvent) {
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
+        return inEvent.path[0];
+      }
+      var x = inEvent.clientX, y = inEvent.clientY;
+      // if the listener is in the shadow root, it is much faster to start there
+      var s = this.owner(inEvent.target);
+      // if x, y is not in this root, fall back to document search
+      if (!s.elementFromPoint(x, y)) {
+        s = document;
+      }
+      return this.searchRoot(s, x, y);
+    },
+    findTouchAction: function(inEvent) {
+      var n;
+      if (HAS_FULL_PATH && inEvent.path && inEvent.path.length) {
+        var path = inEvent.path;
+        for (var i = 0; i < path.length; i++) {
+          n = path[i];
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
+          }
+        }
+      } else {
+        n = inEvent.target;
+        while(n) {
+          if (n.nodeType === Node.ELEMENT_NODE && n.hasAttribute('touch-action')) {
+            return n.getAttribute('touch-action');
+          }
+          n = n.parentNode || n.host;
+        }
+      }
+      // auto is default
+      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;
+      }
+      // fast case, a is a direct descendant of b or vice versa
+      if (a.contains && a.contains(b)) {
+        return a;
+      }
+      if (b.contains && b.contains(a)) {
+        return b;
+      }
+      var adepth = this.depth(a);
+      var bdepth = this.depth(b);
+      var d = adepth - bdepth;
+      if (d >= 0) {
+        a = this.walk(a, d);
+      } else {
+        b = this.walk(b, -d);
+      }
+      while (a && b && a !== b) {
+        a = a.parentNode || a.host;
+        b = b.parentNode || b.host;
+      }
+      return a;
+    },
+    walk: function(n, u) {
+      for (var i = 0; n && (i < u); i++) {
+        n = n.parentNode || n.host;
+      }
+      return n;
+    },
+    depth: function(n) {
+      var d = 0;
+      while(n) {
+        d++;
+        n = n.parentNode || n.host;
+      }
+      return d;
+    },
+    deepContains: function(a, b) {
+      var common = this.LCA(a, b);
+      // if a is the common ancestor, it must "deeply" contain b
+      return common === a;
+    },
+    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;
+  /**
+   * Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting
+   *
+   * @param {Event} Event An event object with clientX and clientY properties
+   * @return {Element} The probable event origninator
+   */
+  scope.findTarget = target.findTarget.bind(target);
+  /**
+   * Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM
+   * roots.
+   *
+   * @param {Node} container
+   * @param {Node} containee
+   * @return {Boolean}
+   */
+  scope.deepContains = target.deepContains.bind(target);
+
+  /**
+   * Determines if the x/y position is inside the given node.
+   *
+   * Example:
+   *
+   *     function upHandler(event) {
+   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);
+   *       if (innode) {
+   *         // wait for tap?
+   *       } else {
+   *         // tap will never happen
+   *       }
+   *     }
+   *
+   * @param {Node} node
+   * @param {Number} x Screen X position
+   * @param {Number} y screen Y position
+   * @return {Boolean}
+   */
+  scope.insideNode = target.insideNode;
+
+})(window.PolymerGestures);
+
+(function() {
+  function shadowSelector(v) {
+    return 'html /deep/ ' + selector(v);
+  }
+  function selector(v) {
+    return '[touch-action="' + v + '"]';
+  }
+  function rule(v) {
+    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';
+  }
+  var attrib2css = [
+    'none',
+    'auto',
+    'pan-x',
+    'pan-y',
+    {
+      rule: 'pan-x pan-y',
+      selectors: [
+        'pan-x pan-y',
+        'pan-y pan-x'
+      ]
+    },
+    'manipulation'
+  ];
+  var styles = '';
+  // only install stylesheet if the browser has touch action support
+  var hasTouchAction = typeof document.head.style.touchAction === 'string';
+  // only add shadow selectors if shadowdom is supported
+  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
+
+  if (hasTouchAction) {
+    attrib2css.forEach(function(r) {
+      if (String(r) === r) {
+        styles += selector(r) + rule(r) + '\n';
+        if (hasShadowRoot) {
+          styles += shadowSelector(r) + rule(r) + '\n';
+        }
+      } else {
+        styles += r.selectors.map(selector) + rule(r.rule) + '\n';
+        if (hasShadowRoot) {
+          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
+        }
+      }
+    });
+
+    var el = document.createElement('style');
+    el.textContent = styles;
+    document.head.appendChild(el);
+  }
+})();
+
+/**
+ * This is the constructor for new PointerEvents.
+ *
+ * New Pointer Events must be given a type, and an optional dictionary of
+ * initialization properties.
+ *
+ * Due to certain platform requirements, events returned from the constructor
+ * identify as MouseEvents.
+ *
+ * @constructor
+ * @param {String} inType The type of the event to create.
+ * @param {Object} [inDict] An optional dictionary of initial event properties.
+ * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
+ */
+(function(scope) {
+
+  var MOUSE_PROPS = [
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    'pageX',
+    'pageY'
+  ];
+
+  var MOUSE_DEFAULTS = [
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    0,
+    0
+  ];
+
+  var NOP_FACTORY = function(){ return function(){}; };
+
+  var eventFactory = {
+    // TODO(dfreedm): this is overridden by tap recognizer, needs review
+    preventTap: NOP_FACTORY,
+    makeBaseEvent: function(inType, inDict) {
+      var e = document.createEvent('Event');
+      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
+      e.preventTap = eventFactory.preventTap(e);
+      return e;
+    },
+    makeGestureEvent: function(inType, inDict) {
+      inDict = inDict || Object.create(null);
+
+      var e = this.makeBaseEvent(inType, inDict);
+      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {
+        k = keys[i];
+        e[k] = inDict[k];
+      }
+      return e;
+    },
+    makePointerEvent: function(inType, inDict) {
+      inDict = inDict || Object.create(null);
+
+      var e = this.makeBaseEvent(inType, inDict);
+      // define inherited MouseEvent properties
+      for(var i = 0, p; i < MOUSE_PROPS.length; i++) {
+        p = MOUSE_PROPS[i];
+        e[p] = inDict[p] || MOUSE_DEFAULTS[i];
+      }
+      e.buttons = inDict.buttons || 0;
+
+      // Spec requires that pointers without pressure specified use 0.5 for down
+      // state and 0 for up state.
+      var pressure = 0;
+      if (inDict.pressure) {
+        pressure = inDict.pressure;
+      } else {
+        pressure = e.buttons ? 0.5 : 0;
+      }
+
+      // add x/y properties aliased to clientX/Y
+      e.x = e.clientX;
+      e.y = e.clientY;
+
+      // define the properties of the PointerEvent interface
+      e.pointerId = inDict.pointerId || 0;
+      e.width = inDict.width || 0;
+      e.height = inDict.height || 0;
+      e.pressure = pressure;
+      e.tiltX = inDict.tiltX || 0;
+      e.tiltY = inDict.tiltY || 0;
+      e.pointerType = inDict.pointerType || '';
+      e.hwTimestamp = inDict.hwTimestamp || 0;
+      e.isPrimary = inDict.isPrimary || false;
+      e._source = inDict._source || '';
+      return e;
+    }
+  };
+
+  scope.eventFactory = eventFactory;
+})(window.PolymerGestures);
+
+/**
+ * This module implements an map of pointer states
+ */
+(function(scope) {
+  var USE_MAP = window.Map && window.Map.prototype.forEach;
+  var POINTERS_FN = function(){ return this.size; };
+  function PointerMap() {
+    if (USE_MAP) {
+      var m = new Map();
+      m.pointers = POINTERS_FN;
+      return m;
+    } else {
+      this.keys = [];
+      this.values = [];
+    }
+  }
+
+  PointerMap.prototype = {
+    set: function(inId, inEvent) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.values[i] = inEvent;
+      } else {
+        this.keys.push(inId);
+        this.values.push(inEvent);
+      }
+    },
+    has: function(inId) {
+      return this.keys.indexOf(inId) > -1;
+    },
+    'delete': function(inId) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.keys.splice(i, 1);
+        this.values.splice(i, 1);
+      }
+    },
+    get: function(inId) {
+      var i = this.keys.indexOf(inId);
+      return this.values[i];
+    },
+    clear: function() {
+      this.keys.length = 0;
+      this.values.length = 0;
+    },
+    // return value, key, map
+    forEach: function(callback, thisArg) {
+      this.values.forEach(function(v, i) {
+        callback.call(thisArg, v, this.keys[i], this);
+      }, this);
+    },
+    pointers: function() {
+      return this.keys.length;
+    }
+  };
+
+  scope.PointerMap = PointerMap;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var CLONE_PROPS = [
+    // MouseEvent
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    // DOM Level 3
+    'buttons',
+    // PointerEvent
+    'pointerId',
+    'width',
+    'height',
+    'pressure',
+    'tiltX',
+    'tiltY',
+    'pointerType',
+    'hwTimestamp',
+    'isPrimary',
+    // event instance
+    'type',
+    'target',
+    'currentTarget',
+    'which',
+    'pageX',
+    'pageY',
+    'timeStamp',
+    // gesture addons
+    'preventTap',
+    'tapPrevented',
+    '_source'
+  ];
+
+  var CLONE_DEFAULTS = [
+    // MouseEvent
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    // DOM Level 3
+    0,
+    // PointerEvent
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    '',
+    0,
+    false,
+    // event instance
+    '',
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    function(){},
+    false
+  ];
+
+  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
+
+  var eventFactory = scope.eventFactory;
+
+  // set of recognizers to run for the currently handled event
+  var currentGestures;
+
+  /**
+   * This module is for normalizing events. Mouse and Touch events will be
+   * collected here, and fire PointerEvents that have the same semantics, no
+   * matter the source.
+   * Events fired:
+   *   - pointerdown: a pointing is added
+   *   - pointerup: a pointer is removed
+   *   - pointermove: a pointer is moved
+   *   - pointerover: a pointer crosses into an element
+   *   - pointerout: a pointer leaves an element
+   *   - 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),
+    // Scope objects for native events.
+    // This exists for ease of testing.
+    eventSources: Object.create(null),
+    eventSourceList: [],
+    gestures: [],
+    // map gesture event -> {listeners: int, index: gestures[int]}
+    dependencyMap: {
+      // make sure down and up are in the map to trigger "register"
+      down: {listeners: 0, index: -1},
+      up: {listeners: 0, index: -1}
+    },
+    gestureQueue: [],
+    /**
+     * Add a new event source that will generate pointer events.
+     *
+     * `inSource` must contain an array of event names named `events`, and
+     * functions with the names specified in the `events` array.
+     * @param {string} name A name for the event source
+     * @param {Object} source A new source of platform events.
+     */
+    registerSource: function(name, source) {
+      var s = source;
+      var newEvents = s.events;
+      if (newEvents) {
+        newEvents.forEach(function(e) {
+          if (s[e]) {
+            this.eventMap[e] = s[e].bind(s);
+          }
+        }, this);
+        this.eventSources[name] = s;
+        this.eventSourceList.push(s);
+      }
+    },
+    registerGesture: function(name, source) {
+      var obj = Object.create(null);
+      obj.listeners = 0;
+      obj.index = this.gestures.length;
+      for (var i = 0, g; i < source.exposes.length; i++) {
+        g = source.exposes[i].toLowerCase();
+        this.dependencyMap[g] = obj;
+      }
+      this.gestures.push(source);
+    },
+    register: function(element, initial) {
+      var l = this.eventSourceList.length;
+      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+        // call eventsource register
+        es.register.call(es, element, initial);
+      }
+    },
+    unregister: function(element) {
+      var l = this.eventSourceList.length;
+      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+        // call eventsource register
+        es.unregister.call(es, element);
+      }
+    },
+    // EVENTS
+    down: function(inEvent) {
+      this.requiredGestures.set(inEvent.pointerId, currentGestures);
+      this.fireEvent('down', inEvent);
+    },
+    move: function(inEvent) {
+      // pipe move events into gesture queue directly
+      inEvent.type = 'move';
+      this.fillGestureQueue(inEvent);
+    },
+    up: function(inEvent) {
+      this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
+    },
+    cancel: function(inEvent) {
+      inEvent.tapPrevented = true;
+      this.fireEvent('up', inEvent);
+      this.requiredGestures.delete(inEvent.pointerId);
+    },
+    addGestureDependency: function(node, currentGestures) {
+      var gesturesWanted = node._pgEvents;
+      if (gesturesWanted && currentGestures) {
+        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
+      // platform events. This can happen when two elements in different scopes
+      // are set up to create pointer events, which is relevant to Shadow DOM.
+
+      var type = inEvent.type;
+
+      // only generate the list of desired events on "down"
+      if (type === 'touchstart' || type === 'mousedown' || type === 'pointerdown' || type === 'MSPointerDown') {
+        if (!inEvent._handledByPG) {
+          currentGestures = {};
+        }
+
+        // in IOS mode, there is only a listener on the document, so this is not re-entrant
+        if (this.IS_IOS) {
+          var ev = inEvent;
+          if (type === 'touchstart') {
+            var ct = inEvent.changedTouches[0];
+            // set up a fake event to give to the path builder
+            ev = {target: inEvent.target, clientX: ct.clientX, clientY: ct.clientY, path: inEvent.path};
+          }
+          // use event path if available, otherwise build a path from target finding
+          var nodes = inEvent.path || scope.targetFinding.path(ev);
+          for (var i = 0, n; i < nodes.length; i++) {
+            n = nodes[i];
+            this.addGestureDependency(n, currentGestures);
+          }
+        } else {
+          this.addGestureDependency(inEvent.currentTarget, currentGestures);
+        }
+      }
+
+      if (inEvent._handledByPG) {
+        return;
+      }
+      var fn = this.eventMap && this.eventMap[type];
+      if (fn) {
+        fn(inEvent);
+      }
+      inEvent._handledByPG = true;
+    },
+    // set up event listeners
+    listen: function(target, events) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
+        this.addEvent(target, e);
+      }
+    },
+    // remove event listeners
+    unlisten: function(target, events) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
+        this.removeEvent(target, e);
+      }
+    },
+    addEvent: function(target, eventName) {
+      target.addEventListener(eventName, this.boundHandler);
+    },
+    removeEvent: function(target, eventName) {
+      target.removeEventListener(eventName, this.boundHandler);
+    },
+    // EVENT CREATION AND TRACKING
+    /**
+     * Creates a new Event of type `inType`, based on the information in
+     * `inEvent`.
+     *
+     * @param {string} inType A string representing the type of event to create
+     * @param {Event} inEvent A platform event with a target
+     * @return {Event} A PointerEvent of type `inType`
+     */
+    makeEvent: function(inType, inEvent) {
+      var e = eventFactory.makePointerEvent(inType, inEvent);
+      e.preventDefault = inEvent.preventDefault;
+      e.tapPrevented = inEvent.tapPrevented;
+      e._target = e._target || inEvent.target;
+      return e;
+    },
+    // make and dispatch an event in one call
+    fireEvent: function(inType, inEvent) {
+      var e = this.makeEvent(inType, inEvent);
+      return this.dispatchEvent(e);
+    },
+    /**
+     * Returns a snapshot of inEvent, with writable properties.
+     *
+     * @param {Event} inEvent An event that contains properties to copy.
+     * @return {Object} An object containing shallow copies of `inEvent`'s
+     *    properties.
+     */
+    cloneEvent: function(inEvent) {
+      var eventCopy = Object.create(null), p;
+      for (var i = 0; i < CLONE_PROPS.length; i++) {
+        p = CLONE_PROPS[i];
+        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
+        // Work around SVGInstanceElement shadow tree
+        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.
+        // This is the behavior implemented by Firefox.
+        if (p === 'target' || p === 'relatedTarget') {
+          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {
+            eventCopy[p] = eventCopy[p].correspondingUseElement;
+          }
+        }
+      }
+      // keep the semantics of preventDefault
+      eventCopy.preventDefault = function() {
+        inEvent.preventDefault();
+      };
+      return eventCopy;
+    },
+    /**
+     * Dispatches the event to its target.
+     *
+     * @param {Event} inEvent The event to be dispatched.
+     * @return {Boolean} True if an event handler returns true, false otherwise.
+     */
+    dispatchEvent: function(inEvent) {
+      var t = inEvent._target;
+      if (t) {
+        t.dispatchEvent(inEvent);
+        // clone the event for the gesture system to process
+        // clone after dispatch to pick up gesture prevention code
+        var clone = this.cloneEvent(inEvent);
+        clone.target = t;
+        this.fillGestureQueue(clone);
+      }
+    },
+    gestureTrigger: function() {
+      // process the gesture queue
+      for (var i = 0, e, rg; i < this.gestureQueue.length; i++) {
+        e = this.gestureQueue[i];
+        rg = e._requiredGestures;
+        if (rg) {
+          for (var j = 0, g, fn; j < this.gestures.length; j++) {
+            // only run recognizer if an element in the source event's path is listening for those gestures
+            if (rg[j]) {
+              g = this.gestures[j];
+              fn = g[e.type];
+              if (fn) {
+                fn.call(g, e);
+              }
+            }
+          }
+        }
+      }
+      this.gestureQueue.length = 0;
+    },
+    fillGestureQueue: function(ev) {
+      // only trigger the gesture queue once
+      if (!this.gestureQueue.length) {
+        requestAnimationFrame(this.boundGestureTrigger);
+      }
+      ev._requiredGestures = this.requiredGestures.get(ev.pointerId);
+      this.gestureQueue.push(ev);
+    }
+  };
+  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
+  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
+  scope.dispatcher = dispatcher;
+
+  /**
+   * Listen for `gesture` on `node` with the `handler` function
+   *
+   * If `handler` is the first listener for `gesture`, the underlying gesture recognizer is then enabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.activateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      var recognizer = dispatcher.gestures[dep.index];
+      if (!node._pgListeners) {
+        dispatcher.register(node);
+        node._pgListeners = 0;
+      }
+      // TODO(dfreedm): re-evaluate bookkeeping to avoid using attributes
+      if (recognizer) {
+        var touchAction = recognizer.defaultActions && recognizer.defaultActions[g];
+        var actionNode;
+        switch(node.nodeType) {
+          case Node.ELEMENT_NODE:
+            actionNode = node;
+          break;
+          case Node.DOCUMENT_FRAGMENT_NODE:
+            actionNode = node.host;
+          break;
+          default:
+            actionNode = null;
+          break;
+        }
+        if (touchAction && actionNode && !actionNode.hasAttribute('touch-action')) {
+          actionNode.setAttribute('touch-action', touchAction);
+        }
+      }
+      if (!node._pgEvents) {
+        node._pgEvents = {};
+      }
+      node._pgEvents[g] = (node._pgEvents[g] || 0) + 1;
+      node._pgListeners++;
+    }
+    return Boolean(dep);
+  };
+
+  /**
+   *
+   * Listen for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.addEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.activateGesture(node, gesture);
+      node.addEventListener(gesture, handler, capture);
+    }
+  };
+
+  /**
+   * Tears down the gesture configuration for `node`
+   *
+   * If `handler` is the last listener for `gesture`, the underlying gesture recognizer is disabled.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @return Boolean `gesture` is a valid gesture
+   */
+  scope.deactivateGesture = function(node, gesture) {
+    var g = gesture.toLowerCase();
+    var dep = dispatcher.dependencyMap[g];
+    if (dep) {
+      if (node._pgListeners > 0) {
+        node._pgListeners--;
+      }
+      if (node._pgListeners === 0) {
+        dispatcher.unregister(node);
+      }
+      if (node._pgEvents) {
+        if (node._pgEvents[g] > 0) {
+          node._pgEvents[g]--;
+        } else {
+          node._pgEvents[g] = 0;
+        }
+      }
+    }
+    return Boolean(dep);
+  };
+
+  /**
+   * Stop listening for `gesture` from `node` with `handler` function.
+   *
+   * @param {Element} node
+   * @param {string} gesture
+   * @param {Function} handler
+   * @param {Boolean} capture
+   */
+  scope.removeEventListener = function(node, gesture, handler, capture) {
+    if (handler) {
+      scope.deactivateGesture(node, gesture);
+      node.removeEventListener(gesture, handler, capture);
+    }
+  };
+})(window.PolymerGestures);
+
+(function (scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  // radius around touchend that swallows mouse events
+  var DEDUP_DIST = 25;
+
+  var WHICH_TO_BUTTONS = [0, 1, 4, 2];
+
+  var CURRENT_BUTTONS = 0;
+  var HAS_BUTTONS = false;
+  try {
+    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;
+  } catch (e) {}
+
+  // handler block for native mouse events
+  var mouseEvents = {
+    POINTER_ID: 1,
+    POINTER_TYPE: 'mouse',
+    events: [
+      'mousedown',
+      'mousemove',
+      'mouseup'
+    ],
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    lastTouches: [],
+    // collide with the global mouse listener
+    isEventSimulatedFromTouch: function(inEvent) {
+      var lts = this.lastTouches;
+      var x = inEvent.clientX, y = inEvent.clientY;
+      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
+        // simulated mouse events will be swallowed near a primary touchend
+        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
+        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {
+          return true;
+        }
+      }
+    },
+    prepareEvent: function(inEvent) {
+      var e = dispatcher.cloneEvent(inEvent);
+      e.pointerId = this.POINTER_ID;
+      e.isPrimary = true;
+      e.pointerType = this.POINTER_TYPE;
+      e._source = 'mouse';
+      if (!HAS_BUTTONS) {
+        var type = inEvent.type;
+        var bit = WHICH_TO_BUTTONS[inEvent.which] || 0;
+        if (type === 'mousedown') {
+          CURRENT_BUTTONS |= bit;
+        } else if (type === 'mouseup') {
+          CURRENT_BUTTONS &= ~bit;
+        }
+        e.buttons = CURRENT_BUTTONS;
+      }
+      return e;
+    },
+    mousedown: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var p = pointermap.has(this.POINTER_ID);
+        var e = this.prepareEvent(inEvent);
+        e.target = scope.findTarget(inEvent);
+        pointermap.set(this.POINTER_ID, e.target);
+        dispatcher.down(e);
+      }
+    },
+    mousemove: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var target = pointermap.get(this.POINTER_ID);
+        if (target) {
+          var e = this.prepareEvent(inEvent);
+          e.target = target;
+          // handle case where we missed a mouseup
+          if ((HAS_BUTTONS ? e.buttons : e.which) === 0) {
+            if (!HAS_BUTTONS) {
+              CURRENT_BUTTONS = e.buttons = 0;
+            }
+            dispatcher.cancel(e);
+            this.cleanupMouse(e.buttons);
+          } else {
+            dispatcher.move(e);
+          }
+        }
+      }
+    },
+    mouseup: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var e = this.prepareEvent(inEvent);
+        e.relatedTarget = scope.findTarget(inEvent);
+        e.target = pointermap.get(this.POINTER_ID);
+        dispatcher.up(e);
+        this.cleanupMouse(e.buttons);
+      }
+    },
+    cleanupMouse: function(buttons) {
+      if (buttons === 0) {
+        pointermap.delete(this.POINTER_ID);
+      }
+    }
+  };
+
+  scope.mouseEvents = mouseEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
+  var pointermap = dispatcher.pointermap;
+  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
+  // This should be long enough to ignore compat mouse events made by touch
+  var DEDUP_TIMEOUT = 2500;
+  var DEDUP_DIST = 25;
+  var CLICK_COUNT_TIMEOUT = 200;
+  var HYSTERESIS = 20;
+  var ATTRIB = 'touch-action';
+  // TODO(dfreedm): disable until http://crbug.com/399765 is resolved
+  // var HAS_TOUCH_ACTION = ATTRIB in document.head.style;
+  var HAS_TOUCH_ACTION = false;
+
+  // handler block for native touch events
+  var touchEvents = {
+    IS_IOS: false,
+    events: [
+      'touchstart',
+      'touchmove',
+      'touchend',
+      'touchcancel'
+    ],
+    exposes: [
+      'down',
+      'up',
+      'move'
+    ],
+    register: function(target, initial) {
+      if (this.IS_IOS ? initial : !initial) {
+        dispatcher.listen(target, this.events);
+      }
+    },
+    unregister: function(target) {
+      if (!this.IS_IOS) {
+        dispatcher.unlisten(target, this.events);
+      }
+    },
+    scrollTypes: {
+      EMITTER: 'none',
+      XSCROLLER: 'pan-x',
+      YSCROLLER: 'pan-y',
+    },
+    touchActionToScrollType: function(touchAction) {
+      var t = touchAction;
+      var st = this.scrollTypes;
+      if (t === st.EMITTER) {
+        return 'none';
+      } else if (t === st.XSCROLLER) {
+        return 'X';
+      } else if (t === st.YSCROLLER) {
+        return 'Y';
+      } else {
+        return 'XY';
+      }
+    },
+    POINTER_TYPE: 'touch',
+    firstTouch: null,
+    isPrimaryTouch: function(inTouch) {
+      return this.firstTouch === inTouch.identifier;
+    },
+    setPrimaryTouch: function(inTouch) {
+      // set primary touch if there no pointers, or the only pointer is the mouse
+      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
+        this.firstTouch = inTouch.identifier;
+        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
+        this.firstTarget = inTouch.target;
+        this.scrolling = null;
+        this.cancelResetClickCount();
+      }
+    },
+    removePrimaryPointer: function(inPointer) {
+      if (inPointer.isPrimary) {
+        this.firstTouch = null;
+        this.firstXY = null;
+        this.resetClickCount();
+      }
+    },
+    clickCount: 0,
+    resetId: null,
+    resetClickCount: function() {
+      var fn = function() {
+        this.clickCount = 0;
+        this.resetId = null;
+      }.bind(this);
+      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
+    },
+    cancelResetClickCount: function() {
+      if (this.resetId) {
+        clearTimeout(this.resetId);
+      }
+    },
+    typeToButtons: function(type) {
+      var ret = 0;
+      if (type === 'touchstart' || type === 'touchmove') {
+        ret = 1;
+      }
+      return ret;
+    },
+    findTarget: function(touch, id) {
+      if (this.currentTouchEvent.type === 'touchstart') {
+        if (this.isPrimaryTouch(touch)) {
+          var fastPath = {
+            clientX: touch.clientX,
+            clientY: touch.clientY,
+            path: this.currentTouchEvent.path,
+            target: this.currentTouchEvent.target
+          };
+          return scope.findTarget(fastPath);
+        } else {
+          return scope.findTarget(touch);
+        }
+      }
+      // reuse target we found in touchstart
+      return pointermap.get(id);
+    },
+    touchToPointer: function(inTouch) {
+      var cte = this.currentTouchEvent;
+      var e = dispatcher.cloneEvent(inTouch);
+      // Spec specifies that pointerId 1 is reserved for Mouse.
+      // Touch identifiers can start at 0.
+      // Add 2 to the touch identifier for compatibility.
+      var id = e.pointerId = inTouch.identifier + 2;
+      e.target = this.findTarget(inTouch, id);
+      e.bubbles = true;
+      e.cancelable = true;
+      e.detail = this.clickCount;
+      e.buttons = this.typeToButtons(cte.type);
+      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
+      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
+      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
+      e.isPrimary = this.isPrimaryTouch(inTouch);
+      e.pointerType = this.POINTER_TYPE;
+      e._source = 'touch';
+      // forward touch preventDefaults
+      var self = this;
+      e.preventDefault = function() {
+        self.scrolling = false;
+        self.firstXY = null;
+        cte.preventDefault();
+      };
+      return e;
+    },
+    processTouches: function(inEvent, inFunction) {
+      var tl = inEvent.changedTouches;
+      this.currentTouchEvent = inEvent;
+      for (var i = 0, t, p; i < tl.length; i++) {
+        t = tl[i];
+        p = this.touchToPointer(t);
+        if (inEvent.type === 'touchstart') {
+          pointermap.set(p.pointerId, p.target);
+        }
+        if (pointermap.has(p.pointerId)) {
+          inFunction.call(this, p);
+        }
+        if (inEvent.type === 'touchend' || inEvent._cancel) {
+          this.cleanUpPointer(p);
+        }
+      }
+    },
+    // For single axis scrollers, determines whether the element should emit
+    // pointer events or behave as a scroller
+    shouldScroll: function(inEvent) {
+      if (this.firstXY) {
+        var ret;
+        var touchAction = scope.targetFinding.findTouchAction(inEvent);
+        var scrollAxis = this.touchActionToScrollType(touchAction);
+        if (scrollAxis === 'none') {
+          // this element is a touch-action: none, should never scroll
+          ret = false;
+        } else if (scrollAxis === 'XY') {
+          // this element should always scroll
+          ret = true;
+        } else {
+          var t = inEvent.changedTouches[0];
+          // check the intended scroll axis, and other axis
+          var a = scrollAxis;
+          var oa = scrollAxis === 'Y' ? 'X' : 'Y';
+          var da = Math.abs(t['client' + a] - this.firstXY[a]);
+          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
+          // if delta in the scroll axis > delta other axis, scroll instead of
+          // making events
+          ret = da >= doa;
+        }
+        return ret;
+      }
+    },
+    findTouch: function(inTL, inId) {
+      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
+        if (t.identifier === inId) {
+          return true;
+        }
+      }
+    },
+    // In some instances, a touchstart can happen without a touchend. This
+    // leaves the pointermap in a broken state.
+    // Therefore, on every touchstart, we remove the touches that did not fire a
+    // touchend event.
+    // To keep state globally consistent, we fire a
+    // pointercancel for this "abandoned" touch
+    vacuumTouches: function(inEvent) {
+      var tl = inEvent.touches;
+      // pointermap.pointers() should be < tl.length here, as the touchstart has not
+      // been processed yet.
+      if (pointermap.pointers() >= tl.length) {
+        var d = [];
+        pointermap.forEach(function(value, key) {
+          // Never remove pointerId == 1, which is mouse.
+          // Touch identifiers are 2 smaller than their pointerId, which is the
+          // index in pointermap.
+          if (key !== 1 && !this.findTouch(tl, key - 2)) {
+            var p = value;
+            d.push(p);
+          }
+        }, this);
+        d.forEach(function(p) {
+          this.cancel(p);
+          pointermap.delete(p.pointerId);
+        });
+      }
+    },
+    touchstart: function(inEvent) {
+      this.vacuumTouches(inEvent);
+      this.setPrimaryTouch(inEvent.changedTouches[0]);
+      this.dedupSynthMouse(inEvent);
+      if (!this.scrolling) {
+        this.clickCount++;
+        this.processTouches(inEvent, this.down);
+      }
+    },
+    down: function(inPointer) {
+      dispatcher.down(inPointer);
+    },
+    touchmove: function(inEvent) {
+      if (HAS_TOUCH_ACTION) {
+        // touchevent.cancelable == false is sent when the page is scrolling under native Touch Action in Chrome 36
+        // https://groups.google.com/a/chromium.org/d/msg/input-dev/wHnyukcYBcA/b9kmtwM1jJQJ
+        if (inEvent.cancelable) {
+          this.processTouches(inEvent, this.move);
+        }
+      } else {
+        if (!this.scrolling) {
+          if (this.scrolling === null && this.shouldScroll(inEvent)) {
+            this.scrolling = true;
+          } else {
+            this.scrolling = false;
+            inEvent.preventDefault();
+            this.processTouches(inEvent, this.move);
+          }
+        } else if (this.firstXY) {
+          var t = inEvent.changedTouches[0];
+          var dx = t.clientX - this.firstXY.X;
+          var dy = t.clientY - this.firstXY.Y;
+          var dd = Math.sqrt(dx * dx + dy * dy);
+          if (dd >= HYSTERESIS) {
+            this.touchcancel(inEvent);
+            this.scrolling = true;
+            this.firstXY = null;
+          }
+        }
+      }
+    },
+    move: function(inPointer) {
+      dispatcher.move(inPointer);
+    },
+    touchend: function(inEvent) {
+      this.dedupSynthMouse(inEvent);
+      this.processTouches(inEvent, this.up);
+    },
+    up: function(inPointer) {
+      inPointer.relatedTarget = scope.findTarget(inPointer);
+      dispatcher.up(inPointer);
+    },
+    cancel: function(inPointer) {
+      dispatcher.cancel(inPointer);
+    },
+    touchcancel: function(inEvent) {
+      inEvent._cancel = true;
+      this.processTouches(inEvent, this.cancel);
+    },
+    cleanUpPointer: function(inPointer) {
+      pointermap['delete'](inPointer.pointerId);
+      this.removePrimaryPointer(inPointer);
+    },
+    // prevent synth mouse events from creating pointer events
+    dedupSynthMouse: function(inEvent) {
+      var lts = scope.mouseEvents.lastTouches;
+      var t = inEvent.changedTouches[0];
+      // only the primary finger will synth mouse events
+      if (this.isPrimaryTouch(t)) {
+        // remember x/y of last touch
+        var lt = {x: t.clientX, y: t.clientY};
+        lts.push(lt);
+        var fn = (function(lts, lt){
+          var i = lts.indexOf(lt);
+          if (i > -1) {
+            lts.splice(i, 1);
+          }
+        }).bind(null, lts, lt);
+        setTimeout(fn, DEDUP_TIMEOUT);
+      }
+    }
+  };
+
+  // prevent "ghost clicks" that come from elements that were removed in a touch handler
+  var STOP_PROP_FN = Event.prototype.stopImmediatePropagation || Event.prototype.stopPropagation;
+  document.addEventListener('click', function(ev) {
+    var x = ev.clientX, y = ev.clientY;
+    // check if a click is within DEDUP_DIST px radius of the touchstart
+    var closeTo = function(touch) {
+      var dx = Math.abs(x - touch.x), dy = Math.abs(y - touch.y);
+      return (dx <= DEDUP_DIST && dy <= DEDUP_DIST);
+    };
+    // if click coordinates are close to touch coordinates, assume the click came from a touch
+    var wasTouched = scope.mouseEvents.lastTouches.some(closeTo);
+    // if the click came from touch, and the touchstart target is not in the path of the click event,
+    // then the touchstart target was probably removed, and the click should be "busted"
+    var path = scope.targetFinding.path(ev);
+    if (wasTouched) {
+      for (var i = 0; i < path.length; i++) {
+        if (path[i] === touchEvents.firstTarget) {
+          return;
+        }
+      }
+      ev.preventDefault();
+      STOP_PROP_FN.call(ev);
+    }
+  }, true);
+
+  scope.touchEvents = touchEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';
+  var msEvents = {
+    events: [
+      'MSPointerDown',
+      'MSPointerMove',
+      'MSPointerUp',
+      'MSPointerCancel',
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    POINTER_TYPES: [
+      '',
+      'unavailable',
+      'touch',
+      'pen',
+      'mouse'
+    ],
+    prepareEvent: function(inEvent) {
+      var e = inEvent;
+      e = dispatcher.cloneEvent(inEvent);
+      if (HAS_BITMAP_TYPE) {
+        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
+      }
+      e._source = 'ms';
+      return e;
+    },
+    cleanup: function(id) {
+      pointermap['delete'](id);
+    },
+    MSPointerDown: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.target = scope.findTarget(inEvent);
+      pointermap.set(inEvent.pointerId, e.target);
+      dispatcher.down(e);
+    },
+    MSPointerMove: function(inEvent) {
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
+    },
+    MSPointerUp: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.up(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    MSPointerCancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.cancel(e);
+      this.cleanup(inEvent.pointerId);
+    }
+  };
+
+  scope.msEvents = msEvents;
+})(window.PolymerGestures);
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  var pointerEvents = {
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel'
+    ],
+    prepareEvent: function(inEvent) {
+      var e = dispatcher.cloneEvent(inEvent);
+      e._source = 'pointer';
+      return e;
+    },
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      if (target === document) {
+        return;
+      }
+      dispatcher.unlisten(target, this.events);
+    },
+    cleanup: function(id) {
+      pointermap['delete'](id);
+    },
+    pointerdown: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.target = scope.findTarget(inEvent);
+      pointermap.set(e.pointerId, e.target);
+      dispatcher.down(e);
+    },
+    pointermove: function(inEvent) {
+      var target = pointermap.get(inEvent.pointerId);
+      if (target) {
+        var e = this.prepareEvent(inEvent);
+        e.target = target;
+        dispatcher.move(e);
+      }
+    },
+    pointerup: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.up(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    pointercancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      e.relatedTarget = scope.findTarget(inEvent);
+      e.target = pointermap.get(e.pointerId);
+      dispatcher.cancel(e);
+      this.cleanup(inEvent.pointerId);
+    }
+  };
+
+  scope.pointerEvents = pointerEvents;
+})(window.PolymerGestures);
+
+/**
+ * This module contains the handlers for native platform events.
+ * From here, the dispatcher is called to create unified pointer events.
+ * Included are touch events (v1), mouse events, and MSPointerEvents.
+ */
+(function(scope) {
+
+  var dispatcher = scope.dispatcher;
+  var nav = window.navigator;
+
+  if (window.PointerEvent) {
+    dispatcher.registerSource('pointer', scope.pointerEvents);
+  } else if (nav.msPointerEnabled) {
+    dispatcher.registerSource('ms', scope.msEvents);
+  } else {
+    dispatcher.registerSource('mouse', scope.mouseEvents);
+    if (window.ontouchstart !== undefined) {
+      dispatcher.registerSource('touch', scope.touchEvents);
+    }
+  }
+
+  // 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);
+
+/**
+ * This event denotes the beginning of a series of tracking events.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class trackstart
+ */
+/**
+ * Pixels moved in the x direction since trackstart.
+ * @type Number
+ * @property dx
+ */
+/**
+ * Pixes moved in the y direction since trackstart.
+ * @type Number
+ * @property dy
+ */
+/**
+ * Pixels moved in the x direction since the last track.
+ * @type Number
+ * @property ddx
+ */
+/**
+ * Pixles moved in the y direction since the last track.
+ * @type Number
+ * @property ddy
+ */
+/**
+ * The clientX position of the track gesture.
+ * @type Number
+ * @property clientX
+ */
+/**
+ * The clientY position of the track gesture.
+ * @type Number
+ * @property clientY
+ */
+/**
+ * The pageX position of the track gesture.
+ * @type Number
+ * @property pageX
+ */
+/**
+ * The pageY position of the track gesture.
+ * @type Number
+ * @property pageY
+ */
+/**
+ * The screenX position of the track gesture.
+ * @type Number
+ * @property screenX
+ */
+/**
+ * The screenY position of the track gesture.
+ * @type Number
+ * @property screenY
+ */
+/**
+ * The last x axis direction of the pointer.
+ * @type Number
+ * @property xDirection
+ */
+/**
+ * The last y axis direction of the pointer.
+ * @type Number
+ * @property yDirection
+ */
+/**
+ * A shared object between all tracking events.
+ * @type Object
+ * @property trackInfo
+ */
+/**
+ * The element currently under the pointer.
+ * @type Element
+ * @property relatedTarget
+ */
+/**
+ * The type of pointer that make the track gesture.
+ * @type String
+ * @property pointerType
+ */
+/**
+ *
+ * This event fires for all pointer movement being tracked.
+ *
+ * @class track
+ * @extends trackstart
+ */
+/**
+ * This event fires when the pointer is no longer being tracked.
+ *
+ * @class trackend
+ * @extends trackstart
+ */
+
+ (function(scope) {
+   var dispatcher = scope.dispatcher;
+   var eventFactory = scope.eventFactory;
+   var pointermap = new scope.PointerMap();
+   var track = {
+     events: [
+       'down',
+       'move',
+       'up',
+     ],
+     exposes: [
+      'trackstart',
+      'track',
+      'trackx',
+      'tracky',
+      'trackend'
+     ],
+     defaultActions: {
+       'track': 'none',
+       'trackx': 'pan-y',
+       'tracky': 'pan-x'
+     },
+     WIGGLE_THRESHOLD: 4,
+     clampDir: function(inDelta) {
+       return inDelta > 0 ? 1 : -1;
+     },
+     calcPositionDelta: function(inA, inB) {
+       var x = 0, y = 0;
+       if (inA && inB) {
+         x = inB.pageX - inA.pageX;
+         y = inB.pageY - inA.pageY;
+       }
+       return {x: x, y: y};
+     },
+     fireTrack: function(inType, inEvent, inTrackingData) {
+       var t = inTrackingData;
+       var d = this.calcPositionDelta(t.downEvent, inEvent);
+       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
+       if (dd.x) {
+         t.xDirection = this.clampDir(dd.x);
+       } else if (inType === 'trackx') {
+         return;
+       }
+       if (dd.y) {
+         t.yDirection = this.clampDir(dd.y);
+       } else if (inType === 'tracky') {
+         return;
+       }
+       var gestureProto = {
+         bubbles: true,
+         cancelable: true,
+         trackInfo: t.trackInfo,
+         relatedTarget: inEvent.relatedTarget,
+         pointerType: inEvent.pointerType,
+         pointerId: inEvent.pointerId,
+         _source: 'track'
+       };
+       if (inType !== 'tracky') {
+         gestureProto.x = inEvent.x;
+         gestureProto.dx = d.x;
+         gestureProto.ddx = dd.x;
+         gestureProto.clientX = inEvent.clientX;
+         gestureProto.pageX = inEvent.pageX;
+         gestureProto.screenX = inEvent.screenX;
+         gestureProto.xDirection = t.xDirection;
+       }
+       if (inType !== 'trackx') {
+         gestureProto.dy = d.y;
+         gestureProto.ddy = dd.y;
+         gestureProto.y = inEvent.y;
+         gestureProto.clientY = inEvent.clientY;
+         gestureProto.pageY = inEvent.pageY;
+         gestureProto.screenY = inEvent.screenY;
+         gestureProto.yDirection = t.yDirection;
+       }
+       var e = eventFactory.makeGestureEvent(inType, gestureProto);
+       t.downTarget.dispatchEvent(e);
+     },
+     down: function(inEvent) {
+       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {
+         var p = {
+           downEvent: inEvent,
+           downTarget: inEvent.target,
+           trackInfo: {},
+           lastMoveEvent: null,
+           xDirection: 0,
+           yDirection: 0,
+           tracking: false
+         };
+         pointermap.set(inEvent.pointerId, p);
+       }
+     },
+     move: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (!p.tracking) {
+           var d = this.calcPositionDelta(p.downEvent, inEvent);
+           var move = d.x * d.x + d.y * d.y;
+           // start tracking only if finger moves more than WIGGLE_THRESHOLD
+           if (move > this.WIGGLE_THRESHOLD) {
+             p.tracking = true;
+             p.lastMoveEvent = p.downEvent;
+             this.fireTrack('trackstart', inEvent, p);
+           }
+         }
+         if (p.tracking) {
+           this.fireTrack('track', inEvent, p);
+           this.fireTrack('trackx', inEvent, p);
+           this.fireTrack('tracky', inEvent, p);
+         }
+         p.lastMoveEvent = inEvent;
+       }
+     },
+     up: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (p.tracking) {
+           this.fireTrack('trackend', inEvent, p);
+         }
+         pointermap.delete(inEvent.pointerId);
+       }
+     }
+   };
+   dispatcher.registerGesture('track', track);
+ })(window.PolymerGestures);
+
+/**
+ * This event is fired when a pointer is held down for 200ms.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class hold
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * Screen X axis position of the held pointer
+ * @type Number
+ * @property clientX
+ */
+/**
+ * Screen Y axis position of the held pointer
+ * @type Number
+ * @property clientY
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * This event is fired every 200ms while a pointer is held down.
+ *
+ * @class holdpulse
+ * @extends hold
+ */
+/**
+ * Milliseconds pointer has been held down.
+ * @type Number
+ * @property holdTime
+ */
+/**
+ * This event is fired when a held pointer is released or moved.
+ *
+ * @class release
+ */
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var hold = {
+    // wait at least HOLD_DELAY ms between hold and pulse events
+    HOLD_DELAY: 200,
+    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold
+    WIGGLE_THRESHOLD: 16,
+    events: [
+      'down',
+      'move',
+      'up',
+    ],
+    exposes: [
+      'hold',
+      'holdpulse',
+      'release'
+    ],
+    heldPointer: null,
+    holdJob: null,
+    pulse: function() {
+      var hold = Date.now() - this.heldPointer.timeStamp;
+      var type = this.held ? 'holdpulse' : 'hold';
+      this.fireHold(type, hold);
+      this.held = true;
+    },
+    cancel: function() {
+      clearInterval(this.holdJob);
+      if (this.held) {
+        this.fireHold('release');
+      }
+      this.held = false;
+      this.heldPointer = null;
+      this.target = null;
+      this.holdJob = null;
+    },
+    down: function(inEvent) {
+      if (inEvent.isPrimary && !this.heldPointer) {
+        this.heldPointer = inEvent;
+        this.target = inEvent.target;
+        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
+      }
+    },
+    up: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        this.cancel();
+      }
+    },
+    move: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        var x = inEvent.clientX - this.heldPointer.clientX;
+        var y = inEvent.clientY - this.heldPointer.clientY;
+        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {
+          this.cancel();
+        }
+      }
+    },
+    fireHold: function(inType, inHoldTime) {
+      var p = {
+        bubbles: true,
+        cancelable: true,
+        pointerType: this.heldPointer.pointerType,
+        pointerId: this.heldPointer.pointerId,
+        x: this.heldPointer.clientX,
+        y: this.heldPointer.clientY,
+        _source: 'hold'
+      };
+      if (inHoldTime) {
+        p.holdTime = inHoldTime;
+      }
+      var e = eventFactory.makeGestureEvent(inType, p);
+      this.target.dispatchEvent(e);
+    }
+  };
+  dispatcher.registerGesture('hold', hold);
+})(window.PolymerGestures);
+
+/**
+ * This event is fired when a pointer quickly goes down and up, and is used to
+ * denote activation.
+ *
+ * Any gesture event can prevent the tap event from being created by calling
+ * `event.preventTap`.
+ *
+ * Any pointer event can prevent the tap by setting the `tapPrevented` property
+ * on itself.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class tap
+ */
+/**
+ * X axis position of the tap.
+ * @property x
+ * @type Number
+ */
+/**
+ * Y axis position of the tap.
+ * @property y
+ * @type Number
+ */
+/**
+ * Type of the pointer that made the tap.
+ * @property pointerType
+ * @type String
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var pointermap = new scope.PointerMap();
+  var tap = {
+    events: [
+      'down',
+      'up'
+    ],
+    exposes: [
+      'tap'
+    ],
+    down: function(inEvent) {
+      if (inEvent.isPrimary && !inEvent.tapPrevented) {
+        pointermap.set(inEvent.pointerId, {
+          target: inEvent.target,
+          buttons: inEvent.buttons,
+          x: inEvent.clientX,
+          y: inEvent.clientY
+        });
+      }
+    },
+    shouldTap: function(e, downState) {
+      var tap = true;
+      if (e.pointerType === 'mouse') {
+        // only allow left click to tap for mouse
+        tap = (e.buttons ^ 1) && (downState.buttons & 1);
+      }
+      return tap && !e.tapPrevented;
+    },
+    up: function(inEvent) {
+      var start = pointermap.get(inEvent.pointerId);
+      if (start && this.shouldTap(inEvent, start)) {
+        // up.relatedTarget is target currently under finger
+        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);
+        if (t) {
+          var e = eventFactory.makeGestureEvent('tap', {
+            bubbles: true,
+            cancelable: true,
+            x: inEvent.clientX,
+            y: inEvent.clientY,
+            detail: inEvent.detail,
+            pointerType: inEvent.pointerType,
+            pointerId: inEvent.pointerId,
+            altKey: inEvent.altKey,
+            ctrlKey: inEvent.ctrlKey,
+            metaKey: inEvent.metaKey,
+            shiftKey: inEvent.shiftKey,
+            _source: 'tap'
+          });
+          t.dispatchEvent(e);
+        }
+      }
+      pointermap.delete(inEvent.pointerId);
+    }
+  };
+  // patch eventFactory to remove id from tap's pointermap for preventTap calls
+  eventFactory.preventTap = function(e) {
+    return function() {
+      e.tapPrevented = true;
+      pointermap.delete(e.pointerId);
+    };
+  };
+  dispatcher.registerGesture('tap', tap);
+})(window.PolymerGestures);
+
+/*
+ * Basic strategy: find the farthest apart points, use as diameter of circle
+ * react to size change and rotation of the chord
+ */
+
+/**
+ * @module pointer-gestures
+ * @submodule Events
+ * @class pinch
+ */
+/**
+ * Scale of the pinch zoom gesture
+ * @property scale
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing pinch
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing pinch
+ * @property centerY
+ * @type Number
+ */
+
+/**
+ * @module pointer-gestures
+ * @submodule Events
+ * @class rotate
+ */
+/**
+ * Angle (in degrees) of rotation. Measured from starting positions of pointers.
+ * @property angle
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing rotation
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing rotation
+ * @property centerY
+ * @type Number
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var eventFactory = scope.eventFactory;
+  var pointermap = new scope.PointerMap();
+  var RAD_TO_DEG = 180 / Math.PI;
+  var pinch = {
+    events: [
+      'down',
+      'up',
+      'move',
+      'cancel'
+    ],
+    exposes: [
+      'pinch',
+      'rotate'
+    ],
+    defaultActions: {
+      'pinch': 'none',
+      'rotate': 'none'
+    },
+    reference: {},
+    down: function(inEvent) {
+      pointermap.set(inEvent.pointerId, inEvent);
+      if (pointermap.pointers() == 2) {
+        var points = this.calcChord();
+        var angle = this.calcAngle(points);
+        this.reference = {
+          angle: angle,
+          diameter: points.diameter,
+          target: scope.targetFinding.LCA(points.a.target, points.b.target)
+        };
+      }
+    },
+    up: function(inEvent) {
+      var p = pointermap.get(inEvent.pointerId);
+      if (p) {
+        pointermap.delete(inEvent.pointerId);
+      }
+    },
+    move: function(inEvent) {
+      if (pointermap.has(inEvent.pointerId)) {
+        pointermap.set(inEvent.pointerId, inEvent);
+        if (pointermap.pointers() > 1) {
+          this.calcPinchRotate();
+        }
+      }
+    },
+    cancel: function(inEvent) {
+        this.up(inEvent);
+    },
+    firePinch: function(diameter, points) {
+      var zoom = diameter / this.reference.diameter;
+      var e = eventFactory.makeGestureEvent('pinch', {
+        bubbles: true,
+        cancelable: true,
+        scale: zoom,
+        centerX: points.center.x,
+        centerY: points.center.y,
+        _source: 'pinch'
+      });
+      this.reference.target.dispatchEvent(e);
+    },
+    fireRotate: function(angle, points) {
+      var diff = Math.round((angle - this.reference.angle) % 360);
+      var e = eventFactory.makeGestureEvent('rotate', {
+        bubbles: true,
+        cancelable: true,
+        angle: diff,
+        centerX: points.center.x,
+        centerY: points.center.y,
+        _source: 'pinch'
+      });
+      this.reference.target.dispatchEvent(e);
+    },
+    calcPinchRotate: function() {
+      var points = this.calcChord();
+      var diameter = points.diameter;
+      var angle = this.calcAngle(points);
+      if (diameter != this.reference.diameter) {
+        this.firePinch(diameter, points);
+      }
+      if (angle != this.reference.angle) {
+        this.fireRotate(angle, points);
+      }
+    },
+    calcChord: function() {
+      var pointers = [];
+      pointermap.forEach(function(p) {
+        pointers.push(p);
+      });
+      var dist = 0;
+      // start with at least two pointers
+      var points = {a: pointers[0], b: pointers[1]};
+      var x, y, d;
+      for (var i = 0; i < pointers.length; i++) {
+        var a = pointers[i];
+        for (var j = i + 1; j < pointers.length; j++) {
+          var b = pointers[j];
+          x = Math.abs(a.clientX - b.clientX);
+          y = Math.abs(a.clientY - b.clientY);
+          d = x + y;
+          if (d > dist) {
+            dist = d;
+            points = {a: a, b: b};
+          }
+        }
+      }
+      x = Math.abs(points.a.clientX + points.b.clientX) / 2;
+      y = Math.abs(points.a.clientY + points.b.clientY) / 2;
+      points.center = { x: x, y: y };
+      points.diameter = dist;
+      return points;
+    },
+    calcAngle: function(points) {
+      var x = points.a.clientX - points.b.clientX;
+      var y = points.a.clientY - points.b.clientY;
+      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;
+    }
+  };
+  dispatcher.registerGesture('pinch', pinch);
+})(window.PolymerGestures);
+
+(function (global) {
+    'use strict';
+
+    var Token,
+        TokenName,
+        Syntax,
+        Messages,
+        source,
+        index,
+        length,
+        delegate,
+        lookahead,
+        state;
+
+    Token = {
+        BooleanLiteral: 1,
+        EOF: 2,
+        Identifier: 3,
+        Keyword: 4,
+        NullLiteral: 5,
+        NumericLiteral: 6,
+        Punctuator: 7,
+        StringLiteral: 8
+    };
+
+    TokenName = {};
+    TokenName[Token.BooleanLiteral] = 'Boolean';
+    TokenName[Token.EOF] = '<end>';
+    TokenName[Token.Identifier] = 'Identifier';
+    TokenName[Token.Keyword] = 'Keyword';
+    TokenName[Token.NullLiteral] = 'Null';
+    TokenName[Token.NumericLiteral] = 'Numeric';
+    TokenName[Token.Punctuator] = 'Punctuator';
+    TokenName[Token.StringLiteral] = 'String';
+
+    Syntax = {
+        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'
+    };
+
+    // Error messages should be identical to V8.
+    Messages = {
+        UnexpectedToken:  'Unexpected token %0',
+        UnknownLabel: 'Undefined label \'%0\'',
+        Redeclaration: '%0 \'%1\' has already been declared'
+    };
+
+    // Ensure the condition is true, otherwise throw an error.
+    // This is only to have a better contract semantic, i.e. another safety net
+    // to catch a logic error. The condition shall be fulfilled in normal case.
+    // Do NOT use this to enforce a certain condition on any user input.
+
+    function assert(condition, message) {
+        if (!condition) {
+            throw new Error('ASSERT: ' + message);
+        }
+    }
+
+    function isDecimalDigit(ch) {
+        return (ch >= 48 && ch <= 57);   // 0..9
+    }
+
+
+    // 7.2 White Space
+
+    function isWhiteSpace(ch) {
+        return (ch === 32) ||  // space
+            (ch === 9) ||      // tab
+            (ch === 0xB) ||
+            (ch === 0xC) ||
+            (ch === 0xA0) ||
+            (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);
+    }
+
+    // 7.3 Line Terminators
+
+    function isLineTerminator(ch) {
+        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);
+    }
+
+    // 7.6 Identifier Names and Identifiers
+
+    function isIdentifierStart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122);          // a..z
+    }
+
+    function isIdentifierPart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122) ||        // a..z
+            (ch >= 48 && ch <= 57);           // 0..9
+    }
+
+    // 7.6.1.1 Keywords
+
+    function isKeyword(id) {
+        return (id === 'this')
+    }
+
+    // 7.4 Comments
+
+    function skipWhitespace() {
+        while (index < length && isWhiteSpace(source.charCodeAt(index))) {
+           ++index;
+        }
+    }
+
+    function getIdentifier() {
+        var start, ch;
+
+        start = index++;
+        while (index < length) {
+            ch = source.charCodeAt(index);
+            if (isIdentifierPart(ch)) {
+                ++index;
+            } else {
+                break;
+            }
+        }
+
+        return source.slice(start, index);
+    }
+
+    function scanIdentifier() {
+        var start, id, type;
+
+        start = index;
+
+        id = getIdentifier();
+
+        // There is no keyword or literal with only one character.
+        // Thus, it must be an identifier.
+        if (id.length === 1) {
+            type = Token.Identifier;
+        } else if (isKeyword(id)) {
+            type = Token.Keyword;
+        } else if (id === 'null') {
+            type = Token.NullLiteral;
+        } else if (id === 'true' || id === 'false') {
+            type = Token.BooleanLiteral;
+        } else {
+            type = Token.Identifier;
+        }
+
+        return {
+            type: type,
+            value: id,
+            range: [start, index]
+        };
+    }
+
+
+    // 7.7 Punctuators
+
+    function scanPunctuator() {
+        var start = index,
+            code = source.charCodeAt(index),
+            code2,
+            ch1 = source[index],
+            ch2;
+
+        switch (code) {
+
+        // Check for most common single-character punctuators.
+        case 46:   // . dot
+        case 40:   // ( open bracket
+        case 41:   // ) close bracket
+        case 59:   // ; semicolon
+        case 44:   // , comma
+        case 123:  // { open curly brace
+        case 125:  // } close curly brace
+        case 91:   // [
+        case 93:   // ]
+        case 58:   // :
+        case 63:   // ?
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: String.fromCharCode(code),
+                range: [start, index]
+            };
+
+        default:
+            code2 = source.charCodeAt(index + 1);
+
+            // '=' (char #61) marks an assignment or comparison operator.
+            if (code2 === 61) {
+                switch (code) {
+                case 37:  // %
+                case 38:  // &
+                case 42:  // *:
+                case 43:  // +
+                case 45:  // -
+                case 47:  // /
+                case 60:  // <
+                case 62:  // >
+                case 124: // |
+                    index += 2;
+                    return {
+                        type: Token.Punctuator,
+                        value: String.fromCharCode(code) + String.fromCharCode(code2),
+                        range: [start, index]
+                    };
+
+                case 33: // !
+                case 61: // =
+                    index += 2;
+
+                    // !== and ===
+                    if (source.charCodeAt(index) === 61) {
+                        ++index;
+                    }
+                    return {
+                        type: Token.Punctuator,
+                        value: source.slice(start, index),
+                        range: [start, index]
+                    };
+                default:
+                    break;
+                }
+            }
+            break;
+        }
+
+        // Peek more characters.
+
+        ch2 = source[index + 1];
+
+        // Other 2-character punctuators: && ||
+
+        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
+            index += 2;
+            return {
+                type: Token.Punctuator,
+                value: ch1 + ch2,
+                range: [start, index]
+            };
+        }
+
+        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: ch1,
+                range: [start, index]
+            };
+        }
+
+        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+    }
+
+    // 7.8.3 Numeric Literals
+    function scanNumericLiteral() {
+        var number, start, ch;
+
+        ch = source[index];
+        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
+            'Numeric literal must start with a decimal digit or a decimal point');
+
+        start = index;
+        number = '';
+        if (ch !== '.') {
+            number = source[index++];
+            ch = source[index];
+
+            // Hex number starts with '0x'.
+            // Octal number starts with '0'.
+            if (number === '0') {
+                // decimal number starts with '0' such as '09' is illegal.
+                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
+                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+                }
+            }
+
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === '.') {
+            number += source[index++];
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === 'e' || ch === 'E') {
+            number += source[index++];
+
+            ch = source[index];
+            if (ch === '+' || ch === '-') {
+                number += source[index++];
+            }
+            if (isDecimalDigit(source.charCodeAt(index))) {
+                while (isDecimalDigit(source.charCodeAt(index))) {
+                    number += source[index++];
+                }
+            } else {
+                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+            }
+        }
+
+        if (isIdentifierStart(source.charCodeAt(index))) {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.NumericLiteral,
+            value: parseFloat(number),
+            range: [start, index]
+        };
+    }
+
+    // 7.8.4 String Literals
+
+    function scanStringLiteral() {
+        var str = '', quote, start, ch, octal = false;
+
+        quote = source[index];
+        assert((quote === '\'' || quote === '"'),
+            'String literal must starts with a quote');
+
+        start = index;
+        ++index;
+
+        while (index < length) {
+            ch = source[index++];
+
+            if (ch === quote) {
+                quote = '';
+                break;
+            } else if (ch === '\\') {
+                ch = source[index++];
+                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
+                    switch (ch) {
+                    case 'n':
+                        str += '\n';
+                        break;
+                    case 'r':
+                        str += '\r';
+                        break;
+                    case 't':
+                        str += '\t';
+                        break;
+                    case 'b':
+                        str += '\b';
+                        break;
+                    case 'f':
+                        str += '\f';
+                        break;
+                    case 'v':
+                        str += '\x0B';
+                        break;
+
+                    default:
+                        str += ch;
+                        break;
+                    }
+                } else {
+                    if (ch ===  '\r' && source[index] === '\n') {
+                        ++index;
+                    }
+                }
+            } else if (isLineTerminator(ch.charCodeAt(0))) {
+                break;
+            } else {
+                str += ch;
+            }
+        }
+
+        if (quote !== '') {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.StringLiteral,
+            value: str,
+            octal: octal,
+            range: [start, index]
+        };
+    }
+
+    function isIdentifierName(token) {
+        return token.type === Token.Identifier ||
+            token.type === Token.Keyword ||
+            token.type === Token.BooleanLiteral ||
+            token.type === Token.NullLiteral;
+    }
+
+    function advance() {
+        var ch;
+
+        skipWhitespace();
+
+        if (index >= length) {
+            return {
+                type: Token.EOF,
+                range: [index, index]
+            };
+        }
+
+        ch = source.charCodeAt(index);
+
+        // Very common: ( and ) and ;
+        if (ch === 40 || ch === 41 || ch === 58) {
+            return scanPunctuator();
+        }
+
+        // String literal starts with single quote (#39) or double quote (#34).
+        if (ch === 39 || ch === 34) {
+            return scanStringLiteral();
+        }
+
+        if (isIdentifierStart(ch)) {
+            return scanIdentifier();
+        }
+
+        // Dot (.) char #46 can also start a floating-point number, hence the need
+        // to check the next character.
+        if (ch === 46) {
+            if (isDecimalDigit(source.charCodeAt(index + 1))) {
+                return scanNumericLiteral();
+            }
+            return scanPunctuator();
+        }
+
+        if (isDecimalDigit(ch)) {
+            return scanNumericLiteral();
+        }
+
+        return scanPunctuator();
+    }
+
+    function lex() {
+        var token;
+
+        token = lookahead;
+        index = token.range[1];
+
+        lookahead = advance();
+
+        index = token.range[1];
+
+        return token;
+    }
+
+    function peek() {
+        var pos;
+
+        pos = index;
+        lookahead = advance();
+        index = pos;
+    }
+
+    // Throw an exception
+
+    function throwError(token, messageFormat) {
+        var error,
+            args = Array.prototype.slice.call(arguments, 2),
+            msg = messageFormat.replace(
+                /%(\d)/g,
+                function (whole, index) {
+                    assert(index < args.length, 'Message reference must be in range');
+                    return args[index];
+                }
+            );
+
+        error = new Error(msg);
+        error.index = index;
+        error.description = msg;
+        throw error;
+    }
+
+    // Throw an exception because of the token.
+
+    function throwUnexpected(token) {
+        throwError(token, Messages.UnexpectedToken, token.value);
+    }
+
+    // Expect the next token to match the specified punctuator.
+    // If not, an exception will be thrown.
+
+    function expect(value) {
+        var token = lex();
+        if (token.type !== Token.Punctuator || token.value !== value) {
+            throwUnexpected(token);
+        }
+    }
+
+    // Return true if the next token matches the specified punctuator.
+
+    function match(value) {
+        return lookahead.type === Token.Punctuator && lookahead.value === value;
+    }
+
+    // Return true if the next token matches the specified keyword
+
+    function matchKeyword(keyword) {
+        return lookahead.type === Token.Keyword && lookahead.value === keyword;
+    }
+
+    function consumeSemicolon() {
+        // Catch the very common case first: immediately a semicolon (char #59).
+        if (source.charCodeAt(index) === 59) {
+            lex();
+            return;
+        }
+
+        skipWhitespace();
+
+        if (match(';')) {
+            lex();
+            return;
+        }
+
+        if (lookahead.type !== Token.EOF && !match('}')) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    // 11.1.4 Array Initialiser
+
+    function parseArrayInitialiser() {
+        var elements = [];
+
+        expect('[');
+
+        while (!match(']')) {
+            if (match(',')) {
+                lex();
+                elements.push(null);
+            } else {
+                elements.push(parseExpression());
+
+                if (!match(']')) {
+                    expect(',');
+                }
+            }
+        }
+
+        expect(']');
+
+        return delegate.createArrayExpression(elements);
+    }
+
+    // 11.1.5 Object Initialiser
+
+    function parseObjectPropertyKey() {
+        var token;
+
+        skipWhitespace();
+        token = lex();
+
+        // Note: This function is called only from parseObjectProperty(), where
+        // EOF and Punctuator tokens are already filtered out.
+        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
+            return delegate.createLiteral(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseObjectProperty() {
+        var token, key;
+
+        token = lookahead;
+        skipWhitespace();
+
+        if (token.type === Token.EOF || token.type === Token.Punctuator) {
+            throwUnexpected(token);
+        }
+
+        key = parseObjectPropertyKey();
+        expect(':');
+        return delegate.createProperty('init', key, parseExpression());
+    }
+
+    function parseObjectInitialiser() {
+        var properties = [];
+
+        expect('{');
+
+        while (!match('}')) {
+            properties.push(parseObjectProperty());
+
+            if (!match('}')) {
+                expect(',');
+            }
+        }
+
+        expect('}');
+
+        return delegate.createObjectExpression(properties);
+    }
+
+    // 11.1.6 The Grouping Operator
+
+    function parseGroupExpression() {
+        var expr;
+
+        expect('(');
+
+        expr = parseExpression();
+
+        expect(')');
+
+        return expr;
+    }
+
+
+    // 11.1 Primary Expressions
+
+    function parsePrimaryExpression() {
+        var type, token, expr;
+
+        if (match('(')) {
+            return parseGroupExpression();
+        }
+
+        type = lookahead.type;
+
+        if (type === Token.Identifier) {
+            expr = delegate.createIdentifier(lex().value);
+        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
+            expr = delegate.createLiteral(lex());
+        } else if (type === Token.Keyword) {
+            if (matchKeyword('this')) {
+                lex();
+                expr = delegate.createThisExpression();
+            }
+        } else if (type === Token.BooleanLiteral) {
+            token = lex();
+            token.value = (token.value === 'true');
+            expr = delegate.createLiteral(token);
+        } else if (type === Token.NullLiteral) {
+            token = lex();
+            token.value = null;
+            expr = delegate.createLiteral(token);
+        } else if (match('[')) {
+            expr = parseArrayInitialiser();
+        } else if (match('{')) {
+            expr = parseObjectInitialiser();
+        }
+
+        if (expr) {
+            return expr;
+        }
+
+        throwUnexpected(lex());
+    }
+
+    // 11.2 Left-Hand-Side Expressions
+
+    function parseArguments() {
+        var args = [];
+
+        expect('(');
+
+        if (!match(')')) {
+            while (index < length) {
+                args.push(parseExpression());
+                if (match(')')) {
+                    break;
+                }
+                expect(',');
+            }
+        }
+
+        expect(')');
+
+        return args;
+    }
+
+    function parseNonComputedProperty() {
+        var token;
+
+        token = lex();
+
+        if (!isIdentifierName(token)) {
+            throwUnexpected(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseNonComputedMember() {
+        expect('.');
+
+        return parseNonComputedProperty();
+    }
+
+    function parseComputedMember() {
+        var expr;
+
+        expect('[');
+
+        expr = parseExpression();
+
+        expect(']');
+
+        return expr;
+    }
+
+    function parseLeftHandSideExpression() {
+        var expr, args, property;
+
+        expr = parsePrimaryExpression();
+
+        while (true) {
+            if (match('[')) {
+                property = parseComputedMember();
+                expr = delegate.createMemberExpression('[', expr, property);
+            } else if (match('.')) {
+                property = parseNonComputedMember();
+                expr = delegate.createMemberExpression('.', expr, property);
+            } else if (match('(')) {
+                args = parseArguments();
+                expr = delegate.createCallExpression(expr, args);
+            } else {
+                break;
+            }
+        }
+
+        return expr;
+    }
+
+    // 11.3 Postfix Expressions
+
+    var parsePostfixExpression = parseLeftHandSideExpression;
+
+    // 11.4 Unary Operators
+
+    function parseUnaryExpression() {
+        var token, expr;
+
+        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
+            expr = parsePostfixExpression();
+        } else if (match('+') || match('-') || match('!')) {
+            token = lex();
+            expr = parseUnaryExpression();
+            expr = delegate.createUnaryExpression(token.value, expr);
+        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
+            throwError({}, Messages.UnexpectedToken);
+        } else {
+            expr = parsePostfixExpression();
+        }
+
+        return expr;
+    }
+
+    function binaryPrecedence(token) {
+        var prec = 0;
+
+        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
+            return 0;
+        }
+
+        switch (token.value) {
+        case '||':
+            prec = 1;
+            break;
+
+        case '&&':
+            prec = 2;
+            break;
+
+        case '==':
+        case '!=':
+        case '===':
+        case '!==':
+            prec = 6;
+            break;
+
+        case '<':
+        case '>':
+        case '<=':
+        case '>=':
+        case 'instanceof':
+            prec = 7;
+            break;
+
+        case 'in':
+            prec = 7;
+            break;
+
+        case '+':
+        case '-':
+            prec = 9;
+            break;
+
+        case '*':
+        case '/':
+        case '%':
+            prec = 11;
+            break;
+
+        default:
+            break;
+        }
+
+        return prec;
+    }
+
+    // 11.5 Multiplicative Operators
+    // 11.6 Additive Operators
+    // 11.7 Bitwise Shift Operators
+    // 11.8 Relational Operators
+    // 11.9 Equality Operators
+    // 11.10 Binary Bitwise Operators
+    // 11.11 Binary Logical Operators
+
+    function parseBinaryExpression() {
+        var expr, token, prec, stack, right, operator, left, i;
+
+        left = parseUnaryExpression();
+
+        token = lookahead;
+        prec = binaryPrecedence(token);
+        if (prec === 0) {
+            return left;
+        }
+        token.prec = prec;
+        lex();
+
+        right = parseUnaryExpression();
+
+        stack = [left, token, right];
+
+        while ((prec = binaryPrecedence(lookahead)) > 0) {
+
+            // Reduce: make a binary expression from the three topmost entries.
+            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
+                right = stack.pop();
+                operator = stack.pop().value;
+                left = stack.pop();
+                expr = delegate.createBinaryExpression(operator, left, right);
+                stack.push(expr);
+            }
+
+            // Shift.
+            token = lex();
+            token.prec = prec;
+            stack.push(token);
+            expr = parseUnaryExpression();
+            stack.push(expr);
+        }
+
+        // Final reduce to clean-up the stack.
+        i = stack.length - 1;
+        expr = stack[i];
+        while (i > 1) {
+            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
+            i -= 2;
+        }
+
+        return expr;
+    }
+
+
+    // 11.12 Conditional Operator
+
+    function parseConditionalExpression() {
+        var expr, consequent, alternate;
+
+        expr = parseBinaryExpression();
+
+        if (match('?')) {
+            lex();
+            consequent = parseConditionalExpression();
+            expect(':');
+            alternate = parseConditionalExpression();
+
+            expr = delegate.createConditionalExpression(expr, consequent, alternate);
+        }
+
+        return expr;
+    }
+
+    // Simplification since we do not support AssignmentExpression.
+    var parseExpression = parseConditionalExpression;
+
+    // Polymer Syntax extensions
+
+    // Filter ::
+    //   Identifier
+    //   Identifier "(" ")"
+    //   Identifier "(" FilterArguments ")"
+
+    function parseFilter() {
+        var identifier, args;
+
+        identifier = lex();
+
+        if (identifier.type !== Token.Identifier) {
+            throwUnexpected(identifier);
+        }
+
+        args = match('(') ? parseArguments() : [];
+
+        return delegate.createFilter(identifier.value, args);
+    }
+
+    // Filters ::
+    //   "|" Filter
+    //   Filters "|" Filter
+
+    function parseFilters() {
+        while (match('|')) {
+            lex();
+            parseFilter();
+        }
+    }
+
+    // TopLevel ::
+    //   LabelledExpressions
+    //   AsExpression
+    //   InExpression
+    //   FilterExpression
+
+    // AsExpression ::
+    //   FilterExpression as Identifier
+
+    // InExpression ::
+    //   Identifier, Identifier in FilterExpression
+    //   Identifier in FilterExpression
+
+    // FilterExpression ::
+    //   Expression
+    //   Expression Filters
+
+    function parseTopLevel() {
+        skipWhitespace();
+        peek();
+
+        var expr = parseExpression();
+        if (expr) {
+            if (lookahead.value === ',' || lookahead.value == 'in' &&
+                       expr.type === Syntax.Identifier) {
+                parseInExpression(expr);
+            } else {
+                parseFilters();
+                if (lookahead.value === 'as') {
+                    parseAsExpression(expr);
+                } else {
+                    delegate.createTopLevel(expr);
+                }
+            }
+        }
+
+        if (lookahead.type !== Token.EOF) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    function parseAsExpression(expr) {
+        lex();  // as
+        var identifier = lex().value;
+        delegate.createAsExpression(expr, identifier);
+    }
+
+    function parseInExpression(identifier) {
+        var indexName;
+        if (lookahead.value === ',') {
+            lex();
+            if (lookahead.type !== Token.Identifier)
+                throwUnexpected(lookahead);
+            indexName = lex().value;
+        }
+
+        lex();  // in
+        var expr = parseExpression();
+        parseFilters();
+        delegate.createInExpression(identifier.name, indexName, expr);
+    }
+
+    function parse(code, inDelegate) {
+        delegate = inDelegate;
+        source = code;
+        index = 0;
+        length = source.length;
+        lookahead = null;
+        state = {
+            labelSet: {}
+        };
+
+        return parseTopLevel();
+    }
+
+    global.esprima = {
+        parse: parse
+    };
+})(this);
+
+// 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';
+
+  function prepareBinding(expressionText, name, node, filterRegistry) {
+    var expression;
+    try {
+      expression = getExpression(expressionText);
+      if (expression.scopeIdent &&
+          (node.nodeType !== Node.ELEMENT_NODE ||
+           node.tagName !== 'TEMPLATE' ||
+           (name !== 'bind' && name !== 'repeat'))) {
+        throw Error('as and in can only be used within <template bind/repeat>');
+      }
+    } catch (ex) {
+      console.error('Invalid expression syntax: ' + expressionText, ex);
+      return;
+    }
+
+    return function(model, node, oneTime) {
+      var binding = expression.getBinding(model, filterRegistry, oneTime);
+      if (expression.scopeIdent && binding) {
+        node.polymerExpressionScopeIdent_ = expression.scopeIdent;
+        if (expression.indexIdent)
+          node.polymerExpressionIndexIdent_ = expression.indexIdent;
+      }
+
+      return binding;
+    }
+  }
+
+  // TODO(rafaelw): Implement simple LRU.
+  var expressionParseCache = Object.create(null);
+
+  function getExpression(expressionText) {
+    var expression = expressionParseCache[expressionText];
+    if (!expression) {
+      var delegate = new ASTDelegate();
+      esprima.parse(expressionText, delegate);
+      expression = new Expression(delegate);
+      expressionParseCache[expressionText] = expression;
+    }
+    return expression;
+  }
+
+  function Literal(value) {
+    this.value = value;
+    this.valueFn_ = undefined;
+  }
+
+  Literal.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var value = this.value;
+        this.valueFn_ = function() {
+          return value;
+        }
+      }
+
+      return this.valueFn_;
+    }
+  }
+
+  function IdentPath(name) {
+    this.name = name;
+    this.path = Path.get(name);
+  }
+
+  IdentPath.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var name = this.name;
+        var path = this.path;
+        this.valueFn_ = function(model, observer) {
+          if (observer)
+            observer.addPath(model, path);
+
+          return path.getValueFrom(model);
+        }
+      }
+
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.path.length == 1);
+        model = findScope(model, this.path[0]);
+
+      return this.path.setValueFrom(model, newValue);
+    }
+  };
+
+  function MemberExpression(object, property, accessor) {
+    this.computed = accessor == '[';
+
+    this.dynamicDeps = typeof object == 'function' ||
+                       object.dynamicDeps ||
+                       (this.computed && !(property instanceof Literal));
+
+    this.simplePath =
+        !this.dynamicDeps &&
+        (property instanceof IdentPath || property instanceof Literal) &&
+        (object instanceof MemberExpression || object instanceof IdentPath);
+
+    this.object = this.simplePath ? object : getFn(object);
+    this.property = !this.computed || this.simplePath ?
+        property : getFn(property);
+  }
+
+  MemberExpression.prototype = {
+    get fullPath() {
+      if (!this.fullPath_) {
+
+        var parts = this.object instanceof MemberExpression ?
+            this.object.fullPath.slice() : [this.object.name];
+        parts.push(this.property instanceof IdentPath ?
+            this.property.name : this.property.value);
+        this.fullPath_ = Path.get(parts);
+      }
+
+      return this.fullPath_;
+    },
+
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var object = this.object;
+
+        if (this.simplePath) {
+          var path = this.fullPath;
+
+          this.valueFn_ = function(model, observer) {
+            if (observer)
+              observer.addPath(model, path);
+
+            return path.getValueFrom(model);
+          };
+        } else if (!this.computed) {
+          var path = Path.get(this.property.name);
+
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+
+            if (observer)
+              observer.addPath(context, path);
+
+            return path.getValueFrom(context);
+          }
+        } else {
+          // Computed property.
+          var property = this.property;
+
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+            var propName = property(model, observer, filterRegistry);
+            if (observer)
+              observer.addPath(context, [propName]);
+
+            return context ? context[propName] : undefined;
+          };
+        }
+      }
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.simplePath) {
+        this.fullPath.setValueFrom(model, newValue);
+        return newValue;
+      }
+
+      var object = this.object(model);
+      var propName = this.property instanceof IdentPath ? this.property.name :
+          this.property(model);
+      return object[propName] = newValue;
+    }
+  };
+
+  function Filter(name, args) {
+    this.name = name;
+    this.args = [];
+    for (var i = 0; i < args.length; i++) {
+      this.args[i] = getFn(args[i]);
+    }
+  }
+
+  Filter.prototype = {
+    transform: function(model, observer, filterRegistry, toModelDirection,
+                        initialArgs) {
+      var fn = filterRegistry[this.name];
+      var context = model;
+      if (fn) {
+        context = undefined;
+      } else {
+        fn = context[this.name];
+        if (!fn) {
+          console.error('Cannot find function or filter: ' + this.name);
+          return;
+        }
+      }
+
+      // If toModelDirection is falsey, then the "normal" (dom-bound) direction
+      // is used. Otherwise, it looks for a 'toModel' property function on the
+      // object.
+      if (toModelDirection) {
+        fn = fn.toModel;
+      } else if (typeof fn.toDOM == 'function') {
+        fn = fn.toDOM;
+      }
+
+      if (typeof fn != 'function') {
+        console.error('Cannot find function or filter: ' + this.name);
+        return;
+      }
+
+      var args = initialArgs || [];
+      for (var i = 0; i < this.args.length; i++) {
+        args.push(getFn(this.args[i])(model, observer, filterRegistry));
+      }
+
+      return fn.apply(context, args);
+    }
+  };
+
+  function notImplemented() { throw Error('Not Implemented'); }
+
+  var unaryOperators = {
+    '+': function(v) { return +v; },
+    '-': function(v) { return -v; },
+    '!': function(v) { return !v; }
+  };
+
+  var binaryOperators = {
+    '+': function(l, r) { return l+r; },
+    '-': function(l, r) { return l-r; },
+    '*': function(l, r) { return l*r; },
+    '/': function(l, r) { return l/r; },
+    '%': function(l, r) { return l%r; },
+    '<': function(l, r) { return l<r; },
+    '>': function(l, r) { return l>r; },
+    '<=': function(l, r) { return l<=r; },
+    '>=': function(l, r) { return l>=r; },
+    '==': function(l, r) { return l==r; },
+    '!=': function(l, r) { return l!=r; },
+    '===': function(l, r) { return l===r; },
+    '!==': function(l, r) { return l!==r; },
+    '&&': function(l, r) { return l&&r; },
+    '||': function(l, r) { return l||r; },
+  };
+
+  function getFn(arg) {
+    return typeof arg == 'function' ? arg : arg.valueFn();
+  }
+
+  function ASTDelegate() {
+    this.expression = null;
+    this.filters = [];
+    this.deps = {};
+    this.currentPath = undefined;
+    this.scopeIdent = undefined;
+    this.indexIdent = undefined;
+    this.dynamicDeps = false;
+  }
+
+  ASTDelegate.prototype = {
+    createUnaryExpression: function(op, argument) {
+      if (!unaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      argument = getFn(argument);
+
+      return function(model, observer, filterRegistry) {
+        return unaryOperators[op](argument(model, observer, filterRegistry));
+      };
+    },
+
+    createBinaryExpression: function(op, left, right) {
+      if (!binaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      left = getFn(left);
+      right = getFn(right);
+
+      switch (op) {
+        case '||':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) ||
+                right(model, observer, filterRegistry);
+          };
+        case '&&':
+          this.dynamicDeps = true;
+          return function(model, observer, filterRegistry) {
+            return left(model, observer, filterRegistry) &&
+                right(model, observer, filterRegistry);
+          };
+      }
+
+      return function(model, observer, filterRegistry) {
+        return binaryOperators[op](left(model, observer, filterRegistry),
+                                   right(model, observer, filterRegistry));
+      };
+    },
+
+    createConditionalExpression: function(test, consequent, alternate) {
+      test = getFn(test);
+      consequent = getFn(consequent);
+      alternate = getFn(alternate);
+
+      this.dynamicDeps = true;
+
+      return function(model, observer, filterRegistry) {
+        return test(model, observer, filterRegistry) ?
+            consequent(model, observer, filterRegistry) :
+            alternate(model, observer, filterRegistry);
+      }
+    },
+
+    createIdentifier: function(name) {
+      var ident = new IdentPath(name);
+      ident.type = 'Identifier';
+      return ident;
+    },
+
+    createMemberExpression: function(accessor, object, property) {
+      var ex = new MemberExpression(object, property, accessor);
+      if (ex.dynamicDeps)
+        this.dynamicDeps = true;
+      return ex;
+    },
+
+    createCallExpression: function(expression, args) {
+      if (!(expression instanceof IdentPath))
+        throw Error('Only identifier function invocations are allowed');
+
+      var filter = new Filter(expression.name, args);
+
+      return function(model, observer, filterRegistry) {
+        return filter.transform(model, observer, filterRegistry, false);
+      };
+    },
+
+    createLiteral: function(token) {
+      return new Literal(token.value);
+    },
+
+    createArrayExpression: function(elements) {
+      for (var i = 0; i < elements.length; i++)
+        elements[i] = getFn(elements[i]);
+
+      return function(model, observer, filterRegistry) {
+        var arr = []
+        for (var i = 0; i < elements.length; i++)
+          arr.push(elements[i](model, observer, filterRegistry));
+        return arr;
+      }
+    },
+
+    createProperty: function(kind, key, value) {
+      return {
+        key: key instanceof IdentPath ? key.name : key.value,
+        value: value
+      };
+    },
+
+    createObjectExpression: function(properties) {
+      for (var i = 0; i < properties.length; i++)
+        properties[i].value = getFn(properties[i].value);
+
+      return function(model, observer, filterRegistry) {
+        var obj = {};
+        for (var i = 0; i < properties.length; i++)
+          obj[properties[i].key] =
+              properties[i].value(model, observer, filterRegistry);
+        return obj;
+      }
+    },
+
+    createFilter: function(name, args) {
+      this.filters.push(new Filter(name, args));
+    },
+
+    createAsExpression: function(expression, scopeIdent) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+    },
+
+    createInExpression: function(scopeIdent, indexIdent, expression) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+      this.indexIdent = indexIdent;
+    },
+
+    createTopLevel: function(expression) {
+      this.expression = expression;
+    },
+
+    createThisExpression: notImplemented
+  }
+
+  function ConstantObservable(value) {
+    this.value_ = value;
+  }
+
+  ConstantObservable.prototype = {
+    open: function() { return this.value_; },
+    discardChanges: function() { return this.value_; },
+    deliver: function() {},
+    close: function() {},
+  }
+
+  function Expression(delegate) {
+    this.scopeIdent = delegate.scopeIdent;
+    this.indexIdent = delegate.indexIdent;
+
+    if (!delegate.expression)
+      throw Error('No expression found.');
+
+    this.expression = delegate.expression;
+    getFn(this.expression); // forces enumeration of path dependencies
+
+    this.filters = delegate.filters;
+    this.dynamicDeps = delegate.dynamicDeps;
+  }
+
+  Expression.prototype = {
+    getBinding: function(model, filterRegistry, oneTime) {
+      if (oneTime)
+        return this.getValue(model, undefined, filterRegistry);
+
+      var observer = new CompoundObserver();
+      // captures deps.
+      var firstValue = this.getValue(model, observer, filterRegistry);
+      var firstTime = true;
+      var self = this;
+
+      function valueFn() {
+        // deps cannot have changed on first value retrieval.
+        if (firstTime) {
+          firstTime = false;
+          return firstValue;
+        }
+
+        if (self.dynamicDeps)
+          observer.startReset();
+
+        var value = self.getValue(model,
+                                  self.dynamicDeps ? observer : undefined,
+                                  filterRegistry);
+        if (self.dynamicDeps)
+          observer.finishReset();
+
+        return value;
+      }
+
+      function setValueFn(newValue) {
+        self.setValue(model, newValue, filterRegistry);
+        return newValue;
+      }
+
+      return new ObserverTransform(observer, valueFn, setValueFn, true);
+    },
+
+    getValue: function(model, observer, filterRegistry) {
+      var value = getFn(this.expression)(model, observer, filterRegistry);
+      for (var i = 0; i < this.filters.length; i++) {
+        value = this.filters[i].transform(model, observer, filterRegistry,
+            false, [value]);
+      }
+
+      return value;
+    },
+
+    setValue: function(model, newValue, filterRegistry) {
+      var count = this.filters ? this.filters.length : 0;
+      while (count-- > 0) {
+        newValue = this.filters[count].transform(model, undefined,
+            filterRegistry, true, [newValue]);
+      }
+
+      if (this.expression.setValue)
+        return this.expression.setValue(model, newValue);
+    }
+  }
+
+  /**
+   * Converts a style property name to a css property name. For example:
+   * "WebkitUserSelect" to "-webkit-user-select"
+   */
+  function convertStylePropertyName(name) {
+    return String(name).replace(/[A-Z]/g, function(c) {
+      return '-' + c.toLowerCase();
+    });
+  }
+
+  var parentScopeName = '@' + Math.random().toString(36).slice(2);
+
+  // Single ident paths must bind directly to the appropriate scope object.
+  // I.e. Pushed values in two-bindings need to be assigned to the actual model
+  // object.
+  function findScope(model, prop) {
+    while (model[parentScopeName] &&
+           !Object.prototype.hasOwnProperty.call(model, prop)) {
+      model = model[parentScopeName];
+    }
+
+    return model;
+  }
+
+  function isLiteralExpression(pathString) {
+    switch (pathString) {
+      case '':
+        return false;
+
+      case 'false':
+      case 'null':
+      case 'true':
+        return true;
+    }
+
+    if (!isNaN(Number(pathString)))
+      return true;
+
+    return false;
+  };
+
+  function PolymerExpressions() {}
+
+  PolymerExpressions.prototype = {
+    // "built-in" filters
+    styleObject: function(value) {
+      var parts = [];
+      for (var key in value) {
+        parts.push(convertStylePropertyName(key) + ': ' + value[key]);
+      }
+      return parts.join('; ');
+    },
+
+    tokenList: function(value) {
+      var tokens = [];
+      for (var key in value) {
+        if (value[key])
+          tokens.push(key);
+      }
+      return tokens.join(' ');
+    },
+
+    // binding delegate API
+    prepareInstancePositionChanged: function(template) {
+      var indexIdent = template.polymerExpressionIndexIdent_;
+      if (!indexIdent)
+        return;
+
+      return function(templateInstance, index) {
+        templateInstance.model[indexIdent] = index;
+      };
+    },
+
+    prepareBinding: function(pathString, name, node) {
+      var path = Path.get(pathString);
+
+      if (!isLiteralExpression(pathString) && path.valid) {
+        if (path.length == 1) {
+          return function(model, node, oneTime) {
+            if (oneTime)
+              return path.getValueFrom(model);
+
+            var scope = findScope(model, path[0]);
+            return new PathObserver(scope, path);
+          };
+        }
+        return; // bail out early if pathString is simple path.
+      }
+
+      return prepareBinding(pathString, name, node, this);
+    },
+
+    prepareInstanceModel: function(template) {
+      var scopeName = template.polymerExpressionScopeIdent_;
+      if (!scopeName)
+        return;
+
+      var parentScope = template.templateInstance ?
+          template.templateInstance.model :
+          template.model;
+
+      var indexName = template.polymerExpressionIndexIdent_;
+
+      return function(model) {
+        return createScopeObject(parentScope, model, scopeName, indexName);
+      };
+    }
+  };
+
+  var createScopeObject = ('__proto__' in {}) ?
+    function(parentScope, model, scopeName, indexName) {
+      var scope = {};
+      scope[scopeName] = model;
+      scope[indexName] = undefined;
+      scope[parentScopeName] = parentScope;
+      scope.__proto__ = parentScope;
+      return scope;
+    } :
+    function(parentScope, model, scopeName, indexName) {
+      var scope = Object.create(parentScope);
+      Object.defineProperty(scope, scopeName,
+          { value: model, configurable: true, writable: true });
+      Object.defineProperty(scope, indexName,
+          { value: undefined, configurable: true, writable: true });
+      Object.defineProperty(scope, parentScopeName,
+          { value: parentScope, configurable: true, writable: true });
+      return scope;
+    };
+
+  global.PolymerExpressions = PolymerExpressions;
+  PolymerExpressions.getExpression = getExpression;
+})(this);
+
+Polymer = {
+  version: '0.5.1'
+};
+
+// TODO(sorvell): this ensures Polymer is an object and not a function
+// Platform is currently defining it as a function to allow for async loading
+// of polymer; once we refine the loading process this likely goes away.
+if (typeof window.Polymer === 'function') {
+  Polymer = {};
+}
+
+
+(function(scope) {
+
+  function withDependencies(task, depends) {
+    depends = depends || [];
+    if (!depends.map) {
+      depends = [depends];
+    }
+    return task.apply(this, depends.map(marshal));
+  }
+
+  function module(name, dependsOrFactory, moduleFactory) {
+    var module;
+    switch (arguments.length) {
+      case 0:
+        return;
+      case 1:
+        module = null;
+        break;
+      case 2:
+        // dependsOrFactory is `factory` in this case
+        module = dependsOrFactory.apply(this);
+        break;
+      default:
+        // dependsOrFactory is `depends` in this case
+        module = withDependencies(moduleFactory, dependsOrFactory);
+        break;
+    }
+    modules[name] = module;
+  };
+
+  function marshal(name) {
+    return modules[name];
+  }
+
+  var modules = {};
+
+  function using(depends, task) {
+    HTMLImports.whenImportsReady(function() {
+      withDependencies(task, depends);
+    });
+  };
+
+  // exports
+
+  scope.marshal = marshal;
+  // `module` confuses commonjs detectors
+  scope.modularize = module;
+  scope.using = using;
+
+})(window);
+
+/*
+	Build only script.
+
+  Ensures scripts needed for basic x-platform compatibility
+  will be run when platform.js is not loaded.
+ */
+if (!window.WebComponents) {
+
+/*
+	On supported platforms, platform.js is not needed. To retain compatibility
+	with the polyfills, we stub out minimal functionality.
+ */
+if (!window.WebComponents) {
+
+  WebComponents = {
+  	flush: function() {},
+    flags: {log: {}}
+  };
+
+  Platform = WebComponents;
+
+  CustomElements = {
+  	useNative: true,
+    ready: true,
+    takeRecords: function() {},
+    instanceof: function(obj, base) {
+      return obj instanceof base;
+    }
+  };
+  
+  HTMLImports = {
+  	useNative: true
+  };
+
+  
+  addEventListener('HTMLImportsLoaded', function() {
+    document.dispatchEvent(
+      new CustomEvent('WebComponentsReady', {bubbles: true})
+    );
+  });
+
+
+  // ShadowDOM
+  ShadowDOMPolyfill = null;
+  wrap = unwrap = function(n){
+    return n;
+  };
+
+}
+
+/*
+  Create polyfill scope and feature detect native support.
+*/
+window.HTMLImports = window.HTMLImports || {flags:{}};
+
+(function(scope) {
+
+/**
+  Basic setup and simple module executer. We collect modules and then execute
+  the code later, only if it's necessary for polyfilling.
+*/
+var IMPORT_LINK_TYPE = 'import';
+var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement('link'));
+
+/**
+  Support `currentScript` on all browsers as `document._currentScript.`
+
+  NOTE: We cannot polyfill `document.currentScript` because it's not possible
+  both to override and maintain the ability to capture the native value.
+  Therefore we choose to expose `_currentScript` both when native imports
+  and the polyfill are in use.
+*/
+// NOTE: ShadowDOMPolyfill intrusion.
+var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
+var wrap = function(node) {
+  return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
+};
+var rootDocument = wrap(document);
+
+var currentScriptDescriptor = {
+  get: function() {
+    var script = HTMLImports.currentScript || document.currentScript ||
+        // NOTE: only works when called in synchronously executing code.
+        // readyState should check if `loading` but IE10 is
+        // interactive when scripts run so we cheat.
+        (document.readyState !== 'complete' ?
+        document.scripts[document.scripts.length - 1] : null);
+    return wrap(script);
+  },
+  configurable: true
+};
+
+Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
+Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor);
+
+/**
+  Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady`
+  method. This api is necessary because unlike the native implementation,
+  script elements do not force imports to resolve. Instead, users should wrap
+  code in either an `HTMLImportsLoaded` hander or after load time in an
+  `HTMLImports.whenReady(callback)` call.
+
+  NOTE: This module also supports these apis under the native implementation.
+  Therefore, if this file is loaded, the same code can be used under both
+  the polyfill and native implementation.
+ */
+
+var isIE = /Trident/.test(navigator.userAgent);
+
+// call a callback when all HTMLImports in the document at call time
+// (or at least document ready) have loaded.
+// 1. ensure the document is in a ready state (has dom), then
+// 2. watch for loading of imports and call callback when done
+function whenReady(callback, doc) {
+  doc = doc || rootDocument;
+  // if document is loading, wait and try again
+  whenDocumentReady(function() {
+    watchImportsLoad(callback, doc);
+  }, doc);
+}
+
+// call the callback when the document is in a ready state (has dom)
+var requiredReadyState = isIE ? 'complete' : 'interactive';
+var READY_EVENT = 'readystatechange';
+function isDocumentReady(doc) {
+  return (doc.readyState === 'complete' ||
+      doc.readyState === requiredReadyState);
+}
+
+// call <callback> when we ensure the document is in a ready state
+function whenDocumentReady(callback, doc) {
+  if (!isDocumentReady(doc)) {
+    var checkReady = function() {
+      if (doc.readyState === 'complete' ||
+          doc.readyState === requiredReadyState) {
+        doc.removeEventListener(READY_EVENT, checkReady);
+        whenDocumentReady(callback, doc);
+      }
+    };
+    doc.addEventListener(READY_EVENT, checkReady);
+  } else if (callback) {
+    callback();
+  }
+}
+
+function markTargetLoaded(event) {
+  event.target.__loaded = true;
+}
+
+// call <callback> when we ensure all imports have loaded
+function watchImportsLoad(callback, doc) {
+  var imports = doc.querySelectorAll('link[rel=import]');
+  var loaded = 0, l = imports.length;
+  function checkDone(d) {
+    if ((loaded == l) && callback) {
+       callback();
+    }
+  }
+  function loadedImport(e) {
+    markTargetLoaded(e);
+    loaded++;
+    checkDone();
+  }
+  if (l) {
+    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
+      if (isImportLoaded(imp)) {
+        loadedImport.call(imp, {target: imp});
+      } else {
+        imp.addEventListener('load', loadedImport);
+        imp.addEventListener('error', loadedImport);
+      }
+    }
+  } else {
+    checkDone();
+  }
+}
+
+// NOTE: test for native imports loading is based on explicitly watching
+// all imports (see below).
+// However, 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.import && link.import.readyState !== 'loading') :
+      link.__importParsed;
+}
+
+// TODO(sorvell): Workaround for
+// https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007, should be removed when
+// this bug is addressed.
+// (1) Install a mutation observer to see when HTMLImports have loaded
+// (2) if this script is run during document load it will watch any existing
+// imports for loading.
+//
+// NOTE: The workaround has restricted functionality: (1) it's only compatible
+// with imports that are added to document.head since the mutation observer
+// watches only head for perf reasons, (2) it requires this script
+// to run before any imports have completed loading.
+if (useNative) {
+  new MutationObserver(function(mxns) {
+    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
+      if (m.addedNodes) {
+        handleImports(m.addedNodes);
+      }
+    }
+  }).observe(document.head, {childList: true});
+
+  function handleImports(nodes) {
+    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+      if (isImport(n)) {
+        handleImport(n);
+      }
+    }
+  }
+
+  function isImport(element) {
+    return element.localName === 'link' && element.rel === 'import';
+  }
+
+  function handleImport(element) {
+    var loaded = element.import;
+    if (loaded) {
+      markTargetLoaded({target: element});
+    } else {
+      element.addEventListener('load', markTargetLoaded);
+      element.addEventListener('error', markTargetLoaded);
+    }
+  }
+
+  // make sure to catch any imports that are in the process of loading
+  // when this script is run.
+  (function() {
+    if (document.readyState === 'loading') {
+      var imports = document.querySelectorAll('link[rel=import]');
+      for (var i=0, l=imports.length, imp; (i<l) && (imp=imports[i]); i++) {
+        handleImport(imp);
+      }
+    }
+  })();
+
+}
+
+// Fire the 'HTMLImportsLoaded' event when imports in document at load time
+// have loaded. This event is required to simulate the script blocking
+// behavior of native imports. A main document script that needs to be sure
+// imports have loaded should wait for this event.
+whenReady(function() {
+  HTMLImports.ready = true;
+  HTMLImports.readyTime = new Date().getTime();
+  rootDocument.dispatchEvent(
+    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
+  );
+});
+
+// exports
+scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+scope.useNative = useNative;
+scope.rootDocument = rootDocument;
+scope.whenReady = whenReady;
+scope.isIE = isIE;
+
+})(HTMLImports);
+
+(function(scope) {
+
+  // TODO(sorvell): 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.
+  var style = document.createElement('style');
+  style.textContent = ''
+      + 'body {'
+      + 'transition: opacity ease-in 0.2s;' 
+      + ' } \n'
+      + 'body[unresolved] {'
+      + 'opacity: 0; display: block; overflow: hidden;' 
+      + ' } \n'
+      ;
+  var head = document.querySelector('head');
+  head.insertBefore(style, head.firstChild);
+
+})(Platform);
+
+/*
+	Build only script.
+
+  Ensures scripts needed for basic x-platform compatibility
+  will be run when platform.js is not loaded.
+ */
+}
+(function(global) {
+  'use strict';
+
+  var testingExposeCycleCount = global.testingExposeCycleCount;
+
+  // Detect and do basic sanity checking on Object/Array.observe.
+  function detectObjectObserve() {
+    if (typeof Object.observe !== 'function' ||
+        typeof Array.observe !== 'function') {
+      return false;
+    }
+
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
+    }
+
+    var test = {};
+    var arr = [];
+    Object.observe(test, callback);
+    Array.observe(arr, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 5)
+      return false;
+
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
+      return false;
+    }
+
+    Object.unobserve(test, callback);
+    Array.unobserve(arr, callback);
+
+    return true;
+  }
+
+  var hasObserve = detectObjectObserve();
+
+  function detectEval() {
+    // Don't test for eval if we're running in a Chrome App environment.
+    // We check for APIs set that only exist in a Chrome App context.
+    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
+      return false;
+    }
+
+    // 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 (typeof navigator != 'undefined' && navigator.getDeviceStorage) {
+      return false;
+    }
+
+    try {
+      var f = new Function('', 'return true;');
+      return f();
+    } catch (ex) {
+      return false;
+    }
+  }
+
+  var hasEval = detectEval();
+
+  function isIndex(s) {
+    return +s === s >>> 0 && s !== '';
+  }
+
+  function toNumber(s) {
+    return +s;
+  }
+
+  function isObject(obj) {
+    return obj === Object(obj);
+  }
+
+  var numberIsNaN = global.Number.isNaN || function(value) {
+    return typeof value === 'number' && global.isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  var createObject = ('__proto__' in {}) ?
+    function(obj) { return obj; } :
+    function(obj) {
+      var proto = obj.__proto__;
+      if (!proto)
+        return obj;
+      var newObject = Object.create(proto);
+      Object.getOwnPropertyNames(obj).forEach(function(name) {
+        Object.defineProperty(newObject, name,
+                             Object.getOwnPropertyDescriptor(obj, name));
+      });
+      return newObject;
+    };
+
+  var identStart = '[\$_a-zA-Z]';
+  var identPart = '[\$_a-zA-Z0-9]';
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
+
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
+
+    var code = char.charCodeAt(0);
+
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
+
+      case 0x5F: // _
+      case 0x24: // $
+        return 'ident';
+
+      case 0x20: // Space
+      case 0x09: // Tab
+      case 0x0A: // Newline
+      case 0x0D: // Return
+      case 0xA0:  // No-break space
+      case 0xFEFF:  // Byte Order Mark
+      case 0x2028:  // Line Separator
+      case 0x2029:  // Paragraph Separator
+        return 'ws';
+    }
+
+    // a-z, A-Z
+    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))
+      return 'ident';
+
+    // 1-9
+    if (0x31 <= code && code <= 0x39)
+      return 'number';
+
+    return 'else';
+  }
+
+  var 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']
+    }
+  }
+
+  function noop() {}
+
+  function parsePath(path) {
+    var keys = [];
+    var index = -1;
+    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';
+
+    var actions = {
+      push: function() {
+        if (key === undefined)
+          return;
+
+        keys.push(key);
+        key = undefined;
+      },
+
+      append: function() {
+        if (key === undefined)
+          key = newChar
+        else
+          key += newChar;
+      }
+    };
+
+    function maybeUnescapeQuote() {
+      if (index >= path.length)
+        return;
+
+      var nextChar = path[index + 1];
+      if ((mode == 'inSingleQuote' && nextChar == "'") ||
+          (mode == 'inDoubleQuote' && nextChar == '"')) {
+        index++;
+        newChar = nextChar;
+        actions.append();
+        return true;
+      }
+    }
+
+    while (mode) {
+      index++;
+      c = path[index];
+
+      if (c == '\\' && maybeUnescapeQuote(mode))
+        continue;
+
+      type = getPathCharType(c);
+      typeMap = pathStateMachine[mode];
+      transition = typeMap[type] || typeMap['else'] || 'error';
+
+      if (transition == 'error')
+        return; // parse error;
+
+      mode = transition[0];
+      action = actions[transition[1]] || noop;
+      newChar = transition[2] === undefined ? c : transition[2];
+      action();
+
+      if (mode === 'afterPath') {
+        return keys;
+      }
+    }
+
+    return; // parse error
+  }
+
+  function isIdent(s) {
+    return identRegExp.test(s);
+  }
+
+  var constructorIsPrivate = {};
+
+  function Path(parts, privateToken) {
+    if (privateToken !== constructorIsPrivate)
+      throw Error('Use Path.get to retrieve path objects');
+
+    for (var i = 0; i < parts.length; i++) {
+      this.push(String(parts[i]));
+    }
+
+    if (hasEval && this.length) {
+      this.getValueFrom = this.compiledGetValueFromFn();
+    }
+  }
+
+  // TODO(rafaelw): Make simple LRU cache
+  var pathCache = {};
+
+  function getPath(pathString) {
+    if (pathString instanceof Path)
+      return pathString;
+
+    if (pathString == null || pathString.length == 0)
+      pathString = '';
+
+    if (typeof pathString != 'string') {
+      if (isIndex(pathString.length)) {
+        // Constructed with array-like (pre-parsed) keys
+        return new Path(pathString, constructorIsPrivate);
+      }
+
+      pathString = String(pathString);
+    }
+
+    var path = pathCache[pathString];
+    if (path)
+      return path;
+
+    var parts = parsePath(pathString);
+    if (!parts)
+      return invalidPath;
+
+    var path = new Path(parts, constructorIsPrivate);
+    pathCache[pathString] = path;
+    return path;
+  }
+
+  Path.get = getPath;
+
+  function formatAccessor(key) {
+    if (isIndex(key)) {
+      return '[' + key + ']';
+    } else {
+      return '["' + key.replace(/"/g, '\\"') + '"]';
+    }
+  }
+
+  Path.prototype = createObject({
+    __proto__: [],
+    valid: true,
+
+    toString: function() {
+      var pathString = '';
+      for (var i = 0; i < this.length; i++) {
+        var key = this[i];
+        if (isIdent(key)) {
+          pathString += i ? '.' + key : key;
+        } else {
+          pathString += formatAccessor(key);
+        }
+      }
+
+      return pathString;
+    },
+
+    getValueFrom: function(obj, directObserver) {
+      for (var i = 0; i < this.length; i++) {
+        if (obj == null)
+          return;
+        obj = obj[this[i]];
+      }
+      return obj;
+    },
+
+    iterateObjects: function(obj, observe) {
+      for (var i = 0; i < this.length; i++) {
+        if (i)
+          obj = obj[this[i - 1]];
+        if (!isObject(obj))
+          return;
+        observe(obj, this[i]);
+      }
+    },
+
+    compiledGetValueFromFn: function() {
+      var str = '';
+      var pathString = 'obj';
+      str += 'if (obj != null';
+      var i = 0;
+      var key;
+      for (; i < (this.length - 1); i++) {
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+        str += ' &&\n     ' + pathString + ' != null';
+      }
+      str += ')\n';
+
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
+
+      str += '  return ' + pathString + ';\nelse\n  return undefined;';
+      return new Function('obj', str);
+    },
+
+    setValueFrom: function(obj, value) {
+      if (!this.length)
+        return false;
+
+      for (var i = 0; i < this.length - 1; i++) {
+        if (!isObject(obj))
+          return false;
+        obj = obj[this[i]];
+      }
+
+      if (!isObject(obj))
+        return false;
+
+      obj[this[i]] = value;
+      return true;
+    }
+  });
+
+  var invalidPath = new Path('', constructorIsPrivate);
+  invalidPath.valid = false;
+  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
+
+  var MAX_DIRTY_CHECK_CYCLES = 1000;
+
+  function dirtyCheck(observer) {
+    var cycles = 0;
+    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
+      cycles++;
+    }
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    return cycles > 0;
+  }
+
+  function objectIsEmpty(object) {
+    for (var prop in object)
+      return false;
+    return true;
+  }
+
+  function diffIsEmpty(diff) {
+    return objectIsEmpty(diff.added) &&
+           objectIsEmpty(diff.removed) &&
+           objectIsEmpty(diff.changed);
+  }
+
+  function diffObjectFromOldObject(object, oldObject) {
+    var added = {};
+    var removed = {};
+    var changed = {};
+
+    for (var prop in oldObject) {
+      var newValue = object[prop];
+
+      if (newValue !== undefined && newValue === oldObject[prop])
+        continue;
+
+      if (!(prop in object)) {
+        removed[prop] = undefined;
+        continue;
+      }
+
+      if (newValue !== oldObject[prop])
+        changed[prop] = newValue;
+    }
+
+    for (var prop in object) {
+      if (prop in oldObject)
+        continue;
+
+      added[prop] = object[prop];
+    }
+
+    if (Array.isArray(object) && object.length !== oldObject.length)
+      changed.length = object.length;
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  var eomTasks = [];
+  function runEOMTasks() {
+    if (!eomTasks.length)
+      return false;
+
+    for (var i = 0; i < eomTasks.length; i++) {
+      eomTasks[i]();
+    }
+    eomTasks.length = 0;
+    return true;
+  }
+
+  var runEOM = hasObserve ? (function(){
+    return function(fn) {
+      return Promise.resolve().then(fn);
+    }
+  })() :
+  (function() {
+    return function(fn) {
+      eomTasks.push(fn);
+    };
+  })();
+
+  var observedObjectCache = [];
+
+  function newObservedObject() {
+    var observer;
+    var object;
+    var discardRecords = false;
+    var first = true;
+
+    function callback(records) {
+      if (observer && observer.state_ === OPENED && !discardRecords)
+        observer.check_(records);
+    }
+
+    return {
+      open: function(obs) {
+        if (observer)
+          throw Error('ObservedObject in use');
+
+        if (!first)
+          Object.deliverChangeRecords(callback);
+
+        observer = obs;
+        first = false;
+      },
+      observe: function(obj, arrayObserve) {
+        object = obj;
+        if (arrayObserve)
+          Array.observe(object, callback);
+        else
+          Object.observe(object, callback);
+      },
+      deliver: function(discard) {
+        discardRecords = discard;
+        Object.deliverChangeRecords(callback);
+        discardRecords = false;
+      },
+      close: function() {
+        observer = undefined;
+        Object.unobserve(object, callback);
+        observedObjectCache.push(this);
+      }
+    };
+  }
+
+  /*
+   * The observedSet abstraction is a perf optimization which reduces the total
+   * number of Object.observe observations of a set of objects. The idea is that
+   * groups of Observers will have some object dependencies in common and this
+   * observed set ensures that each object in the transitive closure of
+   * dependencies is only observed once. The observedSet acts as a write barrier
+   * such that whenever any change comes through, all Observers are checked for
+   * changed values.
+   *
+   * Note that this optimization is explicitly moving work from setup-time to
+   * change-time.
+   *
+   * TODO(rafaelw): Implement "garbage collection". In order to move work off
+   * the critical path, when Observers are closed, their observed objects are
+   * not Object.unobserve(d). As a result, it's possible that if the observedSet
+   * is kept open, but some Observers have been closed, it could cause "leaks"
+   * (prevent otherwise collectable objects from being collected). At some
+   * point, we should implement incremental "gc" which keeps a list of
+   * observedSets which may need clean-up and does small amounts of cleanup on a
+   * timeout until all is clean.
+   */
+
+  function getObservedObject(observer, object, arrayObserve) {
+    var dir = observedObjectCache.pop() || newObservedObject();
+    dir.open(observer);
+    dir.observe(object, arrayObserve);
+    return dir;
+  }
+
+  var observedSetCache = [];
+
+  function newObservedSet() {
+    var observerCount = 0;
+    var observers = [];
+    var objects = [];
+    var rootObj;
+    var rootObjProps;
+
+    function observe(obj, prop) {
+      if (!obj)
+        return;
+
+      if (obj === rootObj)
+        rootObjProps[prop] = true;
+
+      if (objects.indexOf(obj) < 0) {
+        objects.push(obj);
+        Object.observe(obj, callback);
+      }
+
+      observe(Object.getPrototypeOf(obj), prop);
+    }
+
+    function allRootObjNonObservedProps(recs) {
+      for (var i = 0; i < recs.length; i++) {
+        var rec = recs[i];
+        if (rec.object !== rootObj ||
+            rootObjProps[rec.name] ||
+            rec.type === 'setPrototype') {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    function callback(recs) {
+      if (allRootObjNonObservedProps(recs))
+        return;
+
+      var observer;
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.iterateObjects_(observe);
+        }
+      }
+
+      for (var i = 0; i < observers.length; i++) {
+        observer = observers[i];
+        if (observer.state_ == OPENED) {
+          observer.check_();
+        }
+      }
+    }
+
+    var record = {
+      objects: objects,
+      get rootObject() { return rootObj; },
+      set rootObject(value) {
+        rootObj = value;
+        rootObjProps = {};
+      },
+      open: function(obs, object) {
+        observers.push(obs);
+        observerCount++;
+        obs.iterateObjects_(observe);
+      },
+      close: function(obs) {
+        observerCount--;
+        if (observerCount > 0) {
+          return;
+        }
+
+        for (var i = 0; i < objects.length; i++) {
+          Object.unobserve(objects[i], callback);
+          Observer.unobservedCount++;
+        }
+
+        observers.length = 0;
+        objects.length = 0;
+        rootObj = undefined;
+        rootObjProps = undefined;
+        observedSetCache.push(this);
+        if (lastObservedSet === this)
+          lastObservedSet = null;
+      },
+    };
+
+    return record;
+  }
+
+  var lastObservedSet;
+
+  function getObservedSet(observer, obj) {
+    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {
+      lastObservedSet = observedSetCache.pop() || newObservedSet();
+      lastObservedSet.rootObject = obj;
+    }
+    lastObservedSet.open(observer, obj);
+    return lastObservedSet;
+  }
+
+  var UNOPENED = 0;
+  var OPENED = 1;
+  var CLOSED = 2;
+  var RESETTING = 3;
+
+  var nextObserverId = 1;
+
+  function Observer() {
+    this.state_ = UNOPENED;
+    this.callback_ = undefined;
+    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
+    this.directObserver_ = undefined;
+    this.value_ = undefined;
+    this.id_ = nextObserverId++;
+  }
+
+  Observer.prototype = {
+    open: function(callback, target) {
+      if (this.state_ != UNOPENED)
+        throw Error('Observer has already been opened.');
+
+      addToAll(this);
+      this.callback_ = callback;
+      this.target_ = target;
+      this.connect_();
+      this.state_ = OPENED;
+      return this.value_;
+    },
+
+    close: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      removeFromAll(this);
+      this.disconnect_();
+      this.value_ = undefined;
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.state_ = CLOSED;
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      dirtyCheck(this);
+    },
+
+    report_: function(changes) {
+      try {
+        this.callback_.apply(this.target_, changes);
+      } catch (ex) {
+        Observer._errorThrownDuringCallback = true;
+        console.error('Exception caught during observer callback: ' +
+                       (ex.stack || ex));
+      }
+    },
+
+    discardChanges: function() {
+      this.check_(undefined, true);
+      return this.value_;
+    }
+  }
+
+  var collectObservers = !hasObserve;
+  var allObservers;
+  Observer._allObserversCount = 0;
+
+  if (collectObservers) {
+    allObservers = [];
+  }
+
+  function addToAll(observer) {
+    Observer._allObserversCount++;
+    if (!collectObservers)
+      return;
+
+    allObservers.push(observer);
+  }
+
+  function removeFromAll(observer) {
+    Observer._allObserversCount--;
+  }
+
+  var runningMicrotaskCheckpoint = false;
+
+  global.Platform = global.Platform || {};
+
+  global.Platform.performMicrotaskCheckpoint = function() {
+    if (runningMicrotaskCheckpoint)
+      return;
+
+    if (!collectObservers)
+      return;
+
+    runningMicrotaskCheckpoint = true;
+
+    var cycles = 0;
+    var anyChanged, toCheck;
+
+    do {
+      cycles++;
+      toCheck = allObservers;
+      allObservers = [];
+      anyChanged = false;
+
+      for (var i = 0; i < toCheck.length; i++) {
+        var observer = toCheck[i];
+        if (observer.state_ != OPENED)
+          continue;
+
+        if (observer.check_())
+          anyChanged = true;
+
+        allObservers.push(observer);
+      }
+      if (runEOMTasks())
+        anyChanged = true;
+    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
+
+    if (testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    runningMicrotaskCheckpoint = false;
+  };
+
+  if (collectObservers) {
+    global.Platform.clearObservers = function() {
+      allObservers = [];
+    };
+  }
+
+  function ObjectObserver(object) {
+    Observer.call(this);
+    this.value_ = object;
+    this.oldObject_ = undefined;
+  }
+
+  ObjectObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    arrayObserve: false,
+
+    connect_: function(callback, target) {
+      if (hasObserve) {
+        this.directObserver_ = getObservedObject(this, this.value_,
+                                                 this.arrayObserve);
+      } else {
+        this.oldObject_ = this.copyObject(this.value_);
+      }
+
+    },
+
+    copyObject: function(object) {
+      var copy = Array.isArray(object) ? [] : {};
+      for (var prop in object) {
+        copy[prop] = object[prop];
+      };
+      if (Array.isArray(object))
+        copy.length = object.length;
+      return copy;
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var diff;
+      var oldValues;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+
+        oldValues = {};
+        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
+                                           oldValues);
+      } else {
+        oldValues = this.oldObject_;
+        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
+      }
+
+      if (diffIsEmpty(diff))
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([
+        diff.added || {},
+        diff.removed || {},
+        diff.changed || {},
+        function(property) {
+          return oldValues[property];
+        }
+      ]);
+
+      return true;
+    },
+
+    disconnect_: function() {
+      if (hasObserve) {
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+      } else {
+        this.oldObject_ = undefined;
+      }
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      if (hasObserve)
+        this.directObserver_.deliver(false);
+      else
+        dirtyCheck(this);
+    },
+
+    discardChanges: function() {
+      if (this.directObserver_)
+        this.directObserver_.deliver(true);
+      else
+        this.oldObject_ = this.copyObject(this.value_);
+
+      return this.value_;
+    }
+  });
+
+  function ArrayObserver(array) {
+    if (!Array.isArray(array))
+      throw Error('Provided object is not an Array');
+    ObjectObserver.call(this, array);
+  }
+
+  ArrayObserver.prototype = createObject({
+
+    __proto__: ObjectObserver.prototype,
+
+    arrayObserve: true,
+
+    copyObject: function(arr) {
+      return arr.slice();
+    },
+
+    check_: function(changeRecords) {
+      var splices;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+        splices = projectArraySplices(this.value_, changeRecords);
+      } else {
+        splices = calcSplices(this.value_, 0, this.value_.length,
+                              this.oldObject_, 0, this.oldObject_.length);
+      }
+
+      if (!splices || !splices.length)
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([splices]);
+      return true;
+    }
+  });
+
+  ArrayObserver.applySplices = function(previous, current, splices) {
+    splices.forEach(function(splice) {
+      var spliceArgs = [splice.index, splice.removed.length];
+      var addIndex = splice.index;
+      while (addIndex < splice.index + splice.addedCount) {
+        spliceArgs.push(current[addIndex]);
+        addIndex++;
+      }
+
+      Array.prototype.splice.apply(previous, spliceArgs);
+    });
+  };
+
+  function PathObserver(object, path) {
+    Observer.call(this);
+
+    this.object_ = object;
+    this.path_ = getPath(path);
+    this.directObserver_ = undefined;
+  }
+
+  PathObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    get path() {
+      return this.path_;
+    },
+
+    connect_: function() {
+      if (hasObserve)
+        this.directObserver_ = getObservedSet(this, this.object_);
+
+      this.check_(undefined, true);
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    iterateObjects_: function(observe) {
+      this.path_.iterateObjects(this.object_, observe);
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValue = this.value_;
+      this.value_ = this.path_.getValueFrom(this.object_);
+      if (skipChanges || areSameValue(this.value_, oldValue))
+        return false;
+
+      this.report_([this.value_, oldValue, this]);
+      return true;
+    },
+
+    setValue: function(newValue) {
+      if (this.path_)
+        this.path_.setValueFrom(this.object_, newValue);
+    }
+  });
+
+  function CompoundObserver(reportChangesOnOpen) {
+    Observer.call(this);
+
+    this.reportChangesOnOpen_ = reportChangesOnOpen;
+    this.value_ = [];
+    this.directObserver_ = undefined;
+    this.observed_ = [];
+  }
+
+  var observerSentinel = {};
+
+  CompoundObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      if (hasObserve) {
+        var object;
+        var needsDirectObserver = false;
+        for (var i = 0; i < this.observed_.length; i += 2) {
+          object = this.observed_[i]
+          if (object !== observerSentinel) {
+            needsDirectObserver = true;
+            break;
+          }
+        }
+
+        if (needsDirectObserver)
+          this.directObserver_ = getObservedSet(this, object);
+      }
+
+      this.check_(undefined, !this.reportChangesOnOpen_);
+    },
+
+    disconnect_: function() {
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        if (this.observed_[i] === observerSentinel)
+          this.observed_[i + 1].close();
+      }
+      this.observed_.length = 0;
+      this.value_.length = 0;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    addPath: function(object, path) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add paths once started.');
+
+      var path = getPath(path);
+      this.observed_.push(object, path);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = path.getValueFrom(object);
+    },
+
+    addObserver: function(observer) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add observers once started.');
+
+      this.observed_.push(observerSentinel, observer);
+      if (!this.reportChangesOnOpen_)
+        return;
+      var index = this.observed_.length / 2 - 1;
+      this.value_[index] = observer.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');
+      this.state_ = OPENED;
+      this.connect_();
+
+      return this.value_;
+    },
+
+    iterateObjects_: function(observe) {
+      var object;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel)
+          this.observed_[i + 1].iterateObjects(object, observe)
+      }
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValues;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        var object = this.observed_[i];
+        var path = this.observed_[i+1];
+        var value;
+        if (object === observerSentinel) {
+          var observable = path;
+          value = this.state_ === UNOPENED ?
+              observable.open(this.deliver, this) :
+              observable.discardChanges();
+        } else {
+          value = path.getValueFrom(object);
+        }
+
+        if (skipChanges) {
+          this.value_[i / 2] = value;
+          continue;
+        }
+
+        if (areSameValue(value, this.value_[i / 2]))
+          continue;
+
+        oldValues = oldValues || [];
+        oldValues[i / 2] = this.value_[i / 2];
+        this.value_[i / 2] = value;
+      }
+
+      if (!oldValues)
+        return false;
+
+      // TODO(rafaelw): Having observed_ as the third callback arg here is
+      // pretty lame API. Fix.
+      this.report_([this.value_, oldValues, this.observed_]);
+      return true;
+    }
+  });
+
+  function identFn(value) { return value; }
+
+  function ObserverTransform(observable, getValueFn, setValueFn,
+                             dontPassThroughSet) {
+    this.callback_ = undefined;
+    this.target_ = undefined;
+    this.value_ = undefined;
+    this.observable_ = observable;
+    this.getValueFn_ = getValueFn || identFn;
+    this.setValueFn_ = setValueFn || identFn;
+    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
+    // at the moment because of a bug in it's dependency tracking.
+    this.dontPassThroughSet_ = dontPassThroughSet;
+  }
+
+  ObserverTransform.prototype = {
+    open: function(callback, target) {
+      this.callback_ = callback;
+      this.target_ = target;
+      this.value_ =
+          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
+      return this.value_;
+    },
+
+    observedCallback_: function(value) {
+      value = this.getValueFn_(value);
+      if (areSameValue(value, this.value_))
+        return;
+      var oldValue = this.value_;
+      this.value_ = value;
+      this.callback_.call(this.target_, this.value_, oldValue);
+    },
+
+    discardChanges: function() {
+      this.value_ = this.getValueFn_(this.observable_.discardChanges());
+      return this.value_;
+    },
+
+    deliver: function() {
+      return this.observable_.deliver();
+    },
+
+    setValue: function(value) {
+      value = this.setValueFn_(value);
+      if (!this.dontPassThroughSet_ && this.observable_.setValue)
+        return this.observable_.setValue(value);
+    },
+
+    close: function() {
+      if (this.observable_)
+        this.observable_.close();
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.observable_ = undefined;
+      this.value_ = undefined;
+      this.getValueFn_ = undefined;
+      this.setValueFn_ = undefined;
+    }
+  }
+
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
+
+  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
+    var added = {};
+    var removed = {};
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      if (!expectedRecordTypes[record.type]) {
+        console.error('Unknown changeRecord type: ' + record.type);
+        console.error(record);
+        continue;
+      }
+
+      if (!(record.name in oldValues))
+        oldValues[record.name] = record.oldValue;
+
+      if (record.type == 'update')
+        continue;
+
+      if (record.type == 'add') {
+        if (record.name in removed)
+          delete removed[record.name];
+        else
+          added[record.name] = true;
+
+        continue;
+      }
+
+      // type = 'delete'
+      if (record.name in added) {
+        delete added[record.name];
+        delete oldValues[record.name];
+      } else {
+        removed[record.name] = true;
+      }
+    }
+
+    for (var prop in added)
+      added[prop] = object[prop];
+
+    for (var prop in removed)
+      removed[prop] = undefined;
+
+    var changed = {};
+    for (var prop in oldValues) {
+      if (prop in added || prop in removed)
+        continue;
+
+      var newValue = object[prop];
+      if (oldValues[prop] !== newValue)
+        changed[prop] = newValue;
+    }
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  function newSplice(index, removed, addedCount) {
+    return {
+      index: index,
+      removed: removed,
+      addedCount: addedCount
+    };
+  }
+
+  var EDIT_LEAVE = 0;
+  var EDIT_UPDATE = 1;
+  var EDIT_ADD = 2;
+  var EDIT_DELETE = 3;
+
+  function ArraySplice() {}
+
+  ArraySplice.prototype = {
+
+    // Note: This function is *based* on the computation of the Levenshtein
+    // "edit" distance. The one change is that "updates" are treated as two
+    // edits - not one. With Array splices, an update is really a delete
+    // followed by an add. By retaining this, we optimize for "keeping" the
+    // maximum array items in the original array. For example:
+    //
+    //   'xxxx123' -> '123yyyy'
+    //
+    // With 1-edit updates, the shortest path would be just to update all seven
+    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+    // leaves the substring '123' intact.
+    calcEditDistances: function(current, currentStart, currentEnd,
+                                old, oldStart, oldEnd) {
+      // "Deletion" columns
+      var rowCount = oldEnd - oldStart + 1;
+      var columnCount = currentEnd - currentStart + 1;
+      var distances = new Array(rowCount);
+
+      // "Addition" rows. Initialize null column.
+      for (var i = 0; i < rowCount; i++) {
+        distances[i] = new Array(columnCount);
+        distances[i][0] = i;
+      }
+
+      // Initialize null row
+      for (var j = 0; j < columnCount; j++)
+        distances[0][j] = j;
+
+      for (var i = 1; i < rowCount; i++) {
+        for (var j = 1; j < columnCount; j++) {
+          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+            distances[i][j] = distances[i - 1][j - 1];
+          else {
+            var north = distances[i - 1][j] + 1;
+            var west = distances[i][j - 1] + 1;
+            distances[i][j] = north < west ? north : west;
+          }
+        }
+      }
+
+      return distances;
+    },
+
+    // This starts at the final weight, and walks "backward" by finding
+    // the minimum previous weight recursively until the origin of the weight
+    // matrix.
+    spliceOperationsFromEditDistances: function(distances) {
+      var i = distances.length - 1;
+      var j = distances[0].length - 1;
+      var current = distances[i][j];
+      var edits = [];
+      while (i > 0 || j > 0) {
+        if (i == 0) {
+          edits.push(EDIT_ADD);
+          j--;
+          continue;
+        }
+        if (j == 0) {
+          edits.push(EDIT_DELETE);
+          i--;
+          continue;
+        }
+        var northWest = distances[i - 1][j - 1];
+        var west = distances[i - 1][j];
+        var north = distances[i][j - 1];
+
+        var min;
+        if (west < north)
+          min = west < northWest ? west : northWest;
+        else
+          min = north < northWest ? north : northWest;
+
+        if (min == northWest) {
+          if (northWest == current) {
+            edits.push(EDIT_LEAVE);
+          } else {
+            edits.push(EDIT_UPDATE);
+            current = northWest;
+          }
+          i--;
+          j--;
+        } else if (min == west) {
+          edits.push(EDIT_DELETE);
+          i--;
+          current = west;
+        } else {
+          edits.push(EDIT_ADD);
+          j--;
+          current = north;
+        }
+      }
+
+      edits.reverse();
+      return edits;
+    },
+
+    /**
+     * Splice Projection functions:
+     *
+     * A splice map is a representation of how a previous array of items
+     * was transformed into a new array of items. Conceptually it is a list of
+     * tuples of
+     *
+     *   <index, removed, addedCount>
+     *
+     * which are kept in ascending index order of. The tuple represents that at
+     * the |index|, |removed| sequence of items were removed, and counting forward
+     * from |index|, |addedCount| items were added.
+     */
+
+    /**
+     * Lacking individual splice mutation information, the minimal set of
+     * splices can be synthesized given the previous state and final state of an
+     * array. The basic approach is to calculate the edit distance matrix and
+     * choose the shortest path through it.
+     *
+     * Complexity: O(l * p)
+     *   l: The length of the current array
+     *   p: The length of the old array
+     */
+    calcSplices: function(current, currentStart, currentEnd,
+                          old, oldStart, oldEnd) {
+      var prefixCount = 0;
+      var suffixCount = 0;
+
+      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+      if (currentStart == 0 && oldStart == 0)
+        prefixCount = this.sharedPrefix(current, old, minLength);
+
+      if (currentEnd == current.length && oldEnd == old.length)
+        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+
+      currentStart += prefixCount;
+      oldStart += prefixCount;
+      currentEnd -= suffixCount;
+      oldEnd -= suffixCount;
+
+      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+        return [];
+
+      if (currentStart == currentEnd) {
+        var splice = newSplice(currentStart, [], 0);
+        while (oldStart < oldEnd)
+          splice.removed.push(old[oldStart++]);
+
+        return [ splice ];
+      } else if (oldStart == oldEnd)
+        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+      var ops = this.spliceOperationsFromEditDistances(
+          this.calcEditDistances(current, currentStart, currentEnd,
+                                 old, oldStart, oldEnd));
+
+      var splice = undefined;
+      var splices = [];
+      var index = currentStart;
+      var oldIndex = oldStart;
+      for (var i = 0; i < ops.length; i++) {
+        switch(ops[i]) {
+          case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+
+            index++;
+            oldIndex++;
+            break;
+          case EDIT_UPDATE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          case EDIT_ADD:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+            break;
+          case EDIT_DELETE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+        }
+      }
+
+      if (splice) {
+        splices.push(splice);
+      }
+      return splices;
+    },
+
+    sharedPrefix: function(current, old, searchLength) {
+      for (var i = 0; i < searchLength; i++)
+        if (!this.equals(current[i], old[i]))
+          return i;
+      return searchLength;
+    },
+
+    sharedSuffix: function(current, old, searchLength) {
+      var index1 = current.length;
+      var index2 = old.length;
+      var count = 0;
+      while (count < searchLength && this.equals(current[--index1], old[--index2]))
+        count++;
+
+      return count;
+    },
+
+    calculateSplices: function(current, previous) {
+      return this.calcSplices(current, 0, current.length, previous, 0,
+                              previous.length);
+    },
+
+    equals: function(currentValue, previousValue) {
+      return currentValue === previousValue;
+    }
+  };
+
+  var arraySplice = new ArraySplice();
+
+  function calcSplices(current, currentStart, currentEnd,
+                       old, oldStart, oldEnd) {
+    return arraySplice.calcSplices(current, currentStart, currentEnd,
+                                   old, oldStart, oldEnd);
+  }
+
+  function intersect(start1, end1, start2, end2) {
+    // Disjoint
+    if (end1 < start2 || end2 < start1)
+      return -1;
+
+    // Adjacent
+    if (end1 == start2 || end2 == start1)
+      return 0;
+
+    // Non-zero intersect, span1 first
+    if (start1 < start2) {
+      if (end1 < end2)
+        return end1 - start2; // Overlap
+      else
+        return end2 - start2; // Contained
+    } else {
+      // Non-zero intersect, span2 first
+      if (end2 < end1)
+        return end2 - start1; // Overlap
+      else
+        return end1 - start1; // Contained
+    }
+  }
+
+  function mergeSplice(splices, index, removed, addedCount) {
+
+    var splice = newSplice(index, removed, addedCount);
+
+    var inserted = false;
+    var insertionOffset = 0;
+
+    for (var i = 0; i < splices.length; i++) {
+      var current = splices[i];
+      current.index += insertionOffset;
+
+      if (inserted)
+        continue;
+
+      var intersectCount = intersect(splice.index,
+                                     splice.index + splice.removed.length,
+                                     current.index,
+                                     current.index + current.addedCount);
+
+      if (intersectCount >= 0) {
+        // Merge the two splices
+
+        splices.splice(i, 1);
+        i--;
+
+        insertionOffset -= current.addedCount - current.removed.length;
+
+        splice.addedCount += current.addedCount - intersectCount;
+        var deleteCount = splice.removed.length +
+                          current.removed.length - intersectCount;
+
+        if (!splice.addedCount && !deleteCount) {
+          // merged splice is a noop. discard.
+          inserted = true;
+        } else {
+          var removed = current.removed;
+
+          if (splice.index < current.index) {
+            // some prefix of splice.removed is prepended to current.removed.
+            var prepend = splice.removed.slice(0, current.index - splice.index);
+            Array.prototype.push.apply(prepend, removed);
+            removed = prepend;
+          }
+
+          if (splice.index + splice.removed.length > current.index + current.addedCount) {
+            // some suffix of splice.removed is appended to current.removed.
+            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
+            Array.prototype.push.apply(removed, append);
+          }
+
+          splice.removed = removed;
+          if (current.index < splice.index) {
+            splice.index = current.index;
+          }
+        }
+      } else if (splice.index < current.index) {
+        // Insert splice here.
+
+        inserted = true;
+
+        splices.splice(i, 0, splice);
+        i++;
+
+        var offset = splice.addedCount - splice.removed.length
+        current.index += offset;
+        insertionOffset += offset;
+      }
+    }
+
+    if (!inserted)
+      splices.push(splice);
+  }
+
+  function createInitialSplices(array, changeRecords) {
+    var splices = [];
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      switch(record.type) {
+        case 'splice':
+          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
+          break;
+        case 'add':
+        case 'update':
+        case 'delete':
+          if (!isIndex(record.name))
+            continue;
+          var index = toNumber(record.name);
+          if (index < 0)
+            continue;
+          mergeSplice(splices, index, [record.oldValue], 1);
+          break;
+        default:
+          console.error('Unexpected record type: ' + JSON.stringify(record));
+          break;
+      }
+    }
+
+    return splices;
+  }
+
+  function projectArraySplices(array, changeRecords) {
+    var splices = [];
+
+    createInitialSplices(array, changeRecords).forEach(function(splice) {
+      if (splice.addedCount == 1 && splice.removed.length == 1) {
+        if (splice.removed[0] !== array[splice.index])
+          splices.push(splice);
+
+        return
+      };
+
+      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
+                                           splice.removed, 0, splice.removed.length));
+    });
+
+    return splices;
+  }
+
+  // Export the observe-js object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, export as a global object.
+
+  var expose = global;
+
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      expose = exports = module.exports;
+    }
+    expose = exports;
+  } 
+
+  expose.Observer = Observer;
+  expose.Observer.runEOM_ = runEOM;
+  expose.Observer.observerSentinel_ = observerSentinel; // for testing.
+  expose.Observer.hasObjectObserve = hasObserve;
+  expose.ArrayObserver = ArrayObserver;
+  expose.ArrayObserver.calculateSplices = function(current, previous) {
+    return arraySplice.calculateSplices(current, previous);
+  };
+
+  expose.ArraySplice = ArraySplice;
+  expose.ObjectObserver = ObjectObserver;
+  expose.PathObserver = PathObserver;
+  expose.CompoundObserver = CompoundObserver;
+  expose.Path = Path;
+  expose.ObserverTransform = ObserverTransform;
+  
+})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
+
+// 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';
+
+  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
+
+  function getTreeScope(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+
+    return typeof node.getElementById === 'function' ? node : null;
+  }
+
+  Node.prototype.bind = function(name, observable) {
+    console.error('Unhandled binding to Node: ', this, name, observable);
+  };
+
+  Node.prototype.bindFinished = function() {};
+
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
+
+    if (bindings[name])
+      binding[name].close();
+
+    return bindings[name] = binding;
+  }
+
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
+
+  function sanitizeValue(value) {
+    return value == null ? '' : value;
+  }
+
+  function updateText(node, value) {
+    node.data = sanitizeValue(value);
+  }
+
+  function textBinding(node) {
+    return function(value) {
+      return updateText(node, value);
+    };
+  }
+
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
+  Text.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'textContent')
+      return Node.prototype.bind.call(this, name, value, oneTime);
+
+    if (oneTime)
+      return updateText(this, value);
+
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
+  }
+
+  function updateAttribute(el, name, conditional, value) {
+    if (conditional) {
+      if (value)
+        el.setAttribute(name, '');
+      else
+        el.removeAttribute(name);
+      return;
+    }
+
+    el.setAttribute(name, sanitizeValue(value));
+  }
+
+  function attributeBinding(el, name, conditional) {
+    return function(value) {
+      updateAttribute(el, name, conditional, value);
+    };
+  }
+
+  Element.prototype.bind = function(name, value, oneTime) {
+    var conditional = name[name.length - 1] == '?';
+    if (conditional) {
+      this.removeAttribute(name);
+      name = name.slice(0, -1);
+    }
+
+    if (oneTime)
+      return updateAttribute(this, name, conditional, value);
+
+
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
+  };
+
+  var checkboxEventType;
+  (function() {
+    // Attempt to feature-detect which event (change or click) is fired first
+    // for checkboxes.
+    var div = document.createElement('div');
+    var checkbox = div.appendChild(document.createElement('input'));
+    checkbox.setAttribute('type', 'checkbox');
+    var first;
+    var count = 0;
+    checkbox.addEventListener('click', function(e) {
+      count++;
+      first = first || 'click';
+    });
+    checkbox.addEventListener('change', function() {
+      count++;
+      first = first || 'change';
+    });
+
+    var event = document.createEvent('MouseEvent');
+    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    checkbox.dispatchEvent(event);
+    // WebKit/Blink don't fire the change event if the element is outside the
+    // document, so assume 'change' for that case.
+    checkboxEventType = count == 1 ? 'change' : first;
+  })();
+
+  function getEventForInputType(element) {
+    switch (element.type) {
+      case 'checkbox':
+        return checkboxEventType;
+      case 'radio':
+      case 'select-multiple':
+      case 'select-one':
+        return 'change';
+      case 'range':
+        if (/Trident|MSIE/.test(navigator.userAgent))
+          return 'change';
+      default:
+        return 'input';
+    }
+  }
+
+  function updateInput(input, property, value, santizeFn) {
+    input[property] = (santizeFn || sanitizeValue)(value);
+  }
+
+  function inputBinding(input, property, santizeFn) {
+    return function(value) {
+      return updateInput(input, property, value, santizeFn);
+    }
+  }
+
+  function noop() {}
+
+  function bindInputEvent(input, property, observable, postEventFn) {
+    var eventType = getEventForInputType(input);
+
+    function eventHandler() {
+      observable.setValue(input[property]);
+      observable.discardChanges();
+      (postEventFn || noop)(input);
+      Platform.performMicrotaskCheckpoint();
+    }
+    input.addEventListener(eventType, eventHandler);
+
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
+
+      observable_: observable
+    }
+  }
+
+  function booleanSanitize(value) {
+    return Boolean(value);
+  }
+
+  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
+  // Returns an array containing all radio buttons other than |element| that
+  // have the same |name|, either in the form that |element| belongs to or,
+  // if no form, in the document tree to which |element| belongs.
+  //
+  // This implementation is based upon the HTML spec definition of a
+  // "radio button group":
+  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
+  //
+  function getAssociatedRadioButtons(element) {
+    if (element.form) {
+      return filter(element.form.elements, function(el) {
+        return el != element &&
+            el.tagName == 'INPUT' &&
+            el.type == 'radio' &&
+            el.name == element.name;
+      });
+    } else {
+      var treeScope = getTreeScope(element);
+      if (!treeScope)
+        return [];
+      var radios = treeScope.querySelectorAll(
+          'input[type="radio"][name="' + element.name + '"]');
+      return filter(radios, function(el) {
+        return el != element && !el.form;
+      });
+    }
+  }
+
+  function checkedPostEvent(input) {
+    // Only the radio button that is getting checked gets an event. We
+    // therefore find all the associated radio buttons and update their
+    // check binding manually.
+    if (input.tagName === 'INPUT' &&
+        input.type === 'radio') {
+      getAssociatedRadioButtons(input).forEach(function(radio) {
+        var checkedBinding = radio.bindings_.checked;
+        if (checkedBinding) {
+          // Set the value directly to avoid an infinite call stack.
+          checkedBinding.observable_.setValue(false);
+        }
+      });
+    }
+  }
+
+  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value' && name !== 'checked')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
+    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
+
+    if (oneTime)
+      return updateInput(this, name, value, sanitizeFn);
+
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name, sanitizeFn)),
+                sanitizeFn);
+
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
+  }
+
+  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateInput(this, 'value', value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateInput(this, 'value',
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  function updateOption(option, value) {
+    var parentNode = option.parentNode;;
+    var select;
+    var selectBinding;
+    var oldValue;
+    if (parentNode instanceof HTMLSelectElement &&
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
+      select = parentNode;
+      selectBinding = select.bindings_.value;
+      oldValue = select.value;
+    }
+
+    option.value = sanitizeValue(value);
+
+    if (select && select.value != oldValue) {
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
+      Platform.performMicrotaskCheckpoint();
+    }
+  }
+
+  function optionBinding(option) {
+    return function(value) {
+      updateOption(option, value);
+    }
+  }
+
+  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateOption(this, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
+    if (name === 'selectedindex')
+      name = 'selectedIndex';
+
+    if (name !== 'selectedIndex' && name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+
+    if (oneTime)
+      return updateInput(this, name, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
+  }
+})(this);
+
+// 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';
+
+  function assert(v) {
+    if (!v)
+      throw new Error('Assertion failed');
+  }
+
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+  function getFragmentRoot(node) {
+    var p;
+    while (p = node.parentNode) {
+      node = p;
+    }
+
+    return node;
+  }
+
+  function searchRefId(node, id) {
+    if (!id)
+      return;
+
+    var ref;
+    var selector = '#' + id;
+    while (!ref) {
+      node = getFragmentRoot(node);
+
+      if (node.protoContent_)
+        ref = node.protoContent_.querySelector(selector);
+      else if (node.getElementById)
+        ref = node.getElementById(id);
+
+      if (ref || !node.templateCreator_)
+        break
+
+      node = node.templateCreator_;
+    }
+
+    return ref;
+  }
+
+  function getInstanceRoot(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+    return node.templateCreator_ ? node : null;
+  }
+
+  var Map;
+  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
+    Map = global.Map;
+  } else {
+    Map = function() {
+      this.keys = [];
+      this.values = [];
+    };
+
+    Map.prototype = {
+      set: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0) {
+          this.keys.push(key);
+          this.values.push(value);
+        } else {
+          this.values[index] = value;
+        }
+      },
+
+      get: function(key) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return;
+
+        return this.values[index];
+      },
+
+      delete: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return false;
+
+        this.keys.splice(index, 1);
+        this.values.splice(index, 1);
+        return true;
+      },
+
+      forEach: function(f, opt_this) {
+        for (var i = 0; i < this.keys.length; i++)
+          f.call(opt_this || this, this.values[i], this.keys[i], this);
+      }
+    };
+  }
+
+  // JScript does not have __proto__. We wrap all object literals with
+  // createObject which uses Object.create, Object.defineProperty and
+  // Object.getOwnPropertyDescriptor to create a new object that does the exact
+  // same thing. The main downside to this solution is that we have to extract
+  // all those property descriptors for IE.
+  var createObject = ('__proto__' in {}) ?
+      function(obj) { return obj; } :
+      function(obj) {
+        var proto = obj.__proto__;
+        if (!proto)
+          return obj;
+        var newObject = Object.create(proto);
+        Object.getOwnPropertyNames(obj).forEach(function(name) {
+          Object.defineProperty(newObject, name,
+                               Object.getOwnPropertyDescriptor(obj, name));
+        });
+        return newObject;
+      };
+
+  // IE does not support have Document.prototype.contains.
+  if (typeof document.contains != 'function') {
+    Document.prototype.contains = function(node) {
+      if (node === this || node.parentNode === this)
+        return true;
+      return this.documentElement.contains(node);
+    }
+  }
+
+  var BIND = 'bind';
+  var REPEAT = 'repeat';
+  var IF = 'if';
+
+  var templateAttributeDirectives = {
+    'template': true,
+    'repeat': true,
+    'bind': true,
+    'ref': true
+  };
+
+  var semanticTemplateElements = {
+    'THEAD': true,
+    'TBODY': true,
+    'TFOOT': true,
+    'TH': true,
+    'TR': true,
+    'TD': true,
+    'COLGROUP': true,
+    'COL': true,
+    'CAPTION': true,
+    'OPTION': true,
+    'OPTGROUP': true
+  };
+
+  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
+  if (hasTemplateElement) {
+    // TODO(rafaelw): Remove when fix for
+    // https://codereview.chromium.org/164803002/
+    // makes it to Chrome release.
+    (function() {
+      var t = document.createElement('template');
+      var d = t.content.ownerDocument;
+      var html = d.appendChild(d.createElement('html'));
+      var head = html.appendChild(d.createElement('head'));
+      var base = d.createElement('base');
+      base.href = document.baseURI;
+      head.appendChild(base);
+    })();
+  }
+
+  var allTemplatesSelectors = 'template, ' +
+      Object.keys(semanticTemplateElements).map(function(tagName) {
+        return tagName.toLowerCase() + '[template]';
+      }).join(', ');
+
+  function isSVGTemplate(el) {
+    return el.tagName == 'template' &&
+           el.namespaceURI == 'http://www.w3.org/2000/svg';
+  }
+
+  function isHTMLTemplate(el) {
+    return el.tagName == 'TEMPLATE' &&
+           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
+  }
+
+  function isAttributeTemplate(el) {
+    return Boolean(semanticTemplateElements[el.tagName] &&
+                   el.hasAttribute('template'));
+  }
+
+  function isTemplate(el) {
+    if (el.isTemplate_ === undefined)
+      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
+
+    return el.isTemplate_;
+  }
+
+  // FIXME: Observe templates being added/removed from documents
+  // FIXME: Expose imperative API to decorate and observe templates in
+  // "disconnected tress" (e.g. ShadowRoot)
+  document.addEventListener('DOMContentLoaded', function(e) {
+    bootstrapTemplatesRecursivelyFrom(document);
+    // FIXME: Is this needed? Seems like it shouldn't be.
+    Platform.performMicrotaskCheckpoint();
+  }, false);
+
+  function forAllTemplatesFrom(node, fn) {
+    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
+
+    if (isTemplate(node))
+      fn(node)
+    forEach(subTemplates, fn);
+  }
+
+  function bootstrapTemplatesRecursivelyFrom(node) {
+    function bootstrap(template) {
+      if (!HTMLTemplateElement.decorate(template))
+        bootstrapTemplatesRecursivelyFrom(template.content);
+    }
+
+    forAllTemplatesFrom(node, bootstrap);
+  }
+
+  if (!hasTemplateElement) {
+    /**
+     * This represents a <template> element.
+     * @constructor
+     * @extends {HTMLElement}
+     */
+    global.HTMLTemplateElement = function() {
+      throw TypeError('Illegal constructor');
+    };
+  }
+
+  var hasProto = '__proto__' in {};
+
+  function mixin(to, from) {
+    Object.getOwnPropertyNames(from).forEach(function(name) {
+      Object.defineProperty(to, name,
+                            Object.getOwnPropertyDescriptor(from, name));
+    });
+  }
+
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
+  function getOrCreateTemplateContentsOwner(template) {
+    var doc = template.ownerDocument
+    if (!doc.defaultView)
+      return doc;
+    var d = doc.templateContentsOwner_;
+    if (!d) {
+      // TODO(arv): This should either be a Document or HTMLDocument depending
+      // on doc.
+      d = doc.implementation.createHTMLDocument('');
+      while (d.lastChild) {
+        d.removeChild(d.lastChild);
+      }
+      doc.templateContentsOwner_ = d;
+    }
+    return d;
+  }
+
+  function getTemplateStagingDocument(template) {
+    if (!template.stagingDocument_) {
+      var owner = template.ownerDocument;
+      if (!owner.stagingDocument_) {
+        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
+        owner.stagingDocument_.isStagingDocument = true;
+        // TODO(rafaelw): Remove when fix for
+        // https://codereview.chromium.org/164803002/
+        // makes it to Chrome release.
+        var base = owner.stagingDocument_.createElement('base');
+        base.href = document.baseURI;
+        owner.stagingDocument_.head.appendChild(base);
+
+        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
+      }
+
+      template.stagingDocument_ = owner.stagingDocument_;
+    }
+
+    return template.stagingDocument_;
+  }
+
+  // For non-template browsers, the parser will disallow <template> in certain
+  // locations, so we allow "attribute templates" which combine the template
+  // element with the top-level container node of the content, e.g.
+  //
+  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
+  //
+  // becomes
+  //
+  //   <template repeat="{{ foo }}">
+  //   + #document-fragment
+  //     + <tr class="bar">
+  //       + <td>Bar</td>
+  //
+  function extractTemplateFromAttributeTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      if (templateAttributeDirectives[attrib.name]) {
+        if (attrib.name !== 'template')
+          template.setAttribute(attrib.name, attrib.value);
+        el.removeAttribute(attrib.name);
+      }
+    }
+
+    return template;
+  }
+
+  function extractTemplateFromSVGTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      template.setAttribute(attrib.name, attrib.value);
+      el.removeAttribute(attrib.name);
+    }
+
+    el.parentNode.removeChild(el);
+    return template;
+  }
+
+  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
+    var content = template.content;
+    if (useRoot) {
+      content.appendChild(el);
+      return;
+    }
+
+    var child;
+    while (child = el.firstChild) {
+      content.appendChild(child);
+    }
+  }
+
+  var templateObserver;
+  if (typeof MutationObserver == 'function') {
+    templateObserver = new MutationObserver(function(records) {
+      for (var i = 0; i < records.length; i++) {
+        records[i].target.refChanged_();
+      }
+    });
+  }
+
+  /**
+   * Ensures proper API and content model for template elements.
+   * @param {HTMLTemplateElement} opt_instanceRef The template element which
+   *     |el| template element will return as the value of its ref(), and whose
+   *     content will be used as source when createInstance() is invoked.
+   */
+  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
+    if (el.templateIsDecorated_)
+      return false;
+
+    var templateElement = el;
+    templateElement.templateIsDecorated_ = true;
+
+    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
+                               hasTemplateElement;
+    var bootstrapContents = isNativeHTMLTemplate;
+    var liftContents = !isNativeHTMLTemplate;
+    var liftRoot = false;
+
+    if (!isNativeHTMLTemplate) {
+      if (isAttributeTemplate(templateElement)) {
+        assert(!opt_instanceRef);
+        templateElement = extractTemplateFromAttributeTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+        liftRoot = true;
+      } else if (isSVGTemplate(templateElement)) {
+        templateElement = extractTemplateFromSVGTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+      }
+    }
+
+    if (!isNativeHTMLTemplate) {
+      fixTemplateElementPrototype(templateElement);
+      var doc = getOrCreateTemplateContentsOwner(templateElement);
+      templateElement.content_ = doc.createDocumentFragment();
+    }
+
+    if (opt_instanceRef) {
+      // template is contained within an instance, its direct content must be
+      // empty
+      templateElement.instanceRef_ = opt_instanceRef;
+    } else if (liftContents) {
+      liftNonNativeTemplateChildrenIntoContent(templateElement,
+                                               el,
+                                               liftRoot);
+    } else if (bootstrapContents) {
+      bootstrapTemplatesRecursivelyFrom(templateElement.content);
+    }
+
+    return true;
+  };
+
+  // TODO(rafaelw): This used to decorate recursively all templates from a given
+  // node. This happens by default on 'DOMContentLoaded', but may be needed
+  // in subtrees not descendent from document (e.g. ShadowRoot).
+  // Review whether this is the right public API.
+  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
+
+  var htmlElement = global.HTMLUnknownElement || HTMLElement;
+
+  var contentDescriptor = {
+    get: function() {
+      return this.content_;
+    },
+    enumerable: true,
+    configurable: true
+  };
+
+  if (!hasTemplateElement) {
+    // Gecko is more picky with the prototype than WebKit. Make sure to use the
+    // same prototype as created in the constructor.
+    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
+
+    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
+                          contentDescriptor);
+  }
+
+  function fixTemplateElementPrototype(el) {
+    if (hasProto)
+      el.__proto__ = HTMLTemplateElement.prototype;
+    else
+      mixin(el, HTMLTemplateElement.prototype);
+  }
+
+  function ensureSetModelScheduled(template) {
+    if (!template.setModelFn_) {
+      template.setModelFn_ = function() {
+        template.setModelFnScheduled_ = false;
+        var map = getBindings(template,
+            template.delegate_ && template.delegate_.prepareBinding);
+        processBindings(template, map, template.model_);
+      };
+    }
+
+    if (!template.setModelFnScheduled_) {
+      template.setModelFnScheduled_ = true;
+      Observer.runEOM_(template.setModelFn_);
+    }
+  }
+
+  mixin(HTMLTemplateElement.prototype, {
+    bind: function(name, value, oneTime) {
+      if (name != 'ref')
+        return Element.prototype.bind.call(this, name, value, oneTime);
+
+      var self = this;
+      var ref = oneTime ? value : value.open(function(ref) {
+        self.setAttribute('ref', ref);
+        self.refChanged_();
+      });
+
+      this.setAttribute('ref', ref);
+      this.refChanged_();
+      if (oneTime)
+        return;
+
+      if (!this.bindings_) {
+        this.bindings_ = { ref: value };
+      } else {
+        this.bindings_.ref = value;
+      }
+
+      return value;
+    },
+
+    processBindingDirectives_: function(directives) {
+      if (this.iterator_)
+        this.iterator_.closeDeps();
+
+      if (!directives.if && !directives.bind && !directives.repeat) {
+        if (this.iterator_) {
+          this.iterator_.close();
+          this.iterator_ = undefined;
+        }
+
+        return;
+      }
+
+      if (!this.iterator_) {
+        this.iterator_ = new TemplateIterator(this);
+      }
+
+      this.iterator_.updateDependencies(directives, this.model_);
+
+      if (templateObserver) {
+        templateObserver.observe(this, { attributes: true,
+                                         attributeFilter: ['ref'] });
+      }
+
+      return this.iterator_;
+    },
+
+    createInstance: function(model, bindingDelegate, delegate_) {
+      if (bindingDelegate)
+        delegate_ = this.newDelegate_(bindingDelegate);
+      else if (!delegate_)
+        delegate_ = this.delegate_;
+
+      if (!this.refContent_)
+        this.refContent_ = this.ref_.content;
+      var content = this.refContent_;
+      if (content.firstChild === null)
+        return emptyInstance;
+
+      var map = getInstanceBindingMap(content, delegate_);
+      var stagingDocument = getTemplateStagingDocument(this);
+      var instance = stagingDocument.createDocumentFragment();
+      instance.templateCreator_ = this;
+      instance.protoContent_ = content;
+      instance.bindings_ = [];
+      instance.terminator_ = null;
+      var instanceRecord = instance.templateInstance_ = {
+        firstNode: null,
+        lastNode: null,
+        model: model
+      };
+
+      var i = 0;
+      var collectTerminator = false;
+      for (var child = content.firstChild; child; child = child.nextSibling) {
+        // The terminator of the instance is the clone of the last child of the
+        // content. If the last child is an active template, it may produce
+        // instances as a result of production, so simply collecting the last
+        // child of the instance after it has finished producing may be wrong.
+        if (child.nextSibling === null)
+          collectTerminator = true;
+
+        var clone = cloneAndBindInstance(child, instance, stagingDocument,
+                                         map.children[i++],
+                                         model,
+                                         delegate_,
+                                         instance.bindings_);
+        clone.templateInstance_ = instanceRecord;
+        if (collectTerminator)
+          instance.terminator_ = clone;
+      }
+
+      instanceRecord.firstNode = instance.firstChild;
+      instanceRecord.lastNode = instance.lastChild;
+      instance.templateCreator_ = undefined;
+      instance.protoContent_ = undefined;
+      return instance;
+    },
+
+    get model() {
+      return this.model_;
+    },
+
+    set model(model) {
+      this.model_ = model;
+      ensureSetModelScheduled(this);
+    },
+
+    get bindingDelegate() {
+      return this.delegate_ && this.delegate_.raw;
+    },
+
+    refChanged_: function() {
+      if (!this.iterator_ || this.refContent_ === this.ref_.content)
+        return;
+
+      this.refContent_ = undefined;
+      this.iterator_.valueChanged();
+      this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue());
+    },
+
+    clear: function() {
+      this.model_ = undefined;
+      this.delegate_ = undefined;
+      if (this.bindings_ && this.bindings_.ref)
+        this.bindings_.ref.close()
+      this.refContent_ = undefined;
+      if (!this.iterator_)
+        return;
+      this.iterator_.valueChanged();
+      this.iterator_.close()
+      this.iterator_ = undefined;
+    },
+
+    setDelegate_: function(delegate) {
+      this.delegate_ = delegate;
+      this.bindingMap_ = undefined;
+      if (this.iterator_) {
+        this.iterator_.instancePositionChangedFn_ = undefined;
+        this.iterator_.instanceModelFn_ = undefined;
+      }
+    },
+
+    newDelegate_: function(bindingDelegate) {
+      if (!bindingDelegate)
+        return;
+
+      function delegateFn(name) {
+        var fn = bindingDelegate && bindingDelegate[name];
+        if (typeof fn != 'function')
+          return;
+
+        return function() {
+          return fn.apply(bindingDelegate, arguments);
+        };
+      }
+
+      return {
+        bindingMaps: {},
+        raw: bindingDelegate,
+        prepareBinding: delegateFn('prepareBinding'),
+        prepareInstanceModel: delegateFn('prepareInstanceModel'),
+        prepareInstancePositionChanged:
+            delegateFn('prepareInstancePositionChanged')
+      };
+    },
+
+    set bindingDelegate(bindingDelegate) {
+      if (this.delegate_) {
+        throw Error('Template must be cleared before a new bindingDelegate ' +
+                    'can be assigned');
+      }
+
+      this.setDelegate_(this.newDelegate_(bindingDelegate));
+    },
+
+    get ref_() {
+      var ref = searchRefId(this, this.getAttribute('ref'));
+      if (!ref)
+        ref = this.instanceRef_;
+
+      if (!ref)
+        return this;
+
+      var nextRef = ref.ref_;
+      return nextRef ? nextRef : ref;
+    }
+  });
+
+  // Returns
+  //   a) undefined if there are no mustaches.
+  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
+  function parseMustaches(s, name, node, prepareBindingFn) {
+    if (!s || !s.length)
+      return;
+
+    var tokens;
+    var length = s.length;
+    var startIndex = 0, lastIndex = 0, endIndex = 0;
+    var onlyOneTime = true;
+    while (lastIndex < length) {
+      var startIndex = s.indexOf('{{', lastIndex);
+      var oneTimeStart = s.indexOf('[[', lastIndex);
+      var oneTime = false;
+      var terminator = '}}';
+
+      if (oneTimeStart >= 0 &&
+          (startIndex < 0 || oneTimeStart < startIndex)) {
+        startIndex = oneTimeStart;
+        oneTime = true;
+        terminator = ']]';
+      }
+
+      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
+
+      if (endIndex < 0) {
+        if (!tokens)
+          return;
+
+        tokens.push(s.slice(lastIndex)); // TEXT
+        break;
+      }
+
+      tokens = tokens || [];
+      tokens.push(s.slice(lastIndex, startIndex)); // TEXT
+      var pathString = s.slice(startIndex + 2, endIndex).trim();
+      tokens.push(oneTime); // ONE_TIME?
+      onlyOneTime = onlyOneTime && oneTime;
+      var delegateFn = prepareBindingFn &&
+                       prepareBindingFn(pathString, name, node);
+      // Don't try to parse the expression if there's a prepareBinding function
+      if (delegateFn == null) {
+        tokens.push(Path.get(pathString)); // PATH
+      } else {
+        tokens.push(null);
+      }
+      tokens.push(delegateFn); // DELEGATE_FN
+      lastIndex = endIndex + 2;
+    }
+
+    if (lastIndex === length)
+      tokens.push(''); // TEXT
+
+    tokens.hasOnePath = tokens.length === 5;
+    tokens.isSimplePath = tokens.hasOnePath &&
+                          tokens[0] == '' &&
+                          tokens[4] == '';
+    tokens.onlyOneTime = onlyOneTime;
+
+    tokens.combinator = function(values) {
+      var newValue = tokens[0];
+
+      for (var i = 1; i < tokens.length; i += 4) {
+        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];
+        if (value !== undefined)
+          newValue += value;
+        newValue += tokens[i + 3];
+      }
+
+      return newValue;
+    }
+
+    return tokens;
+  };
+
+  function processOneTimeBinding(name, tokens, node, model) {
+    if (tokens.hasOnePath) {
+      var delegateFn = tokens[3];
+      var value = delegateFn ? delegateFn(model, node, true) :
+                               tokens[2].getValueFrom(model);
+      return tokens.isSimplePath ? value : tokens.combinator(value);
+    }
+
+    var values = [];
+    for (var i = 1; i < tokens.length; i += 4) {
+      var delegateFn = tokens[i + 2];
+      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :
+          tokens[i + 1].getValueFrom(model);
+    }
+
+    return tokens.combinator(values);
+  }
+
+  function processSinglePathBinding(name, tokens, node, model) {
+    var delegateFn = tokens[3];
+    var observer = delegateFn ? delegateFn(model, node, false) :
+        new PathObserver(model, tokens[2]);
+
+    return tokens.isSimplePath ? observer :
+        new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBinding(name, tokens, node, model) {
+    if (tokens.onlyOneTime)
+      return processOneTimeBinding(name, tokens, node, model);
+
+    if (tokens.hasOnePath)
+      return processSinglePathBinding(name, tokens, node, model);
+
+    var observer = new CompoundObserver();
+
+    for (var i = 1; i < tokens.length; i += 4) {
+      var oneTime = tokens[i];
+      var delegateFn = tokens[i + 2];
+
+      if (delegateFn) {
+        var value = delegateFn(model, node, oneTime);
+        if (oneTime)
+          observer.addPath(value)
+        else
+          observer.addObserver(value);
+        continue;
+      }
+
+      var path = tokens[i + 1];
+      if (oneTime)
+        observer.addPath(path.getValueFrom(model))
+      else
+        observer.addPath(model, path);
+    }
+
+    return new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBindings(node, bindings, model, instanceBindings) {
+    for (var i = 0; i < bindings.length; i += 2) {
+      var name = bindings[i]
+      var tokens = bindings[i + 1];
+      var value = processBinding(name, tokens, node, model);
+      var binding = node.bind(name, value, tokens.onlyOneTime);
+      if (binding && instanceBindings)
+        instanceBindings.push(binding);
+    }
+
+    node.bindFinished();
+    if (!bindings.isTemplate)
+      return;
+
+    node.model_ = model;
+    var iter = node.processBindingDirectives_(bindings);
+    if (instanceBindings && iter)
+      instanceBindings.push(iter);
+  }
+
+  function parseWithDefault(el, name, prepareBindingFn) {
+    var v = el.getAttribute(name);
+    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
+  }
+
+  function parseAttributeBindings(element, prepareBindingFn) {
+    assert(element);
+
+    var bindings = [];
+    var ifFound = false;
+    var bindFound = false;
+
+    for (var i = 0; i < element.attributes.length; i++) {
+      var attr = element.attributes[i];
+      var name = attr.name;
+      var value = attr.value;
+
+      // Allow bindings expressed in attributes to be prefixed with underbars.
+      // We do this to allow correct semantics for browsers that don't implement
+      // <template> where certain attributes might trigger side-effects -- and
+      // for IE which sanitizes certain attributes, disallowing mustache
+      // replacements in their text.
+      while (name[0] === '_') {
+        name = name.substring(1);
+      }
+
+      if (isTemplate(element) &&
+          (name === IF || name === BIND || name === REPEAT)) {
+        continue;
+      }
+
+      var tokens = parseMustaches(value, name, element,
+                                  prepareBindingFn);
+      if (!tokens)
+        continue;
+
+      bindings.push(name, tokens);
+    }
+
+    if (isTemplate(element)) {
+      bindings.isTemplate = true;
+      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
+      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
+      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
+
+      if (bindings.if && !bindings.bind && !bindings.repeat)
+        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
+    }
+
+    return bindings;
+  }
+
+  function getBindings(node, prepareBindingFn) {
+    if (node.nodeType === Node.ELEMENT_NODE)
+      return parseAttributeBindings(node, prepareBindingFn);
+
+    if (node.nodeType === Node.TEXT_NODE) {
+      var tokens = parseMustaches(node.data, 'textContent', node,
+                                  prepareBindingFn);
+      if (tokens)
+        return ['textContent', tokens];
+    }
+
+    return [];
+  }
+
+  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
+                                delegate,
+                                instanceBindings,
+                                instanceRecord) {
+    var clone = parent.appendChild(stagingDocument.importNode(node, false));
+
+    var i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      cloneAndBindInstance(child, clone, stagingDocument,
+                            bindings.children[i++],
+                            model,
+                            delegate,
+                            instanceBindings);
+    }
+
+    if (bindings.isTemplate) {
+      HTMLTemplateElement.decorate(clone, node);
+      if (delegate)
+        clone.setDelegate_(delegate);
+    }
+
+    processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  }
+
+  function createInstanceBindingMap(node, prepareBindingFn) {
+    var map = getBindings(node, prepareBindingFn);
+    map.children = {};
+    var index = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
+    }
+
+    return map;
+  }
+
+  var contentUidCounter = 1;
+
+  // TODO(rafaelw): Setup a MutationObserver on content which clears the id
+  // so that bindingMaps regenerate when the template.content changes.
+  function getContentUid(content) {
+    var id = content.id_;
+    if (!id)
+      id = content.id_ = contentUidCounter++;
+    return id;
+  }
+
+  // Each delegate is associated with a set of bindingMaps, one for each
+  // content which may be used by a template. The intent is that each binding
+  // delegate gets the opportunity to prepare the instance (via the prepare*
+  // delegate calls) once across all uses.
+  // TODO(rafaelw): Separate out the parse map from the binding map. In the
+  // current implementation, if two delegates need a binding map for the same
+  // content, the second will have to reparse.
+  function getInstanceBindingMap(content, delegate_) {
+    var contentId = getContentUid(content);
+    if (delegate_) {
+      var map = delegate_.bindingMaps[contentId];
+      if (!map) {
+        map = delegate_.bindingMaps[contentId] =
+            createInstanceBindingMap(content, delegate_.prepareBinding) || [];
+      }
+      return map;
+    }
+
+    var map = content.bindingMap_;
+    if (!map) {
+      map = content.bindingMap_ =
+          createInstanceBindingMap(content, undefined) || [];
+    }
+    return map;
+  }
+
+  Object.defineProperty(Node.prototype, 'templateInstance', {
+    get: function() {
+      var instance = this.templateInstance_;
+      return instance ? instance :
+          (this.parentNode ? this.parentNode.templateInstance : undefined);
+    }
+  });
+
+  var emptyInstance = document.createDocumentFragment();
+  emptyInstance.bindings_ = [];
+  emptyInstance.terminator_ = null;
+
+  function TemplateIterator(templateElement) {
+    this.closed = false;
+    this.templateElement_ = templateElement;
+    this.instances = [];
+    this.deps = undefined;
+    this.iteratedValue = [];
+    this.presentValue = undefined;
+    this.arrayObserver = undefined;
+  }
+
+  TemplateIterator.prototype = {
+    closeDeps: function() {
+      var deps = this.deps;
+      if (deps) {
+        if (deps.ifOneTime === false)
+          deps.ifValue.close();
+        if (deps.oneTime === false)
+          deps.value.close();
+      }
+    },
+
+    updateDependencies: function(directives, model) {
+      this.closeDeps();
+
+      var deps = this.deps = {};
+      var template = this.templateElement_;
+
+      var ifValue = true;
+      if (directives.if) {
+        deps.hasIf = true;
+        deps.ifOneTime = directives.if.onlyOneTime;
+        deps.ifValue = processBinding(IF, directives.if, template, model);
+
+        ifValue = deps.ifValue;
+
+        // oneTime if & predicate is false. nothing else to do.
+        if (deps.ifOneTime && !ifValue) {
+          this.valueChanged();
+          return;
+        }
+
+        if (!deps.ifOneTime)
+          ifValue = ifValue.open(this.updateIfValue, this);
+      }
+
+      if (directives.repeat) {
+        deps.repeat = true;
+        deps.oneTime = directives.repeat.onlyOneTime;
+        deps.value = processBinding(REPEAT, directives.repeat, template, model);
+      } else {
+        deps.repeat = false;
+        deps.oneTime = directives.bind.onlyOneTime;
+        deps.value = processBinding(BIND, directives.bind, template, model);
+      }
+
+      var value = deps.value;
+      if (!deps.oneTime)
+        value = value.open(this.updateIteratedValue, this);
+
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(value);
+    },
+
+    /**
+     * Gets the updated value of the bind/repeat. This can potentially call
+     * user code (if a bindingDelegate is set up) so we try to avoid it if we
+     * already have the value in hand (from Observer.open).
+     */
+    getUpdatedValue: function() {
+      var value = this.deps.value;
+      if (!this.deps.oneTime)
+        value = value.discardChanges();
+      return value;
+    },
+
+    updateIfValue: function(ifValue) {
+      if (!ifValue) {
+        this.valueChanged();
+        return;
+      }
+
+      this.updateValue(this.getUpdatedValue());
+    },
+
+    updateIteratedValue: function(value) {
+      if (this.deps.hasIf) {
+        var ifValue = this.deps.ifValue;
+        if (!this.deps.ifOneTime)
+          ifValue = ifValue.discardChanges();
+        if (!ifValue) {
+          this.valueChanged();
+          return;
+        }
+      }
+
+      this.updateValue(value);
+    },
+
+    updateValue: function(value) {
+      if (!this.deps.repeat)
+        value = [value];
+      var observe = this.deps.repeat &&
+                    !this.deps.oneTime &&
+                    Array.isArray(value);
+      this.valueChanged(value, observe);
+    },
+
+    valueChanged: function(value, observeValue) {
+      if (!Array.isArray(value))
+        value = [];
+
+      if (value === this.iteratedValue)
+        return;
+
+      this.unobserve();
+      this.presentValue = value;
+      if (observeValue) {
+        this.arrayObserver = new ArrayObserver(this.presentValue);
+        this.arrayObserver.open(this.handleSplices, this);
+      }
+
+      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
+                                                        this.iteratedValue));
+    },
+
+    getLastInstanceNode: function(index) {
+      if (index == -1)
+        return this.templateElement_;
+      var instance = this.instances[index];
+      var terminator = instance.terminator_;
+      if (!terminator)
+        return this.getLastInstanceNode(index - 1);
+
+      if (terminator.nodeType !== Node.ELEMENT_NODE ||
+          this.templateElement_ === terminator) {
+        return terminator;
+      }
+
+      var subtemplateIterator = terminator.iterator_;
+      if (!subtemplateIterator)
+        return terminator;
+
+      return subtemplateIterator.getLastTemplateNode();
+    },
+
+    getLastTemplateNode: function() {
+      return this.getLastInstanceNode(this.instances.length - 1);
+    },
+
+    insertInstanceAt: function(index, fragment) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var parent = this.templateElement_.parentNode;
+      this.instances.splice(index, 0, fragment);
+
+      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
+    },
+
+    extractInstanceAt: function(index) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var lastNode = this.getLastInstanceNode(index);
+      var parent = this.templateElement_.parentNode;
+      var instance = this.instances.splice(index, 1)[0];
+
+      while (lastNode !== previousInstanceLast) {
+        var node = previousInstanceLast.nextSibling;
+        if (node == lastNode)
+          lastNode = previousInstanceLast;
+
+        instance.appendChild(parent.removeChild(node));
+      }
+
+      return instance;
+    },
+
+    getDelegateFn: function(fn) {
+      fn = fn && fn(this.templateElement_);
+      return typeof fn === 'function' ? fn : null;
+    },
+
+    handleSplices: function(splices) {
+      if (this.closed || !splices.length)
+        return;
+
+      var template = this.templateElement_;
+
+      if (!template.parentNode) {
+        this.close();
+        return;
+      }
+
+      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
+                                 splices);
+
+      var delegate = template.delegate_;
+      if (this.instanceModelFn_ === undefined) {
+        this.instanceModelFn_ =
+            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
+      }
+
+      if (this.instancePositionChangedFn_ === undefined) {
+        this.instancePositionChangedFn_ =
+            this.getDelegateFn(delegate &&
+                               delegate.prepareInstancePositionChanged);
+      }
+
+      // Instance Removals
+      var instanceCache = new Map;
+      var removeDelta = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var removed = splice.removed;
+        for (var j = 0; j < removed.length; j++) {
+          var model = removed[j];
+          var instance = this.extractInstanceAt(splice.index + removeDelta);
+          if (instance !== emptyInstance) {
+            instanceCache.set(model, instance);
+          }
+        }
+
+        removeDelta -= splice.addedCount;
+      }
+
+      // Instance Insertions
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var addIndex = splice.index;
+        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
+          var model = this.iteratedValue[addIndex];
+          var instance = instanceCache.get(model);
+          if (instance) {
+            instanceCache.delete(model);
+          } else {
+            if (this.instanceModelFn_) {
+              model = this.instanceModelFn_(model);
+            }
+
+            if (model === undefined) {
+              instance = emptyInstance;
+            } else {
+              instance = template.createInstance(model, undefined, delegate);
+            }
+          }
+
+          this.insertInstanceAt(addIndex, instance);
+        }
+      }
+
+      instanceCache.forEach(function(instance) {
+        this.closeInstanceBindings(instance);
+      }, this);
+
+      if (this.instancePositionChangedFn_)
+        this.reportInstancesMoved(splices);
+    },
+
+    reportInstanceMoved: function(index) {
+      var instance = this.instances[index];
+      if (instance === emptyInstance)
+        return;
+
+      this.instancePositionChangedFn_(instance.templateInstance_, index);
+    },
+
+    reportInstancesMoved: function(splices) {
+      var index = 0;
+      var offset = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        if (offset != 0) {
+          while (index < splice.index) {
+            this.reportInstanceMoved(index);
+            index++;
+          }
+        } else {
+          index = splice.index;
+        }
+
+        while (index < splice.index + splice.addedCount) {
+          this.reportInstanceMoved(index);
+          index++;
+        }
+
+        offset += splice.addedCount - splice.removed.length;
+      }
+
+      if (offset == 0)
+        return;
+
+      var length = this.instances.length;
+      while (index < length) {
+        this.reportInstanceMoved(index);
+        index++;
+      }
+    },
+
+    closeInstanceBindings: function(instance) {
+      var bindings = instance.bindings_;
+      for (var i = 0; i < bindings.length; i++) {
+        bindings[i].close();
+      }
+    },
+
+    unobserve: function() {
+      if (!this.arrayObserver)
+        return;
+
+      this.arrayObserver.close();
+      this.arrayObserver = undefined;
+    },
+
+    close: function() {
+      if (this.closed)
+        return;
+      this.unobserve();
+      for (var i = 0; i < this.instances.length; i++) {
+        this.closeInstanceBindings(this.instances[i]);
+      }
+
+      this.instances.length = 0;
+      this.closeDeps();
+      this.templateElement_.iterator_ = undefined;
+      this.closed = true;
+    }
+  };
+
+  // Polyfill-specific API.
+  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
+})(this);
+
+(function(scope) {
+  'use strict';
+
+  // feature detect for URL constructor
+  var hasWorkingUrl = false;
+  if (!scope.forceJURL) {
+    try {
+      var u = new URL('b', 'http://a');
+      hasWorkingUrl = u.href === 'http://a/b';
+    } catch(e) {}
+  }
+
+  if (hasWorkingUrl)
+    return;
+
+  var relative = Object.create(null);
+  relative['ftp'] = 21;
+  relative['file'] = 0;
+  relative['gopher'] = 70;
+  relative['http'] = 80;
+  relative['https'] = 443;
+  relative['ws'] = 80;
+  relative['wss'] = 443;
+
+  var relativePathDotMapping = Object.create(null);
+  relativePathDotMapping['%2e'] = '.';
+  relativePathDotMapping['.%2e'] = '..';
+  relativePathDotMapping['%2e.'] = '..';
+  relativePathDotMapping['%2e%2e'] = '..';
+
+  function isRelativeScheme(scheme) {
+    return relative[scheme] !== undefined;
+  }
+
+  function invalid() {
+    clear.call(this);
+    this._isInvalid = true;
+  }
+
+  function IDNAToASCII(h) {
+    if ('' == h) {
+      invalid.call(this)
+    }
+    // XXX
+    return h.toLowerCase()
+  }
+
+  function percentEscape(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ? `
+       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  function percentEscapeQuery(c) {
+    // XXX This actually needs to encode c using encoding and then
+    // convert the bytes one-by-one.
+
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ` (do not escape '?')
+       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  var EOF = undefined,
+      ALPHA = /[a-zA-Z]/,
+      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
+
+  function parse(input, stateOverride, base) {
+    function err(message) {
+      errors.push(message)
+    }
+
+    var state = stateOverride || 'scheme start',
+        cursor = 0,
+        buffer = '',
+        seenAt = false,
+        seenBracket = false,
+        errors = [];
+
+    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
+      var c = input[cursor];
+      switch (state) {
+        case 'scheme start':
+          if (c && ALPHA.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+            state = 'scheme';
+          } else if (!stateOverride) {
+            buffer = '';
+            state = 'no scheme';
+            continue;
+          } else {
+            err('Invalid scheme.');
+            break loop;
+          }
+          break;
+
+        case 'scheme':
+          if (c && ALPHANUMERIC.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+          } else if (':' == c) {
+            this._scheme = buffer;
+            buffer = '';
+            if (stateOverride) {
+              break loop;
+            }
+            if (isRelativeScheme(this._scheme)) {
+              this._isRelative = true;
+            }
+            if ('file' == this._scheme) {
+              state = 'relative';
+            } else if (this._isRelative && base && base._scheme == this._scheme) {
+              state = 'relative or authority';
+            } else if (this._isRelative) {
+              state = 'authority first slash';
+            } else {
+              state = 'scheme data';
+            }
+          } else if (!stateOverride) {
+            buffer = '';
+            cursor = 0;
+            state = 'no scheme';
+            continue;
+          } else if (EOF == c) {
+            break loop;
+          } else {
+            err('Code point not allowed in scheme: ' + c)
+            break loop;
+          }
+          break;
+
+        case 'scheme data':
+          if ('?' == c) {
+            query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            // XXX error handling
+            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+              this._schemeData += percentEscape(c);
+            }
+          }
+          break;
+
+        case 'no scheme':
+          if (!base || !(isRelativeScheme(base._scheme))) {
+            err('Missing scheme.');
+            invalid.call(this);
+          } else {
+            state = 'relative';
+            continue;
+          }
+          break;
+
+        case 'relative or authority':
+          if ('/' == c && '/' == input[cursor+1]) {
+            state = 'authority ignore slashes';
+          } else {
+            err('Expected /, got: ' + c);
+            state = 'relative';
+            continue
+          }
+          break;
+
+        case 'relative':
+          this._isRelative = true;
+          if ('file' != this._scheme)
+            this._scheme = base._scheme;
+          if (EOF == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            break loop;
+          } else if ('/' == c || '\\' == c) {
+            if ('\\' == c)
+              err('\\ is an invalid code point.');
+            state = 'relative slash';
+          } else if ('?' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            var nextC = input[cursor+1]
+            var nextNextC = input[cursor+2]
+            if (
+              'file' != this._scheme || !ALPHA.test(c) ||
+              (nextC != ':' && nextC != '|') ||
+              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {
+              this._host = base._host;
+              this._port = base._port;
+              this._path = base._path.slice();
+              this._path.pop();
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'relative slash':
+          if ('/' == c || '\\' == c) {
+            if ('\\' == c) {
+              err('\\ is an invalid code point.');
+            }
+            if ('file' == this._scheme) {
+              state = 'file host';
+            } else {
+              state = 'authority ignore slashes';
+            }
+          } else {
+            if ('file' != this._scheme) {
+              this._host = base._host;
+              this._port = base._port;
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'authority first slash':
+          if ('/' == c) {
+            state = 'authority second slash';
+          } else {
+            err("Expected '/', got: " + c);
+            state = 'authority ignore slashes';
+            continue;
+          }
+          break;
+
+        case 'authority second slash':
+          state = 'authority ignore slashes';
+          if ('/' != c) {
+            err("Expected '/', got: " + c);
+            continue;
+          }
+          break;
+
+        case 'authority ignore slashes':
+          if ('/' != c && '\\' != c) {
+            state = 'authority';
+            continue;
+          } else {
+            err('Expected authority, got: ' + c);
+          }
+          break;
+
+        case 'authority':
+          if ('@' == c) {
+            if (seenAt) {
+              err('@ already seen.');
+              buffer += '%40';
+            }
+            seenAt = true;
+            for (var i = 0; i < buffer.length; i++) {
+              var cp = buffer[i];
+              if ('\t' == cp || '\n' == cp || '\r' == cp) {
+                err('Invalid whitespace in authority.');
+                continue;
+              }
+              // XXX check URL code points
+              if (':' == cp && null === this._password) {
+                this._password = '';
+                continue;
+              }
+              var tempC = percentEscape(cp);
+              (null !== this._password) ? this._password += tempC : this._username += tempC;
+            }
+            buffer = '';
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            cursor -= buffer.length;
+            buffer = '';
+            state = 'host';
+            continue;
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'file host':
+          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
+              state = 'relative path';
+            } else if (buffer.length == 0) {
+              state = 'relative path start';
+            } else {
+              this._host = IDNAToASCII.call(this, buffer);
+              buffer = '';
+              state = 'relative path start';
+            }
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid whitespace in file host.');
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'host':
+        case 'hostname':
+          if (':' == c && !seenBracket) {
+            // XXX host parsing
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'port';
+            if ('hostname' == stateOverride) {
+              break loop;
+            }
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'relative path start';
+            if (stateOverride) {
+              break loop;
+            }
+            continue;
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            if ('[' == c) {
+              seenBracket = true;
+            } else if (']' == c) {
+              seenBracket = false;
+            }
+            buffer += c;
+          } else {
+            err('Invalid code point in host/hostname: ' + c);
+          }
+          break;
+
+        case 'port':
+          if (/[0-9]/.test(c)) {
+            buffer += c;
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
+            if ('' != buffer) {
+              var temp = parseInt(buffer, 10);
+              if (temp != relative[this._scheme]) {
+                this._port = temp + '';
+              }
+              buffer = '';
+            }
+            if (stateOverride) {
+              break loop;
+            }
+            state = 'relative path start';
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid code point in port: ' + c);
+          } else {
+            invalid.call(this);
+          }
+          break;
+
+        case 'relative path start':
+          if ('\\' == c)
+            err("'\\' not allowed in path.");
+          state = 'relative path';
+          if ('/' != c && '\\' != c) {
+            continue;
+          }
+          break;
+
+        case 'relative path':
+          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {
+            if ('\\' == c) {
+              err('\\ not allowed in relative path.');
+            }
+            var tmp;
+            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
+              buffer = tmp;
+            }
+            if ('..' == buffer) {
+              this._path.pop();
+              if ('/' != c && '\\' != c) {
+                this._path.push('');
+              }
+            } else if ('.' == buffer && '/' != c && '\\' != c) {
+              this._path.push('');
+            } else if ('.' != buffer) {
+              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
+                buffer = buffer[0] + ':';
+              }
+              this._path.push(buffer);
+            }
+            buffer = '';
+            if ('?' == c) {
+              this._query = '?';
+              state = 'query';
+            } else if ('#' == c) {
+              this._fragment = '#';
+              state = 'fragment';
+            }
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            buffer += percentEscape(c);
+          }
+          break;
+
+        case 'query':
+          if (!stateOverride && '#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._query += percentEscapeQuery(c);
+          }
+          break;
+
+        case 'fragment':
+          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._fragment += c;
+          }
+          break;
+      }
+
+      cursor++;
+    }
+  }
+
+  function clear() {
+    this._scheme = '';
+    this._schemeData = '';
+    this._username = '';
+    this._password = null;
+    this._host = '';
+    this._port = '';
+    this._path = [];
+    this._query = '';
+    this._fragment = '';
+    this._isInvalid = false;
+    this._isRelative = false;
+  }
+
+  // Does not process domain names or IP addresses.
+  // Does not handle encoding for the query parameter.
+  function jURL(url, base /* , encoding */) {
+    if (base !== undefined && !(base instanceof jURL))
+      base = new jURL(String(base));
+
+    this._url = url;
+    clear.call(this);
+
+    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
+    // encoding = encoding || 'utf-8'
+
+    parse.call(this, input, null, base);
+  }
+
+  jURL.prototype = {
+    get href() {
+      if (this._isInvalid)
+        return this._url;
+
+      var authority = '';
+      if ('' != this._username || null != this._password) {
+        authority = this._username +
+            (null != this._password ? ':' + this._password : '') + '@';
+      }
+
+      return this.protocol +
+          (this._isRelative ? '//' + authority + this.host : '') +
+          this.pathname + this._query + this._fragment;
+    },
+    set href(href) {
+      clear.call(this);
+      parse.call(this, href);
+    },
+
+    get protocol() {
+      return this._scheme + ':';
+    },
+    set protocol(protocol) {
+      if (this._isInvalid)
+        return;
+      parse.call(this, protocol + ':', 'scheme start');
+    },
+
+    get host() {
+      return this._isInvalid ? '' : this._port ?
+          this._host + ':' + this._port : this._host;
+    },
+    set host(host) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, host, 'host');
+    },
+
+    get hostname() {
+      return this._host;
+    },
+    set hostname(hostname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, hostname, 'hostname');
+    },
+
+    get port() {
+      return this._port;
+    },
+    set port(port) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, port, 'port');
+    },
+
+    get pathname() {
+      return this._isInvalid ? '' : this._isRelative ?
+          '/' + this._path.join('/') : this._schemeData;
+    },
+    set pathname(pathname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._path = [];
+      parse.call(this, pathname, 'relative path start');
+    },
+
+    get search() {
+      return this._isInvalid || !this._query || '?' == this._query ?
+          '' : this._query;
+    },
+    set search(search) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._query = '?';
+      if ('?' == search[0])
+        search = search.slice(1);
+      parse.call(this, search, 'query');
+    },
+
+    get hash() {
+      return this._isInvalid || !this._fragment || '#' == this._fragment ?
+          '' : this._fragment;
+    },
+    set hash(hash) {
+      if (this._isInvalid)
+        return;
+      this._fragment = '#';
+      if ('#' == hash[0])
+        hash = hash.slice(1);
+      parse.call(this, hash, 'fragment');
+    },
+
+    get origin() {
+      var host;
+      if (this._isInvalid || !this._scheme) {
+        return '';
+      }
+      // javascript: Gecko returns String(""), WebKit/Blink String("null")
+      // Gecko throws error for "data://"
+      // data: Gecko returns "", Blink returns "data://", WebKit returns "null"
+      // Gecko returns String("") for file: mailto:
+      // WebKit/Blink returns String("SCHEME://") for file: mailto:
+      switch (this._scheme) {
+        case 'data':
+        case 'file':
+        case 'javascript':
+        case 'mailto':
+          return 'null';
+      }
+      host = this.host;
+      if (!host) {
+        return '';
+      }
+      return this._scheme + '://' + host;
+    }
+  };
+
+  // Copy over the static methods
+  var OriginalURL = scope.URL;
+  if (OriginalURL) {
+    jURL.createObjectURL = function(blob) {
+      // IE extension allows a second optional options argument.
+      // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx
+      return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
+    };
+    jURL.revokeObjectURL = function(url) {
+      OriginalURL.revokeObjectURL(url);
+    };
+  }
+
+  scope.URL = jURL;
+
+})(this);
+
+(function(scope) {
+
+var iterations = 0;
+var callbacks = [];
+var twiddle = document.createTextNode('');
+
+function endOfMicrotask(callback) {
+  twiddle.textContent = iterations++;
+  callbacks.push(callback);
+}
+
+function atEndOfMicrotask() {
+  while (callbacks.length) {
+    callbacks.shift()();
+  }
+}
+
+new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
+  .observe(twiddle, {characterData: true})
+  ;
+
+// exports
+scope.endOfMicrotask = endOfMicrotask;
+// bc 
+Platform.endOfMicrotask = endOfMicrotask;
+
+})(Polymer);
+
+
+(function(scope) {
+
+/**
+ * @class Polymer
+ */
+
+// imports
+var endOfMicrotask = scope.endOfMicrotask;
+
+// logging
+var log = window.WebComponents ? WebComponents.flags.log : {};
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+
+/**
+ * Force any pending data changes to be observed before 
+ * the next task. Data changes are processed asynchronously but are guaranteed
+ * to be processed, for example, before paintin. This method should rarely be 
+ * needed. It does nothing when Object.observe is available; 
+ * when Object.observe is not available, Polymer automatically flushes data 
+ * changes approximately every 1/10 second. 
+ * Therefore, `flush` should only be used when a data mutation should be 
+ * observed sooner than this.
+ * 
+ * @method flush
+ */
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    endOfMicrotask(function() {
+      flushing = false;
+      log.data && console.group('flush');
+      Platform.performMicrotaskCheckpoint();
+      log.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    // watch document visiblity to toggle dirty-checking
+    var visibilityHandler = function() {
+      // only flush if the page is visibile
+      if (document.visibilityState === 'hidden') {
+        if (scope.flushPoll) {
+          clearInterval(scope.flushPoll);
+        }
+      } else {
+        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+      }
+    };
+    if (typeof document.visibilityState === 'string') {
+      document.addEventListener('visibilitychange', visibilityHandler);
+    }
+    visibilityHandler();
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  };
+}
+
+// exports
+scope.flush = flush;
+// bc
+Platform.flush = flush;
+
+})(window.Polymer);
+
+
+(function(scope) {
+
+var urlResolver = {
+  resolveDom: function(root, url) {
+    url = url || baseUrl(root);
+    this.resolveAttributes(root, url);
+    this.resolveStyles(root, url);
+    // handle template.content
+    var templates = root.querySelectorAll('template');
+    if (templates) {
+      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
+        if (t.content) {
+          this.resolveDom(t.content, url);
+        }
+      }
+    }
+  },
+  resolveTemplate: function(template) {
+    this.resolveDom(template.content, baseUrl(template));
+  },
+  resolveStyles: function(root, url) {
+    var styles = root.querySelectorAll('style');
+    if (styles) {
+      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
+        this.resolveStyle(s, url);
+      }
+    }
+  },
+  resolveStyle: function(style, url) {
+    url = url || baseUrl(style);
+    style.textContent = this.resolveCssText(style.textContent, url);
+  },
+  resolveCssText: function(cssText, baseUrl, keepAbsolute) {
+    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);
+    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);
+  },
+  resolveAttributes: function(root, url) {
+    if (root.hasAttributes && root.hasAttributes()) {
+      this.resolveElementAttributes(root, url);
+    }
+    // search for attributes that host urls
+    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
+    if (nodes) {
+      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
+        this.resolveElementAttributes(n, url);
+      }
+    }
+  },
+  resolveElementAttributes: function(node, url) {
+    url = url || baseUrl(node);
+    URL_ATTRS.forEach(function(v) {
+      var attr = node.attributes[v];
+      var value = attr && attr.value;
+      var replacement;
+      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
+        if (v === 'style') {
+          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
+        } else {
+          replacement = resolveRelativeUrl(url, value);
+        }
+        attr.value = replacement;
+      }
+    });
+  }
+};
+
+var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
+var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
+var URL_TEMPLATE_SEARCH = '{{.*}}';
+var URL_HASH = '#';
+
+function baseUrl(node) {
+  var u = new URL(node.ownerDocument.baseURI);
+  u.search = '';
+  u.hash = '';
+  return u;
+}
+
+function replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {
+  return cssText.replace(regexp, function(m, pre, url, post) {
+    var urlPath = url.replace(/["']/g, '');
+    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);
+    return pre + '\'' + urlPath + '\'' + post;
+  });
+}
+
+function resolveRelativeUrl(baseUrl, url, keepAbsolute) {
+  // do not resolve '/' absolute urls
+  if (url && url[0] === '/') {
+    return url;
+  }
+  var u = new URL(url, baseUrl);
+  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);
+}
+
+function makeDocumentRelPath(url) {
+  var root = baseUrl(document.documentElement);
+  var u = new URL(url, root);
+  if (u.host === root.host && u.port === root.port &&
+      u.protocol === root.protocol) {
+    return makeRelPath(root, u);
+  } else {
+    return url;
+  }
+}
+
+// make a relative path from source to target
+function makeRelPath(sourceUrl, targetUrl) {
+  var source = sourceUrl.pathname;
+  var target = targetUrl.pathname;
+  var s = source.split('/');
+  var t = target.split('/');
+  while (s.length && s[0] === t[0]){
+    s.shift();
+    t.shift();
+  }
+  for (var i = 0, l = s.length - 1; i < l; i++) {
+    t.unshift('..');
+  }
+  // empty '#' is discarded but we need to preserve it.
+  var hash = (targetUrl.href.slice(-1) === URL_HASH) ? URL_HASH : targetUrl.hash;
+  return t.join('/') + targetUrl.search + hash;
+}
+
+// exports
+scope.urlResolver = urlResolver;
+
+})(Polymer);
+
+(function(scope) {
+  var endOfMicrotask = Polymer.endOfMicrotask;
+
+  // Generic url loader
+  function Loader(regex) {
+    this.cache = Object.create(null);
+    this.map = Object.create(null);
+    this.requests = 0;
+    this.regex = regex;
+  }
+  Loader.prototype = {
+
+    // TODO(dfreedm): there may be a better factoring here
+    // extract absolute urls from the text (full of relative urls)
+    extractUrls: function(text, base) {
+      var matches = [];
+      var matched, u;
+      while ((matched = this.regex.exec(text))) {
+        u = new URL(matched[1], base);
+        matches.push({matched: matched[0], url: u.href});
+      }
+      return matches;
+    },
+    // take a text blob, a root url, and a callback and load all the urls found within the text
+    // returns a map of absolute url to text
+    process: function(text, root, callback) {
+      var matches = this.extractUrls(text, root);
+
+      // every call to process returns all the text this loader has ever received
+      var done = callback.bind(null, this.map);
+      this.fetch(matches, done);
+    },
+    // build a mapping of url -> text from matches
+    fetch: function(matches, callback) {
+      var inflight = matches.length;
+
+      // return early if there is no fetching to be done
+      if (!inflight) {
+        return callback();
+      }
+
+      // wait for all subrequests to return
+      var done = function() {
+        if (--inflight === 0) {
+          callback();
+        }
+      };
+
+      // start fetching all subrequests
+      var m, req, url;
+      for (var i = 0; i < inflight; i++) {
+        m = matches[i];
+        url = m.url;
+        req = this.cache[url];
+        // if this url has already been requested, skip requesting it again
+        if (!req) {
+          req = this.xhr(url);
+          req.match = m;
+          this.cache[url] = req;
+        }
+        // wait for the request to process its subrequests
+        req.wait(done);
+      }
+    },
+    handleXhr: function(request) {
+      var match = request.match;
+      var url = match.url;
+
+      // handle errors with an empty string
+      var response = request.response || request.responseText || '';
+      this.map[url] = response;
+      this.fetch(this.extractUrls(response, url), request.resolve);
+    },
+    xhr: function(url) {
+      this.requests++;
+      var request = new XMLHttpRequest();
+      request.open('GET', url, true);
+      request.send();
+      request.onerror = request.onload = this.handleXhr.bind(this, request);
+
+      // queue of tasks to run after XHR returns
+      request.pending = [];
+      request.resolve = function() {
+        var pending = request.pending;
+        for(var i = 0; i < pending.length; i++) {
+          pending[i]();
+        }
+        request.pending = null;
+      };
+
+      // if we have already resolved, pending is null, async call the callback
+      request.wait = function(fn) {
+        if (request.pending) {
+          request.pending.push(fn);
+        } else {
+          endOfMicrotask(fn);
+        }
+      };
+
+      return request;
+    }
+  };
+
+  scope.Loader = Loader;
+})(Polymer);
+
+(function(scope) {
+
+var urlResolver = scope.urlResolver;
+var Loader = scope.Loader;
+
+function StyleResolver() {
+  this.loader = new Loader(this.regex);
+}
+StyleResolver.prototype = {
+  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
+  // Recursively replace @imports with the text at that url
+  resolve: function(text, url, callback) {
+    var done = function(map) {
+      callback(this.flatten(text, url, map));
+    }.bind(this);
+    this.loader.process(text, url, done);
+  },
+  // resolve the textContent of a style node
+  resolveNode: function(style, url, callback) {
+    var text = style.textContent;
+    var done = function(text) {
+      style.textContent = text;
+      callback(style);
+    };
+    this.resolve(text, url, done);
+  },
+  // flatten all the @imports to text
+  flatten: function(text, base, map) {
+    var matches = this.loader.extractUrls(text, base);
+    var match, url, intermediate;
+    for (var i = 0; i < matches.length; i++) {
+      match = matches[i];
+      url = match.url;
+      // resolve any css text to be relative to the importer, keep absolute url
+      intermediate = urlResolver.resolveCssText(map[url], url, true);
+      // flatten intermediate @imports
+      intermediate = this.flatten(intermediate, base, map);
+      text = text.replace(match.matched, intermediate);
+    }
+    return text;
+  },
+  loadStyles: function(styles, base, callback) {
+    var loaded=0, l = styles.length;
+    // called in the context of the style
+    function loadedStyle(style) {
+      loaded++;
+      if (loaded === l && callback) {
+        callback();
+      }
+    }
+    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
+      this.resolveNode(s, base, loadedStyle);
+    }
+  }
+};
+
+var styleResolver = new StyleResolver();
+
+// exports
+scope.styleResolver = styleResolver;
+
+})(Polymer);
+
+(function(scope) {
+
+  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
+  function extend(prototype, api) {
+    if (prototype && api) {
+      // use only own properties of 'api'
+      Object.getOwnPropertyNames(api).forEach(function(n) {
+        // acquire property descriptor
+        var pd = Object.getOwnPropertyDescriptor(api, n);
+        if (pd) {
+          // clone property via descriptor
+          Object.defineProperty(prototype, n, pd);
+          // cache name-of-method for 'super' engine
+          if (typeof pd.value == 'function') {
+            // hint the 'super' engine
+            pd.value.nom = n;
+          }
+        }
+      });
+    }
+    return prototype;
+  }
+
+
+  // mixin
+
+  // copy all properties from inProps (et al) to inObj
+  function mixin(inObj/*, inProps, inMoreProps, ...*/) {
+    var obj = inObj || {};
+    for (var i = 1; i < arguments.length; i++) {
+      var p = arguments[i];
+      try {
+        for (var n in p) {
+          copyProperty(n, p, obj);
+        }
+      } catch(x) {
+      }
+    }
+    return obj;
+  }
+
+  // copy property inName from inSource object to inTarget object
+  function copyProperty(inName, inSource, inTarget) {
+    var pd = getPropertyDescriptor(inSource, inName);
+    Object.defineProperty(inTarget, inName, pd);
+  }
+
+  // get property descriptor for inName on inObject, even if
+  // inName exists on some link in inObject's prototype chain
+  function getPropertyDescriptor(inObject, inName) {
+    if (inObject) {
+      var pd = Object.getOwnPropertyDescriptor(inObject, inName);
+      return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);
+    }
+  }
+
+  // exports
+
+  scope.extend = extend;
+  scope.mixin = mixin;
+
+  // for bc
+  Platform.mixin = mixin;
+
+})(Polymer);
+
+(function(scope) {
+  
+  // usage
+  
+  // invoke cb.call(this) in 100ms, unless the job is re-registered,
+  // which resets the timer
+  // 
+  // this.myJob = this.job(this.myJob, cb, 100)
+  //
+  // returns a job handle which can be used to re-register a job
+
+  var Job = function(inContext) {
+    this.context = inContext;
+    this.boundComplete = this.complete.bind(this)
+  };
+  Job.prototype = {
+    go: function(callback, wait) {
+      this.callback = callback;
+      var h;
+      if (!wait) {
+        h = requestAnimationFrame(this.boundComplete);
+        this.handle = function() {
+          cancelAnimationFrame(h);
+        }
+      } else {
+        h = setTimeout(this.boundComplete, wait);
+        this.handle = function() {
+          clearTimeout(h);
+        }
+      }
+    },
+    stop: function() {
+      if (this.handle) {
+        this.handle();
+        this.handle = null;
+      }
+    },
+    complete: function() {
+      if (this.handle) {
+        this.stop();
+        this.callback.call(this.context);
+      }
+    }
+  };
+  
+  function job(job, callback, wait) {
+    if (job) {
+      job.stop();
+    } else {
+      job = new Job(this);
+    }
+    job.go(callback, wait);
+    return job;
+  }
+  
+  // exports 
+
+  scope.job = job;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // dom polyfill, additions, and utility methods
+
+  var registry = {};
+
+  HTMLElement.register = function(tag, prototype) {
+    registry[tag] = prototype;
+  };
+
+  // get prototype mapped to node <tag>
+  HTMLElement.getPrototypeForTag = function(tag) {
+    var prototype = !tag ? HTMLElement.prototype : registry[tag];
+    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
+    return prototype || Object.getPrototypeOf(document.createElement(tag));
+  };
+
+  // we have to flag propagation stoppage for the event dispatcher
+  var originalStopPropagation = Event.prototype.stopPropagation;
+  Event.prototype.stopPropagation = function() {
+    this.cancelBubble = true;
+    originalStopPropagation.apply(this, arguments);
+  };
+  
+  
+  // polyfill DOMTokenList
+  // * add/remove: allow these methods to take multiple classNames
+  // * toggle: add a 2nd argument which forces the given state rather
+  //  than toggling.
+
+  var add = DOMTokenList.prototype.add;
+  var remove = DOMTokenList.prototype.remove;
+  DOMTokenList.prototype.add = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      add.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.remove = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      remove.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.toggle = function(name, bool) {
+    if (arguments.length == 1) {
+      bool = !this.contains(name);
+    }
+    bool ? this.add(name) : this.remove(name);
+  };
+  DOMTokenList.prototype.switch = function(oldName, newName) {
+    oldName && this.remove(oldName);
+    newName && this.add(newName);
+  };
+
+  // add array() to NodeList, NamedNodeMap, HTMLCollection
+
+  var ArraySlice = function() {
+    return Array.prototype.slice.call(this);
+  };
+
+  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});
+
+  NodeList.prototype.array = ArraySlice;
+  namedNodeMap.prototype.array = ArraySlice;
+  HTMLCollection.prototype.array = ArraySlice;
+
+  // utility
+
+  function createDOM(inTagOrNode, inHTML, inAttrs) {
+    var dom = typeof inTagOrNode == 'string' ?
+        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);
+    dom.innerHTML = inHTML;
+    if (inAttrs) {
+      for (var n in inAttrs) {
+        dom.setAttribute(n, inAttrs[n]);
+      }
+    }
+    return dom;
+  }
+
+  // exports
+
+  scope.createDOM = createDOM;
+
+})(Polymer);
+
+(function(scope) {

+    // super

+

+    // `arrayOfArgs` is an optional array of args like one might pass

+    // to `Function.apply`

+

+    // TODO(sjmiles):

+    //    $super must be installed on an instance or prototype chain

+    //    as `super`, and invoked via `this`, e.g.

+    //      `this.super();`

+

+    //    will not work if function objects are not unique, for example,

+    //    when using mixins.

+    //    The memoization strategy assumes each function exists on only one 

+    //    prototype chain i.e. we use the function object for memoizing)

+    //    perhaps we can bookkeep on the prototype itself instead

+    function $super(arrayOfArgs) {

+      // since we are thunking a method call, performance is important here: 

+      // memoize all lookups, once memoized the fast path calls no other 

+      // functions

+      //

+      // find the caller (cannot be `strict` because of 'caller')

+      var caller = $super.caller;

+      // memoized 'name of method' 

+      var nom = caller.nom;

+      // memoized next implementation prototype

+      var _super = caller._super;

+      if (!_super) {

+        if (!nom) {

+          nom = caller.nom = nameInThis.call(this, caller);

+        }

+        if (!nom) {

+          console.warn('called super() on a method not installed declaratively (has no .nom property)');

+        }

+        // super prototype is either cached or we have to find it

+        // by searching __proto__ (at the 'top')

+        // invariant: because we cache _super on fn below, we never reach 

+        // here from inside a series of calls to super(), so it's ok to 

+        // start searching from the prototype of 'this' (at the 'top')

+        // we must never memoize a null super for this reason

+        _super = memoizeSuper(caller, nom, getPrototypeOf(this));

+      }

+      // our super function

+      var fn = _super[nom];

+      if (fn) {

+        // memoize information so 'fn' can call 'super'

+        if (!fn._super) {

+          // must not memoize null, or we lose our invariant above

+          memoizeSuper(fn, nom, _super);

+        }

+        // invoke the inherited method

+        // if 'fn' is not function valued, this will throw

+        return fn.apply(this, arrayOfArgs || []);

+      }

+    }

+

+    function nameInThis(value) {

+      var p = this.__proto__;

+      while (p && p !== HTMLElement.prototype) {

+        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive

+        var n$ = Object.getOwnPropertyNames(p);

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

+          var d = Object.getOwnPropertyDescriptor(p, n);

+          if (typeof d.value === 'function' && d.value === value) {

+            return n;

+          }

+        }

+        p = p.__proto__;

+      }

+    }

+

+    function memoizeSuper(method, name, proto) {

+      // find and cache next prototype containing `name`

+      // we need the prototype so we can do another lookup

+      // from here

+      var s = nextSuper(proto, name, method);

+      if (s[name]) {

+        // `s` is a prototype, the actual method is `s[name]`

+        // tag super method with it's name for quicker lookups

+        s[name].nom = name;

+      }

+      return method._super = s;

+    }

+

+    function nextSuper(proto, name, caller) {

+      // look for an inherited prototype that implements name

+      while (proto) {

+        if ((proto[name] !== caller) && proto[name]) {

+          return proto;

+        }

+        proto = getPrototypeOf(proto);

+      }

+      // must not return null, or we lose our invariant above

+      // in this case, a super() call was invoked where no superclass

+      // method exists

+      // TODO(sjmiles): thow an exception?

+      return Object;

+    }

+

+    // NOTE: In some platforms (IE10) the prototype chain is faked via 

+    // __proto__. Therefore, always get prototype via __proto__ instead of

+    // the more standard Object.getPrototypeOf.

+    function getPrototypeOf(prototype) {

+      return prototype.__proto__;

+    }

+

+    // utility function to precompute name tags for functions

+    // in a (unchained) prototype

+    function hintSuper(prototype) {

+      // tag functions with their prototype name to optimize

+      // super call invocations

+      for (var n in prototype) {

+        var pd = Object.getOwnPropertyDescriptor(prototype, n);

+        if (pd && typeof pd.value === 'function') {

+          pd.value.nom = n;

+        }

+      }

+    }

+

+    // exports

+

+    scope.super = $super;

+

+})(Polymer);

+
+(function(scope) {
+
+  function noopHandler(value) {
+    return value;
+  }
+
+  // helper for deserializing properties of various types to strings
+  var typeHandlers = {
+    string: noopHandler,
+    'undefined': noopHandler,
+    date: function(value) {
+      return new Date(Date.parse(value) || Date.now());
+    },
+    boolean: function(value) {
+      if (value === '') {
+        return true;
+      }
+      return value === 'false' ? false : !!value;
+    },
+    number: function(value) {
+      var n = parseFloat(value);
+      // hex values like "0xFFFF" parseFloat as 0
+      if (n === 0) {
+        n = parseInt(value);
+      }
+      return isNaN(n) ? value : n;
+      // this code disabled because encoded values (like "0xFFFF")
+      // do not round trip to their original format
+      //return (String(floatVal) === value) ? floatVal : value;
+    },
+    object: function(value, currentValue) {
+      if (currentValue === null) {
+        return value;
+      }
+      try {
+        // If the string is an object, we can parse is with the JSON library.
+        // include convenience replace for single-quotes. If the author omits
+        // quotes altogether, parse will fail.
+        return JSON.parse(value.replace(/'/g, '"'));
+      } catch(e) {
+        // The object isn't valid JSON, return the raw value
+        return value;
+      }
+    },
+    // avoid deserialization of functions
+    'function': function(value, currentValue) {
+      return currentValue;
+    }
+  };
+
+  function deserializeValue(value, currentValue) {
+    // attempt to infer type from default value
+    var inferredType = typeof currentValue;
+    // invent 'date' type value for Date
+    if (currentValue instanceof Date) {
+      inferredType = 'date';
+    }
+    // delegate deserialization via type string
+    return typeHandlers[inferredType](value, currentValue);
+  }
+
+  // exports
+
+  scope.deserializeValue = deserializeValue;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+
+  // module
+
+  var api = {};
+
+  api.declaration = {};
+  api.instance = {};
+
+  api.publish = function(apis, prototype) {
+    for (var n in apis) {
+      extend(prototype, apis[n]);
+    }
+  };
+
+  // exports
+
+  scope.api = api;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  var utils = {
+
+    /**
+      * Invokes a function asynchronously. The context of the callback
+      * function is bound to 'this' automatically. Returns a handle which may 
+      * be passed to <a href="#cancelAsync">cancelAsync</a> to cancel the 
+      * asynchronous call.
+      *
+      * @method async
+      * @param {Function|String} method
+      * @param {any|Array} args
+      * @param {number} timeout
+      */
+    async: function(method, args, timeout) {
+      // when polyfilling Object.observe, ensure changes 
+      // propagate before executing the async method
+      Polymer.flush();
+      // second argument to `apply` must be an array
+      args = (args && args.length) ? args : [args];
+      // function to invoke
+      var fn = function() {
+        (this[method] || method).apply(this, args);
+      }.bind(this);
+      // execute `fn` sooner or later
+      var handle = timeout ? setTimeout(fn, timeout) :
+          requestAnimationFrame(fn);
+      // NOTE: switch on inverting handle to determine which time is used.
+      return timeout ? handle : ~handle;
+    },
+
+    /**
+      * Cancels a pending callback that was scheduled via 
+      * <a href="#async">async</a>. 
+      *
+      * @method cancelAsync
+      * @param {handle} handle Handle of the `async` to cancel.
+      */
+    cancelAsync: function(handle) {
+      if (handle < 0) {
+        cancelAnimationFrame(~handle);
+      } else {
+        clearTimeout(handle);
+      }
+    },
+
+    /**
+      * Fire an event.
+      *
+      * @method fire
+      * @returns {Object} event
+      * @param {string} type An event name.
+      * @param {any} detail
+      * @param {Node} onNode Target node.
+      * @param {Boolean} bubbles Set false to prevent bubbling, defaults to true
+      * @param {Boolean} cancelable Set false to prevent cancellation, defaults to true
+      */
+    fire: function(type, detail, onNode, bubbles, cancelable) {
+      var node = onNode || this;
+      var detail = detail === null || detail === undefined ? {} : detail;
+      var event = new CustomEvent(type, {
+        bubbles: bubbles !== undefined ? bubbles : true,
+        cancelable: cancelable !== undefined ? cancelable : true,
+        detail: detail
+      });
+      node.dispatchEvent(event);
+      return event;
+    },
+
+    /**
+      * Fire an event asynchronously.
+      *
+      * @method asyncFire
+      * @param {string} type An event name.
+      * @param detail
+      * @param {Node} toNode Target node.
+      */
+    asyncFire: function(/*inType, inDetail*/) {
+      this.async("fire", arguments);
+    },
+
+    /**
+      * Remove class from old, add class to anew, if they exist.
+      *
+      * @param classFollows
+      * @param anew A node.
+      * @param old A node
+      * @param className
+      */
+    classFollows: function(anew, old, className) {
+      if (old) {
+        old.classList.remove(className);
+      }
+      if (anew) {
+        anew.classList.add(className);
+      }
+    },
+
+    /**
+      * Inject HTML which contains markup bound to this element into
+      * a target element (replacing target element content).
+      *
+      * @param String html to inject
+      * @param Element target element
+      */
+    injectBoundHTML: function(html, element) {
+      var template = document.createElement('template');
+      template.innerHTML = html;
+      var fragment = this.instanceTemplate(template);
+      if (element) {
+        element.textContent = '';
+        element.appendChild(fragment);
+      }
+      return fragment;
+    }
+  };
+
+  // no-operation function for handy stubs
+  var nop = function() {};
+
+  // null-object for handy stubs
+  var nob = {};
+
+  // deprecated
+
+  utils.asyncMethod = utils.async;
+
+  // exports
+
+  scope.api.instance.utils = utils;
+  scope.nop = nop;
+  scope.nob = nob;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var EVENT_PREFIX = 'on-';
+
+  // instance events api
+  var events = {
+    // read-only
+    EVENT_PREFIX: EVENT_PREFIX,
+    // event listeners on host
+    addHostListeners: function() {
+      var events = this.eventDelegates;
+      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
+      // NOTE: host events look like bindings but really are not;
+      // (1) we don't want the attribute to be set and (2) we want to support
+      // multiple event listeners ('host' and 'instance') and Node.bind
+      // by default supports 1 thing being bound.
+      for (var type in events) {
+        var methodName = events[type];
+        PolymerGestures.addEventListener(this, type, this.element.getEventHandler(this, this, methodName));
+      }
+    },
+    // call 'method' or function method on 'obj' with 'args', if the method exists
+    dispatchMethod: function(obj, method, args) {
+      if (obj) {
+        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
+        var fn = typeof method === 'function' ? method : obj[method];
+        if (fn) {
+          fn[args ? 'apply' : 'call'](obj, args);
+        }
+        log.events && console.groupEnd();
+        // NOTE: dirty check right after calling method to ensure 
+        // changes apply quickly; in a very complicated app using high 
+        // frequency events, this can be a perf concern; in this case,
+        // imperative handlers can be used to avoid flushing.
+        Polymer.flush();
+      }
+    }
+  };
+
+  // exports
+
+  scope.api.instance.events = events;
+
+  /**
+   * @class Polymer
+   */
+
+  /**
+   * Add a gesture aware event handler to the given `node`. Can be used 
+   * in place of `element.addEventListener` and ensures gestures will function
+   * as expected on mobile platforms. Please note that Polymer's declarative
+   * event handlers include this functionality by default.
+   * 
+   * @method addEventListener
+   * @param {Node} node node on which to listen
+   * @param {String} eventType name of the event
+   * @param {Function} handlerFn event handler function
+   * @param {Boolean} capture set to true to invoke event capturing
+   * @type Function
+   */
+  // alias PolymerGestures event listener logic
+  scope.addEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.addEventListener(wrap(node), eventType, handlerFn, capture);
+  };
+
+  /**
+   * Remove a gesture aware event handler on the given `node`. To remove an
+   * event listener, the exact same arguments are required that were passed
+   * to `Polymer.addEventListener`.
+   * 
+   * @method removeEventListener
+   * @param {Node} node node on which to listen
+   * @param {String} eventType name of the event
+   * @param {Function} handlerFn event handler function
+   * @param {Boolean} capture set to true to invoke event capturing
+   * @type Function
+   */
+  scope.removeEventListener = function(node, eventType, handlerFn, capture) {
+    PolymerGestures.removeEventListener(wrap(node), eventType, handlerFn, capture);
+  };
+
+})(Polymer);
+
+(function(scope) {

+

+  // instance api for attributes

+

+  var attributes = {

+    // copy attributes defined in the element declaration to the instance

+    // e.g. <polymer-element name="x-foo" tabIndex="0"> tabIndex is copied

+    // to the element instance here.

+    copyInstanceAttributes: function () {

+      var a$ = this._instanceAttributes;

+      for (var k in a$) {

+        if (!this.hasAttribute(k)) {

+          this.setAttribute(k, a$[k]);

+        }

+      }

+    },

+    // for each attribute on this, deserialize value to property as needed

+    takeAttributes: function() {

+      // if we have no publish lookup table, we have no attributes to take

+      // TODO(sjmiles): ad hoc

+      if (this._publishLC) {

+        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

+          this.attributeToProperty(a.name, a.value);

+        }

+      }

+    },

+    // if attribute 'name' is mapped to a property, deserialize

+    // 'value' into that property

+    attributeToProperty: function(name, value) {

+      // try to match this attribute to a property (attributes are

+      // all lower-case, so this is case-insensitive search)

+      var name = this.propertyForAttribute(name);

+      if (name) {

+        // filter out 'mustached' values, these are to be

+        // replaced with bound-data and are not yet values

+        // themselves

+        if (value && value.search(scope.bindPattern) >= 0) {

+          return;

+        }

+        // get original value

+        var currentValue = this[name];

+        // deserialize Boolean or Number values from attribute

+        var value = this.deserializeValue(value, currentValue);

+        // only act if the value has changed

+        if (value !== currentValue) {

+          // install new value (has side-effects)

+          this[name] = value;

+        }

+      }

+    },

+    // return the published property matching name, or undefined

+    propertyForAttribute: function(name) {

+      var match = this._publishLC && this._publishLC[name];

+      return match;

+    },

+    // convert representation of `stringValue` based on type of `currentValue`

+    deserializeValue: function(stringValue, currentValue) {

+      return scope.deserializeValue(stringValue, currentValue);

+    },

+    // convert to a string value based on the type of `inferredType`

+    serializeValue: function(value, inferredType) {

+      if (inferredType === 'boolean') {

+        return value ? '' : undefined;

+      } else if (inferredType !== 'object' && inferredType !== 'function'

+          && value !== undefined) {

+        return value;

+      }

+    },

+    // serializes `name` property value and updates the corresponding attribute

+    // note that reflection is opt-in.

+    reflectPropertyToAttribute: function(name) {

+      var inferredType = typeof this[name];

+      // try to intelligently serialize property value

+      var serializedValue = this.serializeValue(this[name], inferredType);

+      // boolean properties must reflect as boolean attributes

+      if (serializedValue !== undefined) {

+        this.setAttribute(name, serializedValue);

+        // TODO(sorvell): we should remove attr for all properties

+        // that have undefined serialization; however, we will need to

+        // refine the attr reflection system to achieve this; pica, for example,

+        // relies on having inferredType object properties not removed as

+        // attrs.

+      } else if (inferredType === 'boolean') {

+        this.removeAttribute(name);

+      }

+    }

+  };

+

+  // exports

+

+  scope.api.instance.attributes = attributes;

+

+})(Polymer);

+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+
+  // magic words
+
+  var OBSERVE_SUFFIX = 'Changed';
+
+  // element api
+
+  var empty = [];
+
+  var updateRecord = {
+    object: undefined,
+    type: 'update',
+    name: undefined,
+    oldValue: undefined
+  };
+
+  var numberIsNaN = Number.isNaN || function(value) {
+    return typeof value === 'number' && isNaN(value);
+  };
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+    return left !== left && right !== right;
+  }
+
+  // capture A's value if B's value is null or undefined,
+  // otherwise use B's value
+  function resolveBindingValue(oldValue, value) {
+    if (value === undefined && oldValue === null) {
+      return value;
+    }
+    return (value === null || value === undefined) ? oldValue : value;
+  }
+
+  var properties = {
+
+    // creates a CompoundObserver to observe property changes
+    // NOTE, this is only done there are any properties in the `observe` object
+    createPropertyObserver: function() {
+      var n$ = this._observeNames;
+      if (n$ && n$.length) {
+        var o = this._propertyObserver = new CompoundObserver(true);
+        this.registerObserver(o);
+        // TODO(sorvell): may not be kosher to access the value here (this[n]);
+        // previously we looked at the descriptor on the prototype
+        // this doesn't work for inheritance and not for accessors without
+        // a value property
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          o.addPath(this, n);
+          this.observeArrayValue(n, this[n], null);
+        }
+      }
+    },
+
+    // start observing property changes
+    openPropertyObserver: function() {
+      if (this._propertyObserver) {
+        this._propertyObserver.open(this.notifyPropertyChanges, this);
+      }
+    },
+
+    // handler for property changes; routes changes to observing methods
+    // note: array valued properties are observed for array splices
+    notifyPropertyChanges: function(newValues, oldValues, paths) {
+      var name, method, called = {};
+      for (var i in oldValues) {
+        // note: paths is of form [object, path, object, path]
+        name = paths[2 * i + 1];
+        method = this.observe[name];
+        if (method) {
+          var ov = oldValues[i], nv = newValues[i];
+          // observes the value if it is an array
+          this.observeArrayValue(name, nv, ov);
+          if (!called[method]) {
+            // only invoke change method if one of ov or nv is not (undefined | null)
+            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {
+              called[method] = true;
+              // TODO(sorvell): call method with the set of values it's expecting;
+              // e.g. 'foo bar': 'invalidate' expects the new and old values for
+              // foo and bar. Currently we give only one of these and then
+              // deliver all the arguments.
+              this.invokeMethod(method, [ov, nv, arguments]);
+            }
+          }
+        }
+      }
+    },
+
+    // call method iff it exists.
+    invokeMethod: function(method, args) {
+      var fn = this[method] || method;
+      if (typeof fn === 'function') {
+        fn.apply(this, args);
+      }
+    },
+
+    /**
+     * Force any pending property changes to synchronously deliver to
+     * handlers specified in the `observe` object.
+     * Note, normally changes are processed at microtask time.
+     *
+     * @method deliverChanges
+     */
+    deliverChanges: function() {
+      if (this._propertyObserver) {
+        this._propertyObserver.deliver();
+      }
+    },
+
+    observeArrayValue: function(name, value, old) {
+      // we only care if there are registered side-effects
+      var callbackName = this.observe[name];
+      if (callbackName) {
+        // if we are observing the previous value, stop
+        if (Array.isArray(old)) {
+          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
+          this.closeNamedObserver(name + '__array');
+        }
+        // if the new value is an array, being observing it
+        if (Array.isArray(value)) {
+          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
+          var observer = new ArrayObserver(value);
+          observer.open(function(splices) {
+            this.invokeMethod(callbackName, [splices]);
+          }, this);
+          this.registerNamedObserver(name + '__array', observer);
+        }
+      }
+    },
+
+    emitPropertyChangeRecord: function(name, value, oldValue) {
+      var object = this;
+      if (areSameValue(value, oldValue)) {
+        return;
+      }
+      // invoke property change side effects
+      this._propertyChanged(name, value, oldValue);
+      // emit change record
+      if (!Observer.hasObjectObserve) {
+        return;
+      }
+      var notifier = this._objectNotifier;
+      if (!notifier) {
+        notifier = this._objectNotifier = Object.getNotifier(this);
+      }
+      updateRecord.object = this;
+      updateRecord.name = name;
+      updateRecord.oldValue = oldValue;
+      notifier.notify(updateRecord);
+    },
+
+    _propertyChanged: function(name, value, oldValue) {
+      if (this.reflect[name]) {
+        this.reflectPropertyToAttribute(name);
+      }
+    },
+
+    // creates a property binding (called via bind) to a published property.
+    bindProperty: function(property, observable, oneTime) {
+      if (oneTime) {
+        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);
+    },
+
+    // NOTE property `name` must be published. This makes it an accessor.
+    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];
+      // observable callback
+      var self = this;
+      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);
+      }
+      // resolve initial value
+      var value = observable.open(updateValue);
+      if (resolveFn && !areSameValue(oldValue, value)) {
+        var resolvedValue = resolveFn(oldValue, value);
+        if (!areSameValue(value, resolvedValue)) {
+          value = resolvedValue;
+          if (observable.setValue) {
+            observable.setValue(value);
+          }
+        }
+      }
+      updateValue(value, oldValue);
+      // register and return observable
+      var observer = {
+        close: function() {
+          observable.close();
+          self[privateObservable] = undefined;
+          self[privateComputedBoundValue] = undefined;
+        }
+      };
+      this.registerObserver(observer);
+      return observer;
+    },
+
+    createComputedProperties: function() {
+      if (!this._computedNames) {
+        return;
+      }
+      for (var i = 0; i < this._computedNames.length; i++) {
+        var name = this._computedNames[i];
+        var expressionText = this.computed[name];
+        try {
+          var expression = PolymerExpressions.getExpression(expressionText);
+          var observable = expression.getBinding(this, this.element.syntax);
+          this.bindToAccessor(name, observable);
+        } catch (ex) {
+          console.error('Failed to create computed property', ex);
+        }
+      }
+    },
+
+    // property bookkeeping
+    registerObserver: function(observer) {
+      if (!this._observers) {
+        this._observers = [observer];
+        return;
+      }
+      this._observers.push(observer);
+    },
+
+    closeObservers: function() {
+      if (!this._observers) {
+        return;
+      }
+      // observer array items are arrays of observers.
+      var observers = this._observers;
+      for (var i = 0; i < observers.length; i++) {
+        var observer = observers[i];
+        if (observer && typeof observer.close == 'function') {
+          observer.close();
+        }
+      }
+      this._observers = [];
+    },
+
+    // bookkeeping observers for memory management
+    registerNamedObserver: function(name, observer) {
+      var o$ = this._namedObservers || (this._namedObservers = {});
+      o$[name] = observer;
+    },
+
+    closeNamedObserver: function(name) {
+      var o$ = this._namedObservers;
+      if (o$ && o$[name]) {
+        o$[name].close();
+        o$[name] = null;
+        return true;
+      }
+    },
+
+    closeNamedObservers: function() {
+      if (this._namedObservers) {
+        for (var i in this._namedObservers) {
+          this.closeNamedObserver(i);
+        }
+        this._namedObservers = {};
+      }
+    }
+
+  };
+
+  // logging
+  var LOG_OBSERVE = '[%s] watching [%s]';
+  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
+  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
+
+  // exports
+
+  scope.api.instance.properties = properties;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * @class polymer-base
+   */
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+
+  // element api supporting mdv
+  var mdv = {
+
+    /**
+     * Creates dom cloned from the given template, instantiating bindings
+     * with this element as the template model and `PolymerExpressions` as the
+     * binding delegate.
+     *
+     * @method instanceTemplate
+     * @param {Template} template source template from which to create dom.
+     */
+    instanceTemplate: function(template) {
+      // ensure template is decorated (lets' things like <tr template ...> work)
+      HTMLTemplateElement.decorate(template);
+      // ensure a default bindingDelegate
+      var syntax = this.syntax || (!template.bindingDelegate &&
+          this.element.syntax);
+      var dom = template.createInstance(this, syntax);
+      var observers = dom.bindings_;
+      for (var i = 0; i < observers.length; i++) {
+        this.registerObserver(observers[i]);
+      }
+      return dom;
+    },
+
+    // Called by TemplateBinding/NodeBind to setup a binding to the given
+    // property. It's overridden here to support property bindings
+    // in addition to attribute bindings that are supported by default.
+    bind: function(name, observable, oneTime) {
+      var property = this.propertyForAttribute(name);
+      if (!property) {
+        // TODO(sjmiles): this mixin method must use the special form
+        // of `super` installed by `mixinMethod` in declaration/prototype.js
+        return this.mixinSuper(arguments);
+      } else {
+        // use n-way Polymer binding
+        var observer = this.bindProperty(property, observable, oneTime);
+        // NOTE: reflecting binding information is typically required only for
+        // tooling. It has a performance cost so it's opt-in in Node.bind.
+        if (Platform.enableBindingsReflection && observer) {
+          observer.path = observable.path_;
+          this._recordBinding(property, observer);
+        }
+        if (this.reflect[property]) {
+          this.reflectPropertyToAttribute(property);
+        }
+        return observer;
+      }
+    },
+
+    _recordBinding: function(name, observer) {
+      this.bindings_ = this.bindings_ || {};
+      this.bindings_[name] = observer;
+    },
+
+    // Called by TemplateBinding when all bindings on an element have been 
+    // executed. This signals that all element inputs have been gathered
+    // and it's safe to ready the element, create shadow-root and start
+    // data-observation.
+    bindFinished: function() {
+      this.makeElementReady();
+    },
+
+    // called at detached time to signal that an element's bindings should be
+    // cleaned up. This is done asynchronously so that users have the chance
+    // to call `cancelUnbindAll` to prevent unbinding.
+    asyncUnbindAll: function() {
+      if (!this._unbound) {
+        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
+        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
+      }
+    },
+    
+    /**
+     * This method should rarely be used and only if 
+     * <a href="#cancelUnbindAll">`cancelUnbindAll`</a> has been called to 
+     * prevent element unbinding. In this case, the element's bindings will 
+     * not be automatically cleaned up and it cannot be garbage collected 
+     * by the system. If memory pressure is a concern or a 
+     * large amount of elements need to be managed in this way, `unbindAll`
+     * can be called to deactivate the element's bindings and allow its 
+     * memory to be reclaimed.
+     *
+     * @method unbindAll
+     */
+    unbindAll: function() {
+      if (!this._unbound) {
+        this.closeObservers();
+        this.closeNamedObservers();
+        this._unbound = true;
+      }
+    },
+
+    /**
+     * Call in `detached` to prevent the element from unbinding when it is 
+     * detached from the dom. The element is unbound as a cleanup step that 
+     * allows its memory to be reclaimed. 
+     * If `cancelUnbindAll` is used, consider calling 
+     * <a href="#unbindAll">`unbindAll`</a> when the element is no longer
+     * needed. This will allow its memory to be reclaimed.
+     * 
+     * @method cancelUnbindAll
+     */
+    cancelUnbindAll: function() {
+      if (this._unbound) {
+        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
+        return;
+      }
+      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
+      if (this._unbindAllJob) {
+        this._unbindAllJob = this._unbindAllJob.stop();
+      }
+    }
+
+  };
+
+  function unbindNodeTree(node) {
+    forNodeTree(node, _nodeUnbindAll);
+  }
+
+  function _nodeUnbindAll(node) {
+    node.unbindAll();
+  }
+
+  function forNodeTree(node, callback) {
+    if (node) {
+      callback(node);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        forNodeTree(child, callback);
+      }
+    }
+  }
+
+  var mustachePattern = /\{\{([^{}]*)}}/;
+
+  // exports
+
+  scope.bindPattern = mustachePattern;
+  scope.api.instance.mdv = mdv;
+
+})(Polymer);
+
+(function(scope) {
+
+  /**
+   * Common prototype for all Polymer Elements.
+   * 
+   * @class polymer-base
+   * @homepage polymer.github.io
+   */
+  var base = {
+    /**
+     * Tags this object as the canonical Base prototype.
+     *
+     * @property PolymerBase
+     * @type boolean
+     * @default true
+     */
+    PolymerBase: true,
+
+    /**
+     * Debounce signals. 
+     * 
+     * Call `job` to defer a named signal, and all subsequent matching signals, 
+     * until a wait time has elapsed with no new signal.
+     * 
+     *     debouncedClickAction: function(e) {
+     *       // processClick only when it's been 100ms since the last click
+     *       this.job('click', function() {
+     *        this.processClick;
+     *       }, 100);
+     *     }
+     *
+     * @method job
+     * @param String {String} job A string identifier for the job to debounce.
+     * @param Function {Function} callback A function that is called (with `this` context) when the wait time elapses.
+     * @param Number {Number} wait Time in milliseconds (ms) after the last signal that must elapse before invoking `callback`
+     * @type Handle
+     */
+    job: function(job, callback, wait) {
+      if (typeof job === 'string') {
+        var n = '___' + job;
+        this[n] = Polymer.job.call(this, this[n], callback, wait);
+      } else {
+        // TODO(sjmiles): suggest we deprecate this call signature
+        return Polymer.job.call(this, job, callback, wait);
+      }
+    },
+
+    /**
+     * Invoke a superclass method. 
+     * 
+     * Use `super()` to invoke the most recently overridden call to the 
+     * currently executing function. 
+     * 
+     * To pass arguments through, use the literal `arguments` as the parameter 
+     * to `super()`.
+     *
+     *     nextPageAction: function(e) {
+     *       // invoke the superclass version of `nextPageAction`
+     *       this.super(arguments); 
+     *     }
+     *
+     * To pass custom arguments, arrange them in an array.
+     *
+     *     appendSerialNo: function(value, serial) {
+     *       // prefix the superclass serial number with our lot # before
+     *       // invoking the superlcass
+     *       return this.super([value, this.lotNo + serial])
+     *     }
+     *
+     * @method super
+     * @type Any
+     * @param {args) An array of arguments to use when calling the superclass method, or null.
+     */
+    super: Polymer.super,
+
+    /**
+     * Lifecycle method called when the element is instantiated.
+     * 
+     * Override `created` to perform custom create-time tasks. No need to call 
+     * super-class `created` unless you are extending another Polymer element.
+     * Created is called before the element creates `shadowRoot` or prepares
+     * data-observation.
+     * 
+     * @method created
+     * @type void
+     */
+    created: function() {
+    },
+
+    /**
+     * Lifecycle method called when the element has populated it's `shadowRoot`,
+     * prepared data-observation, and made itself ready for API interaction.
+     * 
+     * @method ready
+     * @type void
+     */
+    ready: function() {
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `created` 
+     * instead, which is called immediately after `createdCallback`. 
+     * 
+     * @method createdCallback
+     */
+    createdCallback: function() {
+      if (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();
+      if (!this.ownerDocument.isStagingDocument) {
+        this.makeElementReady();
+      }
+    },
+
+    // system entry point, do not override
+    prepareElement: function() {
+      if (this._elementPrepared) {
+        console.warn('Element already prepared', this.localName);
+        return;
+      }
+      this._elementPrepared = true;
+      // storage for shadowRoots info
+      this.shadowRoots = {};
+      // install property observers
+      this.createPropertyObserver();
+      this.openPropertyObserver();
+      // install boilerplate attributes
+      this.copyInstanceAttributes();
+      // process input attributes
+      this.takeAttributes();
+      // add event listeners
+      this.addHostListeners();
+    },
+
+    // system entry point, do not override
+    makeElementReady: function() {
+      if (this._readied) {
+        return;
+      }
+      this._readied = true;
+      this.createComputedProperties();
+      this.parseDeclarations(this.__proto__);
+      // NOTE: Support use of the `unresolved` attribute to help polyfill
+      // custom elements' `:unresolved` feature.
+      this.removeAttribute('unresolved');
+      // user entry point
+      this.ready();
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom tasks in your element, implement `attributeChanged` 
+     * instead, which is called immediately after `attributeChangedCallback`. 
+     * 
+     * @method attributeChangedCallback
+     */
+    attributeChangedCallback: function(name, oldValue) {
+      // TODO(sjmiles): adhoc filter
+      if (name !== 'class' && name !== 'style') {
+        this.attributeToProperty(name, this.getAttribute(name));
+      }
+      if (this.attributeChanged) {
+        this.attributeChanged.apply(this, arguments);
+      }
+    },
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `attached` 
+     * instead, which is called immediately after `attachedCallback`. 
+     * 
+     * @method attachedCallback
+     */
+     attachedCallback: function() {
+      // when the element is attached, prevent it from unbinding.
+      this.cancelUnbindAll();
+      // invoke user action
+      if (this.attached) {
+        this.attached();
+      }
+      if (!this.hasBeenAttached) {
+        this.hasBeenAttached = true;
+        if (this.domReady) {
+          this.async('domReady');
+        }
+      }
+    },
+
+     /**
+     * Implement to access custom elements in dom descendants, ancestors, 
+     * or siblings. Because custom elements upgrade in document order, 
+     * elements accessed in `ready` or `attached` may not be upgraded. When
+     * `domReady` is called, all registered custom elements are guaranteed
+     * to have been upgraded.
+     * 
+     * @method domReady
+     */
+
+    /**
+     * Low-level lifecycle method called as part of standard Custom Elements
+     * operation. Polymer implements this method to provide basic default 
+     * functionality. For custom create-time tasks, implement `detached` 
+     * instead, which is called immediately after `detachedCallback`. 
+     * 
+     * @method detachedCallback
+     */
+    detachedCallback: function() {
+      if (!this.preventDispose) {
+        this.asyncUnbindAll();
+      }
+      // invoke user action
+      if (this.detached) {
+        this.detached();
+      }
+      // TODO(sorvell): bc
+      if (this.leftView) {
+        this.leftView();
+      }
+    },
+
+    /**
+     * Walks the prototype-chain of this element and allows specific
+     * classes a chance to process static declarations.
+     * 
+     * In particular, each polymer-element has it's own `template`.
+     * `parseDeclarations` is used to accumulate all element `template`s
+     * from an inheritance chain.
+     *
+     * `parseDeclaration` static methods implemented in the chain are called
+     * recursively, oldest first, with the `<polymer-element>` associated
+     * with the current prototype passed as an argument.
+     * 
+     * An element may override this method to customize shadow-root generation. 
+     * 
+     * @method parseDeclarations
+     */
+    parseDeclarations: function(p) {
+      if (p && p.element) {
+        this.parseDeclarations(p.__proto__);
+        p.parseDeclaration.call(this, p.element);
+      }
+    },
+
+    /**
+     * Perform init-time actions based on static information in the
+     * `<polymer-element>` instance argument.
+     *
+     * For example, the standard implementation locates the template associated
+     * with the given `<polymer-element>` and stamps it into a shadow-root to
+     * implement shadow inheritance.
+     *  
+     * An element may override this method for custom behavior. 
+     * 
+     * @method parseDeclaration
+     */
+    parseDeclaration: function(elementElement) {
+      var template = this.fetchTemplate(elementElement);
+      if (template) {
+        var root = this.shadowFromTemplate(template);
+        this.shadowRoots[elementElement.name] = root;
+      }
+    },
+
+    /**
+     * Given a `<polymer-element>`, find an associated template (if any) to be
+     * used for shadow-root generation.
+     *
+     * An element may override this method for custom behavior. 
+     * 
+     * @method fetchTemplate
+     */
+    fetchTemplate: function(elementElement) {
+      return elementElement.querySelector('template');
+    },
+
+    /**
+     * Create a shadow-root in this host and stamp `template` as it's 
+     * content. 
+     *
+     * An element may override this method for custom behavior. 
+     * 
+     * @method shadowFromTemplate
+     */
+    shadowFromTemplate: function(template) {
+      if (template) {
+        // make a shadow root
+        var root = this.createShadowRoot();
+        // stamp template
+        // which includes parsing and applying MDV bindings before being
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        root.appendChild(dom);
+        // perform post-construction initialization tasks on shadow root
+        this.shadowRootReady(root, template);
+        // return the created shadow root
+        return root;
+      }
+    },
+
+    // utility function that stamps a <template> into light-dom
+    lightFromTemplate: function(template, refNode) {
+      if (template) {
+        // TODO(sorvell): mark this element as an eventController so that
+        // event listeners on bound nodes inside it will be called on it.
+        // Note, the expectation here is that events on all descendants
+        // should be handled by this element.
+        this.eventController = this;
+        // stamp template
+        // which includes parsing and applying MDV bindings before being
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        if (refNode) {
+          this.insertBefore(dom, refNode);
+        } else {
+          this.appendChild(dom);
+        }
+        // perform post-construction initialization tasks on ahem, light root
+        this.shadowRootReady(this);
+        // return the created shadow root
+        return dom;
+      }
+    },
+
+    shadowRootReady: function(root) {
+      // locate nodes with id and store references to them in this.$ hash
+      this.marshalNodeReferences(root);
+    },
+
+    // locate nodes with id and store references to them in this.$ hash
+    marshalNodeReferences: function(root) {
+      // establish $ instance variable
+      var $ = this.$ = this.$ || {};
+      // populate $ from nodes with ID from the LOCAL tree
+      if (root) {
+        var n$ = root.querySelectorAll("[id]");
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          $[n.id] = n;
+        };
+      }
+    },
+
+    /**
+     * Register a one-time callback when a child-list or sub-tree mutation
+     * occurs on node. 
+     *
+     * For persistent callbacks, call onMutation from your listener. 
+     * 
+     * @method onMutation
+     * @param Node {Node} node Node to watch for mutations.
+     * @param Function {Function} listener Function to call on mutation. The function is invoked as `listener.call(this, observer, mutations);` where `observer` is the MutationObserver that triggered the notification, and `mutations` is the native mutation list.
+     */
+    onMutation: function(node, listener) {
+      var observer = new MutationObserver(function(mutations) {
+        listener.call(this, observer, mutations);
+        observer.disconnect();
+      }.bind(this));
+      observer.observe(node, {childList: true, subtree: true});
+    }
+  };
+
+  /**
+   * @class Polymer
+   */
+  
+  /**
+   * Returns true if the object includes <a href="#polymer-base">polymer-base</a> in it's prototype chain.
+   * 
+   * @method isBase
+   * @param Object {Object} object Object to test.
+   * @type Boolean
+   */
+  function isBase(object) {
+    return object.hasOwnProperty('PolymerBase')
+  }
+
+  // name a base constructor for dev tools
+
+  /**
+   * The Polymer base-class constructor.
+   * 
+   * @property Base
+   * @type Function
+   */
+  function PolymerBase() {};
+  PolymerBase.prototype = base;
+  base.constructor = PolymerBase;
+
+  // exports
+
+  scope.Base = PolymerBase;
+  scope.isBase = isBase;
+  scope.api.instance.base = base;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // magic words
+  
+  var STYLE_SCOPE_ATTRIBUTE = 'element';
+  var STYLE_CONTROLLER_SCOPE = 'controller';
+  
+  var styles = {
+    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
+    /**
+     * Installs external stylesheets and <style> elements with the attribute 
+     * polymer-scope='controller' into the scope of element. This is intended
+     * to be a called during custom element construction.
+    */
+    installControllerStyles: function() {
+      // apply controller styles, but only if they are not yet applied
+      var scope = this.findStyleScope();
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
+        // allow inherited controller styles
+        var proto = getPrototypeOf(this), cssText = '';
+        while (proto && proto.element) {
+          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
+          proto = getPrototypeOf(proto);
+        }
+        if (cssText) {
+          this.installScopeCssText(cssText, scope);
+        }
+      }
+    },
+    installScopeStyle: function(style, name, scope) {
+      var scope = scope || this.findStyleScope(), name = name || '';
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
+        var cssText = '';
+        if (style instanceof Array) {
+          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
+            cssText += s.textContent + '\n\n';
+          }
+        } else {
+          cssText = style.textContent;
+        }
+        this.installScopeCssText(cssText, scope, name);
+      }
+    },
+    installScopeCssText: function(cssText, scope, name) {
+      scope = scope || this.findStyleScope();
+      name = name || '';
+      if (!scope) {
+        return;
+      }
+      if (hasShadowDOMPolyfill) {
+        cssText = shimCssText(cssText, scope.host);
+      }
+      var style = this.element.cssTextToScopeStyle(cssText,
+          STYLE_CONTROLLER_SCOPE);
+      Polymer.applyStyleToScope(style, scope);
+      // cache that this style has been applied
+      this.styleCacheForScope(scope)[this.localName + name] = true;
+    },
+    findStyleScope: function(node) {
+      // find the shadow root that contains this element
+      var n = node || this;
+      while (n.parentNode) {
+        n = n.parentNode;
+      }
+      return n;
+    },
+    scopeHasNamedStyle: function(scope, name) {
+      var cache = this.styleCacheForScope(scope);
+      return cache[name];
+    },
+    styleCacheForScope: function(scope) {
+      if (hasShadowDOMPolyfill) {
+        var scopeName = scope.host ? scope.host.localName : scope.localName;
+        return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
+      } else {
+        return scope._scopeStyles = (scope._scopeStyles || {});
+      }
+    }
+  };
+
+  var polyfillScopeStyleCache = {};
+  
+  // NOTE: use raw prototype traversal so that we ensure correct traversal
+  // on platforms where the protoype chain is simulated via __proto__ (IE10)
+  function getPrototypeOf(prototype) {
+    return prototype.__proto__;
+  }
+
+  function shimCssText(cssText, host) {
+    var name = '', is = false;
+    if (host) {
+      name = host.localName;
+      is = host.hasAttribute('is');
+    }
+    var selector = WebComponents.ShadowCSS.makeScopeSelector(name, is);
+    return WebComponents.ShadowCSS.shimCssText(cssText, selector);
+  }
+
+  // exports
+
+  scope.api.instance.styles = styles;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+
+  // imperative implementation: Polymer()
+
+  // specify an 'own' prototype for tag `name`
+  function element(name, prototype) {
+    if (typeof name !== 'string') {
+      var script = prototype || document._currentScript;
+      prototype = name;
+      name = script && script.parentNode && script.parentNode.getAttribute ?
+          script.parentNode.getAttribute('name') : '';
+      if (!name) {
+        throw 'Element name could not be inferred.';
+      }
+    }
+    if (getRegisteredPrototype(name)) {
+      throw 'Already registered (Polymer) prototype for element ' + name;
+    }
+    // cache the prototype
+    registerPrototype(name, prototype);
+    // notify the registrar waiting for 'name', if any
+    notifyPrototype(name);
+  }
+
+  // async prototype source
+
+  function waitingForPrototype(name, client) {
+    waitPrototype[name] = client;
+  }
+
+  var waitPrototype = {};
+
+  function notifyPrototype(name) {
+    if (waitPrototype[name]) {
+      waitPrototype[name].registerWhenReady();
+      delete waitPrototype[name];
+    }
+  }
+
+  // utility and bookkeeping
+
+  // maps tag names to prototypes, as registered with
+  // Polymer. Prototypes associated with a tag name
+  // using document.registerElement are available from
+  // HTMLElement.getPrototypeForTag().
+  // If an element was fully registered by Polymer, then
+  // Polymer.getRegisteredPrototype(name) === 
+  //   HTMLElement.getPrototypeForTag(name)
+
+  var prototypesByName = {};
+
+  function registerPrototype(name, prototype) {
+    return prototypesByName[name] = prototype || {};
+  }
+
+  function getRegisteredPrototype(name) {
+    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
+
+  // make window.Polymer reference `element()`
+
+  window.Polymer = element;
+
+  // TODO(sjmiles): find a way to do this that is less terrible
+  // copy window.Polymer properties onto `element()`
+
+  extend(Polymer, scope);
+
+  // Under the HTMLImports polyfill, scripts in the main document
+  // do not block on imports; we want to allow calls to Polymer in the main
+  // document. WebComponents collects those calls until we can process them, which
+  // we do here.
+
+  if (WebComponents.consumeDeclarations) {
+    WebComponents.consumeDeclarations(function(declarations) {
+      if (declarations) {
+        for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
+          element.apply(null, d);
+        }
+      }
+    });
+  }
+
+})(Polymer);
+
+(function(scope) {
+
+/**
+ * @class polymer-base
+ */
+
+ /**
+  * Resolve a url path to be relative to a `base` url. If unspecified, `base`
+  * defaults to the element's ownerDocument url. Can be used to resolve
+  * paths from element's in templates loaded in HTMLImports to be relative
+  * to the document containing the element. Polymer automatically does this for
+  * url attributes in element templates; however, if a url, for
+  * example, contains a binding, then `resolvePath` can be used to ensure it is 
+  * relative to the element document. For example, in an element's template,
+  *
+  *     <a href="{{resolvePath(path)}}">Resolved</a>
+  * 
+  * @method resolvePath
+  * @param {String} url Url path to resolve.
+  * @param {String} base Optional base url against which to resolve, defaults
+  * to the element's ownerDocument url.
+  * returns {String} resolved url.
+  */
+
+var path = {
+  resolveElementPaths: function(node) {
+    Polymer.urlResolver.resolveDom(node);
+  },
+  addResolvePathApi: function() {
+    // let assetpath attribute modify the resolve path
+    var assetPath = this.getAttribute('assetpath') || '';
+    var root = new URL(assetPath, this.ownerDocument.baseURI);
+    this.prototype.resolvePath = function(urlPath, base) {
+      var u = new URL(urlPath, base || root);
+      return u.href;
+    };
+  }
+};
+
+// exports
+scope.api.declaration.path = path;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var api = scope.api.instance.styles;
+  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
+
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // magic words
+
+  var STYLE_SELECTOR = 'style';
+  var STYLE_LOADABLE_MATCH = '@import';
+  var SHEET_SELECTOR = 'link[rel=stylesheet]';
+  var STYLE_GLOBAL_SCOPE = 'global';
+  var SCOPE_ATTR = 'polymer-scope';
+
+  var styles = {
+    // returns true if resources are loading
+    loadStyles: function(callback) {
+      var template = this.fetchTemplate();
+      var content = template && this.templateContent();
+      if (content) {
+        this.convertSheetsToStyles(content);
+        var styles = this.findLoadableStyles(content);
+        if (styles.length) {
+          var templateUrl = template.ownerDocument.baseURI;
+          return Polymer.styleResolver.loadStyles(styles, templateUrl, callback);
+        }
+      }
+      if (callback) {
+        callback();
+      }
+    },
+    convertSheetsToStyles: function(root) {
+      var s$ = root.querySelectorAll(SHEET_SELECTOR);
+      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
+        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
+            this.ownerDocument);
+        this.copySheetAttributes(c, s);
+        s.parentNode.replaceChild(c, s);
+      }
+    },
+    copySheetAttributes: function(style, link) {
+      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
+        if (a.name !== 'rel' && a.name !== 'href') {
+          style.setAttribute(a.name, a.value);
+        }
+      }
+    },
+    findLoadableStyles: function(root) {
+      var loadables = [];
+      if (root) {
+        var s$ = root.querySelectorAll(STYLE_SELECTOR);
+        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
+          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
+            loadables.push(s);
+          }
+        }
+      }
+      return loadables;
+    },
+    /**
+     * Install external stylesheets loaded in <polymer-element> elements into the 
+     * element's template.
+     * @param elementElement The <element> element to style.
+     */
+    installSheets: function() {
+      this.cacheSheets();
+      this.cacheStyles();
+      this.installLocalSheets();
+      this.installGlobalStyles();
+    },
+    /**
+     * Remove all sheets from element and store for later use.
+     */
+    cacheSheets: function() {
+      this.sheets = this.findNodes(SHEET_SELECTOR);
+      this.sheets.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    cacheStyles: function() {
+      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
+      this.styles.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    /**
+     * Takes external stylesheets loaded in an <element> element and moves
+     * their content into a <style> element inside the <element>'s template.
+     * The sheet is then removed from the <element>. This is done only so 
+     * that if the element is loaded in the main document, the sheet does
+     * not become active.
+     * Note, ignores sheets with the attribute 'polymer-scope'.
+     * @param elementElement The <element> element to style.
+     */
+    installLocalSheets: function () {
+      var sheets = this.sheets.filter(function(s) {
+        return !s.hasAttribute(SCOPE_ATTR);
+      });
+      var content = this.templateContent();
+      if (content) {
+        var cssText = '';
+        sheets.forEach(function(sheet) {
+          cssText += cssTextFromSheet(sheet) + '\n';
+        });
+        if (cssText) {
+          var style = createStyleElement(cssText, this.ownerDocument);
+          content.insertBefore(style, content.firstChild);
+        }
+      }
+    },
+    findNodes: function(selector, matcher) {
+      var nodes = this.querySelectorAll(selector).array();
+      var content = this.templateContent();
+      if (content) {
+        var templateNodes = content.querySelectorAll(selector).array();
+        nodes = nodes.concat(templateNodes);
+      }
+      return matcher ? nodes.filter(matcher) : nodes;
+    },
+    /**
+     * Promotes external stylesheets and <style> elements with the attribute 
+     * polymer-scope='global' into global scope.
+     * This is particularly useful for defining @keyframe rules which 
+     * currently do not function in scoped or shadow style elements.
+     * (See wkb.ug/72462)
+     * @param elementElement The <element> element to style.
+    */
+    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
+    installGlobalStyles: function() {
+      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
+      applyStyleToScope(style, document.head);
+    },
+    cssTextForScope: function(scopeDescriptor) {
+      var cssText = '';
+      // handle stylesheets
+      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
+      var matcher = function(s) {
+        return matchesSelector(s, selector);
+      };
+      var sheets = this.sheets.filter(matcher);
+      sheets.forEach(function(sheet) {
+        cssText += cssTextFromSheet(sheet) + '\n\n';
+      });
+      // handle cached style elements
+      var styles = this.styles.filter(matcher);
+      styles.forEach(function(style) {
+        cssText += style.textContent + '\n\n';
+      });
+      return cssText;
+    },
+    styleForScope: function(scopeDescriptor) {
+      var cssText = this.cssTextForScope(scopeDescriptor);
+      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
+    },
+    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
+      if (cssText) {
+        var style = createStyleElement(cssText);
+        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
+            '-' + scopeDescriptor);
+        return style;
+      }
+    }
+  };
+
+  function importRuleForSheet(sheet, baseUrl) {
+    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
+    return '@import \'' + href + '\';';
+  }
+
+  function applyStyleToScope(style, scope) {
+    if (style) {
+      if (scope === document) {
+        scope = document.head;
+      }
+      if (hasShadowDOMPolyfill) {
+        scope = document.head;
+      }
+      // TODO(sorvell): necessary for IE
+      // see https://connect.microsoft.com/IE/feedback/details/790212/
+      // cloning-a-style-element-and-adding-to-document-produces
+      // -unexpected-result#details
+      // var clone = style.cloneNode(true);
+      var clone = createStyleElement(style.textContent);
+      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
+      if (attr) {
+        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
+      }
+      // TODO(sorvell): probably too brittle; try to figure out 
+      // where to put the element.
+      var refNode = scope.firstElementChild;
+      if (scope === document.head) {
+        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
+        var s$ = document.head.querySelectorAll(selector);
+        if (s$.length) {
+          refNode = s$[s$.length-1].nextElementSibling;
+        }
+      }
+      scope.insertBefore(clone, refNode);
+    }
+  }
+
+  function createStyleElement(cssText, scope) {
+    scope = scope || document;
+    scope = scope.createElement ? scope : scope.ownerDocument;
+    var style = scope.createElement('style');
+    style.textContent = cssText;
+    return style;
+  }
+
+  function cssTextFromSheet(sheet) {
+    return (sheet && sheet.__resource) || '';
+  }
+
+  function matchesSelector(node, inSelector) {
+    if (matches) {
+      return matches.call(node, inSelector);
+    }
+  }
+  var p = HTMLElement.prototype;
+  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
+      || p.mozMatchesSelector;
+  
+  // exports
+
+  scope.api.declaration.styles = styles;
+  scope.applyStyleToScope = applyStyleToScope;
+  
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+
+  var log = window.WebComponents ? WebComponents.flags.log : {};
+  var api = scope.api.instance.events;
+  var EVENT_PREFIX = api.EVENT_PREFIX;
+
+  var mixedCaseEventTypes = {};
+  [
+    'webkitAnimationStart',
+    'webkitAnimationEnd',
+    'webkitTransitionEnd',
+    'DOMFocusOut',
+    'DOMFocusIn',
+    'DOMMouseScroll'
+  ].forEach(function(e) {
+    mixedCaseEventTypes[e.toLowerCase()] = e;
+  });
+
+  // polymer-element declarative api: events feature
+  var events = {
+    parseHostEvents: function() {
+      // our delegates map
+      var delegates = this.prototype.eventDelegates;
+      // extract data from attributes into delegates
+      this.addAttributeDelegates(delegates);
+    },
+    addAttributeDelegates: function(delegates) {
+      // for each attribute
+      for (var i=0, a; a=this.attributes[i]; i++) {
+        // does it have magic marker identifying it as an event delegate?
+        if (this.hasEventPrefix(a.name)) {
+          // if so, add the info to delegates
+          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
+              .replace('}}', '').trim();
+        }
+      }
+    },
+    // starts with 'on-'
+    hasEventPrefix: function (n) {
+      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
+    },
+    removeEventPrefix: function(n) {
+      return n.slice(prefixLength);
+    },
+    findController: function(node) {
+      while (node.parentNode) {
+        if (node.eventController) {
+          return node.eventController;
+        }
+        node = node.parentNode;
+      }
+      return node.host;
+    },
+    getEventHandler: function(controller, target, method) {
+      var events = this;
+      return function(e) {
+        if (!controller || !controller.PolymerBase) {
+          controller = events.findController(target);
+        }
+
+        var args = [e, e.detail, e.currentTarget];
+        controller.dispatchMethod(controller, method, args);
+      };
+    },
+    prepareEventBinding: function(pathString, name, node) {
+      if (!this.hasEventPrefix(name))
+        return;
+
+      var eventType = this.removeEventPrefix(name);
+      eventType = mixedCaseEventTypes[eventType] || eventType;
+
+      var events = this;
+
+      return function(model, node, oneTime) {
+        var handler = events.getEventHandler(undefined, node, pathString);
+        PolymerGestures.addEventListener(node, eventType, handler);
+
+        if (oneTime)
+          return;
+
+        // TODO(rafaelw): This is really pointless work. Aside from the cost
+        // of these allocations, NodeBind is going to setAttribute back to its
+        // current value. Fixing this would mean changing the TemplateBinding
+        // binding delegate API.
+        function bindingValue() {
+          return '{{ ' + pathString + ' }}';
+        }
+
+        return {
+          open: bindingValue,
+          discardChanges: bindingValue,
+          close: function() {
+            PolymerGestures.removeEventListener(node, eventType, handler);
+          }
+        };
+      };
+    }
+  };
+
+  var prefixLength = EVENT_PREFIX.length;
+
+  // exports
+  scope.api.declaration.events = events;
+
+})(Polymer);
+
+(function(scope) {
+
+  // element api
+
+  var observationBlacklist = ['attribute'];
+
+  var properties = {
+    inferObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var observe = prototype.observe, property;
+      for (var n in prototype) {
+        if (n.slice(-7) === 'Changed') {
+          property = n.slice(0, -7);
+          if (this.canObserveProperty(property)) {
+            if (!observe) {
+              observe  = (prototype.observe = {});
+            }
+            observe[property] = observe[property] || n;
+          }
+        }
+      }
+    },
+    canObserveProperty: function(property) {
+      return (observationBlacklist.indexOf(property) < 0);
+    },
+    explodeObservers: function(prototype) {
+      // called before prototype.observe is chained to inherited object
+      var o = prototype.observe;
+      if (o) {
+        var exploded = {};
+        for (var n in o) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            exploded[ni] = o[n];
+          }
+        }
+        prototype.observe = exploded;
+      }
+    },
+    optimizePropertyMaps: function(prototype) {
+      if (prototype.observe) {
+        // construct name list
+        var a = prototype._observeNames = [];
+        for (var n in prototype.observe) {
+          var names = n.split(' ');
+          for (var i=0, ni; ni=names[i]; i++) {
+            a.push(ni);
+          }
+        }
+      }
+      if (prototype.publish) {
+        // construct name list
+        var a = prototype._publishNames = [];
+        for (var n in prototype.publish) {
+          a.push(n);
+        }
+      }
+      if (prototype.computed) {
+        // construct name list
+        var a = prototype._computedNames = [];
+        for (var n in prototype.computed) {
+          a.push(n);
+        }
+      }
+    },
+    publishProperties: function(prototype, base) {
+      // if we have any properties to publish
+      var publish = prototype.publish;
+      if (publish) {
+        // transcribe `publish` entries onto own prototype
+        this.requireProperties(publish, prototype, base);
+        // warn and remove accessor names that are broken on some browsers
+        this.filterInvalidAccessorNames(publish);
+        // construct map of lower-cased property names
+        prototype._publishLC = this.lowerCaseMap(publish);
+      }
+      var computed = prototype.computed;
+      if (computed) {
+        // warn and remove accessor names that are broken on some browsers
+        this.filterInvalidAccessorNames(computed);
+      }
+    },
+    // Publishing/computing a property where the name might conflict with a
+    // browser property is not currently supported to help users of Polymer
+    // avoid browser bugs:
+    //
+    // https://code.google.com/p/chromium/issues/detail?id=43394
+    // https://bugs.webkit.org/show_bug.cgi?id=49739
+    //
+    // We can lift this restriction when those bugs are fixed.
+    filterInvalidAccessorNames: function(propertyNames) {
+      for (var name in propertyNames) {
+        // Check if the name is in our blacklist.
+        if (this.propertyNameBlacklist[name]) {
+          console.warn('Cannot define property "' + name + '" for element "' +
+            this.name + '" because it has the same name as an HTMLElement ' +
+            'property, and not all browsers support overriding that. ' +
+            'Consider giving it a different name.');
+          // Remove the invalid accessor from the list.
+          delete propertyNames[name];
+        }
+      }
+    },
+    //
+    // `name: value` entries in the `publish` object may need to generate 
+    // matching properties on the prototype.
+    //
+    // Values that are objects may have a `reflect` property, which
+    // signals that the value describes property control metadata.
+    // In metadata objects, the prototype default value (if any)
+    // is encoded in the `value` property.
+    //
+    // publish: {
+    //   foo: 5, 
+    //   bar: {value: true, reflect: true},
+    //   zot: {}
+    // }
+    //
+    // `reflect` metadata property controls whether changes to the property
+    // are reflected back to the attribute (default false). 
+    //
+    // A value is stored on the prototype unless it's === `undefined`,
+    // in which case the base chain is checked for a value.
+    // If the basal value is also undefined, `null` is stored on the prototype.
+    //
+    // The reflection data is stored on another prototype object, `reflect`
+    // which also can be specified directly.
+    //
+    // reflect: {
+    //   foo: true
+    // }
+    //
+    requireProperties: function(propertyInfos, prototype, base) {
+      // per-prototype storage for reflected properties
+      prototype.reflect = prototype.reflect || {};
+      // ensure a prototype value for each property
+      // and update the property's reflect to attribute status
+      for (var n in propertyInfos) {
+        var value = propertyInfos[n];
+        // value has metadata if it has a `reflect` property
+        if (value && value.reflect !== undefined) {
+          prototype.reflect[n] = Boolean(value.reflect);
+          value = value.value;
+        }
+        // only set a value if one is specified
+        if (value !== undefined) {
+          prototype[n] = value;
+        }
+      }
+    },
+    lowerCaseMap: function(properties) {
+      var map = {};
+      for (var n in properties) {
+        map[n.toLowerCase()] = n;
+      }
+      return map;
+    },
+    createPropertyAccessor: function(name, ignoreWrites) {
+      var proto = this.prototype;
+
+      var privateName = name + '_';
+      var privateObservable  = name + 'Observable_';
+      proto[privateName] = proto[name];
+
+      Object.defineProperty(proto, name, {
+        get: function() {
+          var observable = this[privateObservable];
+          if (observable)
+            observable.deliver();
+
+          return this[privateName];
+        },
+        set: function(value) {
+          if (ignoreWrites) {
+            return this[privateName];
+          }
+
+          var observable = this[privateObservable];
+          if (observable) {
+            observable.setValue(value);
+            return;
+          }
+
+          var oldValue = this[privateName];
+          this[privateName] = value;
+          this.emitPropertyChangeRecord(name, value, oldValue);
+
+          return value;
+        },
+        configurable: true
+      });
+    },
+    createPropertyAccessors: function(prototype) {
+      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, 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);
+          }
+        }
+      }
+    },
+    // This list contains some property names that people commonly want to use,
+    // but won't work because of Chrome/Safari bugs. It isn't an exhaustive
+    // list. In particular it doesn't contain any property names found on
+    // subtypes of HTMLElement (e.g. name, value). Rather it attempts to catch
+    // some common cases.
+    propertyNameBlacklist: {
+      children: 1,
+      'class': 1,
+      id: 1,
+      hidden: 1,
+      style: 1,
+      title: 1,
+    }
+  };
+
+  // exports
+
+  scope.api.declaration.properties = properties;
+
+})(Polymer);
+
+(function(scope) {
+
+  // magic words
+
+  var ATTRIBUTES_ATTRIBUTE = 'attributes';
+  var ATTRIBUTES_REGEX = /\s|,/;
+
+  // attributes api
+
+  var attributes = {
+    
+    inheritAttributesObjects: function(prototype) {
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject(prototype, 'publishLC');
+      // chain our instance attributes map to the inherited version
+      this.inheritObject(prototype, '_instanceAttributes');
+    },
+
+    publishAttributes: function(prototype, base) {
+      // merge names from 'attributes' attribute into the 'publish' object
+      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
+      if (attributes) {
+        // create a `publish` object if needed.
+        // the `publish` object is only relevant to this prototype, the 
+        // publishing logic in `declaration/properties.js` is responsible for
+        // managing property values on the prototype chain.
+        // TODO(sjmiles): the `publish` object is later chained to it's 
+        //                ancestor object, presumably this is only for 
+        //                reflection or other non-library uses. 
+        var publish = prototype.publish || (prototype.publish = {}); 
+        // names='a b c' or names='a,b,c'
+        var names = attributes.split(ATTRIBUTES_REGEX);
+        // record each name for publishing
+        for (var i=0, l=names.length, n; i<l; i++) {
+          // remove excess ws
+          n = names[i].trim();
+          // looks weird, but causes n to exist on `publish` if it does not;
+          // a more careful test would need expensive `in` operator
+          if (n && publish[n] === undefined) {
+            publish[n] = undefined;
+          }
+        }
+      }
+    },
+
+    // record clonable attributes from <element>
+    accumulateInstanceAttributes: function() {
+      // inherit instance attributes
+      var clonable = this.prototype._instanceAttributes;
+      // merge attributes from element
+      var a$ = this.attributes;
+      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
+        if (this.isInstanceAttribute(a.name)) {
+          clonable[a.name] = a.value;
+        }
+      }
+    },
+
+    isInstanceAttribute: function(name) {
+      return !this.blackList[name] && name.slice(0,3) !== 'on-';
+    },
+
+    // do not clone these attributes onto instances
+    blackList: {
+      name: 1,
+      'extends': 1,
+      constructor: 1,
+      noscript: 1,
+      assetpath: 1,
+      'cache-csstext': 1
+    }
+    
+  };
+
+  // add ATTRIBUTES_ATTRIBUTE to the blacklist
+  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
+
+  // exports
+
+  scope.api.declaration.attributes = attributes;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+  var events = scope.api.declaration.events;
+
+  var syntax = new PolymerExpressions();
+  var prepareBinding = syntax.prepareBinding;
+
+  // Polymer takes a first crack at the binding to see if it's a declarative
+  // event handler.
+  syntax.prepareBinding = function(pathString, name, node) {
+    return events.prepareEventBinding(pathString, name, node) ||
+           prepareBinding.call(syntax, pathString, name, node);
+  };
+
+  // declaration api supporting mdv
+  var mdv = {
+    syntax: syntax,
+    fetchTemplate: function() {
+      return this.querySelector('template');
+    },
+    templateContent: function() {
+      var template = this.fetchTemplate();
+      return template && template.content;
+    },
+    installBindingDelegate: function(template) {
+      if (template) {
+        template.bindingDelegate = this.syntax;
+      }
+    }
+  };
+
+  // exports
+  scope.api.declaration.mdv = mdv;
+
+})(Polymer);
+
+(function(scope) {
+
+  // imports
+  
+  var api = scope.api;
+  var isBase = scope.isBase;
+  var extend = scope.extend;
+
+  var hasShadowDOMPolyfill = window.ShadowDOMPolyfill;
+
+  // prototype api
+
+  var prototype = {
+
+    register: function(name, extendeeName) {
+      // build prototype combining extendee, Polymer base, and named api
+      this.buildPrototype(name, extendeeName);
+      // register our custom element with the platform
+      this.registerPrototype(name, extendeeName);
+      // reference constructor in a global named by 'constructor' attribute
+      this.publishConstructor();
+    },
+
+    buildPrototype: function(name, extendeeName) {
+      // get our custom prototype (before chaining)
+      var extension = scope.getRegisteredPrototype(name);
+      // get basal prototype
+      var base = this.generateBasePrototype(extendeeName);
+      // implement declarative features
+      this.desugarBeforeChaining(extension, base);
+      // join prototypes
+      this.prototype = this.chainPrototypes(extension, base);
+      // more declarative features
+      this.desugarAfterChaining(name, extendeeName);
+    },
+
+    desugarBeforeChaining: function(prototype, base) {
+      // back reference declaration element
+      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
+      prototype.element = this;
+      // transcribe `attributes` declarations onto own prototype's `publish`
+      this.publishAttributes(prototype, base);
+      // `publish` properties to the prototype and to attribute watch
+      this.publishProperties(prototype, base);
+      // infer observers for `observe` list based on method names
+      this.inferObservers(prototype);
+      // desugar compound observer syntax, e.g. 'a b c' 
+      this.explodeObservers(prototype);
+    },
+
+    chainPrototypes: function(prototype, base) {
+      // chain various meta-data objects to inherited versions
+      this.inheritMetaData(prototype, base);
+      // chain custom api to inherited
+      var chained = this.chainObject(prototype, base);
+      // x-platform fixup
+      ensurePrototypeTraversal(chained);
+      return chained;
+    },
+
+    inheritMetaData: function(prototype, base) {
+      // chain observe object to inherited
+      this.inheritObject('observe', prototype, base);
+      // chain publish object to inherited
+      this.inheritObject('publish', prototype, base);
+      // chain reflect object to inherited
+      this.inheritObject('reflect', prototype, base);
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject('_publishLC', prototype, base);
+      // chain our instance attributes map to the inherited version
+      this.inheritObject('_instanceAttributes', prototype, base);
+      // chain our event delegates map to the inherited version
+      this.inheritObject('eventDelegates', prototype, base);
+    },
+
+    // implement various declarative features
+    desugarAfterChaining: function(name, extendee) {
+      // build side-chained lists to optimize iterations
+      this.optimizePropertyMaps(this.prototype);
+      this.createPropertyAccessors(this.prototype);
+      // install mdv delegate on template
+      this.installBindingDelegate(this.fetchTemplate());
+      // install external stylesheets as if they are inline
+      this.installSheets();
+      // adjust any paths in dom from imports
+      this.resolveElementPaths(this);
+      // compile list of attributes to copy to instances
+      this.accumulateInstanceAttributes();
+      // parse on-* delegates declared on `this` element
+      this.parseHostEvents();
+      //
+      // install a helper method this.resolvePath to aid in 
+      // setting resource urls. e.g.
+      // this.$.image.src = this.resolvePath('images/foo.png')
+      this.addResolvePathApi();
+      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
+      if (hasShadowDOMPolyfill) {
+        WebComponents.ShadowCSS.shimStyling(this.templateContent(), name,
+          extendee);
+      }
+      // allow custom element access to the declarative context
+      if (this.prototype.registerCallback) {
+        this.prototype.registerCallback(this);
+      }
+    },
+
+    // if a named constructor is requested in element, map a reference
+    // to the constructor to the given symbol
+    publishConstructor: function() {
+      var symbol = this.getAttribute('constructor');
+      if (symbol) {
+        window[symbol] = this.ctor;
+      }
+    },
+
+    // build prototype combining extendee, Polymer base, and named api
+    generateBasePrototype: function(extnds) {
+      var prototype = this.findBasePrototype(extnds);
+      if (!prototype) {
+        // create a prototype based on tag-name extension
+        var prototype = HTMLElement.getPrototypeForTag(extnds);
+        // insert base api in inheritance chain (if needed)
+        prototype = this.ensureBaseApi(prototype);
+        // memoize this base
+        memoizedBases[extnds] = prototype;
+      }
+      return prototype;
+    },
+
+    findBasePrototype: function(name) {
+      return memoizedBases[name];
+    },
+
+    // install Polymer instance api into prototype chain, as needed 
+    ensureBaseApi: function(prototype) {
+      if (prototype.PolymerBase) {
+        return prototype;
+      }
+      var extended = Object.create(prototype);
+      // we need a unique copy of base api for each base prototype
+      // therefore we 'extend' here instead of simply chaining
+      api.publish(api.instance, extended);
+      // TODO(sjmiles): sharing methods across prototype chains is
+      // not supported by 'super' implementation which optimizes
+      // by memoizing prototype relationships.
+      // Probably we should have a version of 'extend' that is 
+      // share-aware: it could study the text of each function,
+      // look for usage of 'super', and wrap those functions in
+      // closures.
+      // As of now, there is only one problematic method, so 
+      // we just patch it manually.
+      // To avoid re-entrancy problems, the special super method
+      // installed is called `mixinSuper` and the mixin method
+      // must use this method instead of the default `super`.
+      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
+      // return buffed-up prototype
+      return extended;
+    },
+
+    mixinMethod: function(extended, prototype, api, name) {
+      var $super = function(args) {
+        return prototype[name].apply(this, args);
+      };
+      extended[name] = function() {
+        this.mixinSuper = $super;
+        return api[name].apply(this, arguments);
+      }
+    },
+
+    // ensure prototype[name] inherits from a prototype.prototype[name]
+    inheritObject: function(name, prototype, base) {
+      // require an object
+      var source = prototype[name] || {};
+      // chain inherited properties onto a new object
+      prototype[name] = this.chainObject(source, base[name]);
+    },
+
+    // register 'prototype' to custom element 'name', store constructor 
+    registerPrototype: function(name, extendee) { 
+      var info = {
+        prototype: this.prototype
+      }
+      // native element must be specified in extends
+      var typeExtension = this.findTypeExtension(extendee);
+      if (typeExtension) {
+        info.extends = typeExtension;
+      }
+      // register the prototype with HTMLElement for name lookup
+      HTMLElement.register(name, this.prototype);
+      // register the custom type
+      this.ctor = document.registerElement(name, info);
+    },
+
+    findTypeExtension: function(name) {
+      if (name && name.indexOf('-') < 0) {
+        return name;
+      } else {
+        var p = this.findBasePrototype(name);
+        if (p.element) {
+          return this.findTypeExtension(p.element.extends);
+        }
+      }
+    }
+
+  };
+
+  // memoize base prototypes
+  var memoizedBases = {};
+
+  // implementation of 'chainObject' depends on support for __proto__
+  if (Object.__proto__) {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        object.__proto__ = inherited;
+      }
+      return object;
+    }
+  } else {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        var chained = Object.create(inherited);
+        object = extend(chained, object);
+      }
+      return object;
+    }
+  }
+
+  // On platforms that do not support __proto__ (versions of IE), the prototype
+  // chain of a custom element is simulated via installation of __proto__.
+  // Although custom elements manages this, we install it here so it's
+  // available during desugaring.
+  function ensurePrototypeTraversal(prototype) {
+    if (!Object.__proto__) {
+      var ancestor = Object.getPrototypeOf(prototype);
+      prototype.__proto__ = ancestor;
+      if (isBase(ancestor)) {
+        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
+      }
+    }
+  }
+
+  // exports
+
+  api.declaration.prototype = prototype;
+
+})(Polymer);
+
+(function(scope) {
+
+  /*
+
+    Elements are added to a registration queue so that they register in 
+    the proper order at the appropriate time. We do this for a few reasons:
+
+    * to enable elements to load resources (like stylesheets) 
+    asynchronously. We need to do this until the platform provides an efficient
+    alternative. One issue is that remote @import stylesheets are 
+    re-fetched whenever stamped into a shadowRoot.
+
+    * to ensure elements loaded 'at the same time' (e.g. via some set of
+    imports) are registered as a batch. This allows elements to be enured from
+    upgrade ordering as long as they query the dom tree 1 task after
+    upgrade (aka domReady). This is a performance tradeoff. On the one hand,
+    elements that could register while imports are loading are prevented from 
+    doing so. On the other, grouping upgrades into a single task means less
+    incremental work (for example style recalcs),  Also, we can ensure the 
+    document is in a known state at the single quantum of time when 
+    elements upgrade.
+
+  */
+  var queue = {
+
+    // tell the queue to wait for an element to be ready
+    wait: function(element) {
+      if (!element.__queue) {
+        element.__queue = {};
+        elements.push(element);
+      }
+    },
+
+    // enqueue an element to the next spot in the queue.
+    enqueue: function(element, check, go) {
+      var shouldAdd = element.__queue && !element.__queue.check;
+      if (shouldAdd) {
+        queueForElement(element).push(element);
+        element.__queue.check = check;
+        element.__queue.go = go;
+      }
+      return (this.indexOf(element) !== 0);
+    },
+
+    indexOf: function(element) {
+      var i = queueForElement(element).indexOf(element);
+      if (i >= 0 && document.contains(element)) {
+        i += (HTMLImports.useNative || HTMLImports.ready) ? 
+          importQueue.length : 1e9;
+      }
+      return i;  
+    },
+
+    // tell the queue an element is ready to be registered
+    go: function(element) {
+      var readied = this.remove(element);
+      if (readied) {
+        element.__queue.flushable = true;
+        this.addToFlushQueue(readied);
+        this.check();
+      }
+    },
+
+    remove: function(element) {
+      var i = this.indexOf(element);
+      if (i !== 0) {
+        //console.warn('queue order wrong', i);
+        return;
+      }
+      return queueForElement(element).shift();
+    },
+
+    check: function() {
+      // next
+      var element = this.nextElement();
+      if (element) {
+        element.__queue.check.call(element);
+      }
+      if (this.canReady()) {
+        this.ready();
+        return true;
+      }
+    },
+
+    nextElement: function() {
+      return nextQueued();
+    },
+
+    canReady: function() {
+      return !this.waitToReady && this.isEmpty();
+    },
+
+    isEmpty: function() {
+      for (var i=0, l=elements.length, e; (i<l) && 
+          (e=elements[i]); i++) {
+        if (e.__queue && !e.__queue.flushable) {
+          return;
+        }
+      }
+      return true;
+    },
+
+    addToFlushQueue: function(element) {
+      flushQueue.push(element);  
+    },
+
+    flush: function() {
+      // prevent re-entrance
+      if (this.flushing) {
+        return;
+      }
+      this.flushing = true;
+      var element;
+      while (flushQueue.length) {
+        element = flushQueue.shift();
+        element.__queue.go.call(element);
+        element.__queue = null;
+      }
+      this.flushing = false;
+    },
+
+    ready: function() {
+      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
+      // while registering. This way we avoid having to upgrade each document
+      // piecemeal per registration and can instead register all elements
+      // and upgrade once in a batch. Without this optimization, upgrade time
+      // degrades significantly when SD polyfill is used. This is mainly because
+      // querying the document tree for elements is slow under the SD polyfill.
+      var polyfillWasReady = CustomElements.ready;
+      CustomElements.ready = false;
+      this.flush();
+      if (!CustomElements.useNative) {
+        CustomElements.upgradeDocumentTree(document);
+      }
+      CustomElements.ready = polyfillWasReady;
+      Polymer.flush();
+      requestAnimationFrame(this.flushReadyCallbacks);
+    },
+
+    addReadyCallback: function(callback) {
+      if (callback) {
+        readyCallbacks.push(callback);
+      }
+    },
+
+    flushReadyCallbacks: function() {
+      if (readyCallbacks) {
+        var fn;
+        while (readyCallbacks.length) {
+          fn = readyCallbacks.shift();
+          fn();
+        }
+      }
+    },
+  
+    /**
+    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
+
+  };
+
+  var elements = [];
+  var flushQueue = [];
+  var importQueue = [];
+  var mainQueue = [];
+  var readyCallbacks = [];
+
+  function queueForElement(element) {
+    return document.contains(element) ? mainQueue : importQueue;
+  }
+
+  function nextQueued() {
+    return importQueue.length ? importQueue[0] : mainQueue[0];
+  }
+
+  function whenReady(callback) {
+    queue.waitToReady = true;
+    Polymer.endOfMicrotask(function() {
+      HTMLImports.whenReady(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);
+
+(function(scope) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+  var queue = scope.queue;
+  var whenReady = scope.whenReady;
+  var getRegisteredPrototype = scope.getRegisteredPrototype;
+  var waitingForPrototype = scope.waitingForPrototype;
+
+  // declarative implementation: <polymer-element>
+
+  var prototype = extend(Object.create(HTMLElement.prototype), {
+
+    createdCallback: function() {
+      if (this.getAttribute('name')) {
+        this.init();
+      }
+    },
+
+    init: function() {
+      // fetch declared values
+      this.name = this.getAttribute('name');
+      this.extends = this.getAttribute('extends');
+      queue.wait(this);
+      // initiate any async resource fetches
+      this.loadResources();
+      // register when all constraints are met
+      this.registerWhenReady();
+    },
+
+    // TODO(sorvell): we currently queue in the order the prototypes are 
+    // registered, but we should queue in the order that polymer-elements
+    // are registered. We are currently blocked from doing this based on 
+    // crbug.com/395686.
+    registerWhenReady: function() {
+     if (this.registered
+       || this.waitingForPrototype(this.name)
+       || this.waitingForQueue()
+       || this.waitingForResources()) {
+          return;
+      }
+      queue.go(this);
+    },
+
+    _register: function() {
+      //console.log('registering', this.name);
+      // warn if extending from a custom element not registered via Polymer
+      if (isCustomTag(this.extends) && !isRegistered(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 = true;
+    },
+
+    waitingForPrototype: function(name) {
+      if (!getRegisteredPrototype(name)) {
+        // then wait for a prototype
+        waitingForPrototype(name, this);
+        // emulate script if user is not supplying one
+        this.handleNoScript(name);
+        // prototype not ready yet
+        return true;
+      }
+    },
+
+    handleNoScript: function(name) {
+      // if explicitly marked as 'noscript'
+      if (this.hasAttribute('noscript') && !this.noscript) {
+        this.noscript = true;
+        // imperative element registration
+        Polymer(name);
+      }
+    },
+
+    waitingForResources: function() {
+      return this._needsResources;
+    },
+
+    // NOTE: Elements must be queued in proper order for inheritance/composition
+    // dependency resolution. Previously this was enforced for inheritance,
+    // and by rule for composition. It's now entirely by rule.
+    waitingForQueue: function() {
+      return queue.enqueue(this, this.registerWhenReady, this._register);
+    },
+
+    loadResources: function() {
+      this._needsResources = true;
+      this.loadStyles(function() {
+        this._needsResources = false;
+        this.registerWhenReady();
+      }.bind(this));
+    }
+
+  });
+
+  // semi-pluggable APIs 
+
+  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
+  // the various plugins are allowed to depend on each other directly)
+  api.publish(api.declaration, prototype);
+
+  // utility and bookkeeping
+
+  function isRegistered(name) {
+    return Boolean(HTMLElement.getPrototypeForTag(name));
+  }
+
+  function isCustomTag(name) {
+    return (name && name.indexOf('-') >= 0);
+  }
+
+  // boot tasks
+
+  whenReady(function() {
+    document.body.removeAttribute('unresolved');
+    document.dispatchEvent(
+      new CustomEvent('polymer-ready', {bubbles: true})
+    );
+  });
+
+  // register polymer-element with document
+
+  document.registerElement('polymer-element', {prototype: prototype});
+
+})(Polymer);
+
+(function(scope) {
+
+/**
+ * @class Polymer
+ */
+
+var whenReady = scope.whenReady;
+
+/**
+ * Loads the set of HTMLImports contained in `node`. Notifies when all
+ * the imports have loaded by calling the `callback` function argument.
+ * This method can be used to lazily load imports. For example, given a 
+ * template:
+ *     
+ *     <template>
+ *       <link rel="import" href="my-import1.html">
+ *       <link rel="import" href="my-import2.html">
+ *     </template>
+ *
+ *     Polymer.importElements(template.content, function() {
+ *       console.log('imports lazily loaded'); 
+ *     });
+ * 
+ * @method importElements
+ * @param {Node} node Node containing the HTMLImports to load.
+ * @param {Function} callback Callback called when all imports have loaded.
+ */
+function importElements(node, callback) {
+  if (node) {
+    document.head.appendChild(node);
+    whenReady(callback);
+  } else if (callback) {
+    callback();
+  }
+}
+
+/**
+ * Loads an HTMLImport for each url specified in the `urls` array.
+ * Notifies when all the imports have loaded by calling the `callback` 
+ * function argument. This method can be used to lazily load imports. 
+ * For example,
+ *
+ *     Polymer.import(['my-import1.html', 'my-import2.html'], function() {
+ *       console.log('imports lazily loaded'); 
+ *     });
+ * 
+ * @method import
+ * @param {Array} urls Array of urls to load as HTMLImports.
+ * @param {Function} callback Callback called when all imports have loaded.
+ */
+function _import(urls, callback) {
+  if (urls && urls.length) {
+      var frag = document.createDocumentFragment();
+      for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
+        link = document.createElement('link');
+        link.rel = 'import';
+        link.href = url;
+        frag.appendChild(link);
+      }
+      importElements(frag, callback);
+  } else if (callback) {
+    callback();
+  }
+}
+
+// exports
+scope.import = _import;
+scope.importElements = importElements;
+
+})(Polymer);
+
+/**
+ * The `auto-binding` element extends the template element. It provides a quick 
+ * and easy way to do data binding without the need to setup a model. 
+ * The `auto-binding` element itself serves as the model and controller for the 
+ * elements it contains. Both data and event handlers can be bound. 
+ *
+ * The `auto-binding` element acts just like a template that is bound to 
+ * a model. It stamps its content in the dom adjacent to itself. When the 
+ * content is stamped, the `template-bound` event is fired.
+ *
+ * Example:
+ *
+ *     <template is="auto-binding">
+ *       <div>Say something: <input value="{{value}}"></div>
+ *       <div>You said: {{value}}</div>
+ *       <button on-tap="{{buttonTap}}">Tap me!</button>
+ *     </template>
+ *     <script>
+ *       var template = document.querySelector('template');
+ *       template.value = 'something';
+ *       template.buttonTap = function() {
+ *         console.log('tap!');
+ *       };
+ *     </script>
+ *
+ * @module Polymer
+ * @status stable
+*/
+
+(function() {
+
+  var element = document.createElement('polymer-element');
+  element.setAttribute('name', 'auto-binding');
+  element.setAttribute('extends', 'template');
+  element.init();
+
+  Polymer('auto-binding', {
+
+    createdCallback: function() {
+      this.syntax = this.bindingDelegate = this.makeSyntax();
+      // delay stamping until polymer-ready so that auto-binding is not
+      // required to load last.
+      Polymer.whenPolymerReady(function() {
+        this.model = this;
+        this.setAttribute('bind', '');
+        // we don't bother with an explicit signal here, we could ust a MO
+        // if necessary
+        this.async(function() {
+          // note: this will marshall *all* the elements in the parentNode
+          // rather than just stamped ones. We'd need to use createInstance
+          // to fix this or something else fancier.
+          this.marshalNodeReferences(this.parentNode);
+          // template stamping is asynchronous so stamping isn't complete
+          // by polymer-ready; fire an event so users can use stamped elements
+          this.fire('template-bound');
+        });
+      }.bind(this));
+    },
+
+    makeSyntax: function() {
+      var events = Object.create(Polymer.api.declaration.events);
+      var self = this;
+      events.findController = function() { return self.model; };
+
+      var syntax = new PolymerExpressions();
+      var prepareBinding = syntax.prepareBinding;  
+      syntax.prepareBinding = function(pathString, name, node) {
+        return events.prepareEventBinding(pathString, name, node) ||
+               prepareBinding.call(syntax, pathString, name, node);
+      };
+      return syntax;
+    }
+
+  });
+
+})();
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.min.js b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.min.js
new file mode 100644
index 0000000..d846037
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/polymer/src/js/polymer/polymer.min.js
@@ -0,0 +1,14 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+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&&b)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){var e=c;if("touchstart"===d){var f=c.changedTouches[0];e={target:c.target,clientX:f.clientX,clientY:f.clientY,path:c.path}}for(var g,h=c.path||a.targetFinding.path(e),i=0;i<h.length;i++)g=h[i],this.addGestureDependency(g,b)}else this.addGestureDependency(c.currentTarget,b);if(!c._handledByPG){var j=this.eventMap&&this.eventMap[d];j&&j(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++)if(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=0,g=!1;try{g=1===new MouseEvent("test",{buttons:1}).buttons}catch(h){}var i={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);if(c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",!g){var d=a.type,h=e[a.which]||0;"mousedown"===d?f|=h:"mouseup"===d&&(f&=~h),c.buttons=f}return c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=(c.has(this.POINTER_ID),this.prepareEvent(d));e.target=a.findTarget(d),c.set(this.POINTER_ID,e.target),b.down(e)}},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===(g?e.buttons:e.which)?(g||(f=e.buttons=0),b.cancel(e),this.cleanupMouse(e.buttons)):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(e.buttons)}},cleanupMouse:function(a){0===a&&c.delete(this.POINTER_ID)}};a.mouseEvents=i}(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=25,f=200,g=20,h=!1,i={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.firstTarget=a.target,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,f)},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(h)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>=g&&(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)}}},j=Event.prototype.stopImmediatePropagation||Event.prototype.stopPropagation;document.addEventListener("click",function(b){var c=b.clientX,d=b.clientY,f=function(a){var b=Math.abs(c-a.x),f=Math.abs(d-a.y);return e>=b&&e>=f},g=a.mouseEvents.lastTouches.some(f),h=a.targetFinding.path(b);if(g){for(var k=0;k<h.length;k++)if(h[k]===i.firstTarget)return;b.preventDefault(),j.call(b)}},!0),a.touchEvents=i}(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){var c=!0;return"mouse"===a.pointerType&&(c=1^a.buttons&&1&b.buttons),c&&!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){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e=180/Math.PI,f={events:["down","up","move","cancel"],exposes:["pinch","rotate"],defaultActions:{pinch:"none",rotate:"none"},reference:{},down:function(b){if(d.set(b.pointerId,b),2==d.pointers()){var c=this.calcChord(),e=this.calcAngle(c);this.reference={angle:e,diameter:c.diameter,target:a.targetFinding.LCA(c.a.target,c.b.target)}}},up:function(a){var b=d.get(a.pointerId);b&&d.delete(a.pointerId)},move:function(a){d.has(a.pointerId)&&(d.set(a.pointerId,a),d.pointers()>1&&this.calcPinchRotate())},cancel:function(a){this.up(a)},firePinch:function(a,b){var d=a/this.reference.diameter,e=c.makeGestureEvent("pinch",{bubbles:!0,cancelable:!0,scale:d,centerX:b.center.x,centerY:b.center.y,_source:"pinch"});this.reference.target.dispatchEvent(e)},fireRotate:function(a,b){var d=Math.round((a-this.reference.angle)%360),e=c.makeGestureEvent("rotate",{bubbles:!0,cancelable:!0,angle:d,centerX:b.center.x,centerY:b.center.y,_source:"pinch"});this.reference.target.dispatchEvent(e)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.firePinch(b,a),c!=this.reference.angle&&this.fireRotate(c,a)},calcChord:function(){var a=[];d.forEach(function(b){a.push(b)});for(var b,c,e,f=0,g={a:a[0],b:a[1]},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),c=Math.abs(i.clientY-k.clientY),e=b+c,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,c=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:c},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*e)%360}};b.registerGesture("pinch",f)}(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&&" ᠎              ".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.5.1"},"function"==typeof window.Polymer&&(Polymer={}),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.WebComponents||(window.WebComponents||(WebComponents={flush:function(){},flags:{log:{}}},Platform=WebComponents,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}),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===r}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===r)&&(b.removeEventListener(s,e),d(a,b))};b.addEventListener(s,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",l=Boolean(k in document.createElement("link")),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=/Trident/.test(navigator.userAgent),r=q?"complete":"interactive",s="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.IMPORT_LINK_TYPE=k,a.useNative=l,a.rootDocument=o,a.whenReady=b,a.isIE=q}(HTMLImports),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={objects:h,get rootObject(){return d},set rootObject(a){d=a,e={}},open:function(b){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),$===this&&($=null)}}};return i}function w(a,b){return $&&$.rootObject===b||($=db.pop()||v(),$.rootObject=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[c])}},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(){return function(a){return Promise.resolve().then(a)}}():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,tb=a;"undefined"!=typeof exports&&("undefined"!=typeof module&&module.exports&&(tb=exports=module.exports),tb=exports),tb.Observer=x,tb.Observer.runEOM_=bb,tb.Observer.observerSentinel_=mb,tb.Observer.hasObjectObserve=P,tb.ArrayObserver=B,tb.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},tb.ArraySplice=I,tb.ObjectObserver=A,tb.PathObserver=C,tb.CompoundObserver=D,tb.Path=l,tb.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){"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"))},get origin(){var a;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return a=this.host,a?this._scheme+"://"+a:""}};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(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.endOfMicrotask=b}(Polymer),function(a){function b(){g||(g=!0,c(function(){g=!1,d.data&&console.group("flush"),Platform.performMicrotaskCheckpoint(),d.data&&console.groupEnd()}))}var c=a.endOfMicrotask,d=window.WebComponents?WebComponents.flags.log:{},e=document.createElement("style");e.textContent="template {display: none !important;} /* injected by platform.js */";var f=document.querySelector("head");f.insertBefore(e,f.firstChild);var g;if(Observer.hasObjectObserve)b=function(){};else{var h=125;window.addEventListener("WebComponentsReady",function(){b();var c=function(){"hidden"===document.visibilityState?a.flushPoll&&clearInterval(a.flushPoll):a.flushPoll=setInterval(b,h)};"string"==typeof document.visibilityState&&document.addEventListener("visibilitychange",c),c()})}if(window.CustomElements&&!CustomElements.useNative){var i=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=i.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b,Platform.flush=b}(window.Polymer),function(a){function b(a){var b=new URL(a.ownerDocument.baseURI);return b.search="",b.hash="",b}function c(a,b,c,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=d(b,h,c),e+"'"+h+"'"+g})}function d(a,b,c){if(b&&"/"===b[0])return b;var d=new URL(b,a);return c?d.href:e(d.href)}function e(a){var c=b(document.documentElement),d=new URL(a,c);return d.host===c.host&&d.port===c.port&&d.protocol===c.protocol?f(c,d):a}function f(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("..");var i=b.href.slice(-1)===m?m:b.hash;return f.join("/")+b.search+i}var g={resolveDom:function(a,c){c=c||b(a),this.resolveAttributes(a,c),this.resolveStyles(a,c);var d=a.querySelectorAll("template");if(d)for(var e,f=0,g=d.length;g>f&&(e=d[f]);f++)e.content&&this.resolveDom(e.content,c)},resolveTemplate:function(a){this.resolveDom(a.content,b(a))},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,c){c=c||b(a),a.textContent=this.resolveCssText(a.textContent,c)},resolveCssText:function(a,b,d){return a=c(a,b,d,h),c(a,b,d,i)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(k);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,e){e=e||b(a),j.forEach(function(b){var f,g=a.attributes[b],i=g&&g.value;i&&i.search(l)<0&&(f="style"===b?c(i,e,!1,h):d(e,i),g.value=f)})}},h=/(url\()([^)]*)(\))/g,i=/(@import[\s]+(?!url\())([^;]*)(;)/g,j=["href","src","action","style","url"],k="["+j.join("],[")+"]",l="{{.*}}",m="#";a.urlResolver=g}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Polymer.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){Polymer.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.WebComponents?WebComponents.flags.log:{},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(),Polymer.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.WebComponents?WebComponents.flags.log:{},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]))}},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},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._objectNotifier;f||(f=this._objectNotifier=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},_propertyChanged:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},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)},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)}}},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.WebComponents?WebComponents.flags.log:{},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)},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},bindFinished:function(){this.makeElementReady()},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())},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},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},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=WebComponents.ShadowCSS.makeScopeSelector(c,d);return WebComponents.ShadowCSS.shimCssText(a,e)}var d=(window.WebComponents?WebComponents.flags.log:{},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),WebComponents.consumeDeclarations&&WebComponents.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.WebComponents?WebComponents.flags.log:{},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.WebComponents?WebComponents.flags.log:{},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=["attribute"],c={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(b=d.slice(0,-7),this.canObserveProperty(b)&&(c||(c=a.observe={}),c[b]=c[b]||d))},canObserveProperty:function(a){return b.indexOf(a)<0},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),this.filterInvalidAccessorNames(c),a._publishLC=this.lowerCaseMap(c));var d=a.computed;d&&this.filterInvalidAccessorNames(d)},filterInvalidAccessorNames:function(a){for(var b in a)this.propertyNameBlacklist[b]&&(console.warn('Cannot define property "'+b+'" for element "'+this.name+'" because it has the same name as an HTMLElement property, and not all browsers support overriding that. Consider giving it a different name.'),delete a[b])},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)},propertyNameBlacklist:{children:1,"class":1,id:1,hidden:1,style:1,title:1}};a.api.declaration.properties=c}(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&&WebComponents.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,Polymer.endOfMicrotask(function(){HTMLImports.whenReady(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,Polymer.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.whenReady;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}})}();
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/flush.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/flush.js
new file mode 100644
index 0000000..61da3a8
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/flush.js
@@ -0,0 +1,97 @@
+/*
+ * 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) {
+
+/**
+ * @class Polymer
+ */
+
+// imports
+var endOfMicrotask = scope.endOfMicrotask;
+
+// logging
+var log = window.WebComponents ? WebComponents.flags.log : {};
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+
+/**
+ * Force any pending data changes to be observed before 
+ * the next task. Data changes are processed asynchronously but are guaranteed
+ * to be processed, for example, before paintin. This method should rarely be 
+ * needed. It does nothing when Object.observe is available; 
+ * when Object.observe is not available, Polymer automatically flushes data 
+ * changes approximately every 1/10 second. 
+ * Therefore, `flush` should only be used when a data mutation should be 
+ * observed sooner than this.
+ * 
+ * @method flush
+ */
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    endOfMicrotask(function() {
+      flushing = false;
+      log.data && console.group('flush');
+      Platform.performMicrotaskCheckpoint();
+      log.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    // watch document visiblity to toggle dirty-checking
+    var visibilityHandler = function() {
+      // only flush if the page is visibile
+      if (document.visibilityState === 'hidden') {
+        if (scope.flushPoll) {
+          clearInterval(scope.flushPoll);
+        }
+      } else {
+        scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+      }
+    };
+    if (typeof document.visibilityState === 'string') {
+      document.addEventListener('visibilitychange', visibilityHandler);
+    }
+    visibilityHandler();
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  };
+}
+
+// exports
+scope.flush = flush;
+// bc
+Platform.flush = flush;
+
+})(window.Polymer);
+
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js
index 827f2fe..ad954e3 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/microtask.js
@@ -29,8 +29,9 @@
   ;
 
 // exports
-
 scope.endOfMicrotask = endOfMicrotask;
+// bc 
+Platform.endOfMicrotask = endOfMicrotask;
 
-})(Platform);
+})(Polymer);
 
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js
index 240e25d..6cd2ccb 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/template_binding/js/observe.js
@@ -1,16 +1,11 @@
-// 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';
@@ -70,7 +65,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;
     }
 
@@ -85,7 +80,7 @@
   var hasEval = detectEval();
 
   function isIndex(s) {
-    return +s === s >>> 0;
+    return +s === s >>> 0 && s !== '';
   }
 
   function toNumber(s) {
@@ -395,7 +390,7 @@
           obj = obj[this[i - 1]];
         if (!isObject(obj))
           return;
-        observe(obj, this[0]);
+        observe(obj, this[i]);
       }
     },
 
@@ -516,21 +511,9 @@
   }
 
   var runEOM = hasObserve ? (function(){
-    var eomObj = { pingPong: true };
-    var eomRunScheduled = false;
-
-    Object.observe(eomObj, function() {
-      runEOMTasks();
-      eomRunScheduled = false;
-    });
-
     return function(fn) {
-      eomTasks.push(fn);
-      if (!eomRunScheduled) {
-        eomRunScheduled = true;
-        eomObj.pingPong = !eomObj.pingPong;
-      }
-    };
+      return Promise.resolve().then(fn);
+    }
   })() :
   (function() {
     return function(fn) {
@@ -668,14 +651,13 @@
     }
 
     var record = {
-      object: undefined,
       objects: objects,
+      get rootObject() { return rootObj; },
+      set rootObject(value) {
+        rootObj = value;
+        rootObjProps = {};
+      },
       open: function(obs, object) {
-        if (!rootObj) {
-          rootObj = object;
-          rootObjProps = {};
-        }
-
         observers.push(obs);
         observerCount++;
         obs.iterateObjects_(observe);
@@ -696,7 +678,9 @@
         rootObj = undefined;
         rootObjProps = undefined;
         observedSetCache.push(this);
-      }
+        if (lastObservedSet === this)
+          lastObservedSet = null;
+      },
     };
 
     return record;
@@ -705,9 +689,9 @@
   var lastObservedSet;
 
   function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
+    if (!lastObservedSet || lastObservedSet.rootObject !== obj) {
       lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
+      lastObservedSet.rootObject = obj;
     }
     lastObservedSet.open(observer, obj);
     return lastObservedSet;
@@ -799,26 +783,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;
 
@@ -1709,19 +1679,33 @@
     return splices;
   }
 
-  global.Observer = Observer;
-  global.Observer.runEOM_ = runEOM;
-  global.Observer.observerSentinel_ = observerSentinel; // for testing.
-  global.Observer.hasObjectObserve = hasObserve;
-  global.ArrayObserver = ArrayObserver;
-  global.ArrayObserver.calculateSplices = function(current, previous) {
+  // Export the observe-js object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, export as a global object.
+
+  var expose = global;
+
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      expose = exports = module.exports;
+    }
+    expose = exports;
+  } 
+
+  expose.Observer = Observer;
+  expose.Observer.runEOM_ = runEOM;
+  expose.Observer.observerSentinel_ = observerSentinel; // for testing.
+  expose.Observer.hasObjectObserve = hasObserve;
+  expose.ArrayObserver = ArrayObserver;
+  expose.ArrayObserver.calculateSplices = function(current, previous) {
     return arraySplice.calculateSplices(current, previous);
   };
 
-  global.ArraySplice = ArraySplice;
-  global.ObjectObserver = ObjectObserver;
-  global.PathObserver = PathObserver;
-  global.CompoundObserver = CompoundObserver;
-  global.Path = Path;
-  global.ObserverTransform = ObserverTransform;
+  expose.ArraySplice = ArraySplice;
+  expose.ObjectObserver = ObjectObserver;
+  expose.PathObserver = PathObserver;
+  expose.CompoundObserver = CompoundObserver;
+  expose.Path = Path;
+  expose.ObserverTransform = ObserverTransform;
+  
 })(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
index 2625367..d640c60 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/build.log
@@ -1,33 +1,47 @@
 BUILD LOG
 ---------
-Build Time: 2014-09-22T10:39:00
+Build Time: 2014-10-07T18:03:14
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.29
-chai: 1.9.1
-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
-karma: 0.12.22
+nodejs: v0.10.21
+chai: 1.9.0
+grunt: 0.4.2
+grunt-audit: 0.0.2
+grunt-concat-sourcemap: 0.4.1
+grunt-contrib-concat: 0.3.0
+grunt-contrib-uglify: 0.3.2
+grunt-contrib-yuidoc: 0.5.1
+grunt-karma: 0.6.2
+karma: 0.10.9
+karma-chrome-launcher: 0.1.2
+karma-coffee-preprocessor: 0.1.3
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
-karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.9
+karma-html2js-preprocessor: 0.1.0
+karma-ie-launcher: 0.1.1
+karma-jasmine: 0.1.5
+karma-mocha: 0.1.1
+karma-phantomjs-launcher: 0.1.2
+karma-requirejs: 0.2.1
 karma-safari-launcher: 0.1.1
-mocha: 1.21.4
+karma-script-launcher: 0.1.0
+mocha: 1.17.1
+requirejs: 2.1.11
 
 REPO REVISIONS
 ==============
-CustomElements: 85981b0986799744f452bd71ee6170f9d05851ac
-HTMLImports: 77efd89e04ae63a3ee7c88cb7e1d2784cf60dcb1
-ShadowDOM: bb82f0b0d361e90ca5efb1c59dd44c976ffeffb4
-URL: 35e0e6aaab5979d277afa4822a2776a7fb7562ba
-platform-dev: d214582dd9537aa4cf0d6034d33c071be2970a66
+WeakMap: 56eebff250e6cf82dfd767b7703599e047d8b10f
+observe-js: fa70c37099026225876f7c7a26bdee7c48129f1c
+
+ShadowDOM: c524de1304cc5a8863326ceeedb325cda43cd42f
+  + cherry pick pull request #515
+  (local hash: 14a48768d21603c7fc54dcef392b48dce0baa33f)
+URL: cf5d82e444d2a029834365a8b9d185fd792227f0
+MutationObservers: b1039ace292dec90b246317db28ff91d653375e7
+HTMLImports: 6dea2dd969dc4dfb594ae33d4b072130c4890da5
+CustomElements: 321f5428f0c0486d45dd6b384aea9d07021e431d
 
 BUILD HASHES
 ============
-build/platform.js: fe9dc71d22c46bb23f01014e77cdda430227b114
\ No newline at end of file
+build/platform.js: 5b8a1707ff61149f8d491be777e197aeaae5da41
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
index 7ce882c..3f712ef 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/dart_support.js
@@ -66,123 +66,3 @@
     }
   });
 })();
-
-// Updates document.registerElement so Dart can see when Javascript custom
-// elements are created, and wrap them to provide a Dart friendly API.
-(function (doc) {
-  var upgraders = {};       // upgrader associated with a custom-tag.
-  var unpatchableTags = {}; // set of custom-tags that can't be patched.
-  var pendingElements = {}; // will upgrade when/if an upgrader is installed.
-  var upgradeOldElements = true;
-
-  var originalRegisterElement = doc.registerElement;
-  if (!originalRegisterElement) {
-    throw new Error('document.registerElement is not present.');
-  }
-
-  function reportError(name) {
-    console.error("Couldn't patch prototype to notify Dart when " + name +
-        " elements are created. This can be fixed by making the " +
-        "createdCallback in " + name + " a configurable property.");
-  }
-
-  function registerElement(name, options) {
-    var proto, extendsOption;
-    if (options !== undefined) {
-      proto = options.prototype;
-    } else {
-      proto = Object.create(HTMLElement.prototype);
-      options = {protoptype: proto};
-    }
-
-    var original = proto.createdCallback;
-    var newCallback = function() {
-      original.call(this);
-      var name = (this.getAttribute('is') || this.localName).toLowerCase();
-      var upgrader = upgraders[name];
-      if (upgrader) {
-        upgrader(this);
-      } else if (upgradeOldElements) {
-        // Save this element in case we can upgrade it later when an upgrader is
-        // registered.
-        var list = pendingElements[name];
-        if (!list) {
-          list = pendingElements[name] = [];
-        }
-        list.push(this);
-      }
-    };
-
-    var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback');
-    if (!descriptor || descriptor.writable) {
-      proto.createdCallback = newCallback;
-    } else if (descriptor.configurable) {
-      descriptor['value'] = newCallback;
-      Object.defineProperty(proto, 'createdCallback', descriptor);
-    } else {
-      unpatchableTags[name] = true;
-      if (upgraders[name]) reportError(name);
-    }
-    return originalRegisterElement.call(this, name, options);
-  }
-
-  function registerDartTypeUpgrader(name, upgrader) {
-    if (!upgrader) return;
-    name = name.toLowerCase();
-    var existing = upgraders[name];
-    if (existing) {
-      console.error('Already have a Dart type associated with ' + name);
-      return;
-    }
-    upgraders[name] = upgrader;
-    if (unpatchableTags[name]) reportError(name);
-    if (upgradeOldElements) {
-      // Upgrade elements that were created before the upgrader was registered.
-      var list = pendingElements[name];
-      if (list) {
-        for (var i = 0; i < list.length; i++) {
-          upgrader(list[i]);
-        }
-      }
-      delete pendingElements[name];
-    } else {
-      console.warn("Didn't expect more Dart types to be registered. '" + name
-          + "' elements that already exist in the page might not be wrapped.");
-    }
-  }
-
-  function onlyUpgradeNewElements() {
-    upgradeOldElements = false;
-    pendingElements = null;
-  }
-
-  // Native custom elements outside the app in Chrome have constructor
-  // names like "x-tag", which need to be translated to the DOM
-  // element they extend.  When using the shadow dom polyfill this is
-  // take care of above.
-  var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
-  if (!ShadowDOMPolyfill) {
-    // dartNativeDispatchHooksTransformer is described on initHooks() in
-    // sdk/lib/_internal/lib/native_helper.dart.
-    if (typeof window.dartNativeDispatchHooksTransformer == 'undefined')
-    window.dartNativeDispatchHooksTransformer = [];
-
-    window.dartNativeDispatchHooksTransformer.push(function(hooks) {
-      var originalGetUnknownTag = hooks.getUnknownTag;
-      hooks.getUnknownTag = function(o, tag) {
-        if (/-/.test(tag)) {  // "x-tag"
-          var s = Object.prototype.toString.call(o);
-          var match = s.match(/^\[object ([A-Za-z]*Element)\]$/);
-          if (match) {
-            return match[1];
-	  }
-          return originalGetUnknownTag(o, tag);
-        }
-      };
-    });
-  }
-
-  doc._registerDartTypeUpgrader = registerDartTypeUpgrader;
-  doc._onlyUpgradeNewElements = onlyUpgradeNewElements;
-  doc.registerElement = registerElement;
-})(document);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.html b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.html
new file mode 100644
index 0000000..469510c
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.html
@@ -0,0 +1,6 @@
+<!--
+ Copyright 2014 The Dart project authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
+-->
+<script src="interop_support.js"></script>
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.js
new file mode 100644
index 0000000..790f828
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/interop_support.js
@@ -0,0 +1,126 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Updates document.registerElement so Dart can see when Javascript custom
+// elements are created, and wrap them to provide a Dart friendly API.
+(function (doc) {
+  if (window._dart_register_element_interop_support) return;
+  window._dart_register_element_interop_support = true;
+
+  var upgraders = {};       // upgrader associated with a custom-tag.
+  var unpatchableTags = {}; // set of custom-tags that can't be patched.
+  var pendingElements = {}; // will upgrade when/if an upgrader is installed.
+  var upgradeOldElements = true;
+
+  var originalRegisterElement = doc.registerElement;
+  if (!originalRegisterElement) {
+    throw new Error('document.registerElement is not present.');
+  }
+
+  function reportError(name) {
+    console.error("Couldn't patch prototype to notify Dart when " + name +
+        " elements are created. This can be fixed by making the " +
+        "createdCallback in " + name + " a configurable property.");
+  }
+
+  function registerElement(name, options) {
+    var proto, extendsOption;
+    if (options !== undefined) {
+      proto = options.prototype;
+    } else {
+      proto = Object.create(HTMLElement.prototype);
+      options = {protoptype: proto};
+    }
+
+    var original = proto.createdCallback;
+    var newCallback = function() {
+      original.call(this);
+      var name = (this.getAttribute('is') || this.localName).toLowerCase();
+      var upgrader = upgraders[name];
+      if (upgrader) {
+        upgrader(this);
+      } else if (upgradeOldElements) {
+        // Save this element in case we can upgrade it later when an upgrader is
+        // registered.
+        var list = pendingElements[name];
+        if (!list) {
+          list = pendingElements[name] = [];
+        }
+        list.push(this);
+      }
+    };
+
+    var descriptor = Object.getOwnPropertyDescriptor(proto, 'createdCallback');
+    if (!descriptor || descriptor.writable) {
+      proto.createdCallback = newCallback;
+    } else if (descriptor.configurable) {
+      descriptor['value'] = newCallback;
+      Object.defineProperty(proto, 'createdCallback', descriptor);
+    } else {
+      unpatchableTags[name] = true;
+      if (upgraders[name]) reportError(name);
+    }
+    return originalRegisterElement.call(this, name, options);
+  }
+
+  function registerDartTypeUpgrader(name, upgrader) {
+    if (!upgrader) return;
+    name = name.toLowerCase();
+    var existing = upgraders[name];
+    if (existing) {
+      console.error('Already have a Dart type associated with ' + name);
+      return;
+    }
+    upgraders[name] = upgrader;
+    if (unpatchableTags[name]) reportError(name);
+    if (upgradeOldElements) {
+      // Upgrade elements that were created before the upgrader was registered.
+      var list = pendingElements[name];
+      if (list) {
+        for (var i = 0; i < list.length; i++) {
+          upgrader(list[i]);
+        }
+      }
+      delete pendingElements[name];
+    } else {
+      console.warn("Didn't expect more Dart types to be registered. '" + name
+          + "' elements that already exist in the page might not be wrapped.");
+    }
+  }
+
+  function onlyUpgradeNewElements() {
+    upgradeOldElements = false;
+    pendingElements = null;
+  }
+
+  // Native custom elements outside the app in Chrome have constructor
+  // names like "x-tag", which need to be translated to the DOM
+  // element they extend.  When using the shadow dom polyfill this is
+  // taken care of in dart_support.js.
+  var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
+  if (!ShadowDOMPolyfill) {
+    // dartNativeDispatchHooksTransformer is described on initHooks() in
+    // sdk/lib/_internal/lib/native_helper.dart.
+    if (typeof window.dartNativeDispatchHooksTransformer == 'undefined')
+    window.dartNativeDispatchHooksTransformer = [];
+
+    window.dartNativeDispatchHooksTransformer.push(function(hooks) {
+      var originalGetUnknownTag = hooks.getUnknownTag;
+      hooks.getUnknownTag = function(o, tag) {
+        if (/-/.test(tag)) {  // "x-tag"
+          var s = Object.prototype.toString.call(o);
+          var match = s.match(/^\[object ([A-Za-z]*Element)\]$/);
+          if (match) {
+            return match[1];
+          }
+          return originalGetUnknownTag(o, tag);
+        }
+      };
+    });
+  }
+
+  doc._registerDartTypeUpgrader = registerDartTypeUpgrader;
+  doc._onlyUpgradeNewElements = onlyUpgradeNewElements;
+  doc.registerElement = registerElement;
+})(document);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
index 0d32bb5..242d3ec 100644
--- a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/platform.js
@@ -7,11 +7,10 @@
  * 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.1-d214582
+// @version: 0.4.2-f0342cf
 
-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)
+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.log("Warning: 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];return d&&d[0]===b?d[1]=c:a(b,this.name,{value:[b,c],writable:!0}),this},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(a){a.scheduled_||(a.scheduled_=!0,o.push(a),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];c.scheduled_=!1;var 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)}}}for(var o in f){var m=f[o],p=new d(c,a);"name"in e&&"namespace"in e&&(p.attributeName=e.name,p.attributeNamespace=e.namespace),e.addedNodes&&(p.addedNodes=e.addedNodes),e.removedNodes&&(p.removedNodes=e.removedNodes),e.previousSibling&&(p.previousSibling=e.previousSibling),e.nextSibling&&(p.nextSibling=e.nextSibling),void 0!==g[o]&&(p.oldValue=g[o]),b(m),m.records_.push(p)}}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,this.scheduled_=!1}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){b(this.observer),this.transientObservedNodes.push(a);var c=n.get(a);c||n.set(a,c=[]),c.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){null==a&&(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: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
+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"))},get origin(){var a;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return a=this.host,a?this._scheme+"://"+a:""}};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||q,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===s}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===s)&&(b.removeEventListener(t,e),d(a,b))};b.addEventListener(t,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 m?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",l=k in document.createElement("link"),m=l,n=/Trident/.test(navigator.userAgent),o=Boolean(window.ShadowDOMPolyfill),p=function(a){return o?ShadowDOMPolyfill.wrapIfNeeded(a):a},q=p(document),r={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(a)},configurable:!0};Object.defineProperty(document,"_currentScript",r),Object.defineProperty(q,"_currentScript",r);var s=n?"complete":"interactive",t="readystatechange";m&&(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(),q.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.useNative=m,a.isImportLoaded=g,a.whenReady=b,a.rootDocument=q,a.IMPORT_LINK_TYPE=k,a.isIE=n}(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===j}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=a.rootDocument,h=a.flags,i=a.isIE,j=a.IMPORT_LINK_TYPE,k={documentSelectors:"link[rel="+j+"]",importsSelectors:["link[rel="+j+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],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))},parseDynamic:function(a,b){this.dynamicElements.push(a),b||this.parseNext()},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,this.markDynamicParsingComplete(a),a.__importElement&&(a.__importElement.__importParsed=!0,this.markDynamicParsingComplete(a.__importElement)),this.parsingElement=null,h.parse&&console.log("completed",a)},markDynamicParsingComplete:function(a){var b=this.dynamicElements.indexOf(a);b>=0&&this.dynamicElements.splice(b,1)},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(g)||this.nextToParseDynamic())},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},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===g?this.documentSelectors:this.importsSelectors},isParsed:function(a){return a.__importParsed},needsDynamicParsing:function(a){return this.dynamicElements.indexOf(a)>=0},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=a.IMPORT_LINK_TYPE;if(e)var h={};else{var i=a.rootDocument,j=(a.xhr,a.Loader),k=a.parser,h={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===i?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(h.loaded.bind(h),h.loadedAll.bind(h));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(i,"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=h,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,f,i,j,k=0,l=a.length;l>k&&(i=a[k]);k++)b||(b=i.ownerDocument,f=h.isParsed(b)),j=d(i),j&&g.loadNode(i),e(i)&&f&&h.parseDynamic(i,j),i.children&&i.children.length&&c(i.children)}function d(a){return 1===a.nodeType&&i.call(a,g.loadSelectorsForNode(a))}function e(a){return 1===a.nodeType&&i.call(a,h.parseSelectorsForNode(a))}function f(a){j.observe(a,{childList:!0,subtree:!0})}var g=(a.IMPORT_LINK_TYPE,a.importer),h=a.parser,i=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector,j=new MutationObserver(b);a.observe=f,g.observe=f}(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){w(a)}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&&(H(a.addedNodes,function(a){a.localName&&g(a)}),H(a.removedNodes,function(a){a.localName&&n(a)}))}),B.dom&&console.groupEnd()}function v(a){for(a||(a=q(document));a.parentNode;)a=a.parentNode;var b=a.__observer;b&&(u(b.takeRecords()),k())}function w(a){if(!a.__observer){var b=new MutationObserver(u);b.observe(a,{childList:!0,subtree:!0}),a.__observer=b}}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=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);
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.js
new file mode 100644
index 0000000..8e6523a
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.js
@@ -0,0 +1,6373 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+window.WebComponents = window.WebComponents || {};
+
+(function(scope) {
+  var flags = scope.flags || {};
+  var file = "webcomponents.js";
+  var script = document.querySelector('script[src*="' + file + '"]');
+  if (!flags.noOpts) {
+    location.search.slice(1).split("&").forEach(function(o) {
+      o = o.split("=");
+      o[0] && (flags[o[0]] = o[1] || true);
+    });
+    if (script) {
+      for (var i = 0, a; a = script.attributes[i]; i++) {
+        if (a.name !== "src") {
+          flags[a.name] = a.value || true;
+        }
+      }
+    }
+    if (flags.log) {
+      var parts = flags.log.split(",");
+      flags.log = {};
+      parts.forEach(function(f) {
+        flags.log[f] = true;
+      });
+    } else {
+      flags.log = {};
+    }
+  }
+  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;
+  if (flags.shadow === "native") {
+    flags.shadow = false;
+  } else {
+    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;
+  }
+  if (flags.register) {
+    window.CustomElements = window.CustomElements || {
+      flags: {}
+    };
+    window.CustomElements.flags.register = flags.register;
+  }
+  scope.flags = flags;
+})(WebComponents);
+
+if (WebComponents.flags.shadow) {
+  if (typeof WeakMap === "undefined") {
+    (function() {
+      var defineProperty = Object.defineProperty;
+      var counter = Date.now() % 1e9;
+      var WeakMap = function() {
+        this.name = "__st" + (Math.random() * 1e9 >>> 0) + (counter++ + "__");
+      };
+      WeakMap.prototype = {
+        set: function(key, value) {
+          var entry = key[this.name];
+          if (entry && entry[0] === key) entry[1] = value; else defineProperty(key, this.name, {
+            value: [ key, value ],
+            writable: true
+          });
+          return this;
+        },
+        get: function(key) {
+          var entry;
+          return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
+        },
+        "delete": function(key) {
+          var entry = key[this.name];
+          if (!entry || entry[0] !== key) return false;
+          entry[0] = entry[1] = undefined;
+          return true;
+        },
+        has: function(key) {
+          var entry = key[this.name];
+          if (!entry) return false;
+          return entry[0] === key;
+        }
+      };
+      window.WeakMap = WeakMap;
+    })();
+  }
+  window.ShadowDOMPolyfill = {};
+  (function(scope) {
+    "use strict";
+    var constructorTable = new WeakMap();
+    var nativePrototypeTable = new WeakMap();
+    var wrappers = Object.create(null);
+    function detectEval() {
+      if (typeof chrome !== "undefined" && chrome.app && chrome.app.runtime) {
+        return false;
+      }
+      if (navigator.getDeviceStorage) {
+        return false;
+      }
+      try {
+        var f = new Function("return true;");
+        return f();
+      } catch (ex) {
+        return false;
+      }
+    }
+    var hasEval = detectEval();
+    function assert(b) {
+      if (!b) throw new Error("Assertion failed");
+    }
+    var defineProperty = Object.defineProperty;
+    var getOwnPropertyNames = Object.getOwnPropertyNames;
+    var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+    function mixin(to, from) {
+      var names = getOwnPropertyNames(from);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+      }
+      return to;
+    }
+    function mixinStatics(to, from) {
+      var names = getOwnPropertyNames(from);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        switch (name) {
+         case "arguments":
+         case "caller":
+         case "length":
+         case "name":
+         case "prototype":
+         case "toString":
+          continue;
+        }
+        defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+      }
+      return to;
+    }
+    function oneOf(object, propertyNames) {
+      for (var i = 0; i < propertyNames.length; i++) {
+        if (propertyNames[i] in object) return propertyNames[i];
+      }
+    }
+    var nonEnumerableDataDescriptor = {
+      value: undefined,
+      configurable: true,
+      enumerable: false,
+      writable: true
+    };
+    function defineNonEnumerableDataProperty(object, name, value) {
+      nonEnumerableDataDescriptor.value = value;
+      defineProperty(object, name, nonEnumerableDataDescriptor);
+    }
+    getOwnPropertyNames(window);
+    function getWrapperConstructor(node) {
+      var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
+      var wrapperConstructor = constructorTable.get(nativePrototype);
+      if (wrapperConstructor) return wrapperConstructor;
+      var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
+      var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
+      registerInternal(nativePrototype, GeneratedWrapper, node);
+      return GeneratedWrapper;
+    }
+    function addForwardingProperties(nativePrototype, wrapperPrototype) {
+      installProperty(nativePrototype, wrapperPrototype, true);
+    }
+    function registerInstanceProperties(wrapperPrototype, instanceObject) {
+      installProperty(instanceObject, wrapperPrototype, false);
+    }
+    var isFirefox = /Firefox/.test(navigator.userAgent);
+    var dummyDescriptor = {
+      get: function() {},
+      set: function(v) {},
+      configurable: true,
+      enumerable: true
+    };
+    function isEventHandlerName(name) {
+      return /^on[a-z]+$/.test(name);
+    }
+    function isIdentifierName(name) {
+      return /^\w[a-zA-Z_0-9]*$/.test(name);
+    }
+    function getGetter(name) {
+      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name) : function() {
+        return this.__impl4cf1e782hg__[name];
+      };
+    }
+    function getSetter(name) {
+      return hasEval && isIdentifierName(name) ? new Function("v", "this.__impl4cf1e782hg__." + name + " = v") : function(v) {
+        this.__impl4cf1e782hg__[name] = v;
+      };
+    }
+    function getMethod(name) {
+      return hasEval && isIdentifierName(name) ? new Function("return this.__impl4cf1e782hg__." + name + ".apply(this.__impl4cf1e782hg__, arguments)") : function() {
+        return this.__impl4cf1e782hg__[name].apply(this.__impl4cf1e782hg__, arguments);
+      };
+    }
+    function getDescriptor(source, name) {
+      try {
+        return Object.getOwnPropertyDescriptor(source, name);
+      } catch (ex) {
+        return dummyDescriptor;
+      }
+    }
+    var isBrokenSafari = function() {
+      var descr = Object.getOwnPropertyDescriptor(Node.prototype, "nodeType");
+      return descr && !descr.get && !descr.set;
+    }();
+    function installProperty(source, target, allowMethod, opt_blacklist) {
+      var names = getOwnPropertyNames(source);
+      for (var i = 0; i < names.length; i++) {
+        var name = names[i];
+        if (name === "polymerBlackList_") continue;
+        if (name in target) continue;
+        if (source.polymerBlackList_ && source.polymerBlackList_[name]) continue;
+        if (isFirefox) {
+          source.__lookupGetter__(name);
+        }
+        var descriptor = getDescriptor(source, name);
+        var getter, setter;
+        if (allowMethod && typeof descriptor.value === "function") {
+          target[name] = getMethod(name);
+          continue;
+        }
+        var isEvent = isEventHandlerName(name);
+        if (isEvent) getter = scope.getEventHandlerGetter(name); else getter = getGetter(name);
+        if (descriptor.writable || descriptor.set || isBrokenSafari) {
+          if (isEvent) setter = scope.getEventHandlerSetter(name); else setter = getSetter(name);
+        }
+        defineProperty(target, name, {
+          get: getter,
+          set: setter,
+          configurable: descriptor.configurable,
+          enumerable: descriptor.enumerable
+        });
+      }
+    }
+    function register(nativeConstructor, wrapperConstructor, opt_instance) {
+      var nativePrototype = nativeConstructor.prototype;
+      registerInternal(nativePrototype, wrapperConstructor, opt_instance);
+      mixinStatics(wrapperConstructor, nativeConstructor);
+    }
+    function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
+      var wrapperPrototype = wrapperConstructor.prototype;
+      assert(constructorTable.get(nativePrototype) === undefined);
+      constructorTable.set(nativePrototype, wrapperConstructor);
+      nativePrototypeTable.set(wrapperPrototype, nativePrototype);
+      addForwardingProperties(nativePrototype, wrapperPrototype);
+      if (opt_instance) registerInstanceProperties(wrapperPrototype, opt_instance);
+      defineNonEnumerableDataProperty(wrapperPrototype, "constructor", wrapperConstructor);
+      wrapperConstructor.prototype = wrapperPrototype;
+    }
+    function isWrapperFor(wrapperConstructor, nativeConstructor) {
+      return constructorTable.get(nativeConstructor.prototype) === wrapperConstructor;
+    }
+    function registerObject(object) {
+      var nativePrototype = Object.getPrototypeOf(object);
+      var superWrapperConstructor = getWrapperConstructor(nativePrototype);
+      var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
+      registerInternal(nativePrototype, GeneratedWrapper, object);
+      return GeneratedWrapper;
+    }
+    function createWrapperConstructor(superWrapperConstructor) {
+      function GeneratedWrapper(node) {
+        superWrapperConstructor.call(this, node);
+      }
+      var p = Object.create(superWrapperConstructor.prototype);
+      p.constructor = GeneratedWrapper;
+      GeneratedWrapper.prototype = p;
+      return GeneratedWrapper;
+    }
+    function isWrapper(object) {
+      return object && object.__impl4cf1e782hg__;
+    }
+    function isNative(object) {
+      return !isWrapper(object);
+    }
+    function wrap(impl) {
+      if (impl === null) return null;
+      assert(isNative(impl));
+      return impl.__wrapper8e3dd93a60__ || (impl.__wrapper8e3dd93a60__ = new (getWrapperConstructor(impl))(impl));
+    }
+    function unwrap(wrapper) {
+      if (wrapper === null) return null;
+      assert(isWrapper(wrapper));
+      return wrapper.__impl4cf1e782hg__;
+    }
+    function unsafeUnwrap(wrapper) {
+      return wrapper.__impl4cf1e782hg__;
+    }
+    function setWrapper(impl, wrapper) {
+      wrapper.__impl4cf1e782hg__ = impl;
+      impl.__wrapper8e3dd93a60__ = wrapper;
+    }
+    function unwrapIfNeeded(object) {
+      return object && isWrapper(object) ? unwrap(object) : object;
+    }
+    function wrapIfNeeded(object) {
+      return object && !isWrapper(object) ? wrap(object) : object;
+    }
+    function rewrap(node, wrapper) {
+      if (wrapper === null) return;
+      assert(isNative(node));
+      assert(wrapper === undefined || isWrapper(wrapper));
+      node.__wrapper8e3dd93a60__ = wrapper;
+    }
+    var getterDescriptor = {
+      get: undefined,
+      configurable: true,
+      enumerable: true
+    };
+    function defineGetter(constructor, name, getter) {
+      getterDescriptor.get = getter;
+      defineProperty(constructor.prototype, name, getterDescriptor);
+    }
+    function defineWrapGetter(constructor, name) {
+      defineGetter(constructor, name, function() {
+        return wrap(this.__impl4cf1e782hg__[name]);
+      });
+    }
+    function forwardMethodsToWrapper(constructors, names) {
+      constructors.forEach(function(constructor) {
+        names.forEach(function(name) {
+          constructor.prototype[name] = function() {
+            var w = wrapIfNeeded(this);
+            return w[name].apply(w, arguments);
+          };
+        });
+      });
+    }
+    scope.assert = assert;
+    scope.constructorTable = constructorTable;
+    scope.defineGetter = defineGetter;
+    scope.defineWrapGetter = defineWrapGetter;
+    scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
+    scope.isWrapper = isWrapper;
+    scope.isWrapperFor = isWrapperFor;
+    scope.mixin = mixin;
+    scope.nativePrototypeTable = nativePrototypeTable;
+    scope.oneOf = oneOf;
+    scope.registerObject = registerObject;
+    scope.registerWrapper = register;
+    scope.rewrap = rewrap;
+    scope.setWrapper = setWrapper;
+    scope.unsafeUnwrap = unsafeUnwrap;
+    scope.unwrap = unwrap;
+    scope.unwrapIfNeeded = unwrapIfNeeded;
+    scope.wrap = wrap;
+    scope.wrapIfNeeded = wrapIfNeeded;
+    scope.wrappers = wrappers;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    function newSplice(index, removed, addedCount) {
+      return {
+        index: index,
+        removed: removed,
+        addedCount: addedCount
+      };
+    }
+    var EDIT_LEAVE = 0;
+    var EDIT_UPDATE = 1;
+    var EDIT_ADD = 2;
+    var EDIT_DELETE = 3;
+    function ArraySplice() {}
+    ArraySplice.prototype = {
+      calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+        var rowCount = oldEnd - oldStart + 1;
+        var columnCount = currentEnd - currentStart + 1;
+        var distances = new Array(rowCount);
+        for (var i = 0; i < rowCount; i++) {
+          distances[i] = new Array(columnCount);
+          distances[i][0] = i;
+        }
+        for (var j = 0; j < columnCount; j++) distances[0][j] = j;
+        for (var i = 1; i < rowCount; i++) {
+          for (var j = 1; j < columnCount; j++) {
+            if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1])) distances[i][j] = distances[i - 1][j - 1]; else {
+              var north = distances[i - 1][j] + 1;
+              var west = distances[i][j - 1] + 1;
+              distances[i][j] = north < west ? north : west;
+            }
+          }
+        }
+        return distances;
+      },
+      spliceOperationsFromEditDistances: function(distances) {
+        var i = distances.length - 1;
+        var j = distances[0].length - 1;
+        var current = distances[i][j];
+        var edits = [];
+        while (i > 0 || j > 0) {
+          if (i == 0) {
+            edits.push(EDIT_ADD);
+            j--;
+            continue;
+          }
+          if (j == 0) {
+            edits.push(EDIT_DELETE);
+            i--;
+            continue;
+          }
+          var northWest = distances[i - 1][j - 1];
+          var west = distances[i - 1][j];
+          var north = distances[i][j - 1];
+          var min;
+          if (west < north) min = west < northWest ? west : northWest; else min = north < northWest ? north : northWest;
+          if (min == northWest) {
+            if (northWest == current) {
+              edits.push(EDIT_LEAVE);
+            } else {
+              edits.push(EDIT_UPDATE);
+              current = northWest;
+            }
+            i--;
+            j--;
+          } else if (min == west) {
+            edits.push(EDIT_DELETE);
+            i--;
+            current = west;
+          } else {
+            edits.push(EDIT_ADD);
+            j--;
+            current = north;
+          }
+        }
+        edits.reverse();
+        return edits;
+      },
+      calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+        var prefixCount = 0;
+        var suffixCount = 0;
+        var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+        if (currentStart == 0 && oldStart == 0) prefixCount = this.sharedPrefix(current, old, minLength);
+        if (currentEnd == current.length && oldEnd == old.length) suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+        currentStart += prefixCount;
+        oldStart += prefixCount;
+        currentEnd -= suffixCount;
+        oldEnd -= suffixCount;
+        if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0) return [];
+        if (currentStart == currentEnd) {
+          var splice = newSplice(currentStart, [], 0);
+          while (oldStart < oldEnd) splice.removed.push(old[oldStart++]);
+          return [ splice ];
+        } else if (oldStart == oldEnd) return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+        var ops = this.spliceOperationsFromEditDistances(this.calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+        var splice = undefined;
+        var splices = [];
+        var index = currentStart;
+        var oldIndex = oldStart;
+        for (var i = 0; i < ops.length; i++) {
+          switch (ops[i]) {
+           case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+            index++;
+            oldIndex++;
+            break;
+
+           case EDIT_UPDATE:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.addedCount++;
+            index++;
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+
+           case EDIT_ADD:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.addedCount++;
+            index++;
+            break;
+
+           case EDIT_DELETE:
+            if (!splice) splice = newSplice(index, [], 0);
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          }
+        }
+        if (splice) {
+          splices.push(splice);
+        }
+        return splices;
+      },
+      sharedPrefix: function(current, old, searchLength) {
+        for (var i = 0; i < searchLength; i++) if (!this.equals(current[i], old[i])) return i;
+        return searchLength;
+      },
+      sharedSuffix: function(current, old, searchLength) {
+        var index1 = current.length;
+        var index2 = old.length;
+        var count = 0;
+        while (count < searchLength && this.equals(current[--index1], old[--index2])) count++;
+        return count;
+      },
+      calculateSplices: function(current, previous) {
+        return this.calcSplices(current, 0, current.length, previous, 0, previous.length);
+      },
+      equals: function(currentValue, previousValue) {
+        return currentValue === previousValue;
+      }
+    };
+    scope.ArraySplice = ArraySplice;
+  })(window.ShadowDOMPolyfill);
+  (function(context) {
+    "use strict";
+    var OriginalMutationObserver = window.MutationObserver;
+    var callbacks = [];
+    var pending = false;
+    var timerFunc;
+    function handle() {
+      pending = false;
+      var copies = callbacks.slice(0);
+      callbacks = [];
+      for (var i = 0; i < copies.length; i++) {
+        (0, copies[i])();
+      }
+    }
+    if (OriginalMutationObserver) {
+      var counter = 1;
+      var observer = new OriginalMutationObserver(handle);
+      var textNode = document.createTextNode(counter);
+      observer.observe(textNode, {
+        characterData: true
+      });
+      timerFunc = function() {
+        counter = (counter + 1) % 2;
+        textNode.data = counter;
+      };
+    } else {
+      timerFunc = window.setTimeout;
+    }
+    function setEndOfMicrotask(func) {
+      callbacks.push(func);
+      if (pending) return;
+      pending = true;
+      timerFunc(handle, 0);
+    }
+    context.setEndOfMicrotask = setEndOfMicrotask;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var setEndOfMicrotask = scope.setEndOfMicrotask;
+    var wrapIfNeeded = scope.wrapIfNeeded;
+    var wrappers = scope.wrappers;
+    var registrationsTable = new WeakMap();
+    var globalMutationObservers = [];
+    var isScheduled = false;
+    function scheduleCallback(observer) {
+      if (observer.scheduled_) return;
+      observer.scheduled_ = true;
+      globalMutationObservers.push(observer);
+      if (isScheduled) return;
+      setEndOfMicrotask(notifyObservers);
+      isScheduled = true;
+    }
+    function notifyObservers() {
+      isScheduled = false;
+      while (globalMutationObservers.length) {
+        var notifyList = globalMutationObservers;
+        globalMutationObservers = [];
+        notifyList.sort(function(x, y) {
+          return x.uid_ - y.uid_;
+        });
+        for (var i = 0; i < notifyList.length; i++) {
+          var mo = notifyList[i];
+          mo.scheduled_ = false;
+          var queue = mo.takeRecords();
+          removeTransientObserversFor(mo);
+          if (queue.length) {
+            mo.callback_(queue, mo);
+          }
+        }
+      }
+    }
+    function MutationRecord(type, target) {
+      this.type = type;
+      this.target = target;
+      this.addedNodes = new wrappers.NodeList();
+      this.removedNodes = new wrappers.NodeList();
+      this.previousSibling = null;
+      this.nextSibling = null;
+      this.attributeName = null;
+      this.attributeNamespace = null;
+      this.oldValue = null;
+    }
+    function registerTransientObservers(ancestor, node) {
+      for (;ancestor; ancestor = ancestor.parentNode) {
+        var registrations = registrationsTable.get(ancestor);
+        if (!registrations) continue;
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.options.subtree) registration.addTransientObserver(node);
+        }
+      }
+    }
+    function removeTransientObserversFor(observer) {
+      for (var i = 0; i < observer.nodes_.length; i++) {
+        var node = observer.nodes_[i];
+        var registrations = registrationsTable.get(node);
+        if (!registrations) return;
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          if (registration.observer === observer) registration.removeTransientObservers();
+        }
+      }
+    }
+    function enqueueMutation(target, type, data) {
+      var interestedObservers = Object.create(null);
+      var associatedStrings = Object.create(null);
+      for (var node = target; node; node = node.parentNode) {
+        var registrations = registrationsTable.get(node);
+        if (!registrations) continue;
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          var options = registration.options;
+          if (node !== target && !options.subtree) continue;
+          if (type === "attributes" && !options.attributes) continue;
+          if (type === "attributes" && options.attributeFilter && (data.namespace !== null || options.attributeFilter.indexOf(data.name) === -1)) {
+            continue;
+          }
+          if (type === "characterData" && !options.characterData) continue;
+          if (type === "childList" && !options.childList) continue;
+          var observer = registration.observer;
+          interestedObservers[observer.uid_] = observer;
+          if (type === "attributes" && options.attributeOldValue || type === "characterData" && options.characterDataOldValue) {
+            associatedStrings[observer.uid_] = data.oldValue;
+          }
+        }
+      }
+      for (var uid in interestedObservers) {
+        var observer = interestedObservers[uid];
+        var record = new MutationRecord(type, target);
+        if ("name" in data && "namespace" in data) {
+          record.attributeName = data.name;
+          record.attributeNamespace = data.namespace;
+        }
+        if (data.addedNodes) record.addedNodes = data.addedNodes;
+        if (data.removedNodes) record.removedNodes = data.removedNodes;
+        if (data.previousSibling) record.previousSibling = data.previousSibling;
+        if (data.nextSibling) record.nextSibling = data.nextSibling;
+        if (associatedStrings[uid] !== undefined) record.oldValue = associatedStrings[uid];
+        scheduleCallback(observer);
+        observer.records_.push(record);
+      }
+    }
+    var slice = Array.prototype.slice;
+    function MutationObserverOptions(options) {
+      this.childList = !!options.childList;
+      this.subtree = !!options.subtree;
+      if (!("attributes" in options) && ("attributeOldValue" in options || "attributeFilter" in options)) {
+        this.attributes = true;
+      } else {
+        this.attributes = !!options.attributes;
+      }
+      if ("characterDataOldValue" in options && !("characterData" in options)) this.characterData = true; else this.characterData = !!options.characterData;
+      if (!this.attributes && (options.attributeOldValue || "attributeFilter" in options) || !this.characterData && options.characterDataOldValue) {
+        throw new TypeError();
+      }
+      this.characterData = !!options.characterData;
+      this.attributeOldValue = !!options.attributeOldValue;
+      this.characterDataOldValue = !!options.characterDataOldValue;
+      if ("attributeFilter" in options) {
+        if (options.attributeFilter == null || typeof options.attributeFilter !== "object") {
+          throw new TypeError();
+        }
+        this.attributeFilter = slice.call(options.attributeFilter);
+      } else {
+        this.attributeFilter = null;
+      }
+    }
+    var uidCounter = 0;
+    function MutationObserver(callback) {
+      this.callback_ = callback;
+      this.nodes_ = [];
+      this.records_ = [];
+      this.uid_ = ++uidCounter;
+      this.scheduled_ = false;
+    }
+    MutationObserver.prototype = {
+      constructor: MutationObserver,
+      observe: function(target, options) {
+        target = wrapIfNeeded(target);
+        var newOptions = new MutationObserverOptions(options);
+        var registration;
+        var registrations = registrationsTable.get(target);
+        if (!registrations) registrationsTable.set(target, registrations = []);
+        for (var i = 0; i < registrations.length; i++) {
+          if (registrations[i].observer === this) {
+            registration = registrations[i];
+            registration.removeTransientObservers();
+            registration.options = newOptions;
+          }
+        }
+        if (!registration) {
+          registration = new Registration(this, target, newOptions);
+          registrations.push(registration);
+          this.nodes_.push(target);
+        }
+      },
+      disconnect: function() {
+        this.nodes_.forEach(function(node) {
+          var registrations = registrationsTable.get(node);
+          for (var i = 0; i < registrations.length; i++) {
+            var registration = registrations[i];
+            if (registration.observer === this) {
+              registrations.splice(i, 1);
+              break;
+            }
+          }
+        }, this);
+        this.records_ = [];
+      },
+      takeRecords: function() {
+        var copyOfRecords = this.records_;
+        this.records_ = [];
+        return copyOfRecords;
+      }
+    };
+    function Registration(observer, target, options) {
+      this.observer = observer;
+      this.target = target;
+      this.options = options;
+      this.transientObservedNodes = [];
+    }
+    Registration.prototype = {
+      addTransientObserver: function(node) {
+        if (node === this.target) return;
+        scheduleCallback(this.observer);
+        this.transientObservedNodes.push(node);
+        var registrations = registrationsTable.get(node);
+        if (!registrations) registrationsTable.set(node, registrations = []);
+        registrations.push(this);
+      },
+      removeTransientObservers: function() {
+        var transientObservedNodes = this.transientObservedNodes;
+        this.transientObservedNodes = [];
+        for (var i = 0; i < transientObservedNodes.length; i++) {
+          var node = transientObservedNodes[i];
+          var registrations = registrationsTable.get(node);
+          for (var j = 0; j < registrations.length; j++) {
+            if (registrations[j] === this) {
+              registrations.splice(j, 1);
+              break;
+            }
+          }
+        }
+      }
+    };
+    scope.enqueueMutation = enqueueMutation;
+    scope.registerTransientObservers = registerTransientObservers;
+    scope.wrappers.MutationObserver = MutationObserver;
+    scope.wrappers.MutationRecord = MutationRecord;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    function TreeScope(root, parent) {
+      this.root = root;
+      this.parent = parent;
+    }
+    TreeScope.prototype = {
+      get renderer() {
+        if (this.root instanceof scope.wrappers.ShadowRoot) {
+          return scope.getRendererForHost(this.root.host);
+        }
+        return null;
+      },
+      contains: function(treeScope) {
+        for (;treeScope; treeScope = treeScope.parent) {
+          if (treeScope === this) return true;
+        }
+        return false;
+      }
+    };
+    function setTreeScope(node, treeScope) {
+      if (node.treeScope_ !== treeScope) {
+        node.treeScope_ = treeScope;
+        for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
+          sr.treeScope_.parent = treeScope;
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          setTreeScope(child, treeScope);
+        }
+      }
+    }
+    function getTreeScope(node) {
+      if (node instanceof scope.wrappers.Window) {
+        debugger;
+      }
+      if (node.treeScope_) return node.treeScope_;
+      var parent = node.parentNode;
+      var treeScope;
+      if (parent) treeScope = getTreeScope(parent); else treeScope = new TreeScope(node, null);
+      return node.treeScope_ = treeScope;
+    }
+    scope.TreeScope = TreeScope;
+    scope.getTreeScope = getTreeScope;
+    scope.setTreeScope = setTreeScope;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrappers = scope.wrappers;
+    var wrappedFuns = new WeakMap();
+    var listenersTable = new WeakMap();
+    var handledEventsTable = new WeakMap();
+    var currentlyDispatchingEvents = new WeakMap();
+    var targetTable = new WeakMap();
+    var currentTargetTable = new WeakMap();
+    var relatedTargetTable = new WeakMap();
+    var eventPhaseTable = new WeakMap();
+    var stopPropagationTable = new WeakMap();
+    var stopImmediatePropagationTable = new WeakMap();
+    var eventHandlersTable = new WeakMap();
+    var eventPathTable = new WeakMap();
+    function isShadowRoot(node) {
+      return node instanceof wrappers.ShadowRoot;
+    }
+    function rootOfNode(node) {
+      return getTreeScope(node).root;
+    }
+    function getEventPath(node, event) {
+      var path = [];
+      var current = node;
+      path.push(current);
+      while (current) {
+        var destinationInsertionPoints = getDestinationInsertionPoints(current);
+        if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
+          for (var i = 0; i < destinationInsertionPoints.length; i++) {
+            var insertionPoint = destinationInsertionPoints[i];
+            if (isShadowInsertionPoint(insertionPoint)) {
+              var shadowRoot = rootOfNode(insertionPoint);
+              var olderShadowRoot = shadowRoot.olderShadowRoot;
+              if (olderShadowRoot) path.push(olderShadowRoot);
+            }
+            path.push(insertionPoint);
+          }
+          current = destinationInsertionPoints[destinationInsertionPoints.length - 1];
+        } else {
+          if (isShadowRoot(current)) {
+            if (inSameTree(node, current) && eventMustBeStopped(event)) {
+              break;
+            }
+            current = current.host;
+            path.push(current);
+          } else {
+            current = current.parentNode;
+            if (current) path.push(current);
+          }
+        }
+      }
+      return path;
+    }
+    function eventMustBeStopped(event) {
+      if (!event) return false;
+      switch (event.type) {
+       case "abort":
+       case "error":
+       case "select":
+       case "change":
+       case "load":
+       case "reset":
+       case "resize":
+       case "scroll":
+       case "selectstart":
+        return true;
+      }
+      return false;
+    }
+    function isShadowInsertionPoint(node) {
+      return node instanceof HTMLShadowElement;
+    }
+    function getDestinationInsertionPoints(node) {
+      return scope.getDestinationInsertionPoints(node);
+    }
+    function eventRetargetting(path, currentTarget) {
+      if (path.length === 0) return currentTarget;
+      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
+      var currentTargetTree = getTreeScope(currentTarget);
+      var originalTarget = path[0];
+      var originalTargetTree = getTreeScope(originalTarget);
+      var relativeTargetTree = lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
+      for (var i = 0; i < path.length; i++) {
+        var node = path[i];
+        if (getTreeScope(node) === relativeTargetTree) return node;
+      }
+      return path[path.length - 1];
+    }
+    function getTreeScopeAncestors(treeScope) {
+      var ancestors = [];
+      for (;treeScope; treeScope = treeScope.parent) {
+        ancestors.push(treeScope);
+      }
+      return ancestors;
+    }
+    function lowestCommonInclusiveAncestor(tsA, tsB) {
+      var ancestorsA = getTreeScopeAncestors(tsA);
+      var ancestorsB = getTreeScopeAncestors(tsB);
+      var result = null;
+      while (ancestorsA.length > 0 && ancestorsB.length > 0) {
+        var a = ancestorsA.pop();
+        var b = ancestorsB.pop();
+        if (a === b) result = a; else break;
+      }
+      return result;
+    }
+    function getTreeScopeRoot(ts) {
+      if (!ts.parent) return ts;
+      return getTreeScopeRoot(ts.parent);
+    }
+    function relatedTargetResolution(event, currentTarget, relatedTarget) {
+      if (currentTarget instanceof wrappers.Window) currentTarget = currentTarget.document;
+      var currentTargetTree = getTreeScope(currentTarget);
+      var relatedTargetTree = getTreeScope(relatedTarget);
+      var relatedTargetEventPath = getEventPath(relatedTarget, event);
+      var lowestCommonAncestorTree;
+      var lowestCommonAncestorTree = lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
+      if (!lowestCommonAncestorTree) lowestCommonAncestorTree = relatedTargetTree.root;
+      for (var commonAncestorTree = lowestCommonAncestorTree; commonAncestorTree; commonAncestorTree = commonAncestorTree.parent) {
+        var adjustedRelatedTarget;
+        for (var i = 0; i < relatedTargetEventPath.length; i++) {
+          var node = relatedTargetEventPath[i];
+          if (getTreeScope(node) === commonAncestorTree) return node;
+        }
+      }
+      return null;
+    }
+    function inSameTree(a, b) {
+      return getTreeScope(a) === getTreeScope(b);
+    }
+    var NONE = 0;
+    var CAPTURING_PHASE = 1;
+    var AT_TARGET = 2;
+    var BUBBLING_PHASE = 3;
+    var pendingError;
+    function dispatchOriginalEvent(originalEvent) {
+      if (handledEventsTable.get(originalEvent)) return;
+      handledEventsTable.set(originalEvent, true);
+      dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
+      if (pendingError) {
+        var err = pendingError;
+        pendingError = null;
+        throw err;
+      }
+    }
+    function isLoadLikeEvent(event) {
+      switch (event.type) {
+       case "load":
+       case "beforeunload":
+       case "unload":
+        return true;
+      }
+      return false;
+    }
+    function dispatchEvent(event, originalWrapperTarget) {
+      if (currentlyDispatchingEvents.get(event)) throw new Error("InvalidStateError");
+      currentlyDispatchingEvents.set(event, true);
+      scope.renderAllPending();
+      var eventPath;
+      var overrideTarget;
+      var win;
+      if (isLoadLikeEvent(event) && !event.bubbles) {
+        var doc = originalWrapperTarget;
+        if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
+          overrideTarget = doc;
+          eventPath = [];
+        }
+      }
+      if (!eventPath) {
+        if (originalWrapperTarget instanceof wrappers.Window) {
+          win = originalWrapperTarget;
+          eventPath = [];
+        } else {
+          eventPath = getEventPath(originalWrapperTarget, event);
+          if (!isLoadLikeEvent(event)) {
+            var doc = eventPath[eventPath.length - 1];
+            if (doc instanceof wrappers.Document) win = doc.defaultView;
+          }
+        }
+      }
+      eventPathTable.set(event, eventPath);
+      if (dispatchCapturing(event, eventPath, win, overrideTarget)) {
+        if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
+          dispatchBubbling(event, eventPath, win, overrideTarget);
+        }
+      }
+      eventPhaseTable.set(event, NONE);
+      currentTargetTable.delete(event, null);
+      currentlyDispatchingEvents.delete(event);
+      return event.defaultPrevented;
+    }
+    function dispatchCapturing(event, eventPath, win, overrideTarget) {
+      var phase = CAPTURING_PHASE;
+      if (win) {
+        if (!invoke(win, event, phase, eventPath, overrideTarget)) return false;
+      }
+      for (var i = eventPath.length - 1; i > 0; i--) {
+        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return false;
+      }
+      return true;
+    }
+    function dispatchAtTarget(event, eventPath, win, overrideTarget) {
+      var phase = AT_TARGET;
+      var currentTarget = eventPath[0] || win;
+      return invoke(currentTarget, event, phase, eventPath, overrideTarget);
+    }
+    function dispatchBubbling(event, eventPath, win, overrideTarget) {
+      var phase = BUBBLING_PHASE;
+      for (var i = 1; i < eventPath.length; i++) {
+        if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget)) return;
+      }
+      if (win && eventPath.length > 0) {
+        invoke(win, event, phase, eventPath, overrideTarget);
+      }
+    }
+    function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
+      var listeners = listenersTable.get(currentTarget);
+      if (!listeners) return true;
+      var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
+      if (target === currentTarget) {
+        if (phase === CAPTURING_PHASE) return true;
+        if (phase === BUBBLING_PHASE) phase = AT_TARGET;
+      } else if (phase === BUBBLING_PHASE && !event.bubbles) {
+        return true;
+      }
+      if ("relatedTarget" in event) {
+        var originalEvent = unwrap(event);
+        var unwrappedRelatedTarget = originalEvent.relatedTarget;
+        if (unwrappedRelatedTarget) {
+          if (unwrappedRelatedTarget instanceof Object && unwrappedRelatedTarget.addEventListener) {
+            var relatedTarget = wrap(unwrappedRelatedTarget);
+            var adjusted = relatedTargetResolution(event, currentTarget, relatedTarget);
+            if (adjusted === target) return true;
+          } else {
+            adjusted = null;
+          }
+          relatedTargetTable.set(event, adjusted);
+        }
+      }
+      eventPhaseTable.set(event, phase);
+      var type = event.type;
+      var anyRemoved = false;
+      targetTable.set(event, target);
+      currentTargetTable.set(event, currentTarget);
+      listeners.depth++;
+      for (var i = 0, len = listeners.length; i < len; i++) {
+        var listener = listeners[i];
+        if (listener.removed) {
+          anyRemoved = true;
+          continue;
+        }
+        if (listener.type !== type || !listener.capture && phase === CAPTURING_PHASE || listener.capture && phase === BUBBLING_PHASE) {
+          continue;
+        }
+        try {
+          if (typeof listener.handler === "function") listener.handler.call(currentTarget, event); else listener.handler.handleEvent(event);
+          if (stopImmediatePropagationTable.get(event)) return false;
+        } catch (ex) {
+          if (!pendingError) pendingError = ex;
+        }
+      }
+      listeners.depth--;
+      if (anyRemoved && listeners.depth === 0) {
+        var copy = listeners.slice();
+        listeners.length = 0;
+        for (var i = 0; i < copy.length; i++) {
+          if (!copy[i].removed) listeners.push(copy[i]);
+        }
+      }
+      return !stopPropagationTable.get(event);
+    }
+    function Listener(type, handler, capture) {
+      this.type = type;
+      this.handler = handler;
+      this.capture = Boolean(capture);
+    }
+    Listener.prototype = {
+      equals: function(that) {
+        return this.handler === that.handler && this.type === that.type && this.capture === that.capture;
+      },
+      get removed() {
+        return this.handler === null;
+      },
+      remove: function() {
+        this.handler = null;
+      }
+    };
+    var OriginalEvent = window.Event;
+    OriginalEvent.prototype.polymerBlackList_ = {
+      returnValue: true,
+      keyLocation: true
+    };
+    function Event(type, options) {
+      if (type instanceof OriginalEvent) {
+        var impl = type;
+        if (!OriginalBeforeUnloadEvent && impl.type === "beforeunload" && !(this instanceof BeforeUnloadEvent)) {
+          return new BeforeUnloadEvent(impl);
+        }
+        setWrapper(impl, this);
+      } else {
+        return wrap(constructEvent(OriginalEvent, "Event", type, options));
+      }
+    }
+    Event.prototype = {
+      get target() {
+        return targetTable.get(this);
+      },
+      get currentTarget() {
+        return currentTargetTable.get(this);
+      },
+      get eventPhase() {
+        return eventPhaseTable.get(this);
+      },
+      get path() {
+        var eventPath = eventPathTable.get(this);
+        if (!eventPath) return [];
+        return eventPath.slice();
+      },
+      stopPropagation: function() {
+        stopPropagationTable.set(this, true);
+      },
+      stopImmediatePropagation: function() {
+        stopPropagationTable.set(this, true);
+        stopImmediatePropagationTable.set(this, true);
+      }
+    };
+    registerWrapper(OriginalEvent, Event, document.createEvent("Event"));
+    function unwrapOptions(options) {
+      if (!options || !options.relatedTarget) return options;
+      return Object.create(options, {
+        relatedTarget: {
+          value: unwrap(options.relatedTarget)
+        }
+      });
+    }
+    function registerGenericEvent(name, SuperEvent, prototype) {
+      var OriginalEvent = window[name];
+      var GenericEvent = function(type, options) {
+        if (type instanceof OriginalEvent) setWrapper(type, this); else return wrap(constructEvent(OriginalEvent, name, type, options));
+      };
+      GenericEvent.prototype = Object.create(SuperEvent.prototype);
+      if (prototype) mixin(GenericEvent.prototype, prototype);
+      if (OriginalEvent) {
+        try {
+          registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent("temp"));
+        } catch (ex) {
+          registerWrapper(OriginalEvent, GenericEvent, document.createEvent(name));
+        }
+      }
+      return GenericEvent;
+    }
+    var UIEvent = registerGenericEvent("UIEvent", Event);
+    var CustomEvent = registerGenericEvent("CustomEvent", Event);
+    var relatedTargetProto = {
+      get relatedTarget() {
+        var relatedTarget = relatedTargetTable.get(this);
+        if (relatedTarget !== undefined) return relatedTarget;
+        return wrap(unwrap(this).relatedTarget);
+      }
+    };
+    function getInitFunction(name, relatedTargetIndex) {
+      return function() {
+        arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
+        var impl = unwrap(this);
+        impl[name].apply(impl, arguments);
+      };
+    }
+    var mouseEventProto = mixin({
+      initMouseEvent: getInitFunction("initMouseEvent", 14)
+    }, relatedTargetProto);
+    var focusEventProto = mixin({
+      initFocusEvent: getInitFunction("initFocusEvent", 5)
+    }, relatedTargetProto);
+    var MouseEvent = registerGenericEvent("MouseEvent", UIEvent, mouseEventProto);
+    var FocusEvent = registerGenericEvent("FocusEvent", UIEvent, focusEventProto);
+    var defaultInitDicts = Object.create(null);
+    var supportsEventConstructors = function() {
+      try {
+        new window.FocusEvent("focus");
+      } catch (ex) {
+        return false;
+      }
+      return true;
+    }();
+    function constructEvent(OriginalEvent, name, type, options) {
+      if (supportsEventConstructors) return new OriginalEvent(type, unwrapOptions(options));
+      var event = unwrap(document.createEvent(name));
+      var defaultDict = defaultInitDicts[name];
+      var args = [ type ];
+      Object.keys(defaultDict).forEach(function(key) {
+        var v = options != null && key in options ? options[key] : defaultDict[key];
+        if (key === "relatedTarget") v = unwrap(v);
+        args.push(v);
+      });
+      event["init" + name].apply(event, args);
+      return event;
+    }
+    if (!supportsEventConstructors) {
+      var configureEventConstructor = function(name, initDict, superName) {
+        if (superName) {
+          var superDict = defaultInitDicts[superName];
+          initDict = mixin(mixin({}, superDict), initDict);
+        }
+        defaultInitDicts[name] = initDict;
+      };
+      configureEventConstructor("Event", {
+        bubbles: false,
+        cancelable: false
+      });
+      configureEventConstructor("CustomEvent", {
+        detail: null
+      }, "Event");
+      configureEventConstructor("UIEvent", {
+        view: null,
+        detail: 0
+      }, "Event");
+      configureEventConstructor("MouseEvent", {
+        screenX: 0,
+        screenY: 0,
+        clientX: 0,
+        clientY: 0,
+        ctrlKey: false,
+        altKey: false,
+        shiftKey: false,
+        metaKey: false,
+        button: 0,
+        relatedTarget: null
+      }, "UIEvent");
+      configureEventConstructor("FocusEvent", {
+        relatedTarget: null
+      }, "UIEvent");
+    }
+    var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
+    function BeforeUnloadEvent(impl) {
+      Event.call(this, impl);
+    }
+    BeforeUnloadEvent.prototype = Object.create(Event.prototype);
+    mixin(BeforeUnloadEvent.prototype, {
+      get returnValue() {
+        return unsafeUnwrap(this).returnValue;
+      },
+      set returnValue(v) {
+        unsafeUnwrap(this).returnValue = v;
+      }
+    });
+    if (OriginalBeforeUnloadEvent) registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
+    function isValidListener(fun) {
+      if (typeof fun === "function") return true;
+      return fun && fun.handleEvent;
+    }
+    function isMutationEvent(type) {
+      switch (type) {
+       case "DOMAttrModified":
+       case "DOMAttributeNameChanged":
+       case "DOMCharacterDataModified":
+       case "DOMElementNameChanged":
+       case "DOMNodeInserted":
+       case "DOMNodeInsertedIntoDocument":
+       case "DOMNodeRemoved":
+       case "DOMNodeRemovedFromDocument":
+       case "DOMSubtreeModified":
+        return true;
+      }
+      return false;
+    }
+    var OriginalEventTarget = window.EventTarget;
+    function EventTarget(impl) {
+      setWrapper(impl, this);
+    }
+    var methodNames = [ "addEventListener", "removeEventListener", "dispatchEvent" ];
+    [ Node, Window ].forEach(function(constructor) {
+      var p = constructor.prototype;
+      methodNames.forEach(function(name) {
+        Object.defineProperty(p, name + "_", {
+          value: p[name]
+        });
+      });
+    });
+    function getTargetToListenAt(wrapper) {
+      if (wrapper instanceof wrappers.ShadowRoot) wrapper = wrapper.host;
+      return unwrap(wrapper);
+    }
+    EventTarget.prototype = {
+      addEventListener: function(type, fun, capture) {
+        if (!isValidListener(fun) || isMutationEvent(type)) return;
+        var listener = new Listener(type, fun, capture);
+        var listeners = listenersTable.get(this);
+        if (!listeners) {
+          listeners = [];
+          listeners.depth = 0;
+          listenersTable.set(this, listeners);
+        } else {
+          for (var i = 0; i < listeners.length; i++) {
+            if (listener.equals(listeners[i])) return;
+          }
+        }
+        listeners.push(listener);
+        var target = getTargetToListenAt(this);
+        target.addEventListener_(type, dispatchOriginalEvent, true);
+      },
+      removeEventListener: function(type, fun, capture) {
+        capture = Boolean(capture);
+        var listeners = listenersTable.get(this);
+        if (!listeners) return;
+        var count = 0, found = false;
+        for (var i = 0; i < listeners.length; i++) {
+          if (listeners[i].type === type && listeners[i].capture === capture) {
+            count++;
+            if (listeners[i].handler === fun) {
+              found = true;
+              listeners[i].remove();
+            }
+          }
+        }
+        if (found && count === 1) {
+          var target = getTargetToListenAt(this);
+          target.removeEventListener_(type, dispatchOriginalEvent, true);
+        }
+      },
+      dispatchEvent: function(event) {
+        var nativeEvent = unwrap(event);
+        var eventType = nativeEvent.type;
+        handledEventsTable.set(nativeEvent, false);
+        scope.renderAllPending();
+        var tempListener;
+        if (!hasListenerInAncestors(this, eventType)) {
+          tempListener = function() {};
+          this.addEventListener(eventType, tempListener, true);
+        }
+        try {
+          return unwrap(this).dispatchEvent_(nativeEvent);
+        } finally {
+          if (tempListener) this.removeEventListener(eventType, tempListener, true);
+        }
+      }
+    };
+    function hasListener(node, type) {
+      var listeners = listenersTable.get(node);
+      if (listeners) {
+        for (var i = 0; i < listeners.length; i++) {
+          if (!listeners[i].removed && listeners[i].type === type) return true;
+        }
+      }
+      return false;
+    }
+    function hasListenerInAncestors(target, type) {
+      for (var node = unwrap(target); node; node = node.parentNode) {
+        if (hasListener(wrap(node), type)) return true;
+      }
+      return false;
+    }
+    if (OriginalEventTarget) registerWrapper(OriginalEventTarget, EventTarget);
+    function wrapEventTargetMethods(constructors) {
+      forwardMethodsToWrapper(constructors, methodNames);
+    }
+    var originalElementFromPoint = document.elementFromPoint;
+    function elementFromPoint(self, document, x, y) {
+      scope.renderAllPending();
+      var element = wrap(originalElementFromPoint.call(unsafeUnwrap(document), x, y));
+      if (!element) return null;
+      var path = getEventPath(element, null);
+      var idx = path.lastIndexOf(self);
+      if (idx == -1) return null; else path = path.slice(0, idx);
+      return eventRetargetting(path, self);
+    }
+    function getEventHandlerGetter(name) {
+      return function() {
+        var inlineEventHandlers = eventHandlersTable.get(this);
+        return inlineEventHandlers && inlineEventHandlers[name] && inlineEventHandlers[name].value || null;
+      };
+    }
+    function getEventHandlerSetter(name) {
+      var eventType = name.slice(2);
+      return function(value) {
+        var inlineEventHandlers = eventHandlersTable.get(this);
+        if (!inlineEventHandlers) {
+          inlineEventHandlers = Object.create(null);
+          eventHandlersTable.set(this, inlineEventHandlers);
+        }
+        var old = inlineEventHandlers[name];
+        if (old) this.removeEventListener(eventType, old.wrapped, false);
+        if (typeof value === "function") {
+          var wrapped = function(e) {
+            var rv = value.call(this, e);
+            if (rv === false) e.preventDefault(); else if (name === "onbeforeunload" && typeof rv === "string") e.returnValue = rv;
+          };
+          this.addEventListener(eventType, wrapped, false);
+          inlineEventHandlers[name] = {
+            value: value,
+            wrapped: wrapped
+          };
+        }
+      };
+    }
+    scope.elementFromPoint = elementFromPoint;
+    scope.getEventHandlerGetter = getEventHandlerGetter;
+    scope.getEventHandlerSetter = getEventHandlerSetter;
+    scope.wrapEventTargetMethods = wrapEventTargetMethods;
+    scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
+    scope.wrappers.CustomEvent = CustomEvent;
+    scope.wrappers.Event = Event;
+    scope.wrappers.EventTarget = EventTarget;
+    scope.wrappers.FocusEvent = FocusEvent;
+    scope.wrappers.MouseEvent = MouseEvent;
+    scope.wrappers.UIEvent = UIEvent;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var UIEvent = scope.wrappers.UIEvent;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalTouchEvent = window.TouchEvent;
+    if (!OriginalTouchEvent) return;
+    var nativeEvent;
+    try {
+      nativeEvent = document.createEvent("TouchEvent");
+    } catch (ex) {
+      return;
+    }
+    var nonEnumDescriptor = {
+      enumerable: false
+    };
+    function nonEnum(obj, prop) {
+      Object.defineProperty(obj, prop, nonEnumDescriptor);
+    }
+    function Touch(impl) {
+      setWrapper(impl, this);
+    }
+    Touch.prototype = {
+      get target() {
+        return wrap(unsafeUnwrap(this).target);
+      }
+    };
+    var descr = {
+      configurable: true,
+      enumerable: true,
+      get: null
+    };
+    [ "clientX", "clientY", "screenX", "screenY", "pageX", "pageY", "identifier", "webkitRadiusX", "webkitRadiusY", "webkitRotationAngle", "webkitForce" ].forEach(function(name) {
+      descr.get = function() {
+        return unsafeUnwrap(this)[name];
+      };
+      Object.defineProperty(Touch.prototype, name, descr);
+    });
+    function TouchList() {
+      this.length = 0;
+      nonEnum(this, "length");
+    }
+    TouchList.prototype = {
+      item: function(index) {
+        return this[index];
+      }
+    };
+    function wrapTouchList(nativeTouchList) {
+      var list = new TouchList();
+      for (var i = 0; i < nativeTouchList.length; i++) {
+        list[i] = new Touch(nativeTouchList[i]);
+      }
+      list.length = i;
+      return list;
+    }
+    function TouchEvent(impl) {
+      UIEvent.call(this, impl);
+    }
+    TouchEvent.prototype = Object.create(UIEvent.prototype);
+    mixin(TouchEvent.prototype, {
+      get touches() {
+        return wrapTouchList(unsafeUnwrap(this).touches);
+      },
+      get targetTouches() {
+        return wrapTouchList(unsafeUnwrap(this).targetTouches);
+      },
+      get changedTouches() {
+        return wrapTouchList(unsafeUnwrap(this).changedTouches);
+      },
+      initTouchEvent: function() {
+        throw new Error("Not implemented");
+      }
+    });
+    registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
+    scope.wrappers.Touch = Touch;
+    scope.wrappers.TouchEvent = TouchEvent;
+    scope.wrappers.TouchList = TouchList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var nonEnumDescriptor = {
+      enumerable: false
+    };
+    function nonEnum(obj, prop) {
+      Object.defineProperty(obj, prop, nonEnumDescriptor);
+    }
+    function NodeList() {
+      this.length = 0;
+      nonEnum(this, "length");
+    }
+    NodeList.prototype = {
+      item: function(index) {
+        return this[index];
+      }
+    };
+    nonEnum(NodeList.prototype, "item");
+    function wrapNodeList(list) {
+      if (list == null) return list;
+      var wrapperList = new NodeList();
+      for (var i = 0, length = list.length; i < length; i++) {
+        wrapperList[i] = wrap(list[i]);
+      }
+      wrapperList.length = length;
+      return wrapperList;
+    }
+    function addWrapNodeListMethod(wrapperConstructor, name) {
+      wrapperConstructor.prototype[name] = function() {
+        return wrapNodeList(unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    scope.wrappers.NodeList = NodeList;
+    scope.addWrapNodeListMethod = addWrapNodeListMethod;
+    scope.wrapNodeList = wrapNodeList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    scope.wrapHTMLCollection = scope.wrapNodeList;
+    scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var NodeList = scope.wrappers.NodeList;
+    var TreeScope = scope.TreeScope;
+    var assert = scope.assert;
+    var defineWrapGetter = scope.defineWrapGetter;
+    var enqueueMutation = scope.enqueueMutation;
+    var getTreeScope = scope.getTreeScope;
+    var isWrapper = scope.isWrapper;
+    var mixin = scope.mixin;
+    var registerTransientObservers = scope.registerTransientObservers;
+    var registerWrapper = scope.registerWrapper;
+    var setTreeScope = scope.setTreeScope;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var wrapIfNeeded = scope.wrapIfNeeded;
+    var wrappers = scope.wrappers;
+    function assertIsNodeWrapper(node) {
+      assert(node instanceof Node);
+    }
+    function createOneElementNodeList(node) {
+      var nodes = new NodeList();
+      nodes[0] = node;
+      nodes.length = 1;
+      return nodes;
+    }
+    var surpressMutations = false;
+    function enqueueRemovalForInsertedNodes(node, parent, nodes) {
+      enqueueMutation(parent, "childList", {
+        removedNodes: nodes,
+        previousSibling: node.previousSibling,
+        nextSibling: node.nextSibling
+      });
+    }
+    function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
+      enqueueMutation(df, "childList", {
+        removedNodes: nodes
+      });
+    }
+    function collectNodes(node, parentNode, previousNode, nextNode) {
+      if (node instanceof DocumentFragment) {
+        var nodes = collectNodesForDocumentFragment(node);
+        surpressMutations = true;
+        for (var i = nodes.length - 1; i >= 0; i--) {
+          node.removeChild(nodes[i]);
+          nodes[i].parentNode_ = parentNode;
+        }
+        surpressMutations = false;
+        for (var i = 0; i < nodes.length; i++) {
+          nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
+          nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
+        }
+        if (previousNode) previousNode.nextSibling_ = nodes[0];
+        if (nextNode) nextNode.previousSibling_ = nodes[nodes.length - 1];
+        return nodes;
+      }
+      var nodes = createOneElementNodeList(node);
+      var oldParent = node.parentNode;
+      if (oldParent) {
+        oldParent.removeChild(node);
+      }
+      node.parentNode_ = parentNode;
+      node.previousSibling_ = previousNode;
+      node.nextSibling_ = nextNode;
+      if (previousNode) previousNode.nextSibling_ = node;
+      if (nextNode) nextNode.previousSibling_ = node;
+      return nodes;
+    }
+    function collectNodesNative(node) {
+      if (node instanceof DocumentFragment) return collectNodesForDocumentFragment(node);
+      var nodes = createOneElementNodeList(node);
+      var oldParent = node.parentNode;
+      if (oldParent) enqueueRemovalForInsertedNodes(node, oldParent, nodes);
+      return nodes;
+    }
+    function collectNodesForDocumentFragment(node) {
+      var nodes = new NodeList();
+      var i = 0;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        nodes[i++] = child;
+      }
+      nodes.length = i;
+      enqueueRemovalForInsertedDocumentFragment(node, nodes);
+      return nodes;
+    }
+    function snapshotNodeList(nodeList) {
+      return nodeList;
+    }
+    function nodeWasAdded(node, treeScope) {
+      setTreeScope(node, treeScope);
+      node.nodeIsInserted_();
+    }
+    function nodesWereAdded(nodes, parent) {
+      var treeScope = getTreeScope(parent);
+      for (var i = 0; i < nodes.length; i++) {
+        nodeWasAdded(nodes[i], treeScope);
+      }
+    }
+    function nodeWasRemoved(node) {
+      setTreeScope(node, new TreeScope(node, null));
+    }
+    function nodesWereRemoved(nodes) {
+      for (var i = 0; i < nodes.length; i++) {
+        nodeWasRemoved(nodes[i]);
+      }
+    }
+    function ensureSameOwnerDocument(parent, child) {
+      var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ? parent : parent.ownerDocument;
+      if (ownerDoc !== child.ownerDocument) ownerDoc.adoptNode(child);
+    }
+    function adoptNodesIfNeeded(owner, nodes) {
+      if (!nodes.length) return;
+      var ownerDoc = owner.ownerDocument;
+      if (ownerDoc === nodes[0].ownerDocument) return;
+      for (var i = 0; i < nodes.length; i++) {
+        scope.adoptNodeNoRemove(nodes[i], ownerDoc);
+      }
+    }
+    function unwrapNodesForInsertion(owner, nodes) {
+      adoptNodesIfNeeded(owner, nodes);
+      var length = nodes.length;
+      if (length === 1) return unwrap(nodes[0]);
+      var df = unwrap(owner.ownerDocument.createDocumentFragment());
+      for (var i = 0; i < length; i++) {
+        df.appendChild(unwrap(nodes[i]));
+      }
+      return df;
+    }
+    function clearChildNodes(wrapper) {
+      if (wrapper.firstChild_ !== undefined) {
+        var child = wrapper.firstChild_;
+        while (child) {
+          var tmp = child;
+          child = child.nextSibling_;
+          tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
+        }
+      }
+      wrapper.firstChild_ = wrapper.lastChild_ = undefined;
+    }
+    function removeAllChildNodes(wrapper) {
+      if (wrapper.invalidateShadowRenderer()) {
+        var childWrapper = wrapper.firstChild;
+        while (childWrapper) {
+          assert(childWrapper.parentNode === wrapper);
+          var nextSibling = childWrapper.nextSibling;
+          var childNode = unwrap(childWrapper);
+          var parentNode = childNode.parentNode;
+          if (parentNode) originalRemoveChild.call(parentNode, childNode);
+          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = null;
+          childWrapper = nextSibling;
+        }
+        wrapper.firstChild_ = wrapper.lastChild_ = null;
+      } else {
+        var node = unwrap(wrapper);
+        var child = node.firstChild;
+        var nextSibling;
+        while (child) {
+          nextSibling = child.nextSibling;
+          originalRemoveChild.call(node, child);
+          child = nextSibling;
+        }
+      }
+    }
+    function invalidateParent(node) {
+      var p = node.parentNode;
+      return p && p.invalidateShadowRenderer();
+    }
+    function cleanupNodes(nodes) {
+      for (var i = 0, n; i < nodes.length; i++) {
+        n = nodes[i];
+        n.parentNode.removeChild(n);
+      }
+    }
+    var originalImportNode = document.importNode;
+    var originalCloneNode = window.Node.prototype.cloneNode;
+    function cloneNode(node, deep, opt_doc) {
+      var clone;
+      if (opt_doc) clone = wrap(originalImportNode.call(opt_doc, unsafeUnwrap(node), false)); else clone = wrap(originalCloneNode.call(unsafeUnwrap(node), false));
+      if (deep) {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          clone.appendChild(cloneNode(child, true, opt_doc));
+        }
+        if (node instanceof wrappers.HTMLTemplateElement) {
+          var cloneContent = clone.content;
+          for (var child = node.content.firstChild; child; child = child.nextSibling) {
+            cloneContent.appendChild(cloneNode(child, true, opt_doc));
+          }
+        }
+      }
+      return clone;
+    }
+    function contains(self, child) {
+      if (!child || getTreeScope(self) !== getTreeScope(child)) return false;
+      for (var node = child; node; node = node.parentNode) {
+        if (node === self) return true;
+      }
+      return false;
+    }
+    var OriginalNode = window.Node;
+    function Node(original) {
+      assert(original instanceof OriginalNode);
+      EventTarget.call(this, original);
+      this.parentNode_ = undefined;
+      this.firstChild_ = undefined;
+      this.lastChild_ = undefined;
+      this.nextSibling_ = undefined;
+      this.previousSibling_ = undefined;
+      this.treeScope_ = undefined;
+    }
+    var OriginalDocumentFragment = window.DocumentFragment;
+    var originalAppendChild = OriginalNode.prototype.appendChild;
+    var originalCompareDocumentPosition = OriginalNode.prototype.compareDocumentPosition;
+    var originalInsertBefore = OriginalNode.prototype.insertBefore;
+    var originalRemoveChild = OriginalNode.prototype.removeChild;
+    var originalReplaceChild = OriginalNode.prototype.replaceChild;
+    var isIe = /Trident/.test(navigator.userAgent);
+    var removeChildOriginalHelper = isIe ? function(parent, child) {
+      try {
+        originalRemoveChild.call(parent, child);
+      } catch (ex) {
+        if (!(parent instanceof OriginalDocumentFragment)) throw ex;
+      }
+    } : function(parent, child) {
+      originalRemoveChild.call(parent, child);
+    };
+    Node.prototype = Object.create(EventTarget.prototype);
+    mixin(Node.prototype, {
+      appendChild: function(childWrapper) {
+        return this.insertBefore(childWrapper, null);
+      },
+      insertBefore: function(childWrapper, refWrapper) {
+        assertIsNodeWrapper(childWrapper);
+        var refNode;
+        if (refWrapper) {
+          if (isWrapper(refWrapper)) {
+            refNode = unwrap(refWrapper);
+          } else {
+            refNode = refWrapper;
+            refWrapper = wrap(refNode);
+          }
+        } else {
+          refWrapper = null;
+          refNode = null;
+        }
+        refWrapper && assert(refWrapper.parentNode === this);
+        var nodes;
+        var previousNode = refWrapper ? refWrapper.previousSibling : this.lastChild;
+        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(childWrapper);
+        if (useNative) nodes = collectNodesNative(childWrapper); else nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
+        if (useNative) {
+          ensureSameOwnerDocument(this, childWrapper);
+          clearChildNodes(this);
+          originalInsertBefore.call(unsafeUnwrap(this), unwrap(childWrapper), refNode);
+        } else {
+          if (!previousNode) this.firstChild_ = nodes[0];
+          if (!refWrapper) {
+            this.lastChild_ = nodes[nodes.length - 1];
+            if (this.firstChild_ === undefined) this.firstChild_ = this.firstChild;
+          }
+          var parentNode = refNode ? refNode.parentNode : unsafeUnwrap(this);
+          if (parentNode) {
+            originalInsertBefore.call(parentNode, unwrapNodesForInsertion(this, nodes), refNode);
+          } else {
+            adoptNodesIfNeeded(this, nodes);
+          }
+        }
+        enqueueMutation(this, "childList", {
+          addedNodes: nodes,
+          nextSibling: refWrapper,
+          previousSibling: previousNode
+        });
+        nodesWereAdded(nodes, this);
+        return childWrapper;
+      },
+      removeChild: function(childWrapper) {
+        assertIsNodeWrapper(childWrapper);
+        if (childWrapper.parentNode !== this) {
+          var found = false;
+          var childNodes = this.childNodes;
+          for (var ieChild = this.firstChild; ieChild; ieChild = ieChild.nextSibling) {
+            if (ieChild === childWrapper) {
+              found = true;
+              break;
+            }
+          }
+          if (!found) {
+            throw new Error("NotFoundError");
+          }
+        }
+        var childNode = unwrap(childWrapper);
+        var childWrapperNextSibling = childWrapper.nextSibling;
+        var childWrapperPreviousSibling = childWrapper.previousSibling;
+        if (this.invalidateShadowRenderer()) {
+          var thisFirstChild = this.firstChild;
+          var thisLastChild = this.lastChild;
+          var parentNode = childNode.parentNode;
+          if (parentNode) removeChildOriginalHelper(parentNode, childNode);
+          if (thisFirstChild === childWrapper) this.firstChild_ = childWrapperNextSibling;
+          if (thisLastChild === childWrapper) this.lastChild_ = childWrapperPreviousSibling;
+          if (childWrapperPreviousSibling) childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
+          if (childWrapperNextSibling) {
+            childWrapperNextSibling.previousSibling_ = childWrapperPreviousSibling;
+          }
+          childWrapper.previousSibling_ = childWrapper.nextSibling_ = childWrapper.parentNode_ = undefined;
+        } else {
+          clearChildNodes(this);
+          removeChildOriginalHelper(unsafeUnwrap(this), childNode);
+        }
+        if (!surpressMutations) {
+          enqueueMutation(this, "childList", {
+            removedNodes: createOneElementNodeList(childWrapper),
+            nextSibling: childWrapperNextSibling,
+            previousSibling: childWrapperPreviousSibling
+          });
+        }
+        registerTransientObservers(this, childWrapper);
+        return childWrapper;
+      },
+      replaceChild: function(newChildWrapper, oldChildWrapper) {
+        assertIsNodeWrapper(newChildWrapper);
+        var oldChildNode;
+        if (isWrapper(oldChildWrapper)) {
+          oldChildNode = unwrap(oldChildWrapper);
+        } else {
+          oldChildNode = oldChildWrapper;
+          oldChildWrapper = wrap(oldChildNode);
+        }
+        if (oldChildWrapper.parentNode !== this) {
+          throw new Error("NotFoundError");
+        }
+        var nextNode = oldChildWrapper.nextSibling;
+        var previousNode = oldChildWrapper.previousSibling;
+        var nodes;
+        var useNative = !this.invalidateShadowRenderer() && !invalidateParent(newChildWrapper);
+        if (useNative) {
+          nodes = collectNodesNative(newChildWrapper);
+        } else {
+          if (nextNode === newChildWrapper) nextNode = newChildWrapper.nextSibling;
+          nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
+        }
+        if (!useNative) {
+          if (this.firstChild === oldChildWrapper) this.firstChild_ = nodes[0];
+          if (this.lastChild === oldChildWrapper) this.lastChild_ = nodes[nodes.length - 1];
+          oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ = oldChildWrapper.parentNode_ = undefined;
+          if (oldChildNode.parentNode) {
+            originalReplaceChild.call(oldChildNode.parentNode, unwrapNodesForInsertion(this, nodes), oldChildNode);
+          }
+        } else {
+          ensureSameOwnerDocument(this, newChildWrapper);
+          clearChildNodes(this);
+          originalReplaceChild.call(unsafeUnwrap(this), unwrap(newChildWrapper), oldChildNode);
+        }
+        enqueueMutation(this, "childList", {
+          addedNodes: nodes,
+          removedNodes: createOneElementNodeList(oldChildWrapper),
+          nextSibling: nextNode,
+          previousSibling: previousNode
+        });
+        nodeWasRemoved(oldChildWrapper);
+        nodesWereAdded(nodes, this);
+        return oldChildWrapper;
+      },
+      nodeIsInserted_: function() {
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          child.nodeIsInserted_();
+        }
+      },
+      hasChildNodes: function() {
+        return this.firstChild !== null;
+      },
+      get parentNode() {
+        return this.parentNode_ !== undefined ? this.parentNode_ : wrap(unsafeUnwrap(this).parentNode);
+      },
+      get firstChild() {
+        return this.firstChild_ !== undefined ? this.firstChild_ : wrap(unsafeUnwrap(this).firstChild);
+      },
+      get lastChild() {
+        return this.lastChild_ !== undefined ? this.lastChild_ : wrap(unsafeUnwrap(this).lastChild);
+      },
+      get nextSibling() {
+        return this.nextSibling_ !== undefined ? this.nextSibling_ : wrap(unsafeUnwrap(this).nextSibling);
+      },
+      get previousSibling() {
+        return this.previousSibling_ !== undefined ? this.previousSibling_ : wrap(unsafeUnwrap(this).previousSibling);
+      },
+      get parentElement() {
+        var p = this.parentNode;
+        while (p && p.nodeType !== Node.ELEMENT_NODE) {
+          p = p.parentNode;
+        }
+        return p;
+      },
+      get textContent() {
+        var s = "";
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          if (child.nodeType != Node.COMMENT_NODE) {
+            s += child.textContent;
+          }
+        }
+        return s;
+      },
+      set textContent(textContent) {
+        if (textContent == null) textContent = "";
+        var removedNodes = snapshotNodeList(this.childNodes);
+        if (this.invalidateShadowRenderer()) {
+          removeAllChildNodes(this);
+          if (textContent !== "") {
+            var textNode = unsafeUnwrap(this).ownerDocument.createTextNode(textContent);
+            this.appendChild(textNode);
+          }
+        } else {
+          clearChildNodes(this);
+          unsafeUnwrap(this).textContent = textContent;
+        }
+        var addedNodes = snapshotNodeList(this.childNodes);
+        enqueueMutation(this, "childList", {
+          addedNodes: addedNodes,
+          removedNodes: removedNodes
+        });
+        nodesWereRemoved(removedNodes);
+        nodesWereAdded(addedNodes, this);
+      },
+      get childNodes() {
+        var wrapperList = new NodeList();
+        var i = 0;
+        for (var child = this.firstChild; child; child = child.nextSibling) {
+          wrapperList[i++] = child;
+        }
+        wrapperList.length = i;
+        return wrapperList;
+      },
+      cloneNode: function(deep) {
+        return cloneNode(this, deep);
+      },
+      contains: function(child) {
+        return contains(this, wrapIfNeeded(child));
+      },
+      compareDocumentPosition: function(otherNode) {
+        return originalCompareDocumentPosition.call(unsafeUnwrap(this), unwrapIfNeeded(otherNode));
+      },
+      normalize: function() {
+        var nodes = snapshotNodeList(this.childNodes);
+        var remNodes = [];
+        var s = "";
+        var modNode;
+        for (var i = 0, n; i < nodes.length; i++) {
+          n = nodes[i];
+          if (n.nodeType === Node.TEXT_NODE) {
+            if (!modNode && !n.data.length) this.removeNode(n); else if (!modNode) modNode = n; else {
+              s += n.data;
+              remNodes.push(n);
+            }
+          } else {
+            if (modNode && remNodes.length) {
+              modNode.data += s;
+              cleanupNodes(remNodes);
+            }
+            remNodes = [];
+            s = "";
+            modNode = null;
+            if (n.childNodes.length) n.normalize();
+          }
+        }
+        if (modNode && remNodes.length) {
+          modNode.data += s;
+          cleanupNodes(remNodes);
+        }
+      }
+    });
+    defineWrapGetter(Node, "ownerDocument");
+    registerWrapper(OriginalNode, Node, document.createDocumentFragment());
+    delete Node.prototype.querySelector;
+    delete Node.prototype.querySelectorAll;
+    Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
+    scope.cloneNode = cloneNode;
+    scope.nodeWasAdded = nodeWasAdded;
+    scope.nodeWasRemoved = nodeWasRemoved;
+    scope.nodesWereAdded = nodesWereAdded;
+    scope.nodesWereRemoved = nodesWereRemoved;
+    scope.originalInsertBefore = originalInsertBefore;
+    scope.originalRemoveChild = originalRemoveChild;
+    scope.snapshotNodeList = snapshotNodeList;
+    scope.wrappers.Node = Node;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLCollection = scope.wrappers.HTMLCollection;
+    var NodeList = scope.wrappers.NodeList;
+    var getTreeScope = scope.getTreeScope;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var originalDocumentQuerySelector = document.querySelector;
+    var originalElementQuerySelector = document.documentElement.querySelector;
+    var originalDocumentQuerySelectorAll = document.querySelectorAll;
+    var originalElementQuerySelectorAll = document.documentElement.querySelectorAll;
+    var originalDocumentGetElementsByTagName = document.getElementsByTagName;
+    var originalElementGetElementsByTagName = document.documentElement.getElementsByTagName;
+    var originalDocumentGetElementsByTagNameNS = document.getElementsByTagNameNS;
+    var originalElementGetElementsByTagNameNS = document.documentElement.getElementsByTagNameNS;
+    var OriginalElement = window.Element;
+    var OriginalDocument = window.HTMLDocument || window.Document;
+    function filterNodeList(list, index, result, deep) {
+      var wrappedItem = null;
+      var root = null;
+      for (var i = 0, length = list.length; i < length; i++) {
+        wrappedItem = wrap(list[i]);
+        if (!deep && (root = getTreeScope(wrappedItem).root)) {
+          if (root instanceof scope.wrappers.ShadowRoot) {
+            continue;
+          }
+        }
+        result[index++] = wrappedItem;
+      }
+      return index;
+    }
+    function shimSelector(selector) {
+      return String(selector).replace(/\/deep\//g, " ");
+    }
+    function findOne(node, selector) {
+      var m, el = node.firstElementChild;
+      while (el) {
+        if (el.matches(selector)) return el;
+        m = findOne(el, selector);
+        if (m) return m;
+        el = el.nextElementSibling;
+      }
+      return null;
+    }
+    function matchesSelector(el, selector) {
+      return el.matches(selector);
+    }
+    var XHTML_NS = "http://www.w3.org/1999/xhtml";
+    function matchesTagName(el, localName, localNameLowerCase) {
+      var ln = el.localName;
+      return ln === localName || ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
+    }
+    function matchesEveryThing() {
+      return true;
+    }
+    function matchesLocalNameOnly(el, ns, localName) {
+      return el.localName === localName;
+    }
+    function matchesNameSpace(el, ns) {
+      return el.namespaceURI === ns;
+    }
+    function matchesLocalNameNS(el, ns, localName) {
+      return el.namespaceURI === ns && el.localName === localName;
+    }
+    function findElements(node, index, result, p, arg0, arg1) {
+      var el = node.firstElementChild;
+      while (el) {
+        if (p(el, arg0, arg1)) result[index++] = el;
+        index = findElements(el, index, result, p, arg0, arg1);
+        el = el.nextElementSibling;
+      }
+      return index;
+    }
+    function querySelectorAllFiltered(p, index, result, selector, deep) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, selector, null);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementQuerySelectorAll.call(target, selector);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentQuerySelectorAll.call(target, selector);
+      } else {
+        return findElements(this, index, result, p, selector, null);
+      }
+      return filterNodeList(list, index, result, deep);
+    }
+    var SelectorsInterface = {
+      querySelector: function(selector) {
+        var shimmed = shimSelector(selector);
+        var deep = shimmed !== selector;
+        selector = shimmed;
+        var target = unsafeUnwrap(this);
+        var wrappedItem;
+        var root = getTreeScope(this).root;
+        if (root instanceof scope.wrappers.ShadowRoot) {
+          return findOne(this, selector);
+        } else if (target instanceof OriginalElement) {
+          wrappedItem = wrap(originalElementQuerySelector.call(target, selector));
+        } else if (target instanceof OriginalDocument) {
+          wrappedItem = wrap(originalDocumentQuerySelector.call(target, selector));
+        } else {
+          return findOne(this, selector);
+        }
+        if (!wrappedItem) {
+          return wrappedItem;
+        } else if (!deep && (root = getTreeScope(wrappedItem).root)) {
+          if (root instanceof scope.wrappers.ShadowRoot) {
+            return findOne(this, selector);
+          }
+        }
+        return wrappedItem;
+      },
+      querySelectorAll: function(selector) {
+        var shimmed = shimSelector(selector);
+        var deep = shimmed !== selector;
+        selector = shimmed;
+        var result = new NodeList();
+        result.length = querySelectorAllFiltered.call(this, matchesSelector, 0, result, selector, deep);
+        return result;
+      }
+    };
+    function getElementsByTagNameFiltered(p, index, result, localName, lowercase) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, localName, lowercase);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementGetElementsByTagName.call(target, localName, lowercase);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentGetElementsByTagName.call(target, localName, lowercase);
+      } else {
+        return findElements(this, index, result, p, localName, lowercase);
+      }
+      return filterNodeList(list, index, result, false);
+    }
+    function getElementsByTagNameNSFiltered(p, index, result, ns, localName) {
+      var target = unsafeUnwrap(this);
+      var list;
+      var root = getTreeScope(this).root;
+      if (root instanceof scope.wrappers.ShadowRoot) {
+        return findElements(this, index, result, p, ns, localName);
+      } else if (target instanceof OriginalElement) {
+        list = originalElementGetElementsByTagNameNS.call(target, ns, localName);
+      } else if (target instanceof OriginalDocument) {
+        list = originalDocumentGetElementsByTagNameNS.call(target, ns, localName);
+      } else {
+        return findElements(this, index, result, p, ns, localName);
+      }
+      return filterNodeList(list, index, result, false);
+    }
+    var GetElementsByInterface = {
+      getElementsByTagName: function(localName) {
+        var result = new HTMLCollection();
+        var match = localName === "*" ? matchesEveryThing : matchesTagName;
+        result.length = getElementsByTagNameFiltered.call(this, match, 0, result, localName, localName.toLowerCase());
+        return result;
+      },
+      getElementsByClassName: function(className) {
+        return this.querySelectorAll("." + className);
+      },
+      getElementsByTagNameNS: function(ns, localName) {
+        var result = new HTMLCollection();
+        var match = null;
+        if (ns === "*") {
+          match = localName === "*" ? matchesEveryThing : matchesLocalNameOnly;
+        } else {
+          match = localName === "*" ? matchesNameSpace : matchesLocalNameNS;
+        }
+        result.length = getElementsByTagNameNSFiltered.call(this, match, 0, result, ns || null, localName);
+        return result;
+      }
+    };
+    scope.GetElementsByInterface = GetElementsByInterface;
+    scope.SelectorsInterface = SelectorsInterface;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var NodeList = scope.wrappers.NodeList;
+    function forwardElement(node) {
+      while (node && node.nodeType !== Node.ELEMENT_NODE) {
+        node = node.nextSibling;
+      }
+      return node;
+    }
+    function backwardsElement(node) {
+      while (node && node.nodeType !== Node.ELEMENT_NODE) {
+        node = node.previousSibling;
+      }
+      return node;
+    }
+    var ParentNodeInterface = {
+      get firstElementChild() {
+        return forwardElement(this.firstChild);
+      },
+      get lastElementChild() {
+        return backwardsElement(this.lastChild);
+      },
+      get childElementCount() {
+        var count = 0;
+        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
+          count++;
+        }
+        return count;
+      },
+      get children() {
+        var wrapperList = new NodeList();
+        var i = 0;
+        for (var child = this.firstElementChild; child; child = child.nextElementSibling) {
+          wrapperList[i++] = child;
+        }
+        wrapperList.length = i;
+        return wrapperList;
+      },
+      remove: function() {
+        var p = this.parentNode;
+        if (p) p.removeChild(this);
+      }
+    };
+    var ChildNodeInterface = {
+      get nextElementSibling() {
+        return forwardElement(this.nextSibling);
+      },
+      get previousElementSibling() {
+        return backwardsElement(this.previousSibling);
+      }
+    };
+    scope.ChildNodeInterface = ChildNodeInterface;
+    scope.ParentNodeInterface = ParentNodeInterface;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var ChildNodeInterface = scope.ChildNodeInterface;
+    var Node = scope.wrappers.Node;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var OriginalCharacterData = window.CharacterData;
+    function CharacterData(node) {
+      Node.call(this, node);
+    }
+    CharacterData.prototype = Object.create(Node.prototype);
+    mixin(CharacterData.prototype, {
+      get textContent() {
+        return this.data;
+      },
+      set textContent(value) {
+        this.data = value;
+      },
+      get data() {
+        return unsafeUnwrap(this).data;
+      },
+      set data(value) {
+        var oldValue = unsafeUnwrap(this).data;
+        enqueueMutation(this, "characterData", {
+          oldValue: oldValue
+        });
+        unsafeUnwrap(this).data = value;
+      }
+    });
+    mixin(CharacterData.prototype, ChildNodeInterface);
+    registerWrapper(OriginalCharacterData, CharacterData, document.createTextNode(""));
+    scope.wrappers.CharacterData = CharacterData;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var CharacterData = scope.wrappers.CharacterData;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    function toUInt32(x) {
+      return x >>> 0;
+    }
+    var OriginalText = window.Text;
+    function Text(node) {
+      CharacterData.call(this, node);
+    }
+    Text.prototype = Object.create(CharacterData.prototype);
+    mixin(Text.prototype, {
+      splitText: function(offset) {
+        offset = toUInt32(offset);
+        var s = this.data;
+        if (offset > s.length) throw new Error("IndexSizeError");
+        var head = s.slice(0, offset);
+        var tail = s.slice(offset);
+        this.data = head;
+        var newTextNode = this.ownerDocument.createTextNode(tail);
+        if (this.parentNode) this.parentNode.insertBefore(newTextNode, this.nextSibling);
+        return newTextNode;
+      }
+    });
+    registerWrapper(OriginalText, Text, document.createTextNode(""));
+    scope.wrappers.Text = Text;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    function invalidateClass(el) {
+      scope.invalidateRendererBasedOnAttribute(el, "class");
+    }
+    function DOMTokenList(impl, ownerElement) {
+      setWrapper(impl, this);
+      this.ownerElement_ = ownerElement;
+    }
+    DOMTokenList.prototype = {
+      constructor: DOMTokenList,
+      get length() {
+        return unsafeUnwrap(this).length;
+      },
+      item: function(index) {
+        return unsafeUnwrap(this).item(index);
+      },
+      contains: function(token) {
+        return unsafeUnwrap(this).contains(token);
+      },
+      add: function() {
+        unsafeUnwrap(this).add.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+      },
+      remove: function() {
+        unsafeUnwrap(this).remove.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+      },
+      toggle: function(token) {
+        var rv = unsafeUnwrap(this).toggle.apply(unsafeUnwrap(this), arguments);
+        invalidateClass(this.ownerElement_);
+        return rv;
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    scope.wrappers.DOMTokenList = DOMTokenList;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var ChildNodeInterface = scope.ChildNodeInterface;
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var Node = scope.wrappers.Node;
+    var DOMTokenList = scope.wrappers.DOMTokenList;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var addWrapNodeListMethod = scope.addWrapNodeListMethod;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var oneOf = scope.oneOf;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrappers = scope.wrappers;
+    var OriginalElement = window.Element;
+    var matchesNames = [ "matches", "mozMatchesSelector", "msMatchesSelector", "webkitMatchesSelector" ].filter(function(name) {
+      return OriginalElement.prototype[name];
+    });
+    var matchesName = matchesNames[0];
+    var originalMatches = OriginalElement.prototype[matchesName];
+    function invalidateRendererBasedOnAttribute(element, name) {
+      var p = element.parentNode;
+      if (!p || !p.shadowRoot) return;
+      var renderer = scope.getRendererForHost(p);
+      if (renderer.dependsOnAttribute(name)) renderer.invalidate();
+    }
+    function enqueAttributeChange(element, name, oldValue) {
+      enqueueMutation(element, "attributes", {
+        name: name,
+        namespace: null,
+        oldValue: oldValue
+      });
+    }
+    var classListTable = new WeakMap();
+    function Element(node) {
+      Node.call(this, node);
+    }
+    Element.prototype = Object.create(Node.prototype);
+    mixin(Element.prototype, {
+      createShadowRoot: function() {
+        var newShadowRoot = new wrappers.ShadowRoot(this);
+        unsafeUnwrap(this).polymerShadowRoot_ = newShadowRoot;
+        var renderer = scope.getRendererForHost(this);
+        renderer.invalidate();
+        return newShadowRoot;
+      },
+      get shadowRoot() {
+        return unsafeUnwrap(this).polymerShadowRoot_ || null;
+      },
+      setAttribute: function(name, value) {
+        var oldValue = unsafeUnwrap(this).getAttribute(name);
+        unsafeUnwrap(this).setAttribute(name, value);
+        enqueAttributeChange(this, name, oldValue);
+        invalidateRendererBasedOnAttribute(this, name);
+      },
+      removeAttribute: function(name) {
+        var oldValue = unsafeUnwrap(this).getAttribute(name);
+        unsafeUnwrap(this).removeAttribute(name);
+        enqueAttributeChange(this, name, oldValue);
+        invalidateRendererBasedOnAttribute(this, name);
+      },
+      matches: function(selector) {
+        return originalMatches.call(unsafeUnwrap(this), selector);
+      },
+      get classList() {
+        var list = classListTable.get(this);
+        if (!list) {
+          classListTable.set(this, list = new DOMTokenList(unsafeUnwrap(this).classList, this));
+        }
+        return list;
+      },
+      get className() {
+        return unsafeUnwrap(this).className;
+      },
+      set className(v) {
+        this.setAttribute("class", v);
+      },
+      get id() {
+        return unsafeUnwrap(this).id;
+      },
+      set id(v) {
+        this.setAttribute("id", v);
+      }
+    });
+    matchesNames.forEach(function(name) {
+      if (name !== "matches") {
+        Element.prototype[name] = function(selector) {
+          return this.matches(selector);
+        };
+      }
+    });
+    if (OriginalElement.prototype.webkitCreateShadowRoot) {
+      Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
+    }
+    mixin(Element.prototype, ChildNodeInterface);
+    mixin(Element.prototype, GetElementsByInterface);
+    mixin(Element.prototype, ParentNodeInterface);
+    mixin(Element.prototype, SelectorsInterface);
+    registerWrapper(OriginalElement, Element, document.createElementNS(null, "x"));
+    scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
+    scope.matchesNames = matchesNames;
+    scope.wrappers.Element = Element;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var defineGetter = scope.defineGetter;
+    var enqueueMutation = scope.enqueueMutation;
+    var mixin = scope.mixin;
+    var nodesWereAdded = scope.nodesWereAdded;
+    var nodesWereRemoved = scope.nodesWereRemoved;
+    var registerWrapper = scope.registerWrapper;
+    var snapshotNodeList = scope.snapshotNodeList;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrappers = scope.wrappers;
+    var escapeAttrRegExp = /[&\u00A0"]/g;
+    var escapeDataRegExp = /[&\u00A0<>]/g;
+    function escapeReplace(c) {
+      switch (c) {
+       case "&":
+        return "&amp;";
+
+       case "<":
+        return "&lt;";
+
+       case ">":
+        return "&gt;";
+
+       case '"':
+        return "&quot;";
+
+       case " ":
+        return "&nbsp;";
+      }
+    }
+    function escapeAttr(s) {
+      return s.replace(escapeAttrRegExp, escapeReplace);
+    }
+    function escapeData(s) {
+      return s.replace(escapeDataRegExp, escapeReplace);
+    }
+    function makeSet(arr) {
+      var set = {};
+      for (var i = 0; i < arr.length; i++) {
+        set[arr[i]] = true;
+      }
+      return set;
+    }
+    var voidElements = makeSet([ "area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr" ]);
+    var plaintextParents = makeSet([ "style", "script", "xmp", "iframe", "noembed", "noframes", "plaintext", "noscript" ]);
+    function getOuterHTML(node, parentNode) {
+      switch (node.nodeType) {
+       case Node.ELEMENT_NODE:
+        var tagName = node.tagName.toLowerCase();
+        var s = "<" + tagName;
+        var attrs = node.attributes;
+        for (var i = 0, attr; attr = attrs[i]; i++) {
+          s += " " + attr.name + '="' + escapeAttr(attr.value) + '"';
+        }
+        s += ">";
+        if (voidElements[tagName]) return s;
+        return s + getInnerHTML(node) + "</" + tagName + ">";
+
+       case Node.TEXT_NODE:
+        var data = node.data;
+        if (parentNode && plaintextParents[parentNode.localName]) return data;
+        return escapeData(data);
+
+       case Node.COMMENT_NODE:
+        return "<!--" + node.data + "-->";
+
+       default:
+        console.error(node);
+        throw new Error("not implemented");
+      }
+    }
+    function getInnerHTML(node) {
+      if (node instanceof wrappers.HTMLTemplateElement) node = node.content;
+      var s = "";
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        s += getOuterHTML(child, node);
+      }
+      return s;
+    }
+    function setInnerHTML(node, value, opt_tagName) {
+      var tagName = opt_tagName || "div";
+      node.textContent = "";
+      var tempElement = unwrap(node.ownerDocument.createElement(tagName));
+      tempElement.innerHTML = value;
+      var firstChild;
+      while (firstChild = tempElement.firstChild) {
+        node.appendChild(wrap(firstChild));
+      }
+    }
+    var oldIe = /MSIE/.test(navigator.userAgent);
+    var OriginalHTMLElement = window.HTMLElement;
+    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+    function HTMLElement(node) {
+      Element.call(this, node);
+    }
+    HTMLElement.prototype = Object.create(Element.prototype);
+    mixin(HTMLElement.prototype, {
+      get innerHTML() {
+        return getInnerHTML(this);
+      },
+      set innerHTML(value) {
+        if (oldIe && plaintextParents[this.localName]) {
+          this.textContent = value;
+          return;
+        }
+        var removedNodes = snapshotNodeList(this.childNodes);
+        if (this.invalidateShadowRenderer()) {
+          if (this instanceof wrappers.HTMLTemplateElement) setInnerHTML(this.content, value); else setInnerHTML(this, value, this.tagName);
+        } else if (!OriginalHTMLTemplateElement && this instanceof wrappers.HTMLTemplateElement) {
+          setInnerHTML(this.content, value);
+        } else {
+          unsafeUnwrap(this).innerHTML = value;
+        }
+        var addedNodes = snapshotNodeList(this.childNodes);
+        enqueueMutation(this, "childList", {
+          addedNodes: addedNodes,
+          removedNodes: removedNodes
+        });
+        nodesWereRemoved(removedNodes);
+        nodesWereAdded(addedNodes, this);
+      },
+      get outerHTML() {
+        return getOuterHTML(this, this.parentNode);
+      },
+      set outerHTML(value) {
+        var p = this.parentNode;
+        if (p) {
+          p.invalidateShadowRenderer();
+          var df = frag(p, value);
+          p.replaceChild(df, this);
+        }
+      },
+      insertAdjacentHTML: function(position, text) {
+        var contextElement, refNode;
+        switch (String(position).toLowerCase()) {
+         case "beforebegin":
+          contextElement = this.parentNode;
+          refNode = this;
+          break;
+
+         case "afterend":
+          contextElement = this.parentNode;
+          refNode = this.nextSibling;
+          break;
+
+         case "afterbegin":
+          contextElement = this;
+          refNode = this.firstChild;
+          break;
+
+         case "beforeend":
+          contextElement = this;
+          refNode = null;
+          break;
+
+         default:
+          return;
+        }
+        var df = frag(contextElement, text);
+        contextElement.insertBefore(df, refNode);
+      },
+      get hidden() {
+        return this.hasAttribute("hidden");
+      },
+      set hidden(v) {
+        if (v) {
+          this.setAttribute("hidden", "");
+        } else {
+          this.removeAttribute("hidden");
+        }
+      }
+    });
+    function frag(contextElement, html) {
+      var p = unwrap(contextElement.cloneNode(false));
+      p.innerHTML = html;
+      var df = unwrap(document.createDocumentFragment());
+      var c;
+      while (c = p.firstChild) {
+        df.appendChild(c);
+      }
+      return wrap(df);
+    }
+    function getter(name) {
+      return function() {
+        scope.renderAllPending();
+        return unsafeUnwrap(this)[name];
+      };
+    }
+    function getterRequiresRendering(name) {
+      defineGetter(HTMLElement, name, getter(name));
+    }
+    [ "clientHeight", "clientLeft", "clientTop", "clientWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetWidth", "scrollHeight", "scrollWidth" ].forEach(getterRequiresRendering);
+    function getterAndSetterRequiresRendering(name) {
+      Object.defineProperty(HTMLElement.prototype, name, {
+        get: getter(name),
+        set: function(v) {
+          scope.renderAllPending();
+          unsafeUnwrap(this)[name] = v;
+        },
+        configurable: true,
+        enumerable: true
+      });
+    }
+    [ "scrollLeft", "scrollTop" ].forEach(getterAndSetterRequiresRendering);
+    function methodRequiresRendering(name) {
+      Object.defineProperty(HTMLElement.prototype, name, {
+        value: function() {
+          scope.renderAllPending();
+          return unsafeUnwrap(this)[name].apply(unsafeUnwrap(this), arguments);
+        },
+        configurable: true,
+        enumerable: true
+      });
+    }
+    [ "getBoundingClientRect", "getClientRects", "scrollIntoView" ].forEach(methodRequiresRendering);
+    registerWrapper(OriginalHTMLElement, HTMLElement, document.createElement("b"));
+    scope.wrappers.HTMLElement = HTMLElement;
+    scope.getInnerHTML = getInnerHTML;
+    scope.setInnerHTML = setInnerHTML;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
+    function HTMLCanvasElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLCanvasElement.prototype, {
+      getContext: function() {
+        var context = unsafeUnwrap(this).getContext.apply(unsafeUnwrap(this), arguments);
+        return context && wrap(context);
+      }
+    });
+    registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement, document.createElement("canvas"));
+    scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLContentElement = window.HTMLContentElement;
+    function HTMLContentElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLContentElement.prototype, {
+      constructor: HTMLContentElement,
+      get select() {
+        return this.getAttribute("select");
+      },
+      set select(value) {
+        this.setAttribute("select", value);
+      },
+      setAttribute: function(n, v) {
+        HTMLElement.prototype.setAttribute.call(this, n, v);
+        if (String(n).toLowerCase() === "select") this.invalidateShadowRenderer(true);
+      }
+    });
+    if (OriginalHTMLContentElement) registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
+    scope.wrappers.HTMLContentElement = HTMLContentElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var OriginalHTMLFormElement = window.HTMLFormElement;
+    function HTMLFormElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLFormElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLFormElement.prototype, {
+      get elements() {
+        return wrapHTMLCollection(unwrap(this).elements);
+      }
+    });
+    registerWrapper(OriginalHTMLFormElement, HTMLFormElement, document.createElement("form"));
+    scope.wrappers.HTMLFormElement = HTMLFormElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var rewrap = scope.rewrap;
+    var OriginalHTMLImageElement = window.HTMLImageElement;
+    function HTMLImageElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLImageElement, HTMLImageElement, document.createElement("img"));
+    function Image(width, height) {
+      if (!(this instanceof Image)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("img"));
+      HTMLElement.call(this, node);
+      rewrap(node, this);
+      if (width !== undefined) node.width = width;
+      if (height !== undefined) node.height = height;
+    }
+    Image.prototype = HTMLImageElement.prototype;
+    scope.wrappers.HTMLImageElement = HTMLImageElement;
+    scope.wrappers.Image = Image;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var NodeList = scope.wrappers.NodeList;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLShadowElement = window.HTMLShadowElement;
+    function HTMLShadowElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
+    HTMLShadowElement.prototype.constructor = HTMLShadowElement;
+    if (OriginalHTMLShadowElement) registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
+    scope.wrappers.HTMLShadowElement = HTMLShadowElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var contentTable = new WeakMap();
+    var templateContentsOwnerTable = new WeakMap();
+    function getTemplateContentsOwner(doc) {
+      if (!doc.defaultView) return doc;
+      var d = templateContentsOwnerTable.get(doc);
+      if (!d) {
+        d = doc.implementation.createHTMLDocument("");
+        while (d.lastChild) {
+          d.removeChild(d.lastChild);
+        }
+        templateContentsOwnerTable.set(doc, d);
+      }
+      return d;
+    }
+    function extractContent(templateElement) {
+      var doc = getTemplateContentsOwner(templateElement.ownerDocument);
+      var df = unwrap(doc.createDocumentFragment());
+      var child;
+      while (child = templateElement.firstChild) {
+        df.appendChild(child);
+      }
+      return df;
+    }
+    var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+    function HTMLTemplateElement(node) {
+      HTMLElement.call(this, node);
+      if (!OriginalHTMLTemplateElement) {
+        var content = extractContent(node);
+        contentTable.set(this, wrap(content));
+      }
+    }
+    HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTemplateElement.prototype, {
+      constructor: HTMLTemplateElement,
+      get content() {
+        if (OriginalHTMLTemplateElement) return wrap(unsafeUnwrap(this).content);
+        return contentTable.get(this);
+      }
+    });
+    if (OriginalHTMLTemplateElement) registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
+    scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLMediaElement = window.HTMLMediaElement;
+    if (!OriginalHTMLMediaElement) return;
+    function HTMLMediaElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement, document.createElement("audio"));
+    scope.wrappers.HTMLMediaElement = HTMLMediaElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var rewrap = scope.rewrap;
+    var OriginalHTMLAudioElement = window.HTMLAudioElement;
+    if (!OriginalHTMLAudioElement) return;
+    function HTMLAudioElement(node) {
+      HTMLMediaElement.call(this, node);
+    }
+    HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
+    registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement, document.createElement("audio"));
+    function Audio(src) {
+      if (!(this instanceof Audio)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("audio"));
+      HTMLMediaElement.call(this, node);
+      rewrap(node, this);
+      node.setAttribute("preload", "auto");
+      if (src !== undefined) node.setAttribute("src", src);
+    }
+    Audio.prototype = HTMLAudioElement.prototype;
+    scope.wrappers.HTMLAudioElement = HTMLAudioElement;
+    scope.wrappers.Audio = Audio;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var rewrap = scope.rewrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLOptionElement = window.HTMLOptionElement;
+    function trimText(s) {
+      return s.replace(/\s+/g, " ").trim();
+    }
+    function HTMLOptionElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLOptionElement.prototype, {
+      get text() {
+        return trimText(this.textContent);
+      },
+      set text(value) {
+        this.textContent = trimText(String(value));
+      },
+      get form() {
+        return wrap(unwrap(this).form);
+      }
+    });
+    registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement, document.createElement("option"));
+    function Option(text, value, defaultSelected, selected) {
+      if (!(this instanceof Option)) {
+        throw new TypeError("DOM object constructor cannot be called as a function.");
+      }
+      var node = unwrap(document.createElement("option"));
+      HTMLElement.call(this, node);
+      rewrap(node, this);
+      if (text !== undefined) node.text = text;
+      if (value !== undefined) node.setAttribute("value", value);
+      if (defaultSelected === true) node.setAttribute("selected", "");
+      node.selected = selected === true;
+    }
+    Option.prototype = HTMLOptionElement.prototype;
+    scope.wrappers.HTMLOptionElement = HTMLOptionElement;
+    scope.wrappers.Option = Option;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLSelectElement = window.HTMLSelectElement;
+    function HTMLSelectElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLSelectElement.prototype, {
+      add: function(element, before) {
+        if (typeof before === "object") before = unwrap(before);
+        unwrap(this).add(unwrap(element), before);
+      },
+      remove: function(indexOrNode) {
+        if (indexOrNode === undefined) {
+          HTMLElement.prototype.remove.call(this);
+          return;
+        }
+        if (typeof indexOrNode === "object") indexOrNode = unwrap(indexOrNode);
+        unwrap(this).remove(indexOrNode);
+      },
+      get form() {
+        return wrap(unwrap(this).form);
+      }
+    });
+    registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement, document.createElement("select"));
+    scope.wrappers.HTMLSelectElement = HTMLSelectElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var OriginalHTMLTableElement = window.HTMLTableElement;
+    function HTMLTableElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableElement.prototype, {
+      get caption() {
+        return wrap(unwrap(this).caption);
+      },
+      createCaption: function() {
+        return wrap(unwrap(this).createCaption());
+      },
+      get tHead() {
+        return wrap(unwrap(this).tHead);
+      },
+      createTHead: function() {
+        return wrap(unwrap(this).createTHead());
+      },
+      createTFoot: function() {
+        return wrap(unwrap(this).createTFoot());
+      },
+      get tFoot() {
+        return wrap(unwrap(this).tFoot);
+      },
+      get tBodies() {
+        return wrapHTMLCollection(unwrap(this).tBodies);
+      },
+      createTBody: function() {
+        return wrap(unwrap(this).createTBody());
+      },
+      get rows() {
+        return wrapHTMLCollection(unwrap(this).rows);
+      },
+      insertRow: function(index) {
+        return wrap(unwrap(this).insertRow(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableElement, HTMLTableElement, document.createElement("table"));
+    scope.wrappers.HTMLTableElement = HTMLTableElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
+    function HTMLTableSectionElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableSectionElement.prototype, {
+      constructor: HTMLTableSectionElement,
+      get rows() {
+        return wrapHTMLCollection(unwrap(this).rows);
+      },
+      insertRow: function(index) {
+        return wrap(unwrap(this).insertRow(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement, document.createElement("thead"));
+    scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var wrapHTMLCollection = scope.wrapHTMLCollection;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
+    function HTMLTableRowElement(node) {
+      HTMLElement.call(this, node);
+    }
+    HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
+    mixin(HTMLTableRowElement.prototype, {
+      get cells() {
+        return wrapHTMLCollection(unwrap(this).cells);
+      },
+      insertCell: function(index) {
+        return wrap(unwrap(this).insertCell(index));
+      }
+    });
+    registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement, document.createElement("tr"));
+    scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLContentElement = scope.wrappers.HTMLContentElement;
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+    var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
+    function HTMLUnknownElement(node) {
+      switch (node.localName) {
+       case "content":
+        return new HTMLContentElement(node);
+
+       case "shadow":
+        return new HTMLShadowElement(node);
+
+       case "template":
+        return new HTMLTemplateElement(node);
+      }
+      HTMLElement.call(this, node);
+    }
+    HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
+    registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
+    scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var registerObject = scope.registerObject;
+    var SVG_NS = "http://www.w3.org/2000/svg";
+    var svgTitleElement = document.createElementNS(SVG_NS, "title");
+    var SVGTitleElement = registerObject(svgTitleElement);
+    var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
+    if (!("classList" in svgTitleElement)) {
+      var descr = Object.getOwnPropertyDescriptor(Element.prototype, "classList");
+      Object.defineProperty(HTMLElement.prototype, "classList", descr);
+      delete Element.prototype.classList;
+    }
+    scope.wrappers.SVGElement = SVGElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var OriginalSVGUseElement = window.SVGUseElement;
+    var SVG_NS = "http://www.w3.org/2000/svg";
+    var gWrapper = wrap(document.createElementNS(SVG_NS, "g"));
+    var useElement = document.createElementNS(SVG_NS, "use");
+    var SVGGElement = gWrapper.constructor;
+    var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
+    var parentInterface = parentInterfacePrototype.constructor;
+    function SVGUseElement(impl) {
+      parentInterface.call(this, impl);
+    }
+    SVGUseElement.prototype = Object.create(parentInterfacePrototype);
+    if ("instanceRoot" in useElement) {
+      mixin(SVGUseElement.prototype, {
+        get instanceRoot() {
+          return wrap(unwrap(this).instanceRoot);
+        },
+        get animatedInstanceRoot() {
+          return wrap(unwrap(this).animatedInstanceRoot);
+        }
+      });
+    }
+    registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
+    scope.wrappers.SVGUseElement = SVGUseElement;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var wrap = scope.wrap;
+    var OriginalSVGElementInstance = window.SVGElementInstance;
+    if (!OriginalSVGElementInstance) return;
+    function SVGElementInstance(impl) {
+      EventTarget.call(this, impl);
+    }
+    SVGElementInstance.prototype = Object.create(EventTarget.prototype);
+    mixin(SVGElementInstance.prototype, {
+      get correspondingElement() {
+        return wrap(unsafeUnwrap(this).correspondingElement);
+      },
+      get correspondingUseElement() {
+        return wrap(unsafeUnwrap(this).correspondingUseElement);
+      },
+      get parentNode() {
+        return wrap(unsafeUnwrap(this).parentNode);
+      },
+      get childNodes() {
+        throw new Error("Not implemented");
+      },
+      get firstChild() {
+        return wrap(unsafeUnwrap(this).firstChild);
+      },
+      get lastChild() {
+        return wrap(unsafeUnwrap(this).lastChild);
+      },
+      get previousSibling() {
+        return wrap(unsafeUnwrap(this).previousSibling);
+      },
+      get nextSibling() {
+        return wrap(unsafeUnwrap(this).nextSibling);
+      }
+    });
+    registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
+    scope.wrappers.SVGElementInstance = SVGElementInstance;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
+    function CanvasRenderingContext2D(impl) {
+      setWrapper(impl, this);
+    }
+    mixin(CanvasRenderingContext2D.prototype, {
+      get canvas() {
+        return wrap(unsafeUnwrap(this).canvas);
+      },
+      drawImage: function() {
+        arguments[0] = unwrapIfNeeded(arguments[0]);
+        unsafeUnwrap(this).drawImage.apply(unsafeUnwrap(this), arguments);
+      },
+      createPattern: function() {
+        arguments[0] = unwrap(arguments[0]);
+        return unsafeUnwrap(this).createPattern.apply(unsafeUnwrap(this), arguments);
+      }
+    });
+    registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D, document.createElement("canvas").getContext("2d"));
+    scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
+    if (!OriginalWebGLRenderingContext) return;
+    function WebGLRenderingContext(impl) {
+      setWrapper(impl, this);
+    }
+    mixin(WebGLRenderingContext.prototype, {
+      get canvas() {
+        return wrap(unsafeUnwrap(this).canvas);
+      },
+      texImage2D: function() {
+        arguments[5] = unwrapIfNeeded(arguments[5]);
+        unsafeUnwrap(this).texImage2D.apply(unsafeUnwrap(this), arguments);
+      },
+      texSubImage2D: function() {
+        arguments[6] = unwrapIfNeeded(arguments[6]);
+        unsafeUnwrap(this).texSubImage2D.apply(unsafeUnwrap(this), arguments);
+      }
+    });
+    var instanceProperties = /WebKit/.test(navigator.userAgent) ? {
+      drawingBufferHeight: null,
+      drawingBufferWidth: null
+    } : {};
+    registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext, instanceProperties);
+    scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalRange = window.Range;
+    function Range(impl) {
+      setWrapper(impl, this);
+    }
+    Range.prototype = {
+      get startContainer() {
+        return wrap(unsafeUnwrap(this).startContainer);
+      },
+      get endContainer() {
+        return wrap(unsafeUnwrap(this).endContainer);
+      },
+      get commonAncestorContainer() {
+        return wrap(unsafeUnwrap(this).commonAncestorContainer);
+      },
+      setStart: function(refNode, offset) {
+        unsafeUnwrap(this).setStart(unwrapIfNeeded(refNode), offset);
+      },
+      setEnd: function(refNode, offset) {
+        unsafeUnwrap(this).setEnd(unwrapIfNeeded(refNode), offset);
+      },
+      setStartBefore: function(refNode) {
+        unsafeUnwrap(this).setStartBefore(unwrapIfNeeded(refNode));
+      },
+      setStartAfter: function(refNode) {
+        unsafeUnwrap(this).setStartAfter(unwrapIfNeeded(refNode));
+      },
+      setEndBefore: function(refNode) {
+        unsafeUnwrap(this).setEndBefore(unwrapIfNeeded(refNode));
+      },
+      setEndAfter: function(refNode) {
+        unsafeUnwrap(this).setEndAfter(unwrapIfNeeded(refNode));
+      },
+      selectNode: function(refNode) {
+        unsafeUnwrap(this).selectNode(unwrapIfNeeded(refNode));
+      },
+      selectNodeContents: function(refNode) {
+        unsafeUnwrap(this).selectNodeContents(unwrapIfNeeded(refNode));
+      },
+      compareBoundaryPoints: function(how, sourceRange) {
+        return unsafeUnwrap(this).compareBoundaryPoints(how, unwrap(sourceRange));
+      },
+      extractContents: function() {
+        return wrap(unsafeUnwrap(this).extractContents());
+      },
+      cloneContents: function() {
+        return wrap(unsafeUnwrap(this).cloneContents());
+      },
+      insertNode: function(node) {
+        unsafeUnwrap(this).insertNode(unwrapIfNeeded(node));
+      },
+      surroundContents: function(newParent) {
+        unsafeUnwrap(this).surroundContents(unwrapIfNeeded(newParent));
+      },
+      cloneRange: function() {
+        return wrap(unsafeUnwrap(this).cloneRange());
+      },
+      isPointInRange: function(node, offset) {
+        return unsafeUnwrap(this).isPointInRange(unwrapIfNeeded(node), offset);
+      },
+      comparePoint: function(node, offset) {
+        return unsafeUnwrap(this).comparePoint(unwrapIfNeeded(node), offset);
+      },
+      intersectsNode: function(node) {
+        return unsafeUnwrap(this).intersectsNode(unwrapIfNeeded(node));
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    if (OriginalRange.prototype.createContextualFragment) {
+      Range.prototype.createContextualFragment = function(html) {
+        return wrap(unsafeUnwrap(this).createContextualFragment(html));
+      };
+    }
+    registerWrapper(window.Range, Range, document.createRange());
+    scope.wrappers.Range = Range;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var mixin = scope.mixin;
+    var registerObject = scope.registerObject;
+    var DocumentFragment = registerObject(document.createDocumentFragment());
+    mixin(DocumentFragment.prototype, ParentNodeInterface);
+    mixin(DocumentFragment.prototype, SelectorsInterface);
+    mixin(DocumentFragment.prototype, GetElementsByInterface);
+    var Comment = registerObject(document.createComment(""));
+    scope.wrappers.Comment = Comment;
+    scope.wrappers.DocumentFragment = DocumentFragment;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var DocumentFragment = scope.wrappers.DocumentFragment;
+    var TreeScope = scope.TreeScope;
+    var elementFromPoint = scope.elementFromPoint;
+    var getInnerHTML = scope.getInnerHTML;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var rewrap = scope.rewrap;
+    var setInnerHTML = scope.setInnerHTML;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var shadowHostTable = new WeakMap();
+    var nextOlderShadowTreeTable = new WeakMap();
+    var spaceCharRe = /[ \t\n\r\f]/;
+    function ShadowRoot(hostWrapper) {
+      var node = unwrap(unsafeUnwrap(hostWrapper).ownerDocument.createDocumentFragment());
+      DocumentFragment.call(this, node);
+      rewrap(node, this);
+      var oldShadowRoot = hostWrapper.shadowRoot;
+      nextOlderShadowTreeTable.set(this, oldShadowRoot);
+      this.treeScope_ = new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
+      shadowHostTable.set(this, hostWrapper);
+    }
+    ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
+    mixin(ShadowRoot.prototype, {
+      constructor: ShadowRoot,
+      get innerHTML() {
+        return getInnerHTML(this);
+      },
+      set innerHTML(value) {
+        setInnerHTML(this, value);
+        this.invalidateShadowRenderer();
+      },
+      get olderShadowRoot() {
+        return nextOlderShadowTreeTable.get(this) || null;
+      },
+      get host() {
+        return shadowHostTable.get(this) || null;
+      },
+      invalidateShadowRenderer: function() {
+        return shadowHostTable.get(this).invalidateShadowRenderer();
+      },
+      elementFromPoint: function(x, y) {
+        return elementFromPoint(this, this.ownerDocument, x, y);
+      },
+      getElementById: function(id) {
+        if (spaceCharRe.test(id)) return null;
+        return this.querySelector('[id="' + id + '"]');
+      }
+    });
+    scope.wrappers.ShadowRoot = ShadowRoot;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var Element = scope.wrappers.Element;
+    var HTMLContentElement = scope.wrappers.HTMLContentElement;
+    var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+    var Node = scope.wrappers.Node;
+    var ShadowRoot = scope.wrappers.ShadowRoot;
+    var assert = scope.assert;
+    var getTreeScope = scope.getTreeScope;
+    var mixin = scope.mixin;
+    var oneOf = scope.oneOf;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var ArraySplice = scope.ArraySplice;
+    function updateWrapperUpAndSideways(wrapper) {
+      wrapper.previousSibling_ = wrapper.previousSibling;
+      wrapper.nextSibling_ = wrapper.nextSibling;
+      wrapper.parentNode_ = wrapper.parentNode;
+    }
+    function updateWrapperDown(wrapper) {
+      wrapper.firstChild_ = wrapper.firstChild;
+      wrapper.lastChild_ = wrapper.lastChild;
+    }
+    function updateAllChildNodes(parentNodeWrapper) {
+      assert(parentNodeWrapper instanceof Node);
+      for (var childWrapper = parentNodeWrapper.firstChild; childWrapper; childWrapper = childWrapper.nextSibling) {
+        updateWrapperUpAndSideways(childWrapper);
+      }
+      updateWrapperDown(parentNodeWrapper);
+    }
+    function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
+      var parentNode = unwrap(parentNodeWrapper);
+      var newChild = unwrap(newChildWrapper);
+      var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
+      remove(newChildWrapper);
+      updateWrapperUpAndSideways(newChildWrapper);
+      if (!refChildWrapper) {
+        parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
+        if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild) parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
+        var lastChildWrapper = wrap(parentNode.lastChild);
+        if (lastChildWrapper) lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
+      } else {
+        if (parentNodeWrapper.firstChild === refChildWrapper) parentNodeWrapper.firstChild_ = refChildWrapper;
+        refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
+      }
+      scope.originalInsertBefore.call(parentNode, newChild, refChild);
+    }
+    function remove(nodeWrapper) {
+      var node = unwrap(nodeWrapper);
+      var parentNode = node.parentNode;
+      if (!parentNode) return;
+      var parentNodeWrapper = wrap(parentNode);
+      updateWrapperUpAndSideways(nodeWrapper);
+      if (nodeWrapper.previousSibling) nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
+      if (nodeWrapper.nextSibling) nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
+      if (parentNodeWrapper.lastChild === nodeWrapper) parentNodeWrapper.lastChild_ = nodeWrapper;
+      if (parentNodeWrapper.firstChild === nodeWrapper) parentNodeWrapper.firstChild_ = nodeWrapper;
+      scope.originalRemoveChild.call(parentNode, node);
+    }
+    var distributedNodesTable = new WeakMap();
+    var destinationInsertionPointsTable = new WeakMap();
+    var rendererForHostTable = new WeakMap();
+    function resetDistributedNodes(insertionPoint) {
+      distributedNodesTable.set(insertionPoint, []);
+    }
+    function getDistributedNodes(insertionPoint) {
+      var rv = distributedNodesTable.get(insertionPoint);
+      if (!rv) distributedNodesTable.set(insertionPoint, rv = []);
+      return rv;
+    }
+    function getChildNodesSnapshot(node) {
+      var result = [], i = 0;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        result[i++] = child;
+      }
+      return result;
+    }
+    var request = oneOf(window, [ "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "setTimeout" ]);
+    var pendingDirtyRenderers = [];
+    var renderTimer;
+    function renderAllPending() {
+      for (var i = 0; i < pendingDirtyRenderers.length; i++) {
+        var renderer = pendingDirtyRenderers[i];
+        var parentRenderer = renderer.parentRenderer;
+        if (parentRenderer && parentRenderer.dirty) continue;
+        renderer.render();
+      }
+      pendingDirtyRenderers = [];
+    }
+    function handleRequestAnimationFrame() {
+      renderTimer = null;
+      renderAllPending();
+    }
+    function getRendererForHost(host) {
+      var renderer = rendererForHostTable.get(host);
+      if (!renderer) {
+        renderer = new ShadowRenderer(host);
+        rendererForHostTable.set(host, renderer);
+      }
+      return renderer;
+    }
+    function getShadowRootAncestor(node) {
+      var root = getTreeScope(node).root;
+      if (root instanceof ShadowRoot) return root;
+      return null;
+    }
+    function getRendererForShadowRoot(shadowRoot) {
+      return getRendererForHost(shadowRoot.host);
+    }
+    var spliceDiff = new ArraySplice();
+    spliceDiff.equals = function(renderNode, rawNode) {
+      return unwrap(renderNode.node) === rawNode;
+    };
+    function RenderNode(node) {
+      this.skip = false;
+      this.node = node;
+      this.childNodes = [];
+    }
+    RenderNode.prototype = {
+      append: function(node) {
+        var rv = new RenderNode(node);
+        this.childNodes.push(rv);
+        return rv;
+      },
+      sync: function(opt_added) {
+        if (this.skip) return;
+        var nodeWrapper = this.node;
+        var newChildren = this.childNodes;
+        var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
+        var added = opt_added || new WeakMap();
+        var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
+        var newIndex = 0, oldIndex = 0;
+        var lastIndex = 0;
+        for (var i = 0; i < splices.length; i++) {
+          var splice = splices[i];
+          for (;lastIndex < splice.index; lastIndex++) {
+            oldIndex++;
+            newChildren[newIndex++].sync(added);
+          }
+          var removedCount = splice.removed.length;
+          for (var j = 0; j < removedCount; j++) {
+            var wrapper = wrap(oldChildren[oldIndex++]);
+            if (!added.get(wrapper)) remove(wrapper);
+          }
+          var addedCount = splice.addedCount;
+          var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
+          for (var j = 0; j < addedCount; j++) {
+            var newChildRenderNode = newChildren[newIndex++];
+            var newChildWrapper = newChildRenderNode.node;
+            insertBefore(nodeWrapper, newChildWrapper, refNode);
+            added.set(newChildWrapper, true);
+            newChildRenderNode.sync(added);
+          }
+          lastIndex += addedCount;
+        }
+        for (var i = lastIndex; i < newChildren.length; i++) {
+          newChildren[i].sync(added);
+        }
+      }
+    };
+    function ShadowRenderer(host) {
+      this.host = host;
+      this.dirty = false;
+      this.invalidateAttributes();
+      this.associateNode(host);
+    }
+    ShadowRenderer.prototype = {
+      render: function(opt_renderNode) {
+        if (!this.dirty) return;
+        this.invalidateAttributes();
+        var host = this.host;
+        this.distribution(host);
+        var renderNode = opt_renderNode || new RenderNode(host);
+        this.buildRenderTree(renderNode, host);
+        var topMostRenderer = !opt_renderNode;
+        if (topMostRenderer) renderNode.sync();
+        this.dirty = false;
+      },
+      get parentRenderer() {
+        return getTreeScope(this.host).renderer;
+      },
+      invalidate: function() {
+        if (!this.dirty) {
+          this.dirty = true;
+          var parentRenderer = this.parentRenderer;
+          if (parentRenderer) parentRenderer.invalidate();
+          pendingDirtyRenderers.push(this);
+          if (renderTimer) return;
+          renderTimer = window[request](handleRequestAnimationFrame, 0);
+        }
+      },
+      distribution: function(root) {
+        this.resetAllSubtrees(root);
+        this.distributionResolution(root);
+      },
+      resetAll: function(node) {
+        if (isInsertionPoint(node)) resetDistributedNodes(node); else resetDestinationInsertionPoints(node);
+        this.resetAllSubtrees(node);
+      },
+      resetAllSubtrees: function(node) {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.resetAll(child);
+        }
+        if (node.shadowRoot) this.resetAll(node.shadowRoot);
+        if (node.olderShadowRoot) this.resetAll(node.olderShadowRoot);
+      },
+      distributionResolution: function(node) {
+        if (isShadowHost(node)) {
+          var shadowHost = node;
+          var pool = poolPopulation(shadowHost);
+          var shadowTrees = getShadowTrees(shadowHost);
+          for (var i = 0; i < shadowTrees.length; i++) {
+            this.poolDistribution(shadowTrees[i], pool);
+          }
+          for (var i = shadowTrees.length - 1; i >= 0; i--) {
+            var shadowTree = shadowTrees[i];
+            var shadow = getShadowInsertionPoint(shadowTree);
+            if (shadow) {
+              var olderShadowRoot = shadowTree.olderShadowRoot;
+              if (olderShadowRoot) {
+                pool = poolPopulation(olderShadowRoot);
+              }
+              for (var j = 0; j < pool.length; j++) {
+                destributeNodeInto(pool[j], shadow);
+              }
+            }
+            this.distributionResolution(shadowTree);
+          }
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.distributionResolution(child);
+        }
+      },
+      poolDistribution: function(node, pool) {
+        if (node instanceof HTMLShadowElement) return;
+        if (node instanceof HTMLContentElement) {
+          var content = node;
+          this.updateDependentAttributes(content.getAttribute("select"));
+          var anyDistributed = false;
+          for (var i = 0; i < pool.length; i++) {
+            var node = pool[i];
+            if (!node) continue;
+            if (matches(node, content)) {
+              destributeNodeInto(node, content);
+              pool[i] = undefined;
+              anyDistributed = true;
+            }
+          }
+          if (!anyDistributed) {
+            for (var child = content.firstChild; child; child = child.nextSibling) {
+              destributeNodeInto(child, content);
+            }
+          }
+          return;
+        }
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.poolDistribution(child, pool);
+        }
+      },
+      buildRenderTree: function(renderNode, node) {
+        var children = this.compose(node);
+        for (var i = 0; i < children.length; i++) {
+          var child = children[i];
+          var childRenderNode = renderNode.append(child);
+          this.buildRenderTree(childRenderNode, child);
+        }
+        if (isShadowHost(node)) {
+          var renderer = getRendererForHost(node);
+          renderer.dirty = false;
+        }
+      },
+      compose: function(node) {
+        var children = [];
+        var p = node.shadowRoot || node;
+        for (var child = p.firstChild; child; child = child.nextSibling) {
+          if (isInsertionPoint(child)) {
+            this.associateNode(p);
+            var distributedNodes = getDistributedNodes(child);
+            for (var j = 0; j < distributedNodes.length; j++) {
+              var distributedNode = distributedNodes[j];
+              if (isFinalDestination(child, distributedNode)) children.push(distributedNode);
+            }
+          } else {
+            children.push(child);
+          }
+        }
+        return children;
+      },
+      invalidateAttributes: function() {
+        this.attributes = Object.create(null);
+      },
+      updateDependentAttributes: function(selector) {
+        if (!selector) return;
+        var attributes = this.attributes;
+        if (/\.\w+/.test(selector)) attributes["class"] = true;
+        if (/#\w+/.test(selector)) attributes["id"] = true;
+        selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
+          attributes[name] = true;
+        });
+      },
+      dependsOnAttribute: function(name) {
+        return this.attributes[name];
+      },
+      associateNode: function(node) {
+        unsafeUnwrap(node).polymerShadowRenderer_ = this;
+      }
+    };
+    function poolPopulation(node) {
+      var pool = [];
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        if (isInsertionPoint(child)) {
+          pool.push.apply(pool, getDistributedNodes(child));
+        } else {
+          pool.push(child);
+        }
+      }
+      return pool;
+    }
+    function getShadowInsertionPoint(node) {
+      if (node instanceof HTMLShadowElement) return node;
+      if (node instanceof HTMLContentElement) return null;
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        var res = getShadowInsertionPoint(child);
+        if (res) return res;
+      }
+      return null;
+    }
+    function destributeNodeInto(child, insertionPoint) {
+      getDistributedNodes(insertionPoint).push(child);
+      var points = destinationInsertionPointsTable.get(child);
+      if (!points) destinationInsertionPointsTable.set(child, [ insertionPoint ]); else points.push(insertionPoint);
+    }
+    function getDestinationInsertionPoints(node) {
+      return destinationInsertionPointsTable.get(node);
+    }
+    function resetDestinationInsertionPoints(node) {
+      destinationInsertionPointsTable.set(node, undefined);
+    }
+    var selectorStartCharRe = /^(:not\()?[*.#[a-zA-Z_|]/;
+    function matches(node, contentElement) {
+      var select = contentElement.getAttribute("select");
+      if (!select) return true;
+      select = select.trim();
+      if (!select) return true;
+      if (!(node instanceof Element)) return false;
+      if (!selectorStartCharRe.test(select)) return false;
+      try {
+        return node.matches(select);
+      } catch (ex) {
+        return false;
+      }
+    }
+    function isFinalDestination(insertionPoint, node) {
+      var points = getDestinationInsertionPoints(node);
+      return points && points[points.length - 1] === insertionPoint;
+    }
+    function isInsertionPoint(node) {
+      return node instanceof HTMLContentElement || node instanceof HTMLShadowElement;
+    }
+    function isShadowHost(shadowHost) {
+      return shadowHost.shadowRoot;
+    }
+    function getShadowTrees(host) {
+      var trees = [];
+      for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
+        trees.push(tree);
+      }
+      return trees;
+    }
+    function render(host) {
+      new ShadowRenderer(host).render();
+    }
+    Node.prototype.invalidateShadowRenderer = function(force) {
+      var renderer = unsafeUnwrap(this).polymerShadowRenderer_;
+      if (renderer) {
+        renderer.invalidate();
+        return true;
+      }
+      return false;
+    };
+    HTMLContentElement.prototype.getDistributedNodes = HTMLShadowElement.prototype.getDistributedNodes = function() {
+      renderAllPending();
+      return getDistributedNodes(this);
+    };
+    Element.prototype.getDestinationInsertionPoints = function() {
+      renderAllPending();
+      return getDestinationInsertionPoints(this) || [];
+    };
+    HTMLContentElement.prototype.nodeIsInserted_ = HTMLShadowElement.prototype.nodeIsInserted_ = function() {
+      this.invalidateShadowRenderer();
+      var shadowRoot = getShadowRootAncestor(this);
+      var renderer;
+      if (shadowRoot) renderer = getRendererForShadowRoot(shadowRoot);
+      unsafeUnwrap(this).polymerShadowRenderer_ = renderer;
+      if (renderer) renderer.invalidate();
+    };
+    scope.getRendererForHost = getRendererForHost;
+    scope.getShadowTrees = getShadowTrees;
+    scope.renderAllPending = renderAllPending;
+    scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
+    scope.visual = {
+      insertBefore: insertBefore,
+      remove: remove
+    };
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var HTMLElement = scope.wrappers.HTMLElement;
+    var assert = scope.assert;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var elementsWithFormProperty = [ "HTMLButtonElement", "HTMLFieldSetElement", "HTMLInputElement", "HTMLKeygenElement", "HTMLLabelElement", "HTMLLegendElement", "HTMLObjectElement", "HTMLOutputElement", "HTMLTextAreaElement" ];
+    function createWrapperConstructor(name) {
+      if (!window[name]) return;
+      assert(!scope.wrappers[name]);
+      var GeneratedWrapper = function(node) {
+        HTMLElement.call(this, node);
+      };
+      GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
+      mixin(GeneratedWrapper.prototype, {
+        get form() {
+          return wrap(unwrap(this).form);
+        }
+      });
+      registerWrapper(window[name], GeneratedWrapper, document.createElement(name.slice(4, -7)));
+      scope.wrappers[name] = GeneratedWrapper;
+    }
+    elementsWithFormProperty.forEach(createWrapperConstructor);
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalSelection = window.Selection;
+    function Selection(impl) {
+      setWrapper(impl, this);
+    }
+    Selection.prototype = {
+      get anchorNode() {
+        return wrap(unsafeUnwrap(this).anchorNode);
+      },
+      get focusNode() {
+        return wrap(unsafeUnwrap(this).focusNode);
+      },
+      addRange: function(range) {
+        unsafeUnwrap(this).addRange(unwrap(range));
+      },
+      collapse: function(node, index) {
+        unsafeUnwrap(this).collapse(unwrapIfNeeded(node), index);
+      },
+      containsNode: function(node, allowPartial) {
+        return unsafeUnwrap(this).containsNode(unwrapIfNeeded(node), allowPartial);
+      },
+      extend: function(node, offset) {
+        unsafeUnwrap(this).extend(unwrapIfNeeded(node), offset);
+      },
+      getRangeAt: function(index) {
+        return wrap(unsafeUnwrap(this).getRangeAt(index));
+      },
+      removeRange: function(range) {
+        unsafeUnwrap(this).removeRange(unwrap(range));
+      },
+      selectAllChildren: function(node) {
+        unsafeUnwrap(this).selectAllChildren(unwrapIfNeeded(node));
+      },
+      toString: function() {
+        return unsafeUnwrap(this).toString();
+      }
+    };
+    registerWrapper(window.Selection, Selection, window.getSelection());
+    scope.wrappers.Selection = Selection;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var GetElementsByInterface = scope.GetElementsByInterface;
+    var Node = scope.wrappers.Node;
+    var ParentNodeInterface = scope.ParentNodeInterface;
+    var Selection = scope.wrappers.Selection;
+    var SelectorsInterface = scope.SelectorsInterface;
+    var ShadowRoot = scope.wrappers.ShadowRoot;
+    var TreeScope = scope.TreeScope;
+    var cloneNode = scope.cloneNode;
+    var defineWrapGetter = scope.defineWrapGetter;
+    var elementFromPoint = scope.elementFromPoint;
+    var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+    var matchesNames = scope.matchesNames;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var renderAllPending = scope.renderAllPending;
+    var rewrap = scope.rewrap;
+    var setWrapper = scope.setWrapper;
+    var unsafeUnwrap = scope.unsafeUnwrap;
+    var unwrap = scope.unwrap;
+    var wrap = scope.wrap;
+    var wrapEventTargetMethods = scope.wrapEventTargetMethods;
+    var wrapNodeList = scope.wrapNodeList;
+    var implementationTable = new WeakMap();
+    function Document(node) {
+      Node.call(this, node);
+      this.treeScope_ = new TreeScope(this, null);
+    }
+    Document.prototype = Object.create(Node.prototype);
+    defineWrapGetter(Document, "documentElement");
+    defineWrapGetter(Document, "body");
+    defineWrapGetter(Document, "head");
+    function wrapMethod(name) {
+      var original = document[name];
+      Document.prototype[name] = function() {
+        return wrap(original.apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    [ "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "getElementById" ].forEach(wrapMethod);
+    var originalAdoptNode = document.adoptNode;
+    function adoptNodeNoRemove(node, doc) {
+      originalAdoptNode.call(unsafeUnwrap(doc), unwrap(node));
+      adoptSubtree(node, doc);
+    }
+    function adoptSubtree(node, doc) {
+      if (node.shadowRoot) doc.adoptNode(node.shadowRoot);
+      if (node instanceof ShadowRoot) adoptOlderShadowRoots(node, doc);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        adoptSubtree(child, doc);
+      }
+    }
+    function adoptOlderShadowRoots(shadowRoot, doc) {
+      var oldShadowRoot = shadowRoot.olderShadowRoot;
+      if (oldShadowRoot) doc.adoptNode(oldShadowRoot);
+    }
+    var originalGetSelection = document.getSelection;
+    mixin(Document.prototype, {
+      adoptNode: function(node) {
+        if (node.parentNode) node.parentNode.removeChild(node);
+        adoptNodeNoRemove(node, this);
+        return node;
+      },
+      elementFromPoint: function(x, y) {
+        return elementFromPoint(this, this, x, y);
+      },
+      importNode: function(node, deep) {
+        return cloneNode(node, deep, unsafeUnwrap(this));
+      },
+      getSelection: function() {
+        renderAllPending();
+        return new Selection(originalGetSelection.call(unwrap(this)));
+      },
+      getElementsByName: function(name) {
+        return SelectorsInterface.querySelectorAll.call(this, "[name=" + JSON.stringify(String(name)) + "]");
+      }
+    });
+    if (document.registerElement) {
+      var originalRegisterElement = document.registerElement;
+      Document.prototype.registerElement = function(tagName, object) {
+        var prototype, extendsOption;
+        if (object !== undefined) {
+          prototype = object.prototype;
+          extendsOption = object.extends;
+        }
+        if (!prototype) prototype = Object.create(HTMLElement.prototype);
+        if (scope.nativePrototypeTable.get(prototype)) {
+          throw new Error("NotSupportedError");
+        }
+        var proto = Object.getPrototypeOf(prototype);
+        var nativePrototype;
+        var prototypes = [];
+        while (proto) {
+          nativePrototype = scope.nativePrototypeTable.get(proto);
+          if (nativePrototype) break;
+          prototypes.push(proto);
+          proto = Object.getPrototypeOf(proto);
+        }
+        if (!nativePrototype) {
+          throw new Error("NotSupportedError");
+        }
+        var newPrototype = Object.create(nativePrototype);
+        for (var i = prototypes.length - 1; i >= 0; i--) {
+          newPrototype = Object.create(newPrototype);
+        }
+        [ "createdCallback", "attachedCallback", "detachedCallback", "attributeChangedCallback" ].forEach(function(name) {
+          var f = prototype[name];
+          if (!f) return;
+          newPrototype[name] = function() {
+            if (!(wrap(this) instanceof CustomElementConstructor)) {
+              rewrap(this);
+            }
+            f.apply(wrap(this), arguments);
+          };
+        });
+        var p = {
+          prototype: newPrototype
+        };
+        if (extendsOption) p.extends = extendsOption;
+        function CustomElementConstructor(node) {
+          if (!node) {
+            if (extendsOption) {
+              return document.createElement(extendsOption, tagName);
+            } else {
+              return document.createElement(tagName);
+            }
+          }
+          setWrapper(node, this);
+        }
+        CustomElementConstructor.prototype = prototype;
+        CustomElementConstructor.prototype.constructor = CustomElementConstructor;
+        scope.constructorTable.set(newPrototype, CustomElementConstructor);
+        scope.nativePrototypeTable.set(prototype, newPrototype);
+        var nativeConstructor = originalRegisterElement.call(unwrap(this), tagName, p);
+        return CustomElementConstructor;
+      };
+      forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "registerElement" ]);
+    }
+    forwardMethodsToWrapper([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement, window.HTMLHtmlElement ], [ "appendChild", "compareDocumentPosition", "contains", "getElementsByClassName", "getElementsByTagName", "getElementsByTagNameNS", "insertBefore", "querySelector", "querySelectorAll", "removeChild", "replaceChild" ].concat(matchesNames));
+    forwardMethodsToWrapper([ window.HTMLDocument || window.Document ], [ "adoptNode", "importNode", "contains", "createComment", "createDocumentFragment", "createElement", "createElementNS", "createEvent", "createEventNS", "createRange", "createTextNode", "elementFromPoint", "getElementById", "getElementsByName", "getSelection" ]);
+    mixin(Document.prototype, GetElementsByInterface);
+    mixin(Document.prototype, ParentNodeInterface);
+    mixin(Document.prototype, SelectorsInterface);
+    mixin(Document.prototype, {
+      get implementation() {
+        var implementation = implementationTable.get(this);
+        if (implementation) return implementation;
+        implementation = new DOMImplementation(unwrap(this).implementation);
+        implementationTable.set(this, implementation);
+        return implementation;
+      },
+      get defaultView() {
+        return wrap(unwrap(this).defaultView);
+      }
+    });
+    registerWrapper(window.Document, Document, document.implementation.createHTMLDocument(""));
+    if (window.HTMLDocument) registerWrapper(window.HTMLDocument, Document);
+    wrapEventTargetMethods([ window.HTMLBodyElement, window.HTMLDocument || window.Document, window.HTMLHeadElement ]);
+    function DOMImplementation(impl) {
+      setWrapper(impl, this);
+    }
+    function wrapImplMethod(constructor, name) {
+      var original = document.implementation[name];
+      constructor.prototype[name] = function() {
+        return wrap(original.apply(unsafeUnwrap(this), arguments));
+      };
+    }
+    function forwardImplMethod(constructor, name) {
+      var original = document.implementation[name];
+      constructor.prototype[name] = function() {
+        return original.apply(unsafeUnwrap(this), arguments);
+      };
+    }
+    wrapImplMethod(DOMImplementation, "createDocumentType");
+    wrapImplMethod(DOMImplementation, "createDocument");
+    wrapImplMethod(DOMImplementation, "createHTMLDocument");
+    forwardImplMethod(DOMImplementation, "hasFeature");
+    registerWrapper(window.DOMImplementation, DOMImplementation);
+    forwardMethodsToWrapper([ window.DOMImplementation ], [ "createDocumentType", "createDocument", "createHTMLDocument", "hasFeature" ]);
+    scope.adoptNodeNoRemove = adoptNodeNoRemove;
+    scope.wrappers.DOMImplementation = DOMImplementation;
+    scope.wrappers.Document = Document;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var EventTarget = scope.wrappers.EventTarget;
+    var Selection = scope.wrappers.Selection;
+    var mixin = scope.mixin;
+    var registerWrapper = scope.registerWrapper;
+    var renderAllPending = scope.renderAllPending;
+    var unwrap = scope.unwrap;
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var wrap = scope.wrap;
+    var OriginalWindow = window.Window;
+    var originalGetComputedStyle = window.getComputedStyle;
+    var originalGetDefaultComputedStyle = window.getDefaultComputedStyle;
+    var originalGetSelection = window.getSelection;
+    function Window(impl) {
+      EventTarget.call(this, impl);
+    }
+    Window.prototype = Object.create(EventTarget.prototype);
+    OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
+      return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
+    };
+    if (originalGetDefaultComputedStyle) {
+      OriginalWindow.prototype.getDefaultComputedStyle = function(el, pseudo) {
+        return wrap(this || window).getDefaultComputedStyle(unwrapIfNeeded(el), pseudo);
+      };
+    }
+    OriginalWindow.prototype.getSelection = function() {
+      return wrap(this || window).getSelection();
+    };
+    delete window.getComputedStyle;
+    delete window.getDefaultComputedStyle;
+    delete window.getSelection;
+    [ "addEventListener", "removeEventListener", "dispatchEvent" ].forEach(function(name) {
+      OriginalWindow.prototype[name] = function() {
+        var w = wrap(this || window);
+        return w[name].apply(w, arguments);
+      };
+      delete window[name];
+    });
+    mixin(Window.prototype, {
+      getComputedStyle: function(el, pseudo) {
+        renderAllPending();
+        return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
+      },
+      getSelection: function() {
+        renderAllPending();
+        return new Selection(originalGetSelection.call(unwrap(this)));
+      },
+      get document() {
+        return wrap(unwrap(this).document);
+      }
+    });
+    if (originalGetDefaultComputedStyle) {
+      Window.prototype.getDefaultComputedStyle = function(el, pseudo) {
+        renderAllPending();
+        return originalGetDefaultComputedStyle.call(unwrap(this), unwrapIfNeeded(el), pseudo);
+      };
+    }
+    registerWrapper(OriginalWindow, Window, window);
+    scope.wrappers.Window = Window;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unwrap = scope.unwrap;
+    var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
+    var OriginalDataTransferSetDragImage = OriginalDataTransfer.prototype.setDragImage;
+    if (OriginalDataTransferSetDragImage) {
+      OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
+        OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
+      };
+    }
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var registerWrapper = scope.registerWrapper;
+    var setWrapper = scope.setWrapper;
+    var unwrap = scope.unwrap;
+    var OriginalFormData = window.FormData;
+    if (!OriginalFormData) return;
+    function FormData(formElement) {
+      var impl;
+      if (formElement instanceof OriginalFormData) {
+        impl = formElement;
+      } else {
+        impl = new OriginalFormData(formElement && unwrap(formElement));
+      }
+      setWrapper(impl, this);
+    }
+    registerWrapper(OriginalFormData, FormData, new OriginalFormData());
+    scope.wrappers.FormData = FormData;
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var unwrapIfNeeded = scope.unwrapIfNeeded;
+    var originalSend = XMLHttpRequest.prototype.send;
+    XMLHttpRequest.prototype.send = function(obj) {
+      return originalSend.call(this, unwrapIfNeeded(obj));
+    };
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    "use strict";
+    var isWrapperFor = scope.isWrapperFor;
+    var elements = {
+      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"
+    };
+    function overrideConstructor(tagName) {
+      var nativeConstructorName = elements[tagName];
+      var nativeConstructor = window[nativeConstructorName];
+      if (!nativeConstructor) return;
+      var element = document.createElement(tagName);
+      var wrapperConstructor = element.constructor;
+      window[nativeConstructorName] = wrapperConstructor;
+    }
+    Object.keys(elements).forEach(overrideConstructor);
+    Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
+      window[name] = scope.wrappers[name];
+    });
+  })(window.ShadowDOMPolyfill);
+  (function(scope) {
+    var ShadowCSS = {
+      strictStyling: false,
+      registry: {},
+      shimStyling: function(root, name, extendsName) {
+        var scopeStyles = this.prepareRoot(root, name, extendsName);
+        var typeExtension = this.isTypeExtension(extendsName);
+        var scopeSelector = this.makeScopeSelector(name, typeExtension);
+        var cssText = stylesToCssText(scopeStyles, true);
+        cssText = this.scopeCssText(cssText, scopeSelector);
+        if (root) {
+          root.shimmedStyle = cssText;
+        }
+        this.addCssToDocument(cssText, name);
+      },
+      shimStyle: function(style, selector) {
+        return this.shimCssText(style.textContent, selector);
+      },
+      shimCssText: function(cssText, selector) {
+        cssText = this.insertDirectives(cssText);
+        return this.scopeCssText(cssText, selector);
+      },
+      makeScopeSelector: function(name, typeExtension) {
+        if (name) {
+          return typeExtension ? "[is=" + name + "]" : name;
+        }
+        return "";
+      },
+      isTypeExtension: function(extendsName) {
+        return extendsName && extendsName.indexOf("-") < 0;
+      },
+      prepareRoot: function(root, name, extendsName) {
+        var def = this.registerRoot(root, name, extendsName);
+        this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
+        this.removeStyles(root, def.rootStyles);
+        if (this.strictStyling) {
+          this.applyScopeToContent(root, name);
+        }
+        return def.scopeStyles;
+      },
+      removeStyles: function(root, styles) {
+        for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
+          s.parentNode.removeChild(s);
+        }
+      },
+      registerRoot: function(root, name, extendsName) {
+        var def = this.registry[name] = {
+          root: root,
+          name: name,
+          extendsName: extendsName
+        };
+        var styles = this.findStyles(root);
+        def.rootStyles = styles;
+        def.scopeStyles = def.rootStyles;
+        var extendee = this.registry[def.extendsName];
+        if (extendee) {
+          def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
+        }
+        return def;
+      },
+      findStyles: function(root) {
+        if (!root) {
+          return [];
+        }
+        var styles = root.querySelectorAll("style");
+        return Array.prototype.filter.call(styles, function(s) {
+          return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
+        });
+      },
+      applyScopeToContent: function(root, name) {
+        if (root) {
+          Array.prototype.forEach.call(root.querySelectorAll("*"), function(node) {
+            node.setAttribute(name, "");
+          });
+          Array.prototype.forEach.call(root.querySelectorAll("template"), function(template) {
+            this.applyScopeToContent(template.content, name);
+          }, this);
+        }
+      },
+      insertDirectives: function(cssText) {
+        cssText = this.insertPolyfillDirectivesInCssText(cssText);
+        return this.insertPolyfillRulesInCssText(cssText);
+      },
+      insertPolyfillDirectivesInCssText: function(cssText) {
+        cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
+          return p1.slice(0, -2) + "{";
+        });
+        return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
+          return p1 + " {";
+        });
+      },
+      insertPolyfillRulesInCssText: function(cssText) {
+        cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
+          return p1.slice(0, -1);
+        });
+        return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
+          var rule = match.replace(p1, "").replace(p2, "");
+          return p3 + rule;
+        });
+      },
+      scopeCssText: function(cssText, scopeSelector) {
+        var unscoped = this.extractUnscopedRulesFromCssText(cssText);
+        cssText = this.insertPolyfillHostInCssText(cssText);
+        cssText = this.convertColonHost(cssText);
+        cssText = this.convertColonHostContext(cssText);
+        cssText = this.convertShadowDOMSelectors(cssText);
+        if (scopeSelector) {
+          var self = this, cssText;
+          withCssRules(cssText, function(rules) {
+            cssText = self.scopeRules(rules, scopeSelector);
+          });
+        }
+        cssText = cssText + "\n" + unscoped;
+        return cssText.trim();
+      },
+      extractUnscopedRulesFromCssText: function(cssText) {
+        var r = "", m;
+        while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
+          r += m[1].slice(0, -1) + "\n\n";
+        }
+        while (m = cssContentUnscopedRuleRe.exec(cssText)) {
+          r += m[0].replace(m[2], "").replace(m[1], m[3]) + "\n\n";
+        }
+        return r;
+      },
+      convertColonHost: function(cssText) {
+        return this.convertColonRule(cssText, cssColonHostRe, this.colonHostPartReplacer);
+      },
+      convertColonHostContext: function(cssText) {
+        return this.convertColonRule(cssText, cssColonHostContextRe, this.colonHostContextPartReplacer);
+      },
+      convertColonRule: function(cssText, regExp, partReplacer) {
+        return cssText.replace(regExp, function(m, p1, p2, p3) {
+          p1 = polyfillHostNoCombinator;
+          if (p2) {
+            var parts = p2.split(","), r = [];
+            for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) {
+              p = p.trim();
+              r.push(partReplacer(p1, p, p3));
+            }
+            return r.join(",");
+          } else {
+            return p1 + p3;
+          }
+        });
+      },
+      colonHostContextPartReplacer: function(host, part, suffix) {
+        if (part.match(polyfillHost)) {
+          return this.colonHostPartReplacer(host, part, suffix);
+        } else {
+          return host + part + suffix + ", " + part + " " + host + suffix;
+        }
+      },
+      colonHostPartReplacer: function(host, part, suffix) {
+        return host + part.replace(polyfillHost, "") + suffix;
+      },
+      convertShadowDOMSelectors: function(cssText) {
+        for (var i = 0; i < shadowDOMSelectorsRe.length; i++) {
+          cssText = cssText.replace(shadowDOMSelectorsRe[i], " ");
+        }
+        return cssText;
+      },
+      scopeRules: function(cssRules, scopeSelector) {
+        var cssText = "";
+        if (cssRules) {
+          Array.prototype.forEach.call(cssRules, function(rule) {
+            if (rule.selectorText && (rule.style && rule.style.cssText !== undefined)) {
+              cssText += this.scopeSelector(rule.selectorText, scopeSelector, this.strictStyling) + " {\n	";
+              cssText += this.propertiesFromRule(rule) + "\n}\n\n";
+            } else if (rule.type === CSSRule.MEDIA_RULE) {
+              cssText += "@media " + rule.media.mediaText + " {\n";
+              cssText += this.scopeRules(rule.cssRules, scopeSelector);
+              cssText += "\n}\n\n";
+            } else {
+              try {
+                if (rule.cssText) {
+                  cssText += rule.cssText + "\n\n";
+                }
+              } catch (x) {
+                if (rule.type === CSSRule.KEYFRAMES_RULE && rule.cssRules) {
+                  cssText += this.ieSafeCssTextFromKeyFrameRule(rule);
+                }
+              }
+            }
+          }, this);
+        }
+        return cssText;
+      },
+      ieSafeCssTextFromKeyFrameRule: function(rule) {
+        var cssText = "@keyframes " + rule.name + " {";
+        Array.prototype.forEach.call(rule.cssRules, function(rule) {
+          cssText += " " + rule.keyText + " {" + rule.style.cssText + "}";
+        });
+        cssText += " }";
+        return cssText;
+      },
+      scopeSelector: function(selector, scopeSelector, strict) {
+        var r = [], parts = selector.split(",");
+        parts.forEach(function(p) {
+          p = p.trim();
+          if (this.selectorNeedsScoping(p, scopeSelector)) {
+            p = strict && !p.match(polyfillHostNoCombinator) ? this.applyStrictSelectorScope(p, scopeSelector) : this.applySelectorScope(p, scopeSelector);
+          }
+          r.push(p);
+        }, this);
+        return r.join(", ");
+      },
+      selectorNeedsScoping: function(selector, scopeSelector) {
+        if (Array.isArray(scopeSelector)) {
+          return true;
+        }
+        var re = this.makeScopeMatcher(scopeSelector);
+        return !selector.match(re);
+      },
+      makeScopeMatcher: function(scopeSelector) {
+        scopeSelector = scopeSelector.replace(/\[/g, "\\[").replace(/\[/g, "\\]");
+        return new RegExp("^(" + scopeSelector + ")" + selectorReSuffix, "m");
+      },
+      applySelectorScope: function(selector, selectorScope) {
+        return Array.isArray(selectorScope) ? this.applySelectorScopeList(selector, selectorScope) : this.applySimpleSelectorScope(selector, selectorScope);
+      },
+      applySelectorScopeList: function(selector, scopeSelectorList) {
+        var r = [];
+        for (var i = 0, s; s = scopeSelectorList[i]; i++) {
+          r.push(this.applySimpleSelectorScope(selector, s));
+        }
+        return r.join(", ");
+      },
+      applySimpleSelectorScope: function(selector, scopeSelector) {
+        if (selector.match(polyfillHostRe)) {
+          selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
+          return selector.replace(polyfillHostRe, scopeSelector + " ");
+        } else {
+          return scopeSelector + " " + selector;
+        }
+      },
+      applyStrictSelectorScope: function(selector, scopeSelector) {
+        scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, "$1");
+        var splits = [ " ", ">", "+", "~" ], scoped = selector, attrName = "[" + scopeSelector + "]";
+        splits.forEach(function(sep) {
+          var parts = scoped.split(sep);
+          scoped = parts.map(function(p) {
+            var t = p.trim().replace(polyfillHostRe, "");
+            if (t && splits.indexOf(t) < 0 && t.indexOf(attrName) < 0) {
+              p = t.replace(/([^:]*)(:*)(.*)/, "$1" + attrName + "$2$3");
+            }
+            return p;
+          }).join(sep);
+        });
+        return scoped;
+      },
+      insertPolyfillHostInCssText: function(selector) {
+        return selector.replace(colonHostContextRe, polyfillHostContext).replace(colonHostRe, polyfillHost);
+      },
+      propertiesFromRule: function(rule) {
+        var cssText = rule.style.cssText;
+        if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
+          cssText = cssText.replace(/content:[^;]*;/g, "content: '" + rule.style.content + "';");
+        }
+        var style = rule.style;
+        for (var i in style) {
+          if (style[i] === "initial") {
+            cssText += i + ": initial; ";
+          }
+        }
+        return cssText;
+      },
+      replaceTextInStyles: function(styles, action) {
+        if (styles && action) {
+          if (!(styles instanceof Array)) {
+            styles = [ styles ];
+          }
+          Array.prototype.forEach.call(styles, function(s) {
+            s.textContent = action.call(this, s.textContent);
+          }, this);
+        }
+      },
+      addCssToDocument: function(cssText, name) {
+        if (cssText.match("@import")) {
+          addOwnSheet(cssText, name);
+        } else {
+          addCssToDocument(cssText);
+        }
+      }
+    };
+    var selectorRe = /([^{]*)({[\s\S]*?})/gim, cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim, cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim, cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim, cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim, cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim, cssPseudoRe = /::(x-[^\s{,(]*)/gim, cssPartRe = /::part\(([^)]*)\)/gim, polyfillHost = "-shadowcsshost", polyfillHostContext = "-shadowcsscontext", parenSuffix = ")(?:\\((" + "(?:\\([^)(]*\\)|[^)(]*)+?" + ")\\))?([^,{]*)";
+    var cssColonHostRe = new RegExp("(" + polyfillHost + parenSuffix, "gim"), cssColonHostContextRe = new RegExp("(" + polyfillHostContext + parenSuffix, "gim"), selectorReSuffix = "([>\\s~+[.,{:][\\s\\S]*)?$", colonHostRe = /\:host/gim, colonHostContextRe = /\:host-context/gim, polyfillHostNoCombinator = polyfillHost + "-no-combinator", polyfillHostRe = new RegExp(polyfillHost, "gim"), polyfillHostContextRe = new RegExp(polyfillHostContext, "gim"), shadowDOMSelectorsRe = [ /\^\^/g, /\^/g, /\/shadow\//g, /\/shadow-deep\//g, /::shadow/g, /\/deep\//g, /::content/g ];
+    function stylesToCssText(styles, preserveComments) {
+      var cssText = "";
+      Array.prototype.forEach.call(styles, function(s) {
+        cssText += s.textContent + "\n\n";
+      });
+      if (!preserveComments) {
+        cssText = cssText.replace(cssCommentRe, "");
+      }
+      return cssText;
+    }
+    function cssTextToStyle(cssText) {
+      var style = document.createElement("style");
+      style.textContent = cssText;
+      return style;
+    }
+    function cssToRules(cssText) {
+      var style = cssTextToStyle(cssText);
+      document.head.appendChild(style);
+      var rules = [];
+      if (style.sheet) {
+        try {
+          rules = style.sheet.cssRules;
+        } catch (e) {}
+      } else {
+        console.warn("sheet not found", style);
+      }
+      style.parentNode.removeChild(style);
+      return rules;
+    }
+    var frame = document.createElement("iframe");
+    frame.style.display = "none";
+    function initFrame() {
+      frame.initialized = true;
+      document.body.appendChild(frame);
+      var doc = frame.contentDocument;
+      var base = doc.createElement("base");
+      base.href = document.baseURI;
+      doc.head.appendChild(base);
+    }
+    function inFrame(fn) {
+      if (!frame.initialized) {
+        initFrame();
+      }
+      document.body.appendChild(frame);
+      fn(frame.contentDocument);
+      document.body.removeChild(frame);
+    }
+    var isChrome = navigator.userAgent.match("Chrome");
+    function withCssRules(cssText, callback) {
+      if (!callback) {
+        return;
+      }
+      var rules;
+      if (cssText.match("@import") && isChrome) {
+        var style = cssTextToStyle(cssText);
+        inFrame(function(doc) {
+          doc.head.appendChild(style.impl);
+          rules = Array.prototype.slice.call(style.sheet.cssRules, 0);
+          callback(rules);
+        });
+      } else {
+        rules = cssToRules(cssText);
+        callback(rules);
+      }
+    }
+    function rulesToCss(cssRules) {
+      for (var i = 0, css = []; i < cssRules.length; i++) {
+        css.push(cssRules[i].cssText);
+      }
+      return css.join("\n\n");
+    }
+    function addCssToDocument(cssText) {
+      if (cssText) {
+        getSheet().appendChild(document.createTextNode(cssText));
+      }
+    }
+    function addOwnSheet(cssText, name) {
+      var style = cssTextToStyle(cssText);
+      style.setAttribute(name, "");
+      style.setAttribute(SHIMMED_ATTRIBUTE, "");
+      document.head.appendChild(style);
+    }
+    var SHIM_ATTRIBUTE = "shim-shadowdom";
+    var SHIMMED_ATTRIBUTE = "shim-shadowdom-css";
+    var NO_SHIM_ATTRIBUTE = "no-shim";
+    var sheet;
+    function getSheet() {
+      if (!sheet) {
+        sheet = document.createElement("style");
+        sheet.setAttribute(SHIMMED_ATTRIBUTE, "");
+        sheet[SHIMMED_ATTRIBUTE] = true;
+      }
+      return sheet;
+    }
+    if (window.ShadowDOMPolyfill) {
+      addCssToDocument("style { display: none !important; }\n");
+      var doc = ShadowDOMPolyfill.wrap(document);
+      var head = doc.querySelector("head");
+      head.insertBefore(getSheet(), head.childNodes[0]);
+      document.addEventListener("DOMContentLoaded", function() {
+        var urlResolver = scope.urlResolver;
+        if (window.HTMLImports && !HTMLImports.useNative) {
+          var SHIM_SHEET_SELECTOR = "link[rel=stylesheet]" + "[" + SHIM_ATTRIBUTE + "]";
+          var SHIM_STYLE_SELECTOR = "style[" + SHIM_ATTRIBUTE + "]";
+          HTMLImports.importer.documentPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
+          HTMLImports.importer.importsPreloadSelectors += "," + SHIM_SHEET_SELECTOR;
+          HTMLImports.parser.documentSelectors = [ HTMLImports.parser.documentSelectors, SHIM_SHEET_SELECTOR, SHIM_STYLE_SELECTOR ].join(",");
+          var originalParseGeneric = HTMLImports.parser.parseGeneric;
+          HTMLImports.parser.parseGeneric = function(elt) {
+            if (elt[SHIMMED_ATTRIBUTE]) {
+              return;
+            }
+            var style = elt.__importElement || elt;
+            if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
+              originalParseGeneric.call(this, elt);
+              return;
+            }
+            if (elt.__resource) {
+              style = elt.ownerDocument.createElement("style");
+              style.textContent = elt.__resource;
+            }
+            HTMLImports.path.resolveUrlsInStyle(style);
+            style.textContent = ShadowCSS.shimStyle(style);
+            style.removeAttribute(SHIM_ATTRIBUTE, "");
+            style.setAttribute(SHIMMED_ATTRIBUTE, "");
+            style[SHIMMED_ATTRIBUTE] = true;
+            if (style.parentNode !== head) {
+              if (elt.parentNode === head) {
+                head.replaceChild(style, elt);
+              } else {
+                this.addElementToDocument(style);
+              }
+            }
+            style.__importParsed = true;
+            this.markParsingComplete(elt);
+            this.parseNext();
+          };
+          var hasResource = HTMLImports.parser.hasResource;
+          HTMLImports.parser.hasResource = function(node) {
+            if (node.localName === "link" && node.rel === "stylesheet" && node.hasAttribute(SHIM_ATTRIBUTE)) {
+              return node.__resource;
+            } else {
+              return hasResource.call(this, node);
+            }
+          };
+        }
+      });
+    }
+    scope.ShadowCSS = ShadowCSS;
+  })(window.WebComponents);
+}
+
+(function(scope) {
+  if (window.ShadowDOMPolyfill) {
+    window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
+    window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
+  } else {
+    window.wrap = window.unwrap = function(n) {
+      return n;
+    };
+  }
+})(window.WebComponents);
+
+(function(global) {
+  var registrationsTable = new WeakMap();
+  var setImmediate;
+  if (/Trident/.test(navigator.userAgent)) {
+    setImmediate = setTimeout;
+  } else if (window.setImmediate) {
+    setImmediate = window.setImmediate;
+  } else {
+    var setImmediateQueue = [];
+    var sentinel = String(Math.random());
+    window.addEventListener("message", function(e) {
+      if (e.data === sentinel) {
+        var queue = setImmediateQueue;
+        setImmediateQueue = [];
+        queue.forEach(function(func) {
+          func();
+        });
+      }
+    });
+    setImmediate = function(func) {
+      setImmediateQueue.push(func);
+      window.postMessage(sentinel, "*");
+    };
+  }
+  var isScheduled = false;
+  var scheduledObservers = [];
+  function scheduleCallback(observer) {
+    scheduledObservers.push(observer);
+    if (!isScheduled) {
+      isScheduled = true;
+      setImmediate(dispatchCallbacks);
+    }
+  }
+  function wrapIfNeeded(node) {
+    return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
+  }
+  function dispatchCallbacks() {
+    isScheduled = false;
+    var observers = scheduledObservers;
+    scheduledObservers = [];
+    observers.sort(function(o1, o2) {
+      return o1.uid_ - o2.uid_;
+    });
+    var anyNonEmpty = false;
+    observers.forEach(function(observer) {
+      var queue = observer.takeRecords();
+      removeTransientObserversFor(observer);
+      if (queue.length) {
+        observer.callback_(queue, observer);
+        anyNonEmpty = true;
+      }
+    });
+    if (anyNonEmpty) dispatchCallbacks();
+  }
+  function removeTransientObserversFor(observer) {
+    observer.nodes_.forEach(function(node) {
+      var registrations = registrationsTable.get(node);
+      if (!registrations) return;
+      registrations.forEach(function(registration) {
+        if (registration.observer === observer) registration.removeTransientObservers();
+      });
+    });
+  }
+  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
+    for (var node = target; node; node = node.parentNode) {
+      var registrations = registrationsTable.get(node);
+      if (registrations) {
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          var options = registration.options;
+          if (node !== target && !options.subtree) continue;
+          var record = callback(options);
+          if (record) registration.enqueue(record);
+        }
+      }
+    }
+  }
+  var uidCounter = 0;
+  function JsMutationObserver(callback) {
+    this.callback_ = callback;
+    this.nodes_ = [];
+    this.records_ = [];
+    this.uid_ = ++uidCounter;
+  }
+  JsMutationObserver.prototype = {
+    observe: function(target, options) {
+      target = wrapIfNeeded(target);
+      if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
+        throw new SyntaxError();
+      }
+      var registrations = registrationsTable.get(target);
+      if (!registrations) registrationsTable.set(target, registrations = []);
+      var registration;
+      for (var i = 0; i < registrations.length; i++) {
+        if (registrations[i].observer === this) {
+          registration = registrations[i];
+          registration.removeListeners();
+          registration.options = options;
+          break;
+        }
+      }
+      if (!registration) {
+        registration = new Registration(this, target, options);
+        registrations.push(registration);
+        this.nodes_.push(target);
+      }
+      registration.addListeners();
+    },
+    disconnect: function() {
+      this.nodes_.forEach(function(node) {
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.observer === this) {
+            registration.removeListeners();
+            registrations.splice(i, 1);
+            break;
+          }
+        }
+      }, this);
+      this.records_ = [];
+    },
+    takeRecords: function() {
+      var copyOfRecords = this.records_;
+      this.records_ = [];
+      return copyOfRecords;
+    }
+  };
+  function MutationRecord(type, target) {
+    this.type = type;
+    this.target = target;
+    this.addedNodes = [];
+    this.removedNodes = [];
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.attributeName = null;
+    this.attributeNamespace = null;
+    this.oldValue = null;
+  }
+  function copyMutationRecord(original) {
+    var record = new MutationRecord(original.type, original.target);
+    record.addedNodes = original.addedNodes.slice();
+    record.removedNodes = original.removedNodes.slice();
+    record.previousSibling = original.previousSibling;
+    record.nextSibling = original.nextSibling;
+    record.attributeName = original.attributeName;
+    record.attributeNamespace = original.attributeNamespace;
+    record.oldValue = original.oldValue;
+    return record;
+  }
+  var currentRecord, recordWithOldValue;
+  function getRecord(type, target) {
+    return currentRecord = new MutationRecord(type, target);
+  }
+  function getRecordWithOldValue(oldValue) {
+    if (recordWithOldValue) return recordWithOldValue;
+    recordWithOldValue = copyMutationRecord(currentRecord);
+    recordWithOldValue.oldValue = oldValue;
+    return recordWithOldValue;
+  }
+  function clearRecords() {
+    currentRecord = recordWithOldValue = undefined;
+  }
+  function recordRepresentsCurrentMutation(record) {
+    return record === recordWithOldValue || record === currentRecord;
+  }
+  function selectRecord(lastRecord, newRecord) {
+    if (lastRecord === newRecord) return lastRecord;
+    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
+    return null;
+  }
+  function Registration(observer, target, options) {
+    this.observer = observer;
+    this.target = target;
+    this.options = options;
+    this.transientObservedNodes = [];
+  }
+  Registration.prototype = {
+    enqueue: function(record) {
+      var records = this.observer.records_;
+      var length = records.length;
+      if (records.length > 0) {
+        var lastRecord = records[length - 1];
+        var recordToReplaceLast = selectRecord(lastRecord, record);
+        if (recordToReplaceLast) {
+          records[length - 1] = recordToReplaceLast;
+          return;
+        }
+      } else {
+        scheduleCallback(this.observer);
+      }
+      records[length] = record;
+    },
+    addListeners: function() {
+      this.addListeners_(this.target);
+    },
+    addListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
+      if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
+      if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
+      if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
+    },
+    removeListeners: function() {
+      this.removeListeners_(this.target);
+    },
+    removeListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
+      if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
+      if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
+      if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
+    },
+    addTransientObserver: function(node) {
+      if (node === this.target) return;
+      this.addListeners_(node);
+      this.transientObservedNodes.push(node);
+      var registrations = registrationsTable.get(node);
+      if (!registrations) registrationsTable.set(node, registrations = []);
+      registrations.push(this);
+    },
+    removeTransientObservers: function() {
+      var transientObservedNodes = this.transientObservedNodes;
+      this.transientObservedNodes = [];
+      transientObservedNodes.forEach(function(node) {
+        this.removeListeners_(node);
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          if (registrations[i] === this) {
+            registrations.splice(i, 1);
+            break;
+          }
+        }
+      }, this);
+    },
+    handleEvent: function(e) {
+      e.stopImmediatePropagation();
+      switch (e.type) {
+       case "DOMAttrModified":
+        var name = e.attrName;
+        var namespace = e.relatedNode.namespaceURI;
+        var target = e.target;
+        var record = new getRecord("attributes", target);
+        record.attributeName = name;
+        record.attributeNamespace = namespace;
+        var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.attributes) return;
+          if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
+            return;
+          }
+          if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
+          return record;
+        });
+        break;
+
+       case "DOMCharacterDataModified":
+        var target = e.target;
+        var record = getRecord("characterData", target);
+        var oldValue = e.prevValue;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.characterData) return;
+          if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
+          return record;
+        });
+        break;
+
+       case "DOMNodeRemoved":
+        this.addTransientObserver(e.target);
+
+       case "DOMNodeInserted":
+        var target = e.relatedNode;
+        var changedNode = e.target;
+        var addedNodes, removedNodes;
+        if (e.type === "DOMNodeInserted") {
+          addedNodes = [ changedNode ];
+          removedNodes = [];
+        } else {
+          addedNodes = [];
+          removedNodes = [ changedNode ];
+        }
+        var previousSibling = changedNode.previousSibling;
+        var nextSibling = changedNode.nextSibling;
+        var record = getRecord("childList", target);
+        record.addedNodes = addedNodes;
+        record.removedNodes = removedNodes;
+        record.previousSibling = previousSibling;
+        record.nextSibling = nextSibling;
+        forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+          if (!options.childList) return;
+          return record;
+        });
+      }
+      clearRecords();
+    }
+  };
+  global.JsMutationObserver = JsMutationObserver;
+  if (!global.MutationObserver) global.MutationObserver = JsMutationObserver;
+})(this);
+
+window.HTMLImports = window.HTMLImports || {
+  flags: {}
+};
+
+(function(scope) {
+  var IMPORT_LINK_TYPE = "import";
+  var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement("link"));
+  var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill);
+  var wrap = function(node) {
+    return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node;
+  };
+  var rootDocument = wrap(document);
+  var currentScriptDescriptor = {
+    get: function() {
+      var script = HTMLImports.currentScript || document.currentScript || (document.readyState !== "complete" ? document.scripts[document.scripts.length - 1] : null);
+      return wrap(script);
+    },
+    configurable: true
+  };
+  Object.defineProperty(document, "_currentScript", currentScriptDescriptor);
+  Object.defineProperty(rootDocument, "_currentScript", currentScriptDescriptor);
+  var isIE = /Trident/.test(navigator.userAgent);
+  function whenReady(callback, doc) {
+    doc = doc || rootDocument;
+    whenDocumentReady(function() {
+      watchImportsLoad(callback, doc);
+    }, doc);
+  }
+  var requiredReadyState = isIE ? "complete" : "interactive";
+  var READY_EVENT = "readystatechange";
+  function isDocumentReady(doc) {
+    return doc.readyState === "complete" || doc.readyState === requiredReadyState;
+  }
+  function whenDocumentReady(callback, doc) {
+    if (!isDocumentReady(doc)) {
+      var checkReady = function() {
+        if (doc.readyState === "complete" || doc.readyState === requiredReadyState) {
+          doc.removeEventListener(READY_EVENT, checkReady);
+          whenDocumentReady(callback, doc);
+        }
+      };
+      doc.addEventListener(READY_EVENT, checkReady);
+    } else if (callback) {
+      callback();
+    }
+  }
+  function markTargetLoaded(event) {
+    event.target.__loaded = true;
+  }
+  function watchImportsLoad(callback, doc) {
+    var imports = doc.querySelectorAll("link[rel=import]");
+    var loaded = 0, l = imports.length;
+    function checkDone(d) {
+      if (loaded == l && callback) {
+        callback();
+      }
+    }
+    function loadedImport(e) {
+      markTargetLoaded(e);
+      loaded++;
+      checkDone();
+    }
+    if (l) {
+      for (var i = 0, imp; i < l && (imp = imports[i]); i++) {
+        if (isImportLoaded(imp)) {
+          loadedImport.call(imp, {
+            target: imp
+          });
+        } else {
+          imp.addEventListener("load", loadedImport);
+          imp.addEventListener("error", loadedImport);
+        }
+      }
+    } else {
+      checkDone();
+    }
+  }
+  function isImportLoaded(link) {
+    return useNative ? link.__loaded || link.import && link.import.readyState !== "loading" : link.__importParsed;
+  }
+  if (useNative) {
+    new MutationObserver(function(mxns) {
+      for (var i = 0, l = mxns.length, m; i < l && (m = mxns[i]); i++) {
+        if (m.addedNodes) {
+          handleImports(m.addedNodes);
+        }
+      }
+    }).observe(document.head, {
+      childList: true
+    });
+    function handleImports(nodes) {
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        if (isImport(n)) {
+          handleImport(n);
+        }
+      }
+    }
+    function isImport(element) {
+      return element.localName === "link" && element.rel === "import";
+    }
+    function handleImport(element) {
+      var loaded = element.import;
+      if (loaded) {
+        markTargetLoaded({
+          target: element
+        });
+      } else {
+        element.addEventListener("load", markTargetLoaded);
+        element.addEventListener("error", markTargetLoaded);
+      }
+    }
+    (function() {
+      if (document.readyState === "loading") {
+        var imports = document.querySelectorAll("link[rel=import]");
+        for (var i = 0, l = imports.length, imp; i < l && (imp = imports[i]); i++) {
+          handleImport(imp);
+        }
+      }
+    })();
+  }
+  whenReady(function() {
+    HTMLImports.ready = true;
+    HTMLImports.readyTime = new Date().getTime();
+    rootDocument.dispatchEvent(new CustomEvent("HTMLImportsLoaded", {
+      bubbles: true
+    }));
+  });
+  scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+  scope.useNative = useNative;
+  scope.rootDocument = rootDocument;
+  scope.whenReady = whenReady;
+  scope.isIE = isIE;
+})(HTMLImports);
+
+(function(scope) {
+  var modules = [];
+  var addModule = function(module) {
+    modules.push(module);
+  };
+  var initializeModules = function() {
+    modules.forEach(function(module) {
+      module(scope);
+    });
+  };
+  scope.addModule = addModule;
+  scope.initializeModules = initializeModules;
+})(HTMLImports);
+
+HTMLImports.addModule(function(scope) {
+  var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+  var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+  var path = {
+    resolveUrlsInStyle: function(style) {
+      var doc = style.ownerDocument;
+      var resolver = doc.createElement("a");
+      style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
+      return style;
+    },
+    resolveUrlsInCssText: function(cssText, urlObj) {
+      var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
+      r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
+      return r;
+    },
+    replaceUrls: function(text, urlObj, regexp) {
+      return text.replace(regexp, function(m, pre, url, post) {
+        var urlPath = url.replace(/["']/g, "");
+        urlObj.href = urlPath;
+        urlPath = urlObj.href;
+        return pre + "'" + urlPath + "'" + post;
+      });
+    }
+  };
+  scope.path = path;
+});
+
+HTMLImports.addModule(function(scope) {
+  xhr = {
+    async: true,
+    ok: function(request) {
+      return request.status >= 200 && request.status < 300 || request.status === 304 || request.status === 0;
+    },
+    load: function(url, next, nextContext) {
+      var request = new XMLHttpRequest();
+      if (scope.flags.debug || scope.flags.bust) {
+        url += "?" + Math.random();
+      }
+      request.open("GET", url, xhr.async);
+      request.addEventListener("readystatechange", function(e) {
+        if (request.readyState === 4) {
+          var locationHeader = request.getResponseHeader("Location");
+          var redirectedUrl = null;
+          if (locationHeader) {
+            var redirectedUrl = locationHeader.substr(0, 1) === "/" ? location.origin + locationHeader : locationHeader;
+          }
+          next.call(nextContext, !xhr.ok(request) && request, request.response || request.responseText, redirectedUrl);
+        }
+      });
+      request.send();
+      return request;
+    },
+    loadDocument: function(url, next, nextContext) {
+      this.load(url, next, nextContext).responseType = "document";
+    }
+  };
+  scope.xhr = xhr;
+});
+
+HTMLImports.addModule(function(scope) {
+  var xhr = scope.xhr;
+  var flags = scope.flags;
+  var Loader = function(onLoad, onComplete) {
+    this.cache = {};
+    this.onload = onLoad;
+    this.oncomplete = onComplete;
+    this.inflight = 0;
+    this.pending = {};
+  };
+  Loader.prototype = {
+    addNodes: function(nodes) {
+      this.inflight += nodes.length;
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        this.require(n);
+      }
+      this.checkDone();
+    },
+    addNode: function(node) {
+      this.inflight++;
+      this.require(node);
+      this.checkDone();
+    },
+    require: function(elt) {
+      var url = elt.src || elt.href;
+      elt.__nodeUrl = url;
+      if (!this.dedupe(url, elt)) {
+        this.fetch(url, elt);
+      }
+    },
+    dedupe: function(url, elt) {
+      if (this.pending[url]) {
+        this.pending[url].push(elt);
+        return true;
+      }
+      var resource;
+      if (this.cache[url]) {
+        this.onload(url, elt, this.cache[url]);
+        this.tail();
+        return true;
+      }
+      this.pending[url] = [ elt ];
+      return false;
+    },
+    fetch: function(url, elt) {
+      flags.load && console.log("fetch", url, elt);
+      if (url.match(/^data:/)) {
+        var pieces = url.split(",");
+        var header = pieces[0];
+        var body = pieces[1];
+        if (header.indexOf(";base64") > -1) {
+          body = atob(body);
+        } else {
+          body = decodeURIComponent(body);
+        }
+        setTimeout(function() {
+          this.receive(url, elt, null, body);
+        }.bind(this), 0);
+      } else {
+        var receiveXhr = function(err, resource, redirectedUrl) {
+          this.receive(url, elt, err, resource, redirectedUrl);
+        }.bind(this);
+        xhr.load(url, receiveXhr);
+      }
+    },
+    receive: function(url, elt, err, resource, redirectedUrl) {
+      this.cache[url] = resource;
+      var $p = this.pending[url];
+      for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
+        this.onload(url, p, resource, err, redirectedUrl);
+        this.tail();
+      }
+      this.pending[url] = null;
+    },
+    tail: function() {
+      --this.inflight;
+      this.checkDone();
+    },
+    checkDone: function() {
+      if (!this.inflight) {
+        this.oncomplete();
+      }
+    }
+  };
+  scope.Loader = Loader;
+});
+
+HTMLImports.addModule(function(scope) {
+  var Observer = function(addCallback) {
+    this.addCallback = addCallback;
+    this.mo = new MutationObserver(this.handler.bind(this));
+  };
+  Observer.prototype = {
+    handler: function(mutations) {
+      for (var i = 0, l = mutations.length, m; i < l && (m = mutations[i]); i++) {
+        if (m.type === "childList" && m.addedNodes.length) {
+          this.addedNodes(m.addedNodes);
+        }
+      }
+    },
+    addedNodes: function(nodes) {
+      if (this.addCallback) {
+        this.addCallback(nodes);
+      }
+      for (var i = 0, l = nodes.length, n, loading; i < l && (n = nodes[i]); i++) {
+        if (n.children && n.children.length) {
+          this.addedNodes(n.children);
+        }
+      }
+    },
+    observe: function(root) {
+      this.mo.observe(root, {
+        childList: true,
+        subtree: true
+      });
+    }
+  };
+  scope.Observer = Observer;
+});
+
+HTMLImports.addModule(function(scope) {
+  var path = scope.path;
+  var rootDocument = scope.rootDocument;
+  var flags = scope.flags;
+  var isIE = scope.isIE;
+  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+  var IMPORT_SELECTOR = "link[rel=" + IMPORT_LINK_TYPE + "]";
+  var importParser = {
+    documentSelectors: IMPORT_SELECTOR,
+    importsSelectors: [ IMPORT_SELECTOR, "link[rel=stylesheet]", "style", "script:not([type])", 'script[type="text/javascript"]' ].join(","),
+    map: {
+      link: "parseLink",
+      script: "parseScript",
+      style: "parseStyle"
+    },
+    dynamicElements: [],
+    parseNext: function() {
+      var next = this.nextToParse();
+      if (next) {
+        this.parse(next);
+      }
+    },
+    parse: function(elt) {
+      if (this.isParsed(elt)) {
+        flags.parse && console.log("[%s] is already parsed", elt.localName);
+        return;
+      }
+      var fn = this[this.map[elt.localName]];
+      if (fn) {
+        this.markParsing(elt);
+        fn.call(this, elt);
+      }
+    },
+    parseDynamic: function(elt, quiet) {
+      this.dynamicElements.push(elt);
+      if (!quiet) {
+        this.parseNext();
+      }
+    },
+    markParsing: function(elt) {
+      flags.parse && console.log("parsing", elt);
+      this.parsingElement = elt;
+    },
+    markParsingComplete: function(elt) {
+      elt.__importParsed = true;
+      this.markDynamicParsingComplete(elt);
+      if (elt.__importElement) {
+        elt.__importElement.__importParsed = true;
+        this.markDynamicParsingComplete(elt.__importElement);
+      }
+      this.parsingElement = null;
+      flags.parse && console.log("completed", elt);
+    },
+    markDynamicParsingComplete: function(elt) {
+      var i = this.dynamicElements.indexOf(elt);
+      if (i >= 0) {
+        this.dynamicElements.splice(i, 1);
+      }
+    },
+    parseImport: function(elt) {
+      if (HTMLImports.__importsParsingHook) {
+        HTMLImports.__importsParsingHook(elt);
+      }
+      if (elt.import) {
+        elt.import.__importParsed = true;
+      }
+      this.markParsingComplete(elt);
+      if (elt.__resource && !elt.__error) {
+        elt.dispatchEvent(new CustomEvent("load", {
+          bubbles: false
+        }));
+      } else {
+        elt.dispatchEvent(new CustomEvent("error", {
+          bubbles: false
+        }));
+      }
+      if (elt.__pending) {
+        var fn;
+        while (elt.__pending.length) {
+          fn = elt.__pending.shift();
+          if (fn) {
+            fn({
+              target: elt
+            });
+          }
+        }
+      }
+      this.parseNext();
+    },
+    parseLink: function(linkElt) {
+      if (nodeIsImport(linkElt)) {
+        this.parseImport(linkElt);
+      } else {
+        linkElt.href = linkElt.href;
+        this.parseGeneric(linkElt);
+      }
+    },
+    parseStyle: function(elt) {
+      var src = elt;
+      elt = cloneStyle(elt);
+      elt.__importElement = src;
+      this.parseGeneric(elt);
+    },
+    parseGeneric: function(elt) {
+      this.trackElement(elt);
+      this.addElementToDocument(elt);
+    },
+    rootImportForElement: function(elt) {
+      var n = elt;
+      while (n.ownerDocument.__importLink) {
+        n = n.ownerDocument.__importLink;
+      }
+      return n;
+    },
+    addElementToDocument: function(elt) {
+      var port = this.rootImportForElement(elt.__importElement || elt);
+      var l = port.__insertedElements = port.__insertedElements || 0;
+      var refNode = port.nextElementSibling;
+      for (var i = 0; i < l; i++) {
+        refNode = refNode && refNode.nextElementSibling;
+      }
+      port.parentNode.insertBefore(elt, refNode);
+    },
+    trackElement: function(elt, callback) {
+      var self = this;
+      var done = function(e) {
+        if (callback) {
+          callback(e);
+        }
+        self.markParsingComplete(elt);
+        self.parseNext();
+      };
+      elt.addEventListener("load", done);
+      elt.addEventListener("error", done);
+      if (isIE && elt.localName === "style") {
+        var fakeLoad = false;
+        if (elt.textContent.indexOf("@import") == -1) {
+          fakeLoad = true;
+        } else if (elt.sheet) {
+          fakeLoad = true;
+          var csr = elt.sheet.cssRules;
+          var len = csr ? csr.length : 0;
+          for (var i = 0, r; i < len && (r = csr[i]); i++) {
+            if (r.type === CSSRule.IMPORT_RULE) {
+              fakeLoad = fakeLoad && Boolean(r.styleSheet);
+            }
+          }
+        }
+        if (fakeLoad) {
+          elt.dispatchEvent(new CustomEvent("load", {
+            bubbles: false
+          }));
+        }
+      }
+    },
+    parseScript: function(scriptElt) {
+      var script = document.createElement("script");
+      script.__importElement = scriptElt;
+      script.src = scriptElt.src ? scriptElt.src : generateScriptDataUrl(scriptElt);
+      scope.currentScript = scriptElt;
+      this.trackElement(script, function(e) {
+        script.parentNode.removeChild(script);
+        scope.currentScript = null;
+      });
+      this.addElementToDocument(script);
+    },
+    nextToParse: function() {
+      this._mayParse = [];
+      return !this.parsingElement && (this.nextToParseInDoc(rootDocument) || this.nextToParseDynamic());
+    },
+    nextToParseInDoc: function(doc, link) {
+      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)) {
+            if (this.hasResource(n)) {
+              return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;
+            } else {
+              return;
+            }
+          }
+        }
+      }
+      return link;
+    },
+    nextToParseDynamic: function() {
+      return this.dynamicElements[0];
+    },
+    parseSelectorsForNode: function(node) {
+      var doc = node.ownerDocument || node;
+      return doc === rootDocument ? this.documentSelectors : this.importsSelectors;
+    },
+    isParsed: function(node) {
+      return node.__importParsed;
+    },
+    needsDynamicParsing: function(elt) {
+      return this.dynamicElements.indexOf(elt) >= 0;
+    },
+    hasResource: function(node) {
+      if (nodeIsImport(node) && node.import === undefined) {
+        return false;
+      }
+      return true;
+    }
+  };
+  function nodeIsImport(elt) {
+    return elt.localName === "link" && elt.rel === IMPORT_LINK_TYPE;
+  }
+  function generateScriptDataUrl(script) {
+    var scriptContent = generateScriptContent(script);
+    return "data:text/javascript;charset=utf-8," + encodeURIComponent(scriptContent);
+  }
+  function generateScriptContent(script) {
+    return script.textContent + generateSourceMapHint(script);
+  }
+  function generateSourceMapHint(script) {
+    var owner = script.ownerDocument;
+    owner.__importedScripts = owner.__importedScripts || 0;
+    var moniker = script.ownerDocument.baseURI;
+    var num = owner.__importedScripts ? "-" + owner.__importedScripts : "";
+    owner.__importedScripts++;
+    return "\n//# sourceURL=" + moniker + num + ".js\n";
+  }
+  function cloneStyle(style) {
+    var clone = style.ownerDocument.createElement("style");
+    clone.textContent = style.textContent;
+    path.resolveUrlsInStyle(clone);
+    return clone;
+  }
+  scope.parser = importParser;
+  scope.IMPORT_SELECTOR = IMPORT_SELECTOR;
+});
+
+HTMLImports.addModule(function(scope) {
+  var flags = scope.flags;
+  var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+  var IMPORT_SELECTOR = scope.IMPORT_SELECTOR;
+  var rootDocument = scope.rootDocument;
+  var Loader = scope.Loader;
+  var Observer = scope.Observer;
+  var parser = scope.parser;
+  var importer = {
+    documents: {},
+    documentPreloadSelectors: IMPORT_SELECTOR,
+    importsPreloadSelectors: [ IMPORT_SELECTOR ].join(","),
+    loadNode: function(node) {
+      importLoader.addNode(node);
+    },
+    loadSubtree: function(parent) {
+      var nodes = this.marshalNodes(parent);
+      importLoader.addNodes(nodes);
+    },
+    marshalNodes: function(parent) {
+      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
+    },
+    loadSelectorsForNode: function(node) {
+      var doc = node.ownerDocument || node;
+      return doc === rootDocument ? this.documentPreloadSelectors : this.importsPreloadSelectors;
+    },
+    loaded: function(url, elt, resource, err, redirectedUrl) {
+      flags.load && console.log("loaded", url, elt);
+      elt.__resource = resource;
+      elt.__error = err;
+      if (isImportLink(elt)) {
+        var doc = this.documents[url];
+        if (doc === undefined) {
+          doc = err ? null : makeDocument(resource, redirectedUrl || url);
+          if (doc) {
+            doc.__importLink = elt;
+            this.bootDocument(doc);
+          }
+          this.documents[url] = doc;
+        }
+        elt.import = doc;
+      }
+      parser.parseNext();
+    },
+    bootDocument: function(doc) {
+      this.loadSubtree(doc);
+      this.observer.observe(doc);
+      parser.parseNext();
+    },
+    loadedAll: function() {
+      parser.parseNext();
+    }
+  };
+  var importLoader = new Loader(importer.loaded.bind(importer), importer.loadedAll.bind(importer));
+  importer.observer = new Observer();
+  function isImportLink(elt) {
+    return isLinkRel(elt, IMPORT_LINK_TYPE);
+  }
+  function isLinkRel(elt, rel) {
+    return elt.localName === "link" && elt.getAttribute("rel") === rel;
+  }
+  function makeDocument(resource, url) {
+    var doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
+    doc._URL = url;
+    var base = doc.createElement("base");
+    base.setAttribute("href", url);
+    if (!doc.baseURI) {
+      doc.baseURI = url;
+    }
+    var meta = doc.createElement("meta");
+    meta.setAttribute("charset", "utf-8");
+    doc.head.appendChild(meta);
+    doc.head.appendChild(base);
+    doc.body.innerHTML = resource;
+    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
+      HTMLTemplateElement.bootstrap(doc);
+    }
+    return doc;
+  }
+  if (!document.baseURI) {
+    var baseURIDescriptor = {
+      get: function() {
+        var base = document.querySelector("base");
+        return base ? base.href : window.location.href;
+      },
+      configurable: true
+    };
+    Object.defineProperty(document, "baseURI", baseURIDescriptor);
+    Object.defineProperty(rootDocument, "baseURI", baseURIDescriptor);
+  }
+  scope.importer = importer;
+  scope.importLoader = importLoader;
+});
+
+HTMLImports.addModule(function(scope) {
+  var parser = scope.parser;
+  var importer = scope.importer;
+  var dynamic = {
+    added: function(nodes) {
+      var owner, parsed;
+      for (var i = 0, l = nodes.length, n; i < l && (n = nodes[i]); i++) {
+        if (!owner) {
+          owner = n.ownerDocument;
+          parsed = parser.isParsed(owner);
+        }
+        loading = this.shouldLoadNode(n);
+        if (loading) {
+          importer.loadNode(n);
+        }
+        if (this.shouldParseNode(n) && parsed) {
+          parser.parseDynamic(n, loading);
+        }
+      }
+    },
+    shouldLoadNode: function(node) {
+      return node.nodeType === 1 && matches.call(node, importer.loadSelectorsForNode(node));
+    },
+    shouldParseNode: function(node) {
+      return node.nodeType === 1 && matches.call(node, parser.parseSelectorsForNode(node));
+    }
+  };
+  importer.observer.addCallback = dynamic.added.bind(dynamic);
+  var matches = HTMLElement.prototype.matches || HTMLElement.prototype.matchesSelector || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector || HTMLElement.prototype.msMatchesSelector;
+});
+
+(function(scope) {
+  initializeModules = scope.initializeModules;
+  if (scope.useNative) {
+    return;
+  }
+  if (typeof window.CustomEvent !== "function") {
+    window.CustomEvent = function(inType, dictionary) {
+      var e = document.createEvent("HTMLEvents");
+      e.initEvent(inType, dictionary.bubbles === false ? false : true, dictionary.cancelable === false ? false : true, dictionary.detail);
+      return e;
+    };
+  }
+  initializeModules();
+  var rootDocument = scope.rootDocument;
+  function bootstrap() {
+    HTMLImports.importer.bootDocument(rootDocument);
+  }
+  if (document.readyState === "complete" || document.readyState === "interactive" && !window.attachEvent) {
+    bootstrap();
+  } else {
+    document.addEventListener("DOMContentLoaded", bootstrap);
+  }
+})(HTMLImports);
+
+window.CustomElements = window.CustomElements || {
+  flags: {}
+};
+
+(function(scope) {
+  var flags = scope.flags;
+  var modules = [];
+  var addModule = function(module) {
+    modules.push(module);
+  };
+  var initializeModules = function() {
+    modules.forEach(function(module) {
+      module(scope);
+    });
+  };
+  scope.addModule = addModule;
+  scope.initializeModules = initializeModules;
+  scope.hasNative = Boolean(document.registerElement);
+  scope.useNative = !flags.register && scope.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || HTMLImports.useNative);
+})(CustomElements);
+
+CustomElements.addModule(function(scope) {
+  var IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : "none";
+  function forSubtree(node, cb) {
+    findAllElements(node, function(e) {
+      if (cb(e)) {
+        return true;
+      }
+      forRoots(e, cb);
+    });
+    forRoots(node, cb);
+  }
+  function findAllElements(node, find, data) {
+    var e = node.firstElementChild;
+    if (!e) {
+      e = node.firstChild;
+      while (e && e.nodeType !== Node.ELEMENT_NODE) {
+        e = e.nextSibling;
+      }
+    }
+    while (e) {
+      if (find(e, data) !== true) {
+        findAllElements(e, find, data);
+      }
+      e = e.nextElementSibling;
+    }
+    return null;
+  }
+  function forRoots(node, cb) {
+    var root = node.shadowRoot;
+    while (root) {
+      forSubtree(root, cb);
+      root = root.olderShadowRoot;
+    }
+  }
+  var processingDocuments;
+  function forDocumentTree(doc, cb) {
+    processingDocuments = [];
+    _forDocumentTree(doc, cb);
+    processingDocuments = null;
+  }
+  function _forDocumentTree(doc, cb) {
+    doc = wrap(doc);
+    if (processingDocuments.indexOf(doc) >= 0) {
+      return;
+    }
+    processingDocuments.push(doc);
+    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) {
+        _forDocumentTree(n.import, cb);
+      }
+    }
+    cb(doc);
+  }
+  scope.forDocumentTree = forDocumentTree;
+  scope.forSubtree = forSubtree;
+});
+
+CustomElements.addModule(function(scope) {
+  var flags = scope.flags;
+  var forSubtree = scope.forSubtree;
+  var forDocumentTree = scope.forDocumentTree;
+  function addedNode(node) {
+    return added(node) || addedSubtree(node);
+  }
+  function added(node) {
+    if (scope.upgrade(node)) {
+      return true;
+    }
+    attached(node);
+  }
+  function addedSubtree(node) {
+    forSubtree(node, function(e) {
+      if (added(e)) {
+        return true;
+      }
+    });
+  }
+  function attachedNode(node) {
+    attached(node);
+    if (inDocument(node)) {
+      forSubtree(node, function(e) {
+        attached(e);
+      });
+    }
+  }
+  var hasPolyfillMutations = !window.MutationObserver || window.MutationObserver === window.JsMutationObserver;
+  scope.hasPolyfillMutations = hasPolyfillMutations;
+  var isPendingMutations = false;
+  var pendingMutations = [];
+  function deferMutation(fn) {
+    pendingMutations.push(fn);
+    if (!isPendingMutations) {
+      isPendingMutations = true;
+      setTimeout(takeMutations);
+    }
+  }
+  function takeMutations() {
+    isPendingMutations = false;
+    var $p = pendingMutations;
+    for (var i = 0, l = $p.length, p; i < l && (p = $p[i]); i++) {
+      p();
+    }
+    pendingMutations = [];
+  }
+  function attached(element) {
+    if (hasPolyfillMutations) {
+      deferMutation(function() {
+        _attached(element);
+      });
+    } else {
+      _attached(element);
+    }
+  }
+  function _attached(element) {
+    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
+      if (!element.__attached && inDocument(element)) {
+        element.__attached = true;
+        if (element.attachedCallback) {
+          element.attachedCallback();
+        }
+      }
+    }
+  }
+  function detachedNode(node) {
+    detached(node);
+    forSubtree(node, function(e) {
+      detached(e);
+    });
+  }
+  function detached(element) {
+    if (hasPolyfillMutations) {
+      deferMutation(function() {
+        _detached(element);
+      });
+    } else {
+      _detached(element);
+    }
+  }
+  function _detached(element) {
+    if (element.__upgraded__ && (element.attachedCallback || element.detachedCallback)) {
+      if (element.__attached && !inDocument(element)) {
+        element.__attached = false;
+        if (element.detachedCallback) {
+          element.detachedCallback();
+        }
+      }
+    }
+  }
+  function inDocument(element) {
+    var p = element;
+    var doc = wrap(document);
+    while (p) {
+      if (p == doc) {
+        return true;
+      }
+      p = p.parentNode || p.host;
+    }
+  }
+  function watchShadow(node) {
+    if (node.shadowRoot && !node.shadowRoot.__watched) {
+      flags.dom && console.log("watching shadow-root for: ", node.localName);
+      var root = node.shadowRoot;
+      while (root) {
+        observe(root);
+        root = root.olderShadowRoot;
+      }
+    }
+  }
+  function handler(mutations) {
+    if (flags.dom) {
+      var mx = mutations[0];
+      if (mx && mx.type === "childList" && mx.addedNodes) {
+        if (mx.addedNodes) {
+          var d = mx.addedNodes[0];
+          while (d && d !== document && !d.host) {
+            d = d.parentNode;
+          }
+          var u = d && (d.URL || d._URL || d.host && d.host.localName) || "";
+          u = u.split("/?").shift().split("/").pop();
+        }
+      }
+      console.group("mutations (%d) [%s]", mutations.length, u || "");
+    }
+    mutations.forEach(function(mx) {
+      if (mx.type === "childList") {
+        forEach(mx.addedNodes, function(n) {
+          if (!n.localName) {
+            return;
+          }
+          addedNode(n);
+        });
+        forEach(mx.removedNodes, function(n) {
+          if (!n.localName) {
+            return;
+          }
+          detachedNode(n);
+        });
+      }
+    });
+    flags.dom && console.groupEnd();
+  }
+  function takeRecords(node) {
+    node = wrap(node);
+    if (!node) {
+      node = wrap(document);
+    }
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+    var observer = node.__observer;
+    if (observer) {
+      handler(observer.takeRecords());
+      takeMutations();
+    }
+  }
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+  function observe(inRoot) {
+    if (inRoot.__observer) {
+      return;
+    }
+    var observer = new MutationObserver(handler);
+    observer.observe(inRoot, {
+      childList: true,
+      subtree: true
+    });
+    inRoot.__observer = observer;
+  }
+  function upgradeDocument(doc) {
+    doc = wrap(doc);
+    flags.dom && console.group("upgradeDocument: ", doc.baseURI.split("/").pop());
+    addedNode(doc);
+    observe(doc);
+    flags.dom && console.groupEnd();
+  }
+  function upgradeDocumentTree(doc) {
+    forDocumentTree(doc, upgradeDocument);
+  }
+  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
+  Element.prototype.createShadowRoot = function() {
+    var root = originalCreateShadowRoot.call(this);
+    CustomElements.watchShadow(this);
+    return root;
+  };
+  scope.watchShadow = watchShadow;
+  scope.upgradeDocumentTree = upgradeDocumentTree;
+  scope.upgradeSubtree = addedSubtree;
+  scope.upgradeAll = addedNode;
+  scope.attachedNode = attachedNode;
+  scope.takeRecords = takeRecords;
+});
+
+CustomElements.addModule(function(scope) {
+  var flags = scope.flags;
+  function upgrade(node) {
+    if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {
+      var is = node.getAttribute("is");
+      var definition = scope.getRegisteredDefinition(is || node.localName);
+      if (definition) {
+        if (is && definition.tag == node.localName) {
+          return upgradeWithDefinition(node, definition);
+        } else if (!is && !definition.extends) {
+          return upgradeWithDefinition(node, definition);
+        }
+      }
+    }
+  }
+  function upgradeWithDefinition(element, definition) {
+    flags.upgrade && console.group("upgrade:", element.localName);
+    if (definition.is) {
+      element.setAttribute("is", definition.is);
+    }
+    implementPrototype(element, definition);
+    element.__upgraded__ = true;
+    created(element);
+    scope.attachedNode(element);
+    scope.upgradeSubtree(element);
+    flags.upgrade && console.groupEnd();
+    return element;
+  }
+  function implementPrototype(element, definition) {
+    if (Object.__proto__) {
+      element.__proto__ = definition.prototype;
+    } else {
+      customMixin(element, definition.prototype, definition.native);
+      element.__proto__ = definition.prototype;
+    }
+  }
+  function customMixin(inTarget, inSrc, inNative) {
+    var used = {};
+    var p = inSrc;
+    while (p !== inNative && p !== HTMLElement.prototype) {
+      var keys = Object.getOwnPropertyNames(p);
+      for (var i = 0, k; k = keys[i]; i++) {
+        if (!used[k]) {
+          Object.defineProperty(inTarget, k, Object.getOwnPropertyDescriptor(p, k));
+          used[k] = 1;
+        }
+      }
+      p = Object.getPrototypeOf(p);
+    }
+  }
+  function created(element) {
+    if (element.createdCallback) {
+      element.createdCallback();
+    }
+  }
+  scope.upgrade = upgrade;
+  scope.upgradeWithDefinition = upgradeWithDefinition;
+  scope.implementPrototype = implementPrototype;
+});
+
+CustomElements.addModule(function(scope) {
+  var upgradeDocumentTree = scope.upgradeDocumentTree;
+  var upgrade = scope.upgrade;
+  var upgradeWithDefinition = scope.upgradeWithDefinition;
+  var implementPrototype = scope.implementPrototype;
+  var useNative = scope.useNative;
+  function register(name, options) {
+    var definition = options || {};
+    if (!name) {
+      throw new Error("document.registerElement: first argument `name` must not be empty");
+    }
+    if (name.indexOf("-") < 0) {
+      throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(name) + "'.");
+    }
+    if (isReservedTag(name)) {
+      throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(name) + "'. The type name is invalid.");
+    }
+    if (getRegisteredDefinition(name)) {
+      throw new Error("DuplicateDefinitionError: a type with name '" + String(name) + "' is already registered");
+    }
+    if (!definition.prototype) {
+      definition.prototype = Object.create(HTMLElement.prototype);
+    }
+    definition.__name = name.toLowerCase();
+    definition.lifecycle = definition.lifecycle || {};
+    definition.ancestry = ancestry(definition.extends);
+    resolveTagName(definition);
+    resolvePrototypeChain(definition);
+    overrideAttributeApi(definition.prototype);
+    registerDefinition(definition.__name, definition);
+    definition.ctor = generateConstructor(definition);
+    definition.ctor.prototype = definition.prototype;
+    definition.prototype.constructor = definition.ctor;
+    if (scope.ready) {
+      upgradeDocumentTree(document);
+    }
+    return definition.ctor;
+  }
+  function overrideAttributeApi(prototype) {
+    if (prototype.setAttribute._polyfilled) {
+      return;
+    }
+    var setAttribute = prototype.setAttribute;
+    prototype.setAttribute = function(name, value) {
+      changeAttribute.call(this, name, value, setAttribute);
+    };
+    var removeAttribute = prototype.removeAttribute;
+    prototype.removeAttribute = function(name) {
+      changeAttribute.call(this, name, null, removeAttribute);
+    };
+    prototype.setAttribute._polyfilled = true;
+  }
+  function changeAttribute(name, value, operation) {
+    name = name.toLowerCase();
+    var oldValue = this.getAttribute(name);
+    operation.apply(this, arguments);
+    var newValue = this.getAttribute(name);
+    if (this.attributeChangedCallback && newValue !== oldValue) {
+      this.attributeChangedCallback(name, oldValue, newValue);
+    }
+  }
+  function isReservedTag(name) {
+    for (var i = 0; i < reservedTagList.length; i++) {
+      if (name === reservedTagList[i]) {
+        return true;
+      }
+    }
+  }
+  var reservedTagList = [ "annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph" ];
+  function ancestry(extnds) {
+    var extendee = getRegisteredDefinition(extnds);
+    if (extendee) {
+      return ancestry(extendee.extends).concat([ extendee ]);
+    }
+    return [];
+  }
+  function resolveTagName(definition) {
+    var baseTag = definition.extends;
+    for (var i = 0, a; a = definition.ancestry[i]; i++) {
+      baseTag = a.is && a.tag;
+    }
+    definition.tag = baseTag || definition.__name;
+    if (baseTag) {
+      definition.is = definition.__name;
+    }
+  }
+  function resolvePrototypeChain(definition) {
+    if (!Object.__proto__) {
+      var nativePrototype = HTMLElement.prototype;
+      if (definition.is) {
+        var inst = document.createElement(definition.tag);
+        var expectedPrototype = Object.getPrototypeOf(inst);
+        if (expectedPrototype === definition.prototype) {
+          nativePrototype = expectedPrototype;
+        }
+      }
+      var proto = definition.prototype, ancestor;
+      while (proto && proto !== nativePrototype) {
+        ancestor = Object.getPrototypeOf(proto);
+        proto.__proto__ = ancestor;
+        proto = ancestor;
+      }
+      definition.native = nativePrototype;
+    }
+  }
+  function instantiate(definition) {
+    return upgradeWithDefinition(domCreateElement(definition.tag), definition);
+  }
+  var registry = {};
+  function getRegisteredDefinition(name) {
+    if (name) {
+      return registry[name.toLowerCase()];
+    }
+  }
+  function registerDefinition(name, definition) {
+    registry[name] = definition;
+  }
+  function generateConstructor(definition) {
+    return function() {
+      return instantiate(definition);
+    };
+  }
+  var HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
+  function createElementNS(namespace, tag, typeExtension) {
+    if (namespace === HTML_NAMESPACE) {
+      return createElement(tag, typeExtension);
+    } else {
+      return domCreateElementNS(namespace, tag);
+    }
+  }
+  function createElement(tag, typeExtension) {
+    var definition = getRegisteredDefinition(typeExtension || tag);
+    if (definition) {
+      if (tag == definition.tag && typeExtension == definition.is) {
+        return new definition.ctor();
+      }
+      if (!typeExtension && !definition.is) {
+        return new definition.ctor();
+      }
+    }
+    var element;
+    if (typeExtension) {
+      element = createElement(tag);
+      element.setAttribute("is", typeExtension);
+      return element;
+    }
+    element = domCreateElement(tag);
+    if (tag.indexOf("-") >= 0) {
+      implementPrototype(element, HTMLElement);
+    }
+    return element;
+  }
+  function cloneNode(deep) {
+    var n = domCloneNode.call(this, deep);
+    upgrade(n);
+    return n;
+  }
+  var domCreateElement = document.createElement.bind(document);
+  var domCreateElementNS = document.createElementNS.bind(document);
+  var domCloneNode = Node.prototype.cloneNode;
+  var isInstance;
+  if (!Object.__proto__ && !useNative) {
+    isInstance = function(obj, ctor) {
+      var p = obj;
+      while (p) {
+        if (p === ctor.prototype) {
+          return true;
+        }
+        p = p.__proto__;
+      }
+      return false;
+    };
+  } else {
+    isInstance = function(obj, base) {
+      return obj instanceof base;
+    };
+  }
+  document.registerElement = register;
+  document.createElement = createElement;
+  document.createElementNS = createElementNS;
+  Node.prototype.cloneNode = cloneNode;
+  scope.registry = registry;
+  scope.instanceof = isInstance;
+  scope.reservedTagList = reservedTagList;
+  scope.getRegisteredDefinition = getRegisteredDefinition;
+  document.register = document.registerElement;
+});
+
+(function(scope) {
+  var useNative = scope.useNative;
+  var initializeModules = scope.initializeModules;
+  if (useNative) {
+    var nop = function() {};
+    scope.watchShadow = nop;
+    scope.upgrade = nop;
+    scope.upgradeAll = nop;
+    scope.upgradeDocumentTree = nop;
+    scope.upgradeSubtree = nop;
+    scope.takeRecords = nop;
+    scope.instanceof = function(obj, base) {
+      return obj instanceof base;
+    };
+  } else {
+    initializeModules();
+  }
+  var upgradeDocumentTree = scope.upgradeDocumentTree;
+  if (!window.wrap) {
+    if (window.ShadowDOMPolyfill) {
+      window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
+      window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
+    } else {
+      window.wrap = window.unwrap = function(node) {
+        return node;
+      };
+    }
+  }
+  function bootstrap() {
+    upgradeDocumentTree(wrap(document));
+    if (window.HTMLImports) {
+      HTMLImports.__importsParsingHook = function(elt) {
+        upgradeDocumentTree(wrap(elt.import));
+      };
+    }
+    CustomElements.ready = true;
+    setTimeout(function() {
+      CustomElements.readyTime = Date.now();
+      if (window.HTMLImports) {
+        CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
+      }
+      document.dispatchEvent(new CustomEvent("WebComponentsReady", {
+        bubbles: true
+      }));
+    });
+  }
+  if (typeof window.CustomEvent !== "function") {
+    window.CustomEvent = function(inType, params) {
+      params = params || {};
+      var e = document.createEvent("CustomEvent");
+      e.initCustomEvent(inType, Boolean(params.bubbles), Boolean(params.cancelable), params.detail);
+      return e;
+    };
+    window.CustomEvent.prototype = window.Event.prototype;
+  }
+  if (document.readyState === "complete" || scope.flags.eager) {
+    bootstrap();
+  } else if (document.readyState === "interactive" && !window.attachEvent && (!window.HTMLImports || window.HTMLImports.ready)) {
+    bootstrap();
+  } else {
+    var loadEvent = window.HTMLImports && !HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded";
+    window.addEventListener(loadEvent, bootstrap);
+  }
+})(window.CustomElements);
+
+(function(scope) {
+  if (!Function.prototype.bind) {
+    Function.prototype.bind = function(scope) {
+      var self = this;
+      var args = Array.prototype.slice.call(arguments, 1);
+      return function() {
+        var args2 = args.slice();
+        args2.push.apply(args2, arguments);
+        return self.apply(scope, args2);
+      };
+    };
+  }
+})(window.WebComponents);
+
+(function(scope) {
+  "use strict";
+  if (!window.performance) {
+    var start = Date.now();
+    window.performance = {
+      now: function() {
+        return Date.now() - start;
+      }
+    };
+  }
+  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, 1e3 / 60);
+      };
+    }();
+  }
+  if (!window.cancelAnimationFrame) {
+    window.cancelAnimationFrame = function() {
+      return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(id) {
+        clearTimeout(id);
+      };
+    }();
+  }
+  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;
+  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">');
+      };
+    }
+  }
+  if (HTMLImports.useNative) {
+    installPolymerWarning();
+  } else {
+    addEventListener("DOMContentLoaded", installPolymerWarning);
+  }
+})(window.WebComponents);
+
+(function(scope) {
+  var style = document.createElement("style");
+  style.textContent = "" + "body {" + "transition: opacity ease-in 0.2s;" + " } \n" + "body[unresolved] {" + "opacity: 0; display: block; overflow: hidden; position: relative;" + " } \n";
+  var head = document.querySelector("head");
+  head.insertBefore(style, head.firstChild);
+})(window.WebComponents);
+
+(function(scope) {
+  window.Platform = scope;
+})(window.WebComponents);
diff --git a/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.min.js b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.min.js
new file mode 100644
index 0000000..9118695
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/deployed/web/packages/web_components/webcomponents.min.js
@@ -0,0 +1,14 @@
+/**
+ * @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
+ */
+// @version 0.5.1
+window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents.js",r=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){e=e.split("="),e[0]&&(t[e[0]]=e[1]||!0)}),r)for(var o,i=0;o=r.attributes[i];i++)"src"!==o.name&&(t[o.name]=o.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,t.shadow="native"===t.shadow?!1:t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(WebComponents),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];k(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}k(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,k(e,t,U)}function s(e){var t=e.__proto__||Object.getPrototypeOf(e),n=R.get(t);if(n)return n;var r=s(t),o=E(r);return g(t,o,e),o}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^\w[a-zA-Z_0-9]*$/.test(e)}function p(e){return A&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function f(e){return A&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function h(e){return A&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return q}}function w(t,n,r){for(var o=W(t),i=0;i<o.length;i++){var a=o[i];if("polymerBlackList_"!==a&&!(a in n||t.polymerBlackList_&&t.polymerBlackList_[a])){B&&t.__lookupGetter__(a);var s,c,l=m(t,a);if(r&&"function"==typeof l.value)n[a]=h(a);else{var d=u(a);s=d?e.getEventHandlerGetter(a):p(a),(l.writable||l.set||V)&&(c=d?e.getEventHandlerSetter(a):f(a)),k(n,a,{get:s,set:c,configurable:l.configurable,enumerable:l.enumerable})}}}}function v(e,t,n){var r=e.prototype;g(r,t,n),o(t,e)}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),P.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function S(e){return e&&e.__impl4cf1e782hg__}function T(e){return!S(e)}function M(e){return null===e?null:(n(T(e)),e.__wrapper8e3dd93a60__||(e.__wrapper8e3dd93a60__=new(s(e))(e)))}function _(e){return null===e?null:(n(S(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&S(e)?_(e):e}function C(e){return e&&!S(e)?M(e):e}function D(e,t){null!==t&&(n(T(e)),n(void 0===t||S(t)),e.__wrapper8e3dd93a60__=t)}function j(e,t,n){G.get=n,k(e.prototype,t,G)}function H(e,t){j(e,t,function(){return M(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,P=new WeakMap,I=Object.create(null),A=t(),k=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var B=/Firefox/.test(navigator.userAgent),q={get:function(){},set:function(){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.assert=n,e.constructorTable=R,e.defineGetter=j,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isWrapper=S,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=P,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=D,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=_,e.unwrapIfNeeded=N,e.wrap=M,e.wrapIfNeeded=C,e.wrappers=I}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,f=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,f)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,f-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var h=t(n,[],0);u>l;)h.removed.push(c[l++]);return[h]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),h=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:h&&(w.push(h),h=void 0),v++,g++;break;case o:h||(h=t(v,[],0)),h.addedCount++,v++,h.removed.push(c[g]),g++;break;case i:h||(h=t(v,[],0)),h.addedCount++,v++;break;case a:h||(h=t(v,[],0)),h.removed.push(c[g]),g++}return h&&w.push(h),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)e[t]()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,h.push(e),m||(u(n),m=!0))}function n(){for(m=!1;h.length;){var e=h;h=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=f.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=f.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=f.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&!("attributes"===n&&!d.attributes||"attributes"===n&&d.attributeFilter&&(null!==o.namespace||-1===d.attributeFilter.indexOf(o.name))||"characterData"===n&&!d.characterData||"childList"===n&&!d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var h in i){var p=i[h],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[h]&&(m.oldValue=a[h]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,this.attributes="attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?!!e.attributes:!0,this.characterData="characterDataOldValue"in e&&!("characterData"in e)?!0:!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,f=new WeakMap,h=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=f.get(e);o||f.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=f.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=f.get(e);n||f.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=f.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return k(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var f=n(p),h=f.olderShadowRoot;h&&s.push(h)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=k(t),r=e[0],o=k(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(k(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=k(t),a=k(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(k(d)===c)return d}return null}function d(e,t){return k(e)===k(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),h(V(e),V(e.target)),I)){var t=I;throw I=null,t}}function f(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function h(t,n){if(Y.get(t))throw new Error("InvalidStateError");Y.set(t,!0),e.renderAllPending();var o,i,a;if(f(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!f(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return nt.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),Z.set(t,rt),$.delete(t,null),Y.delete(t),t.defaultPrevented}function m(e,t,n,r){var o=ot;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=it,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=at,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===ot)return!0;n===at&&(n=it)}else if(n===at&&!t.bubbles)return!0;if("relatedTarget"in t){var c=q(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;J.set(t,p)}}Z.set(t,n);var f=t.type,h=!1;X.set(t,a),$.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)h=!0;else if(!(v.type!==f||!v.capture&&n===ot||v.capture&&n===at))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),et.get(t))return!1}catch(g){I||(I=g)}}if(i.depth--,h&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof st))return V(M(st,"Event",e,t));var n=e;return gt||"beforeunload"!==n.type||this instanceof _?void U(n,this):new _(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:q(e.relatedTarget)}}):e}function S(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(M(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function T(e,t){return function(){arguments[t]=q(arguments[t]);var n=q(this);n[e].apply(n,arguments)}}function M(e,t,n,r){if(wt)return new e(n,E(r));var o=q(document.createEvent(t)),i=mt[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=q(t)),a.push(t)}),o["init"+t].apply(o,a),o}function _(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),q(e)}function D(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function j(e,t){for(var n=q(e);n;n=n.parentNode)if(D(V(n),t))return!0;return!1}function H(e){A(e,yt)}function x(t,n,o,i){e.renderAllPending();var a=V(Et.call(B(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=tt.get(this);return t&&t[e]&&t[e].value||null}}function P(e){var t=e.slice(2);return function(n){var r=tt.get(this);r||(r=Object.create(null),tt.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var I,A=e.forwardMethodsToWrapper,k=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,B=e.unsafeUnwrap,q=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,Y=new WeakMap,X=new WeakMap,$=new WeakMap,J=new WeakMap,Z=new WeakMap,Q=new WeakMap,et=new WeakMap,tt=new WeakMap,nt=new WeakMap,rt=0,ot=1,it=2,at=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var st=window.Event;st.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return $.get(this)},get eventPhase(){return Z.get(this)},get path(){var e=nt.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),et.set(this,!0)}},F(st,y,document.createEvent("Event"));var ct=S("UIEvent",y),lt=S("CustomEvent",y),ut={get relatedTarget(){var e=J.get(this);return void 0!==e?e:V(q(this).relatedTarget)}},dt=W({initMouseEvent:T("initMouseEvent",14)},ut),pt=W({initFocusEvent:T("initFocusEvent",5)},ut),ft=S("MouseEvent",ct,dt),ht=S("FocusEvent",ct,pt),mt=Object.create(null),wt=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!wt){var vt=function(e,t,n){if(n){var r=mt[n];t=W(W({},r),t)}mt[e]=t};vt("Event",{bubbles:!1,cancelable:!1}),vt("CustomEvent",{detail:null},"Event"),vt("UIEvent",{view:null,detail:0},"Event"),vt("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),vt("FocusEvent",{relatedTarget:null},"UIEvent")}var gt=window.BeforeUnloadEvent;_.prototype=Object.create(y.prototype),W(_.prototype,{get returnValue(){return B(this).returnValue},set returnValue(e){B(this).returnValue=e}}),gt&&F(gt,_);var bt=window.EventTarget,yt=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;yt.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=q(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;j(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return q(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},bt&&F(bt,N);var Et=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=P,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=_,e.wrappers.CustomEvent=lt,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=ht,e.wrappers.MouseEvent=ft,e.wrappers.UIEvent=ct}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var f;try{f=document.createEvent("TouchEvent")}catch(h){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,f),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof S)}function n(e){var t=new M;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new M,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new _(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function f(e,t){var n=e.nodeType===S.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function h(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){h(e,t);var n=t.length;if(1===n)return I(t[0]);for(var r=I(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(I(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=I(t),o=r.parentNode;o&&Y.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=I(e),a=i.firstChild;a;)n=a.nextSibling,Y.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=k(n?B.call(n,P(e),!1):q.call(P(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function S(e){O(e instanceof V),T.call(this,e),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 T=e.wrappers.EventTarget,M=e.wrappers.NodeList,_=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,D=e.isWrapper,j=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,P=e.unsafeUnwrap,I=e.unwrap,A=e.unwrapIfNeeded,k=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,B=document.importNode,q=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.insertBefore,Y=V.prototype.removeChild,X=V.prototype.replaceChild,$=/Trident/.test(navigator.userAgent),J=$?function(e,t){try{Y.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){Y.call(e,t)};S.prototype=Object.create(T.prototype),j(S.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?D(n)?r=I(n):(r=n,n=k(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)f(this,e),w(this),K.call(P(this),I(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:P(this);l?K.call(l,m(this,o),r):h(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=I(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(P(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(D(r)?o=I(r):(o=r,r=k(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(f(this,e),w(this),X.call(P(this),I(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&X.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:k(P(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:k(P(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:k(P(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:k(P(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:k(P(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==S.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=S.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=P(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),P(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new M,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(P(this),A(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===S.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeNode(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(S,"ownerDocument"),x(V,S,document.createDocumentFragment()),delete S.prototype.querySelector,delete S.prototype.querySelectorAll,S.prototype=j(Object.create(T.prototype),S.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=K,e.originalRemoveChild=Y,e.snapshotNodeList=c,e.wrappers.Node=S}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=g(t[s]),!o&&(a=w(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\//g," ")}function r(e,t){for(var n,o=e.firstElementChild;o;){if(o.matches(t))return o;if(n=r(o,t))return n;o=o.nextElementSibling}return null}function o(e,t){return e.matches(t)}function i(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===C}function a(){return!0}function s(e,t,n){return e.localName===n}function c(e,t){return e.namespaceURI===t}function l(e,t,n){return e.namespaceURI===t&&e.localName===n}function u(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=u(a,t,n,r,o,i),a=a.nextElementSibling;return t}function d(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,null);if(c instanceof L)s=S.call(c,i);else{if(!(c instanceof N))return u(this,r,o,n,i,null);s=E.call(c,i)}return t(s,r,o,a)}function p(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,a);if(c instanceof L)s=M.call(c,i,a);else{if(!(c instanceof N))return u(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=v(this),l=w(this).root;if(l instanceof e.wrappers.ShadowRoot)return u(this,r,o,n,i,a);if(c instanceof L)s=O.call(c,i,a);else{if(!(c instanceof N))return u(this,r,o,n,i,a);s=_.call(c,i,a)}return t(s,r,o,!1)}var h=e.wrappers.HTMLCollection,m=e.wrappers.NodeList,w=e.getTreeScope,v=e.unsafeUnwrap,g=e.wrap,b=document.querySelector,y=document.documentElement.querySelector,E=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,_=document.getElementsByTagNameNS,O=document.documentElement.getElementsByTagNameNS,L=window.Element,N=window.HTMLDocument||window.Document,C="http://www.w3.org/1999/xhtml",D={querySelector:function(t){var o=n(t),i=o!==t;t=o;var a,s=v(this),c=w(this).root;if(c instanceof e.wrappers.ShadowRoot)return r(this,t);if(s instanceof L)a=g(y.call(s,t));else{if(!(s instanceof N))return r(this,t);a=g(b.call(s,t))}return a&&!i&&(c=w(a).root)&&c instanceof e.wrappers.ShadowRoot?r(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var i=new m;return i.length=d.call(this,o,0,i,e,r),i}},j={getElementsByTagName:function(e){var t=new h,n="*"===e?a:i;return t.length=p.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new h,r=null;return r="*"===e?"*"===t?a:s:"*"===t?c:l,n.length=f.call(this,r,0,n,e||null,t),n
+}};e.GetElementsByInterface=j,e.SelectorsInterface=D}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}};e.ChildNodeInterface=i,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){e.invalidateRendererBasedOnAttribute(t,"class")}function n(e,t){r(e,this),this.ownerElement_=t}var r=e.setWrapper,o=e.unsafeUnwrap;n.prototype={constructor:n,get length(){return o(this).length},item:function(e){return o(this).item(e)},contains:function(e){return o(this).contains(e)},add:function(){o(this).add.apply(o(this),arguments),t(this.ownerElement_)},remove:function(){o(this).remove.apply(o(this),arguments),t(this.ownerElement_)},toggle:function(){var e=o(this).toggle.apply(o(this),arguments);return t(this.ownerElement_),e},toString:function(){return o(this).toString()}},e.wrappers.DOMTokenList=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.wrappers.DOMTokenList,c=e.ParentNodeInterface,l=e.SelectorsInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),f=e.unsafeUnwrap,h=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new h.ShadowRoot(this);f(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return f(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=f(this).getAttribute(e);f(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=f(this).getAttribute(e);f(this).removeAttribute(e),n(this,e,r),t(this,e)},matches:function(e){return g.call(f(this),e)},get classList(){var e=b.get(this);return e||b.set(this,e=new s(f(this).classList,this)),e},get className(){return f(this).className},set className(e){this.setAttribute("class",e)},get id(){return f(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(O,t)}function r(e){return e.replace(L,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,i=e.tagName.toLowerCase(),s="<"+i,c=e.attributes,l=0;o=c[l];l++)s+=" "+o.name+'="'+n(o.value)+'"';return s+=">",N[i]?s:s+a(e)+"</"+i+">";case Node.TEXT_NODE:var u=e.data;return t&&C[t.localName]?u:r(u);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function a(e){e instanceof _.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=i(n,e);return t}function s(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function c(e){h.call(this,e)}function l(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function u(t){return function(){return e.renderAllPending(),S(this)[t]}}function d(e){m(c,e,u(e))}function p(t){Object.defineProperty(c.prototype,t,{get:u(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(c.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var h=e.wrappers.Element,m=e.defineGetter,w=e.enqueueMutation,v=e.mixin,g=e.nodesWereAdded,b=e.nodesWereRemoved,y=e.registerWrapper,E=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,_=e.wrappers,O=/[&\u00A0"]/g,L=/[&\u00A0<>]/g,N=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),j=window.HTMLElement,H=window.HTMLTemplateElement;c.prototype=Object.create(h.prototype),v(c.prototype,{get innerHTML(){return a(this)},set innerHTML(e){if(D&&C[this.localName])return void(this.textContent=e);var t=E(this.childNodes);this.invalidateShadowRenderer()?this instanceof _.HTMLTemplateElement?s(this.content,e):s(this,e,this.tagName):!H&&this instanceof _.HTMLTemplateElement?s(this.content,e):S(this).innerHTML=e;var n=E(this.childNodes);w(this,"childList",{addedNodes:n,removedNodes:t}),b(t),g(n,this)},get outerHTML(){return i(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=l(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=l(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(d),["scrollLeft","scrollTop"].forEach(p),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),y(j,c,document.createElement("b")),e.wrappers.HTMLElement=c,e.getInnerHTML=a,e.setInnerHTML=s}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.wrappers.Element,n=e.wrappers.HTMLElement,r=e.registerObject,o="http://www.w3.org/2000/svg",i=document.createElementNS(o,"title"),a=r(i),s=Object.getPrototypeOf(a.prototype).constructor;if(!("classList"in i)){var c=Object.getOwnPropertyDescriptor(t.prototype,"classList");Object.defineProperty(n.prototype,"classList",c),delete t.prototype.classList}e.wrappers.SVGElement=s}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.WebGLRenderingContext;if(c){n(t.prototype,{get canvas(){return s(i(this).canvas)},texImage2D:function(){arguments[5]=a(arguments[5]),i(this).texImage2D.apply(i(this),arguments)},texSubImage2D:function(){arguments[6]=a(arguments[6]),i(this).texSubImage2D.apply(i(this),arguments)}});var l=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};r(c,t,l),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Range;t.prototype={get startContainer(){return s(o(this).startContainer)},get endContainer(){return s(o(this).endContainer)},get commonAncestorContainer(){return s(o(this).commonAncestorContainer)},setStart:function(e,t){o(this).setStart(a(e),t)},setEnd:function(e,t){o(this).setEnd(a(e),t)},setStartBefore:function(e){o(this).setStartBefore(a(e))},setStartAfter:function(e){o(this).setStartAfter(a(e))},setEndBefore:function(e){o(this).setEndBefore(a(e))},setEndAfter:function(e){o(this).setEndAfter(a(e))},selectNode:function(e){o(this).selectNode(a(e))},selectNodeContents:function(e){o(this).selectNodeContents(a(e))},compareBoundaryPoints:function(e,t){return o(this).compareBoundaryPoints(e,i(t))},extractContents:function(){return s(o(this).extractContents())},cloneContents:function(){return s(o(this).cloneContents())},insertNode:function(e){o(this).insertNode(a(e))},surroundContents:function(e){o(this).surroundContents(a(e))},cloneRange:function(){return s(o(this).cloneRange())},isPointInRange:function(e,t){return o(this).isPointInRange(a(e),t)},comparePoint:function(e,t){return o(this).comparePoint(a(e),t)},intersectsNode:function(e){return o(this).intersectsNode(a(e))},toString:function(){return o(this).toString()}},c.prototype.createContextualFragment&&(t.prototype.createContextualFragment=function(e){return s(o(this).createContextualFragment(e))}),n(window.Range,t,document.createRange()),e.wrappers.Range=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.GetElementsByInterface,n=e.ParentNodeInterface,r=e.SelectorsInterface,o=e.mixin,i=e.registerObject,a=i(document.createDocumentFragment());o(a.prototype,n),o(a.prototype,r),o(a.prototype,t);var s=i(document.createComment(""));e.wrappers.Comment=s,e.wrappers.DocumentFragment=a}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),p.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=new WeakMap,f=new WeakMap,h=/[ \t\n\r\f]/;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return p.get(this)||null},invalidateShadowRenderer:function(){return p.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getElementById:function(e){return h.test(e)?null:this.querySelector('[id="'+e+'"]')}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){I.set(e,[])}function i(e){var t=I.get(e);return t||I.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){M=null,s()}function l(e){var t=k.get(e);return t||(t=new f(e),k.set(e,t)),t}function u(e){var t=D(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function f(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function h(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=A.get(e);n?n.push(t):A.set(e,[t])}function v(e){return A.get(e)}function g(e){A.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof _))return!1;if(!B.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function S(e){return e.shadowRoot}function T(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var M,_=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,D=(e.assert,e.getTreeScope),j=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,P=e.ArraySplice,I=new WeakMap,A=new WeakMap,k=new WeakMap,W=j(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new P;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var f=c[p];d<f.index;d++)u++,o[l++].sync(s);for(var h=f.removed.length,m=0;h>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=f.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},f.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return D(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),M)return;M=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(S(e)){for(var t=e,n=h(t),r=T(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=h(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(S(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var B=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(){var e=H(this).polymerShadowRenderer_;return e?(e.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},_.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=T,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}{var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap;window.Selection}t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(i(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},extend:function(e,t){o(this).extend(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(a(e))},toString:function(){return o(this).toString()}},n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new m(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return N(n.apply(O(this),arguments))}}function r(e,t){j.call(O(t),L(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof h&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){_(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){return N(n.apply(O(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(O(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.wrappers.Selection,f=e.SelectorsInterface,h=e.wrappers.ShadowRoot,m=e.TreeScope,w=e.cloneNode,v=e.defineWrapGetter,g=e.elementFromPoint,b=e.forwardMethodsToWrapper,y=e.matchesNames,E=e.mixin,S=e.registerWrapper,T=e.renderAllPending,M=e.rewrap,_=e.setWrapper,O=e.unsafeUnwrap,L=e.unwrap,N=e.wrap,C=e.wrapEventTargetMethods,D=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),v(t,"documentElement"),v(t,"body"),v(t,"head"),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","getElementById"].forEach(n);var j=document.adoptNode,H=document.getSelection;if(E(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return g(this,this,e,t)},importNode:function(e,t){return w(e,t,O(this))},getSelection:function(){return T(),new p(H.call(L(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}}),document.registerElement){var x=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void _(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n.extends),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){N(this)instanceof r||M(this),t.apply(N(this),arguments)})});var d={prototype:l};i&&(d.extends=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);x.call(L(this),t,d);return r},b([window.HTMLDocument||window.Document],["registerElement"])}b([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"].concat(y)),b([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","elementFromPoint","getElementById","getElementsByName","getSelection"]),E(t.prototype,l),E(t.prototype,d),E(t.prototype,f),E(t.prototype,{get implementation(){var e=D.get(this);return e?e:(e=new a(L(this).implementation),D.set(this,e),e)},get defaultView(){return N(L(this).defaultView)}}),S(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&S(window.HTMLDocument,t),C([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]),s(a,"createDocumentType"),s(a,"createDocument"),s(a,"createHTMLDocument"),c(a,"hasFeature"),S(window.DOMImplementation,a),b([window.DOMImplementation],["createDocumentType","createDocument","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t
+}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,f=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(f.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.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(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&j){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return D||(D=document.createElement("style"),D.setAttribute(x,""),D[x]=!0),D}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(f,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(h,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,S,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n	",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+e+")"+T,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(_,b).replace(M,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,f=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,h=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),S=new RegExp("("+b+y,"gim"),T="([>\\s~+[.,{:][\\s\\S]*)?$",M=/\:host/gim,_=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g,/::content/g]),C=document.createElement("iframe");C.style.display="none";var D,j=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var P=ShadowDOMPolyfill.wrap(document),I=P.querySelector("head");I.insertBefore(l(),I.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==I&&(e.parentNode===I?I.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return S=new s(e,t)}function u(e){return T?T:(T=c(S),T.oldValue=e,T)}function d(){S=T=void 0}function p(e){return e===T||e===S}function f(e,t){return e===t?e:T&&p(e)?T:null}function h(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var m,w=new WeakMap;if(/Trident/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new h(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var S,T;h.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=f(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,r=e.relatedNode,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var f=p.previousSibling,h=p.nextSibling,o=l("childList",r);o.addedNodes=s,o.removedNodes=c,o.previousSibling=f,o.nextSibling=h,i(r,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a)}(this),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||h,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===v)&&(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){s==c&&e&&e()}function r(e){o(e),s++,n()}var i=t.querySelectorAll("link[rel=import]"),s=0,c=i.length;if(c)for(var l,u=0;c>u&&(l=i[u]);u++)a(l)?r.call(l,{target:l}):(l.addEventListener("load",r),l.addEventListener("error",r));else n()}function a(e){return d?e.__loaded||e.import&&"loading"!==e.import.readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e.import;t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),f=function(e){return p?ShadowDOMPolyfill.wrapIfNeeded(e):e},h=f(document),m={get:function(){var e=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(h,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),h.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=h,e.whenReady=t,e.isIE=w}(HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(HTMLImports),HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e){var t=e.ownerDocument,n=t.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,n),e},resolveUrlsInCssText:function(e,r){var o=this.replaceUrls(e,r,t);return o=this.replaceUrls(o,r,n)},replaceUrls:function(e,t,n){return e.replace(n,function(e,n,r,o){var i=r.replace(/["']/g,"");return t.href=i,i=t.href,n+"'"+i+"'"+o})}};e.path=r}),HTMLImports.addModule(function(e){xhr={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(t,n,r){var o=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(t+="?"+Math.random()),o.open("GET",t,xhr.async),o.addEventListener("readystatechange",function(){if(4===o.readyState){var e=o.getResponseHeader("Location"),t=null;if(e)var t="/"===e.substr(0,1)?location.origin+e:e;n.call(r,!xhr.ok(o)&&o,o.response||o.responseText,t)}}),o.send(),o},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}},e.xhr=xhr}),HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(e),e.import&&(e.import.__importParsed=!0),this.markParsingComplete(e),e.dispatchEvent(e.__resource&&!e.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){for(var t=this.rootImportForElement(e.__importElement||e),n=t.__insertedElements=t.__insertedElements||0,r=t.nextElementSibling,o=0;n>o;o++)r=r&&r.nextElementSibling;t.parentNode.insertBefore(e,r)},trackElement:function(e,t){var n=this,r=function(r){t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(){r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.import,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.import?!1:!0}};e.parser=p,e.IMPORT_SELECTOR=d}),HTMLImports.addModule(function(e){function t(e){return n(e,i)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e,t){var n=document.implementation.createHTMLDocument(i);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||(n.baseURI=t);var o=n.createElement("meta");return o.setAttribute("charset","utf-8"),n.head.appendChild(o),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var o=e.flags,i=e.IMPORT_LINK_TYPE,a=e.IMPORT_SELECTOR,s=e.rootDocument,c=e.Loader,l=e.Observer,u=e.parser,d={documents:{},documentPreloadSelectors:a,importsPreloadSelectors:[a].join(","),loadNode:function(e){p.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);p.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,i,a,s){if(o.load&&console.log("loaded",e,n),n.__resource=i,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(i,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.import=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},p=new c(d.loaded.bind(d),d.loadedAll.bind(d));if(d.observer=new l,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(s,"baseURI",f)}e.importer=d,e.importLoader=p}),HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a=0,s=e.length;s>a&&(i=e[a]);a++)r||(r=i.ownerDocument,o=t.isParsed(r)),loading=this.shouldLoadNode(i),loading&&n.loadNode(i),this.shouldParseNode(i)&&o&&t.parseDynamic(i,loading)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){HTMLImports.importer.bootDocument(n)}if(initializeModules=e.initializeModules,!e.useNative){"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){var n=document.createEvent("HTMLEvents");return n.initEvent(e,t.bubbles===!1?!1:!0,t.cancelable===!1?!1:!0,t.detail),n}),initializeModules();var n=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||HTMLImports.useNative)}(CustomElements),CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){a=[],i(e,t),a=null}function i(e,t){if(e=wrap(e),!(a.indexOf(e)>=0)){a.push(e);for(var n,r=e.querySelectorAll("link[rel="+s+"]"),o=0,c=r.length;c>o&&(n=r[o]);o++)n.import&&i(n.import,t);t(e)}}var a,s=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),CustomElements.addModule(function(e){function t(e){return n(e)||r(e)}function n(t){return e.upgrade(t)?!0:void s(t)}function r(e){y(e,function(e){return n(e)?!0:void 0})}function o(e){s(e),p(e)&&y(e,function(e){s(e)})}function i(e){M.push(e),T||(T=!0,setTimeout(a))}function a(){T=!1;for(var e,t=M,n=0,r=t.length;r>n&&(e=t[n]);n++)e();M=[]}function s(e){S?i(function(){c(e)}):c(e)}function c(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&!e.__attached&&p(e)&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function l(e){u(e),y(e,function(e){u(e)})}function u(e){S?i(function(){d(e)}):d(e)}function d(e){e.__upgraded__&&(e.attachedCallback||e.detachedCallback)&&e.__attached&&!p(e)&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function p(e){for(var t=e,n=wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.host}}function f(e){if(e.shadowRoot&&!e.shadowRoot.__watched){b.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)w(t),t=t.olderShadowRoot}}function h(e){if(b.dom){var n=e[0];if(n&&"childList"===n.type&&n.addedNodes&&n.addedNodes){for(var r=n.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var o=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";
+o=o.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",e.length,o||"")}e.forEach(function(e){"childList"===e.type&&(_(e.addedNodes,function(e){e.localName&&t(e)}),_(e.removedNodes,function(e){e.localName&&l(e)}))}),b.dom&&console.groupEnd()}function m(e){for(e=wrap(e),e||(e=wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(t.takeRecords()),a())}function w(e){if(!e.__observer){var t=new MutationObserver(h);t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=wrap(e),b.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop()),t(e),w(e),b.dom&&console.groupEnd()}function g(e){E(e,v)}var b=e.flags,y=e.forSubtree,E=e.forDocumentTree,S=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=S;var T=!1,M=[],_=Array.prototype.forEach.call.bind(Array.prototype.forEach),O=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var e=O.call(this);return CustomElements.watchShadow(this),e},e.watchShadow=f,e.upgradeDocumentTree=g,e.upgradeSubtree=r,e.upgradeAll=t,e.attachedNode=o,e.takeRecords=m}),CustomElements.addModule(function(e){function t(t){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),o=e.getRegisteredDefinition(r||t.localName);if(o){if(r&&o.tag==t.localName)return n(t,o);if(!r&&!o.extends)return n(t,o)}}}function n(t,n){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),e.attachedNode(t),e.upgradeSubtree(t),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t.native),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c.extends),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t.extends).concat([t]):[]}function a(e){for(var t,n=e.extends,r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag),r=Object.getPrototypeOf(n);r===e.prototype&&(t=r)}for(var o,i=e.prototype;i&&i!==t;)o=Object.getPrototypeOf(i),i.__proto__=o,i=o;e.native=t}}function c(e){return g(M(e.tag),e)}function l(e){return e?S[e.toLowerCase()]:void 0}function u(e,t){S[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===T?f(t,n):_(e,t)}function f(e,t){var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=f(e),r.setAttribute("is",t),r):(r=M(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function h(e){var t=O.call(this,e);return v(t),t}var m,w=e.upgradeDocumentTree,v=e.upgrade,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],S={},T="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),_=document.createElementNS.bind(document),O=Node.prototype.cloneNode;m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},document.registerElement=t,document.createElement=f,document.createElementNS=p,Node.prototype.cloneNode=h,e.registry=S,e.instanceof=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(wrap(document)),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(e){i(wrap(e.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}))})}var n=e.useNative,r=e.initializeModules;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e.instanceof=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var a=window.HTMLImports&&!HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(a,t)}else t()}(window.CustomElements),function(){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){"use strict";function t(){window.Polymer===o&&(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 n=Date.now();window.performance={now:function(){return Date.now()-n}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var r=[],o=function(e){"string"!=typeof e&&1===arguments.length&&Array.prototype.push.call(arguments,document._currentScript),r.push(arguments)};window.Polymer=o,e.consumeDeclarations=function(t){e.consumeDeclarations=function(){throw"Possible attempt to load Polymer twice"},t&&t(r),r=null},HTMLImports.useNative?t():addEventListener("DOMContentLoaded",t)}(window.WebComponents),function(){var e=document.createElement("style");e.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var t=document.querySelector("head");t.insertBefore(e,t.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
diff --git a/runtime/bin/vmservice/observatory/lib/dominator_tree.dart b/runtime/bin/vmservice/observatory/lib/dominator_tree.dart
new file mode 100644
index 0000000..9975369
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/dominator_tree.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dominator_tree;
+
+// Flowgraph dominators in O(m log n) time. Implements the algorithm from
+// [Lengauer & Tarjan 1979]
+// T. Lengauer and R.E. Tarjan,
+// "A fast algorithm for finding dominators in a flowgraph",
+// ACM Transactions on Programming Language and Systems, 1(1):121-141, 1979.
+
+// Internal vertex information used inside 'Dominator'.
+// Field names mostly follow naming in [Lengauer & Tarjan 1979].
+class _Vertex {
+  final Object id;
+  _Vertex dom;
+  _Vertex parent;
+  _Vertex ancestor;
+  _Vertex label;
+  int semi;
+  final List<_Vertex> pred = new List<_Vertex>();
+  final List<_Vertex> bucket = new List<_Vertex>();
+  // TODO(koda): Avoid duplication by having an interface for 'id' with
+  // access to outgoing edges, and/or clearing 'succ' after constructing
+  // inverse graph in 'pred'.
+  final List<_Vertex> succ = new List<_Vertex>();
+  _Vertex(this.id) { label = this; }
+}
+
+// Utility to compute immediate dominators. Usage:
+// 1. Build the flowgraph using 'addEdges'.
+// 2. Call 'computeDominatorTree' once.
+// 3. Use 'dominator' to access result.
+// The instance can only be used once.
+class Dominator {
+  final Map<Object, _Vertex> _idToVertex = new Map<Object, _Vertex>();
+  final List<_Vertex> _vertex = new List<_Vertex>();
+  
+  void addEdges(Object u, Iterable<Object> vs) {
+    _asVertex(u).succ.addAll(vs.map(_asVertex));
+  }
+  
+  // Returns the immediate dominator of 'v', or null if 'v' is the root.
+  Object dominator(Object v) {
+    _Vertex dom = _asVertex(v).dom;
+    return dom == null ? null : dom.id;
+  }
+  
+  _Vertex _asVertex(Object u) {
+    return _idToVertex.putIfAbsent(u, () => new _Vertex(u));
+  }
+  
+  void _dfs(_Vertex v) {
+    v.semi = _vertex.length;
+    _vertex.add(v);
+    for (_Vertex w in v.succ) {
+      if (w.semi == null) {
+        w.parent = v;
+        _dfs(w);
+      }
+      w.pred.add(v);
+    }
+  }
+
+  void _compress(_Vertex v) {
+    if (v.ancestor.ancestor != null) {
+      _compress(v.ancestor);
+      if (v.ancestor.label.semi < v.label.semi) {
+        v.label = v.ancestor.label;
+      }
+      v.ancestor = v.ancestor.ancestor;
+    }
+  }
+
+  _Vertex _eval(_Vertex v) {
+    if (v.ancestor == null) {
+      return v;
+    } else {
+      _compress(v);
+      return v.label;
+    }
+  }
+
+  void _link(_Vertex v, _Vertex w) {
+    w.ancestor = v;
+  }
+  
+  void computeDominatorTree(Object root) {
+    _Vertex r = _asVertex(root);
+    int n = _idToVertex.length;
+    _dfs(r);
+    if (_vertex.length != n) {
+      throw new StateError("Not a flowgraph: "
+          "only ${_vertex.length} of $n vertices reachable");
+    }
+    for (int i = n - 1; i >= 1; --i) {
+      _Vertex w = _vertex[i];
+      for (_Vertex v in w.pred) {
+        _Vertex u = _eval(v);
+        if (u.semi < w.semi) {
+          w.semi = u.semi;
+        }
+      }
+      _vertex[w.semi].bucket.add(w);
+      _link(w.parent, w);
+      for (_Vertex v in w.parent.bucket) {
+        _Vertex u = _eval(v);
+        v.dom = u.semi < v.semi ? u : w.parent;
+      }
+      w.parent.bucket.clear();
+    }
+    for (int i = 1; i < n; ++i) {
+      _Vertex w = _vertex[i];
+      if (w.dom != _vertex[w.semi]) {
+        w.dom = w.dom.dom;
+      }
+    }
+    r.dom = null;
+  }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/lib/object_graph.dart b/runtime/bin/vmservice/observatory/lib/object_graph.dart
new file mode 100644
index 0000000..ec6cdae
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/lib/object_graph.dart
@@ -0,0 +1,120 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library object_graph;
+
+import 'dart:typed_data';
+
+import 'dominator_tree.dart';
+
+// Port of dart::ReadStream from vm/datastream.h.
+class ReadStream {
+  int _cur = 0;
+  final ByteData _data;
+  
+  ReadStream(this._data);
+  
+  int get pendingBytes => _data.lengthInBytes - _cur;
+  
+  int readUnsigned() {
+    int result = 0;
+    int shift = 0;
+    while (_data.getUint8(_cur) <= maxUnsignedDataPerByte) {
+      result |= _data.getUint8(_cur) << shift;
+      shift += dataBitsPerByte;
+      ++_cur;
+    }
+    result |= (_data.getUint8(_cur) & byteMask) << shift;
+    ++_cur;
+    return result;
+  }
+
+  static const int dataBitsPerByte = 7;
+  static const int byteMask = (1 << dataBitsPerByte) - 1;
+  static const int maxUnsignedDataPerByte = byteMask;
+}
+
+class ObjectVertex {
+  // Never null. The isolate root has id 0.
+  final int _id;
+  // null for VM-heap objects.
+  int _shallowSize;
+  int get shallowSize => _shallowSize;
+  int _retainedSize;
+  int get retainedSize => _retainedSize;
+  // null for VM-heap objects.
+  int _classId;
+  int get classId => _classId;
+  final List<ObjectVertex> succ = new List<ObjectVertex>();
+  ObjectVertex(this._id) : _retainedSize = 0;
+  String toString() => '$_id,$_shallowSize,$succ';
+}
+
+// See implementation of ObjectGraph::Serialize for format.
+class ObjectGraph {
+  final Map<int, ObjectVertex> _idToVertex = new Map<int, ObjectVertex>();
+
+  ObjectVertex _asVertex(int id) {
+    return _idToVertex.putIfAbsent(id, () => new ObjectVertex(id));
+  }
+
+  void _addFrom(ReadStream stream) {
+    ObjectVertex obj = _asVertex(stream.readUnsigned());
+    obj._shallowSize = stream.readUnsigned();
+    obj._classId = stream.readUnsigned();
+    int last = stream.readUnsigned();
+    while (last != 0) {
+      obj.succ.add(_asVertex(last));
+      last = stream.readUnsigned();
+    }
+  }
+
+  ObjectGraph(ReadStream reader) {
+    while (reader.pendingBytes > 0) {
+      _addFrom(reader);
+    }
+    _computeRetainedSizes();
+  }
+
+  Iterable<ObjectVertex> get vertices => _idToVertex.values;
+
+  ObjectVertex get root => _asVertex(0);
+  
+  void _computeRetainedSizes() {
+    // The retained size for an object is the sum of the shallow sizes of
+    // all its descendants in the dominator tree (including itself).
+    var d = new Dominator();
+    for (ObjectVertex u in vertices) {
+      if (u.shallowSize != null) {
+        u._retainedSize = u.shallowSize;
+        d.addEdges(u, u.succ.where((ObjectVertex v) => v.shallowSize != null));
+      }
+    }
+    d.computeDominatorTree(root);
+    // Compute all retained sizes "bottom up", starting from the leaves.
+    // Keep track of number of remaining children of each vertex.
+    var degree = new Map<ObjectVertex, int>();
+    for (ObjectVertex u in vertices) {
+      var v = d.dominator(u);
+      if (v != null) {
+        degree[v] = 1 + degree.putIfAbsent(v, () => 0);
+      }
+    }
+    var leaves = new List<ObjectVertex>();
+    for (ObjectVertex u in vertices) {
+      if (!degree.containsKey(u)) {
+        leaves.add(u);
+      }
+    }
+    while (!leaves.isEmpty) {
+      var v = leaves.removeLast();
+      var u = d.dominator(v);
+      if (u == null) continue;
+      u._retainedSize += v._retainedSize;
+      if (--degree[u] == 0) {
+        leaves.add(u);
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/lib/service_html.dart b/runtime/bin/vmservice/observatory/lib/service_html.dart
index 14f7311..da5a975 100644
--- a/runtime/bin/vmservice/observatory/lib/service_html.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_html.dart
@@ -43,8 +43,12 @@
     assert(data is Blob);
     FileReader fileReader = new FileReader();
     fileReader.readAsArrayBuffer(data);
-    return fileReader.onLoadEnd.first.then((e)
-        => new ByteData.view(fileReader.result));
+    return fileReader.onLoadEnd.first.then((e) {
+      var result = fileReader.result;
+      return new ByteData.view(result.buffer,
+                               result.offsetInBytes,
+                               result.length);
+    });
   }
 }
 
diff --git a/runtime/bin/vmservice/observatory/lib/service_io.dart b/runtime/bin/vmservice/observatory/lib/service_io.dart
index 5bae3e8..9bd5242 100644
--- a/runtime/bin/vmservice/observatory/lib/service_io.dart
+++ b/runtime/bin/vmservice/observatory/lib/service_io.dart
@@ -8,6 +8,7 @@
 import 'dart:io';
 import 'dart:typed_data';
 
+import 'package:logging/logging.dart';
 import 'package:observatory/service_common.dart';
 
 // Export the service library.
@@ -49,7 +50,7 @@
   
   Future<ByteData> nonStringToByteData(dynamic data) {
     assert(data is Uint8List);
-    print('nonString: ${data.lengthInBytes}, $data');
+    Logger.root.info('Binary data size in bytes: ${data.lengthInBytes}');
     return new Future.sync(() =>
         new ByteData.view(data.buffer,
                           data.offsetInBytes,
diff --git a/runtime/bin/vmservice/observatory/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/observatory/lib/src/elements/heap_map.dart
index 3674762..1f37c23 100644
--- a/runtime/bin/vmservice/observatory/lib/src/elements/heap_map.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/elements/heap_map.dart
@@ -155,7 +155,8 @@
 
   void _handleClick(MouseEvent event) {
     var address = _objectAt(event.offset).address.toRadixString(16);
-    window.location.hash = "/${fragmentation.isolate.link}/address/$address";
+    app.locationManager.go(app.locationManager.makeLink(
+        "${fragmentation.isolate.relativeLink('address/$address')}"));
   }
 
   void _updateFragmentationData() {
diff --git a/runtime/bin/vmservice/observatory/lib/src/service/object.dart b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
index afca179..3c8f3b7 100644
--- a/runtime/bin/vmservice/observatory/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/observatory/lib/src/service/object.dart
@@ -333,7 +333,8 @@
   @reflectable String relativeLink(String id) => '$id';
 
   @observable String version = 'unknown';
-  @observable String architecture = 'unknown';
+  @observable String targetCPU;
+  @observable int architectureBits;
   @observable double uptime = 0.0;
   @observable bool assertsEnabled = false;
   @observable bool typeChecksEnabled = false;
@@ -557,7 +558,8 @@
     }
     _loaded = true;
     version = map['version'];
-    architecture = map['architecture'];
+    targetCPU = map['targetCPU'];
+    architectureBits = map['architectureBits'];
     uptime = map['uptime'];
     var dateInMillis = int.parse(map['date']);
     lastUpdate = new DateTime.fromMillisecondsSinceEpoch(dateInMillis);
@@ -1311,6 +1313,7 @@
   @observable ServiceMap breakpoint;
   @observable ServiceMap exception;
   @observable ByteData data;
+  @observable int count;
 
   void _update(ObservableMap map, bool mapIsRef) {
     _loaded = true;
@@ -1327,6 +1330,9 @@
     if (map['_data'] != null) {
       data = map['_data'];
     }
+    if (map['count'] != null) {
+      count = map['count'];
+    }
   }
 
   String toString() {
@@ -1434,6 +1440,7 @@
   @observable int endTokenPos;
 
   @observable ServiceMap error;
+  @observable int vmCid;
 
   final Allocations newSpace = new Allocations();
   final Allocations oldSpace = new Allocations();
@@ -1456,6 +1463,9 @@
   void _update(ObservableMap map, bool mapIsRef) {
     name = map['name'];
     vmName = (map.containsKey('vmName') ? map['vmName'] : name);
+    var idPrefix = "classes/";
+    assert(id.startsWith(idPrefix));
+    vmCid = int.parse(id.substring(idPrefix.length));
 
     if (mapIsRef) {
       return;
diff --git a/runtime/bin/vmservice/observatory/pubspec.yaml b/runtime/bin/vmservice/observatory/pubspec.yaml
index f41e772..f2aca69 100644
--- a/runtime/bin/vmservice/observatory/pubspec.yaml
+++ b/runtime/bin/vmservice/observatory/pubspec.yaml
@@ -9,6 +9,8 @@
     entry_points:
     - web/index.html
     - web/index_devtools.html
+    inline_stylesheets:
+      lib/src/elements/css/shared.css: false
 - $dart2js:
     suppressWarnings: false
     $exclude: web/main.dart
diff --git a/runtime/bin/vmservice/observatory/test/classes_test.dart b/runtime/bin/vmservice/observatory/test/classes_test.dart
new file mode 100644
index 0000000..55d834b
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/classes_test.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.
+
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+var tests = [
+
+(Isolate isolate) =>
+  isolate.get('classes/62').then((Class c) {
+    expect(c.name, equals('_List'));
+    expect(c.vmCid, equals(62));
+}),
+
+];
+
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/bin/vmservice/observatory/test/dominator_tree_test.dart b/runtime/bin/vmservice/observatory/test/dominator_tree_test.dart
new file mode 100644
index 0000000..0bd52b3
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/dominator_tree_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:observatory/dominator_tree.dart';
+import 'package:unittest/unittest.dart';
+
+void main() {
+  test('small example from [Lenguaer & Tarjan 1979]', smallTest);
+  test('non-flowgraph', nonFlowgraph);
+}
+
+void smallTest() {
+  var g = {
+    'R': ['A', 'B', 'C'],
+    'A': ['D'],
+    'B': ['A', 'D', 'E'],
+    'C': ['F', 'G'],
+    'D': ['L'],
+    'E': ['H'],
+    'F': ['I'],
+    'G': ['I', 'J'],
+    'H': ['E', 'K'],
+    'I': ['K'],
+    'J': ['I'],
+    'K': ['I', 'R'],
+    'L': ['H'],
+  };
+  var d = new Dominator();
+  for (String u in g.keys) {
+    d.addEdges(u, g[u]);
+  }
+  d.computeDominatorTree('R');
+  expect(d.dominator('I'), equals('R'));
+  expect(d.dominator('K'), equals('R'));
+  expect(d.dominator('C'), equals('R'));
+  expect(d.dominator('H'), equals('R'));
+  expect(d.dominator('E'), equals('R'));
+  expect(d.dominator('A'), equals('R'));
+  expect(d.dominator('D'), equals('R'));
+  expect(d.dominator('B'), equals('R'));
+  
+  expect(d.dominator('F'), equals('C'));
+  expect(d.dominator('G'), equals('C'));
+  expect(d.dominator('J'), equals('G'));
+  expect(d.dominator('L'), equals('D'));
+  expect(d.dominator('R'), isNull);
+}
+
+void nonFlowgraph() {
+  var d = new Dominator();
+  d.addEdges('A', ['B']);
+  expect(() => d.computeDominatorTree('B'), throwsStateError);
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/test/graph_test.dart b/runtime/bin/vmservice/observatory/test/graph_test.dart
new file mode 100644
index 0000000..6492781
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/graph_test.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:observatory/object_graph.dart';
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+class Foo {
+  Object left;
+  Object right;
+}
+Foo r;
+
+List lst;
+
+void script() {
+  // Create 3 instances of Foo, with out-degrees
+  // 0 (for b), 1 (for a), and 2 (for staticFoo).
+  r = new Foo();
+  var a = new Foo();
+  var b = new Foo();
+  r.left = a;
+  r.right = b;
+  a.left = b;
+  
+  lst = new List(2);
+  lst[0] = lst;  // Self-loop.
+  // Larger than any other fixed-size list in a fresh heap.
+  lst[1] = new List(123456);
+}
+
+int fooId;
+
+var tests = [
+
+(Isolate isolate) {
+  Completer completer = new Completer();
+  isolate.vm.events.stream.listen((ServiceEvent event) {
+    if (event.eventType == '_Graph') {
+      ReadStream reader = new ReadStream(event.data);
+      ObjectGraph graph = new ObjectGraph(reader);
+      expect(fooId, isNotNull);
+      Iterable<ObjectVertex> foos = graph.vertices.where(
+          (ObjectVertex obj) => obj.classId == fooId);
+      expect(foos.length, equals(3));
+      expect(foos.where(
+          (ObjectVertex obj) => obj.succ.length == 0).length, equals(1));
+      expect(foos.where(
+          (ObjectVertex obj) => obj.succ.length == 1).length, equals(1));
+      expect(foos.where(
+          (ObjectVertex obj) => obj.succ.length == 2).length, equals(1));
+      
+      ObjectVertex bVertex = foos.where(
+          (ObjectVertex obj) => obj.succ.length == 0).first;
+      ObjectVertex aVertex = foos.where(
+          (ObjectVertex obj) => obj.succ.length == 1).first;
+      ObjectVertex rVertex = foos.where(
+          (ObjectVertex obj) => obj.succ.length == 2).first;
+      
+      // TODO(koda): Check actual byte sizes.
+
+      expect(aVertex.retainedSize, equals(aVertex.shallowSize));
+      expect(bVertex.retainedSize, equals(bVertex.shallowSize));
+      expect(rVertex.retainedSize, equals(aVertex.shallowSize +
+                                          bVertex.shallowSize +
+                                          rVertex.shallowSize));
+      
+      const int fixedSizeListCid = 62;
+      List<ObjectVertex> lists = new List.from(graph.vertices.where(
+          (ObjectVertex obj) => obj.classId == fixedSizeListCid));
+      expect(lists.length >= 2, isTrue);
+      // Order by decreasing retained size.
+      lists.sort((u, v) => v.retainedSize - u.retainedSize);
+      ObjectVertex first = lists[0];
+      ObjectVertex second = lists[1];
+      // Check that the short list retains more than the long list inside.
+      expect(first.succ.length, equals(2 + second.succ.length));
+      // ... and specifically, that it retains exactly itself + the long one.
+      expect(first.retainedSize,
+          equals(first.shallowSize + second.shallowSize));
+      completer.complete();
+    }
+  });
+  return isolate.rootLib.load().then((Library lib) {
+    expect(lib.classes.length, equals(1));
+    Class fooClass = lib.classes.first;
+    fooId = fooClass.vmCid;
+    isolate.get('graph');
+    return completer.future;
+  });
+},
+
+];
+
+main(args) => runIsolateTests(args, tests, testeeBefore: script);
\ No newline at end of file
diff --git a/runtime/bin/vmservice/observatory/test/vm_test.dart b/runtime/bin/vmservice/observatory/test/vm_test.dart
new file mode 100644
index 0000000..86fa089
--- /dev/null
+++ b/runtime/bin/vmservice/observatory/test/vm_test.dart
@@ -0,0 +1,16 @@
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+
+var tests = [
+
+(Isolate isolate) {
+  VM vm = isolate.owner;
+  expect(vm.targetCPU, isNotNull);
+  expect(vm.architectureBits == 32 ||
+         vm.architectureBits == 64, isTrue);
+},
+
+];
+
+main(args) => runIsolateTests(args, tests);
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 7412ebf..cf124ba 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -4,7 +4,7 @@
 
 
 // TODO(srdjan): Use shared array implementation.
-class _List<E> implements List<E> {
+class _List<E> extends FixedLengthListBase<E> {
 
   factory _List(length) native "List_allocate";
 
@@ -12,10 +12,6 @@
 
   void operator []=(int index, E value) native "List_setIndexed";
 
-  String toString() {
-    return ListBase.listToString(this);
-  }
-
   int get length native "List_getLength";
 
   List _slice(int start, int count, bool needsTypeArgument) {
@@ -34,38 +30,6 @@
   List _sliceInternal(int start, int count, bool needsTypeArgument)
       native "List_slice";
 
-  void insert(int index, E element) {
-    throw NonGrowableListError.add();
-  }
-
-  void insertAll(int index, Iterable<E> iterable) {
-    throw NonGrowableListError.add();
-  }
-
-  void setAll(int index, Iterable<E> iterable) {
-    IterableMixinWorkaround.setAllList(this, index, iterable);
-  }
-
-  E removeAt(int index) {
-    throw NonGrowableListError.remove();
-  }
-
-  bool remove(Object element) {
-    throw NonGrowableListError.remove();
-  }
-
-  void removeWhere(bool test(E element)) {
-    throw NonGrowableListError.remove();
-  }
-
-  void retainWhere(bool test(E element)) {
-    throw NonGrowableListError.remove();
-  }
-
-  Iterable<E> getRange(int start, [int end]) {
-    return new IterableMixinWorkaround<E>().getRangeList(this, start, end);
-  }
-
   // List interface.
   void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
     if (start < 0 || start > this.length) {
@@ -95,18 +59,6 @@
     }
   }
 
-  void removeRange(int start, int end) {
-    throw NonGrowableListError.remove();
-  }
-
-  void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw NonGrowableListError.remove();
-  }
-
-  void fillRange(int start, int end, [E fillValue]) {
-    IterableMixinWorkaround.fillRangeList(this, start, end, fillValue);
-  }
-
   List<E> sublist(int start, [int end]) {
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
@@ -119,10 +71,6 @@
 
   // Iterable interface.
 
-  bool contains(Object element) {
-    return IterableMixinWorkaround.contains(this, element);
-  }
-
   void forEach(f(E element)) {
     final length = this.length;
     for (int i = 0; i < length; i++) {
@@ -130,120 +78,10 @@
     }
   }
 
-  String join([String separator = ""]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  Iterable map(f(E element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  E reduce(E combine(E value, E element)) {
-    return IterableMixinWorkaround.reduce(this, combine);
-  }
-
-  fold(initialValue, combine(previousValue, E element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  Iterable<E> where(bool f(E element)) {
-    return new IterableMixinWorkaround<E>().where(this, f);
-  }
-
-  Iterable expand(Iterable f(E element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  Iterable<E> take(int n) {
-    return new IterableMixinWorkaround<E>().takeList(this, n);
-  }
-
-  Iterable<E> takeWhile(bool test(E value)) {
-    return new IterableMixinWorkaround<E>().takeWhile(this, test);
-  }
-
-  Iterable<E> skip(int n) {
-    return new IterableMixinWorkaround<E>().skipList(this, n);
-  }
-
-  Iterable<E> skipWhile(bool test(E value)) {
-    return new IterableMixinWorkaround<E>().skipWhile(this, test);
-  }
-
-  bool every(bool f(E element)) {
-    return IterableMixinWorkaround.every(this, f);
-  }
-
-  bool any(bool f(E element)) {
-    return IterableMixinWorkaround.any(this, f);
-  }
-
-  E firstWhere(bool test(E value), {E orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  E lastWhere(bool test(E value), {E orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  E singleWhere(bool test(E value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  E elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty {
-    return this.length == 0;
-  }
-
-  bool get isNotEmpty => !isEmpty;
-
-  Iterable<E> get reversed =>
-      new IterableMixinWorkaround<E>().reversedList(this);
-
-  void sort([int compare(E a, E b)]) {
-    IterableMixinWorkaround.sortList(this, compare);
-  }
-
-  void shuffle([Random random]) {
-    IterableMixinWorkaround.shuffleList(this, random);
-  }
-
-  int indexOf(Object element, [int start = 0]) {
-    return Lists.indexOf(this, element, start, this.length);
-  }
-
-  int lastIndexOf(Object element, [int start = null]) {
-    if (start == null) start = length - 1;
-    return Lists.lastIndexOf(this, element, start);
-  }
-
   Iterator<E> get iterator {
     return new _FixedSizeArrayIterator<E>(this);
   }
 
-  void add(E element) {
-    throw NonGrowableListError.add();
-  }
-
-  void addAll(Iterable<E> iterable) {
-    throw NonGrowableListError.add();
-  }
-
-  void clear() {
-    throw NonGrowableListError.remove();
-  }
-
-  void set length(int length) {
-    throw NonGrowableListError.length();
-  }
-
-  E removeLast() {
-    throw NonGrowableListError.remove();
-  }
-
   E get first {
     if (length > 0) return this[0];
     throw IterableElementError.noElement();
@@ -273,14 +111,6 @@
     // _GrowableList.withData must not be called with empty list.
     return growable ? <E>[] : new List<E>(0);
   }
-
-  Set<E> toSet() {
-    return new Set<E>.from(this);
-  }
-
-  Map<int, E> asMap() {
-    return new IterableMixinWorkaround<E>().asMapList(this);
-  }
 }
 
 
@@ -291,7 +121,7 @@
 // classes (and inline cache misses) versus a field in the native
 // implementation (checks when modifying). We should keep watching
 // the inline cache misses.
-class _ImmutableList<E> implements List<E> {
+class _ImmutableList<E> extends UnmodifiableListBase<E> {
 
   factory _ImmutableList._uninstantiable() {
     throw new UnsupportedError(
@@ -303,60 +133,8 @@
 
   E operator [](int index) native "List_getIndexed";
 
-  void operator []=(int index, E value) {
-    throw UnmodifiableListError.change();
-  }
-
   int get length native "List_getLength";
 
-  void insert(int index, E element) {
-    throw UnmodifiableListError.add();
-  }
-
-  void insertAll(int index, Iterable<E> iterable) {
-    throw UnmodifiableListError.add();
-  }
-
-  void setAll(int index, Iterable<E> iterable) {
-    throw UnmodifiableListError.change();
-  }
-
-  E removeAt(int index) {
-    throw UnmodifiableListError.remove();
-  }
-
-  bool remove(Object element) {
-    throw UnmodifiableListError.remove();
-  }
-
-  void removeWhere(bool test(E element)) {
-    throw UnmodifiableListError.remove();
-  }
-
-  void retainWhere(bool test(E element)) {
-    throw UnmodifiableListError.remove();
-  }
-
-  void copyFrom(List src, int srcStart, int dstStart, int count) {
-    throw UnmodifiableListError.change();
-  }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    throw UnmodifiableListError.change();
-  }
-
-  void removeRange(int start, int end) {
-    throw UnmodifiableListError.remove();
-  }
-
-  void fillRange(int start, int end, [E fillValue]) {
-    throw UnmodifiableListError.change();
-  }
-
-  void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw UnmodifiableListError.change();
-  }
-
   List<E> sublist(int start, [int end]) {
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
@@ -371,16 +149,8 @@
     return result;
   }
 
-  Iterable<E> getRange(int start, int end) {
-    return new IterableMixinWorkaround<E>().getRangeList(this, start, end);
-  }
-
   // Collection interface.
 
-  bool contains(Object element) {
-    return IterableMixinWorkaround.contains(this, element);
-  }
-
   void forEach(f(E element)) {
     final length = this.length;
     for (int i = 0; i < length; i++) {
@@ -388,124 +158,10 @@
     }
   }
 
-  Iterable map(f(E element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  String join([String separator = ""]) {
-    return IterableMixinWorkaround.joinList(this, separator);
-  }
-
-  E reduce(E combine(E value, E element)) {
-    return IterableMixinWorkaround.reduce(this, combine);
-  }
-
-  fold(initialValue, combine(previousValue, E element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  Iterable<E> where(bool f(E element)) {
-    return new IterableMixinWorkaround<E>().where(this, f);
-  }
-
-  Iterable expand(Iterable f(E element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  Iterable<E> take(int n) {
-    return new IterableMixinWorkaround<E>().takeList(this, n);
-  }
-
-  Iterable<E> takeWhile(bool test(E value)) {
-    return new IterableMixinWorkaround<E>().takeWhile(this, test);
-  }
-
-  Iterable<E> skip(int n) {
-    return new IterableMixinWorkaround<E>().skipList(this, n);
-  }
-
-  Iterable<E> skipWhile(bool test(E value)) {
-    return new IterableMixinWorkaround<E>().skipWhile(this, test);
-  }
-
-  bool every(bool f(E element)) {
-    return IterableMixinWorkaround.every(this, f);
-  }
-
-  bool any(bool f(E element)) {
-    return IterableMixinWorkaround.any(this, f);
-  }
-
-  E firstWhere(bool test(E value), {E orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  E lastWhere(bool test(E value), {E orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  E singleWhere(bool test(E value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
-  E elementAt(int index) {
-    return this[index];
-  }
-
-  bool get isEmpty {
-    return this.length == 0;
-  }
-
-  bool get isNotEmpty => !isEmpty;
-
-  Iterable<E> get reversed =>
-      new IterableMixinWorkaround<E>().reversedList(this);
-
-  void sort([int compare(E a, E b)]) {
-    throw UnmodifiableListError.change();
-  }
-
-  void shuffle([Random random]) {
-    throw UnmodifiableListError.change();
-  }
-
-  String toString() {
-    return ListBase.listToString(this);
-  }
-
-  int indexOf(Object element, [int start = 0]) {
-    return Lists.indexOf(this, element, start, this.length);
-  }
-
-  int lastIndexOf(Object element, [int start = null]) {
-    if (start == null) start = length - 1;
-    return Lists.lastIndexOf(this, element, start);
-  }
-
   Iterator<E> get iterator {
     return new _FixedSizeArrayIterator<E>(this);
   }
 
-  void add(E element) {
-    throw UnmodifiableListError.add();
-  }
-
-  void addAll(Iterable<E> elements) {
-    throw UnmodifiableListError.add();
-  }
-
-  void clear() {
-    throw UnmodifiableListError.remove();
-  }
-
-  void set length(int length) {
-    throw UnmodifiableListError.length();
-  }
-
-  E removeLast() {
-    throw UnmodifiableListError.remove();
-  }
-
   E get first {
     if (length > 0) return this[0];
     throw IterableElementError.noElement();
@@ -536,14 +192,6 @@
     }
     return growable ? <E>[] : new _List<E>(0);
   }
-
-  Set<E> toSet() {
-    return new Set<E>.from(this);
-  }
-
-  Map<int, E> asMap() {
-    return new IterableMixinWorkaround<E>().asMapList(this);
-  }
 }
 
 
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 5f9bd9f..cd984e5 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -27,6 +27,9 @@
       native "AssertionError_throwNew";
 
   String toString() {
+    if (_url == null) {
+      return _failedAssertion;
+    }
     var columnInfo = "";
     if (_column > 0) {
       // Only add column information if it is valid.
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index bc6d155..a572475 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.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.
 
-class _GrowableList<T> implements List<T> {
+class _GrowableList<T> extends ListBase<T> {
 
   void insert(int index, T element) {
     if ((index < 0) || (index > length)) {
@@ -25,7 +25,9 @@
   T removeAt(int index) {
     var result = this[index];
     int newLength = this.length - 1;
-    Lists.copy(this, index + 1, this, index, newLength - index);
+    if (index < newLength) {
+      Lists.copy(this, index + 1, this, index, newLength - index);
+    }
     this.length = newLength;
     return result;
   }
@@ -67,37 +69,12 @@
     }
   }
 
-  void removeWhere(bool test(T element)) {
-    IterableMixinWorkaround.removeWhereList(this, test);
-  }
-
-  void retainWhere(bool test(T element)) {
-    IterableMixinWorkaround.removeWhereList(this,
-                                            (T element) => !test(element));
-  }
-
-  Iterable<T> getRange(int start, int end) {
-    return new IterableMixinWorkaround<T>().getRangeList(this, start, end);
-  }
-
-  void setRange(int start, int end, Iterable<T> iterable, [int skipCount = 0]) {
-    IterableMixinWorkaround.setRangeList(this, start, end, iterable, skipCount);
-  }
-
   void removeRange(int start, int end) {
     Lists.indicesCheck(this, start, end);
     Lists.copy(this, end, this, start, this.length - end);
     this.length = this.length - (end - start);
   }
 
-  void replaceRange(int start, int end, Iterable<T> iterable) {
-    IterableMixinWorkaround.replaceRangeList(this, start, end, iterable);
-  }
-
-  void fillRange(int start, int end, [T fillValue]) {
-    IterableMixinWorkaround.fillRangeList(this, start, end, fillValue);
-  }
-
   List<T> sublist(int start, [int end]) {
     Lists.indicesCheck(this, start, end);
     if (end == null) end = this.length;
@@ -226,14 +203,6 @@
     throw IterableElementError.tooMany();;
   }
 
-  int indexOf(Object element, [int start = 0]) {
-    return IterableMixinWorkaround.indexOfList(this, element, start);
-  }
-
-  int lastIndexOf(Object element, [int start = null]) {
-    return IterableMixinWorkaround.lastIndexOfList(this, element, start);
-  }
-
   void _grow(int new_length) {
     var new_data = new _List(new_length);
     for (int i = 0; i < length; i++) {
@@ -244,10 +213,6 @@
 
   // Iterable interface.
 
-  bool contains(Object element) {
-    return IterableMixinWorkaround.contains(this, element);
-  }
-
   void forEach(f(T element)) {
     int initialLength = length;
     for (int i = 0; i < length; i++) {
@@ -324,62 +289,6 @@
     return buffer.toString();
   }
 
-  Iterable map(f(T element)) {
-    return IterableMixinWorkaround.mapList(this, f);
-  }
-
-  T reduce(T combine(T value, T element)) {
-    return IterableMixinWorkaround.reduce(this, combine);
-  }
-
-  fold(initialValue, combine(previousValue, T element)) {
-    return IterableMixinWorkaround.fold(this, initialValue, combine);
-  }
-
-  Iterable<T> where(bool f(T element)) {
-    return new IterableMixinWorkaround<T>().where(this, f);
-  }
-
-  Iterable expand(Iterable f(T element)) {
-    return IterableMixinWorkaround.expand(this, f);
-  }
-
-  Iterable<T> take(int n) {
-    return new IterableMixinWorkaround<T>().takeList(this, n);
-  }
-
-  Iterable<T> takeWhile(bool test(T value)) {
-    return new IterableMixinWorkaround<T>().takeWhile(this, test);
-  }
-
-  Iterable<T> skip(int n) {
-    return new IterableMixinWorkaround<T>().skipList(this, n);
-  }
-
-  Iterable<T> skipWhile(bool test(T value)) {
-    return new IterableMixinWorkaround<T>().skipWhile(this, test);
-  }
-
-  bool every(bool f(T element)) {
-    return IterableMixinWorkaround.every(this, f);
-  }
-
-  bool any(bool f(T element)) {
-    return IterableMixinWorkaround.any(this, f);
-  }
-
-  T firstWhere(bool test(T value), {T orElse()}) {
-    return IterableMixinWorkaround.firstWhere(this, test, orElse);
-  }
-
-  T lastWhere(bool test(T value), {T orElse()}) {
-    return IterableMixinWorkaround.lastWhereList(this, test, orElse);
-  }
-
-  T singleWhere(bool test(T value)) {
-    return IterableMixinWorkaround.singleWhere(this, test);
-  }
-
   T elementAt(int index) {
     return this[index];
   }
@@ -394,17 +303,6 @@
     this.length = 0;
   }
 
-  Iterable<T> get reversed =>
-      new IterableMixinWorkaround<T>().reversedList(this);
-
-  void sort([int compare(T a, T b)]) {
-    IterableMixinWorkaround.sortList(this, compare);
-  }
-
-  void shuffle([Random random]) {
-    IterableMixinWorkaround.shuffleList(this, random);
-  }
-
   String toString() => ListBase.listToString(this);
 
   Iterator<T> get iterator {
@@ -429,8 +327,4 @@
   Set<T> toSet() {
     return new Set<T>.from(this);
   }
-
-  Map<int, T> asMap() {
-    return new IterableMixinWorkaround<T>().asMapList(this);
-  }
 }
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 82a0fc1..7251d81 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -35,6 +35,23 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(CapabilityImpl_equals, 2) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Capability, recv, arguments->NativeArgAt(0));
+  GET_NON_NULL_NATIVE_ARGUMENT(Capability, other, arguments->NativeArgAt(1));
+  return (recv.Id() == other.Id()) ? Bool::True().raw() : Bool::False().raw();
+}
+
+
+DEFINE_NATIVE_ENTRY(CapabilityImpl_get_hashcode, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Capability, cap, arguments->NativeArgAt(0));
+  int64_t id = cap.Id();
+  int32_t hi = static_cast<int32_t>(id >> 32);
+  int32_t lo = static_cast<int32_t>(id);
+  int32_t hash = (hi ^ lo) & kSmiMax;
+  return Smi::New(hash);
+}
+
+
 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 1) {
   ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
   Dart_Port port_id =
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 1313609..e5430f8 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -17,6 +17,17 @@
 
 class _CapabilityImpl implements Capability {
   factory _CapabilityImpl() native "CapabilityImpl_factory";
+
+  bool operator==(var other) {
+    return (other is _CapabilityImpl) && _equals(other);
+  }
+
+  int get hashCode {
+    return _get_hashcode();
+  }
+
+  _equals(other) native "CapabilityImpl_equals";
+  _get_hashcode() native "CapabilityImpl_get_hashcode";
 }
 
 patch class RawReceivePort {
@@ -311,6 +322,8 @@
   // in vm/isolate.cc.
   static const _PAUSE = 1;
   static const _RESUME = 2;
+  static const _PING = 3;
+
 
   static SendPort _spawnFunction(SendPort readyPort, Function topLevelFunction,
                                  var message)
@@ -358,7 +371,12 @@
   }
 
   /* patch */ void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
-    throw new UnsupportedError("ping");
+    var msg = new List(4)
+        ..[0] = 0  // Make room for OOM message type.
+        ..[1] = _PING
+        ..[2] = responsePort
+        ..[3] = pingType;
+    _sendOOB(controlPort, msg);
   }
 
   /* patch */ void addErrorListener(SendPort port) {
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index 701fccd..278cb09 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -46,7 +46,9 @@
 
 DEFINE_NATIVE_ENTRY(Object_toString, 1) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  ASSERT(!instance.IsString());  // See issue 20583.
+  if (instance.IsString()) {
+    return instance.raw();
+  }
   const char* c_str = instance.ToCString();
   return String::New(c_str);
 }
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 51a9d80..1b6c96b 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -275,40 +275,6 @@
     return IterableMixinWorkaround.expand(this, f);
   }
 
-  // The following methods need to know the element type (int or double).
-  Iterable where(bool f(element)) {
-    return new IterableMixinWorkaround().where(this, f);
-  }
-
-  Iterable take(int n) {
-    return new IterableMixinWorkaround().takeList(this, n);
-  }
-
-  Iterable takeWhile(bool test(element)) {
-    return new IterableMixinWorkaround().takeWhile(this, test);
-  }
-
-  Iterable skip(int n) {
-    return new IterableMixinWorkaround().skipList(this, n);
-  }
-
-  Iterable skipWhile(bool test(element)) {
-    return new IterableMixinWorkaround().skipWhile(this, test);
-  }
-
-  Iterable<dynamic> get reversed {
-    return new IterableMixinWorkaround().reversedList(this);
-  }
-
-  Map<int, dynamic> asMap() {
-    return new IterableMixinWorkaround().asMapList(this);
-  }
-
-  Iterable getRange(int start, [int end]) {
-    return new IterableMixinWorkaround().getRangeList(this, start, end);
-  }
-  // End of methods returning incorrectly parameterized types.
-
   bool every(bool f(element)) {
     return IterableMixinWorkaround.every(this, f);
   }
@@ -535,6 +501,142 @@
 }
 
 
+class _IntListMixin {
+  Iterable<int> where(bool f(int element)) => new WhereIterable<int>(this, f);
+
+  Iterable<int> take(int n) => new SubListIterable<int>(this, 0, n);
+
+  Iterable<int> takeWhile(bool test(int element)) =>
+    new TakeWhileIterable<int>(this, test);
+
+  Iterable<int> skip(int n) => new SubListIterable<int>(this, n, null);
+
+  Iterable<int> skipWhile(bool test(element)) =>
+    new SkipWhileIterable<int>(this, test);
+
+  Iterable<int> get reversed => new ReversedListIterable<int>(this);
+
+  Map<int, int> asMap() => new ListMapView<int>(this);
+
+  Iterable<int> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<int>(this, start, end);
+  }
+
+  Iterator<int> get iterator => new _TypedListIterator<int>(this);
+}
+
+
+class _DoubleListMixin {
+  Iterable<double> where(bool f(int element)) =>
+    new WhereIterable<double>(this, f);
+
+  Iterable<double> take(int n) => new SubListIterable<double>(this, 0, n);
+
+  Iterable<double> takeWhile(bool test(int element)) =>
+    new TakeWhileIterable<double>(this, test);
+
+  Iterable<double> skip(int n) => new SubListIterable<double>(this, n, null);
+
+  Iterable<double> skipWhile(bool test(element)) =>
+    new SkipWhileIterable<double>(this, test);
+
+  Iterable<double> get reversed => new ReversedListIterable<double>(this);
+
+  Map<int, double> asMap() => new ListMapView<double>(this);
+
+  Iterable<double> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<double>(this, start, end);
+  }
+
+  Iterator<double> get iterator => new _TypedListIterator<double>(this);
+}
+
+
+class _Float32x4ListMixin {
+  Iterable<Float32x4> where(bool f(int element)) =>
+    new WhereIterable<Float32x4>(this, f);
+
+  Iterable<Float32x4> take(int n) => new SubListIterable<Float32x4>(this, 0, n);
+
+  Iterable<Float32x4> takeWhile(bool test(int element)) =>
+    new TakeWhileIterable<Float32x4>(this, test);
+
+  Iterable<Float32x4> skip(int n) =>
+    new SubListIterable<Float32x4>(this, n, null);
+
+  Iterable<Float32x4> skipWhile(bool test(element)) =>
+    new SkipWhileIterable<Float32x4>(this, test);
+
+  Iterable<Float32x4> get reversed => new ReversedListIterable<Float32x4>(this);
+
+  Map<int, Float32x4> asMap() => new ListMapView<Float32x4>(this);
+
+  Iterable<Float32x4> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Float32x4>(this, start, end);
+  }
+
+  Iterator<Float32x4> get iterator => new _TypedListIterator<Float32x4>(this);
+}
+
+
+class _Int32x4ListMixin {
+  Iterable<Int32x4> where(bool f(int element)) =>
+    new WhereIterable<Int32x4>(this, f);
+
+  Iterable<Int32x4> take(int n) => new SubListIterable<Int32x4>(this, 0, n);
+
+  Iterable<Int32x4> takeWhile(bool test(int element)) =>
+    new TakeWhileIterable<Int32x4>(this, test);
+
+  Iterable<Int32x4> skip(int n) => new SubListIterable<Int32x4>(this, n, null);
+
+  Iterable<Int32x4> skipWhile(bool test(element)) =>
+    new SkipWhileIterable<Int32x4>(this, test);
+
+  Iterable<Int32x4> get reversed => new ReversedListIterable<Int32x4>(this);
+
+  Map<int, Int32x4> asMap() => new ListMapView<Int32x4>(this);
+
+  Iterable<Int32x4> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Int32x4>(this, start, end);
+  }
+
+  Iterator<Int32x4> get iterator => new _TypedListIterator<Int32x4>(this);
+}
+
+
+class _Float64x2ListMixin {
+  Iterable<Float64x2> where(bool f(int element)) =>
+    new WhereIterable<Float64x2>(this, f);
+
+  Iterable<Float64x2> take(int n) => new SubListIterable<Float64x2>(this, 0, n);
+
+  Iterable<Float64x2> takeWhile(bool test(int element)) =>
+    new TakeWhileIterable<Float64x2>(this, test);
+
+  Iterable<Float64x2> skip(int n) =>
+    new SubListIterable<Float64x2>(this, n, null);
+
+  Iterable<Float64x2> skipWhile(bool test(element)) =>
+    new SkipWhileIterable<Float64x2>(this, test);
+
+  Iterable<Float64x2> get reversed => new ReversedListIterable<Float64x2>(this);
+
+  Map<int, Float64x2> asMap() => new ListMapView<Float64x2>(this);
+
+  Iterable<Float64x2> getRange(int start, [int end]) {
+    RangeError.checkValidRange(start, end, this.length);
+    return new SubListIterable<Float64x2>(this, start, end);
+  }
+
+  Iterator<Float64x2> get iterator => new _TypedListIterator<Float64x2>(this);
+}
+
+
 class _ByteBuffer implements ByteBuffer {
   final _TypedList _data;
 
@@ -730,7 +832,7 @@
 }
 
 
-class _Int8Array extends _TypedList implements Int8List {
+class _Int8Array extends _TypedList with _IntListMixin implements Int8List {
   // Factory constructors.
 
   factory _Int8Array(int length) {
@@ -754,10 +856,6 @@
     _setInt8(index, _toInt8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -776,7 +874,7 @@
 }
 
 
-class _Uint8Array extends _TypedList implements Uint8List {
+class _Uint8Array extends _TypedList with _IntListMixin implements Uint8List {
   // Factory constructors.
 
   factory _Uint8Array(int length) {
@@ -799,10 +897,6 @@
     _setUint8(index, _toUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Methods implementing TypedData interface.
   int get elementSizeInBytes {
@@ -820,7 +914,7 @@
 }
 
 
-class _Uint8ClampedArray extends _TypedList implements Uint8ClampedList {
+class _Uint8ClampedArray extends _TypedList with _IntListMixin implements Uint8ClampedList {
   // Factory constructors.
 
   factory _Uint8ClampedArray(int length) {
@@ -843,10 +937,6 @@
     _setUint8(index, _toClampedUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Methods implementing TypedData interface.
   int get elementSizeInBytes {
@@ -865,7 +955,7 @@
 }
 
 
-class _Int16Array extends _TypedList implements Int16List {
+class _Int16Array extends _TypedList with _IntListMixin implements Int16List {
   // Factory constructors.
 
   factory _Int16Array(int length) {
@@ -889,10 +979,6 @@
     _setIndexedInt16(index, _toInt16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -919,7 +1005,7 @@
 }
 
 
-class _Uint16Array extends _TypedList implements Uint16List {
+class _Uint16Array extends _TypedList with _IntListMixin implements Uint16List {
   // Factory constructors.
 
   factory _Uint16Array(int length) {
@@ -943,10 +1029,6 @@
     _setIndexedUint16(index, _toUint16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -973,7 +1055,7 @@
 }
 
 
-class _Int32Array extends _TypedList implements Int32List {
+class _Int32Array extends _TypedList with _IntListMixin implements Int32List {
   // Factory constructors.
 
   factory _Int32Array(int length) {
@@ -997,10 +1079,6 @@
     _setIndexedInt32(index, _toInt32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -1027,7 +1105,7 @@
 }
 
 
-class _Uint32Array extends _TypedList implements Uint32List {
+class _Uint32Array extends _TypedList with _IntListMixin implements Uint32List {
   // Factory constructors.
 
   factory _Uint32Array(int length) {
@@ -1051,10 +1129,6 @@
     _setIndexedUint32(index, _toUint32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1081,7 +1155,7 @@
 }
 
 
-class _Int64Array extends _TypedList implements Int64List {
+class _Int64Array extends _TypedList with _IntListMixin implements Int64List {
   // Factory constructors.
 
   factory _Int64Array(int length) {
@@ -1105,10 +1179,6 @@
     _setIndexedInt64(index, _toInt64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1135,7 +1205,7 @@
 }
 
 
-class _Uint64Array extends _TypedList implements Uint64List {
+class _Uint64Array extends _TypedList with _IntListMixin implements Uint64List {
   // Factory constructors.
 
   factory _Uint64Array(int length) {
@@ -1159,10 +1229,6 @@
     _setIndexedUint64(index, _toUint64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1189,7 +1255,7 @@
 }
 
 
-class _Float32Array extends _TypedList implements Float32List {
+class _Float32Array extends _TypedList with _DoubleListMixin implements Float32List {
   // Factory constructors.
 
   factory _Float32Array(int length) {
@@ -1213,10 +1279,6 @@
     _setIndexedFloat32(index, value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1243,7 +1305,7 @@
 }
 
 
-class _Float64Array extends _TypedList implements Float64List {
+class _Float64Array extends _TypedList with _DoubleListMixin implements Float64List {
   // Factory constructors.
 
   factory _Float64Array(int length) {
@@ -1267,10 +1329,6 @@
     _setIndexedFloat64(index, value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1297,7 +1355,7 @@
 }
 
 
-class _Float32x4Array extends _TypedList implements Float32x4List {
+class _Float32x4Array extends _TypedList with _Float32x4ListMixin implements Float32x4List {
   // Factory constructors.
 
   factory _Float32x4Array(int length) {
@@ -1319,10 +1377,6 @@
     _setIndexedFloat32x4(index, value);
   }
 
-  Iterator<Float32x4> get iterator {
-    return new _TypedListIterator<Float32x4>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1349,7 +1403,7 @@
 }
 
 
-class _Int32x4Array extends _TypedList implements Int32x4List {
+class _Int32x4Array extends _TypedList with _Int32x4ListMixin implements Int32x4List {
   // Factory constructors.
 
   factory _Int32x4Array(int length) {
@@ -1371,10 +1425,6 @@
     _setIndexedInt32x4(index, value);
   }
 
-  Iterator<Int32x4> get iterator {
-    return new _TypedListIterator<Int32x4>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1401,7 +1451,7 @@
 }
 
 
-class _Float64x2Array extends _TypedList implements Float64x2List {
+class _Float64x2Array extends _TypedList with _Float64x2ListMixin implements Float64x2List {
   // Factory constructors.
 
   factory _Float64x2Array(int length) {
@@ -1423,10 +1473,6 @@
     _setIndexedFloat64x2(index, value);
   }
 
-  Iterator<Float64x2> get iterator {
-    return new _TypedListIterator<Float64x2>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1453,7 +1499,7 @@
 }
 
 
-class _ExternalInt8Array extends _TypedList implements Int8List {
+class _ExternalInt8Array extends _TypedList with _IntListMixin implements Int8List {
   // Factory constructors.
 
   factory _ExternalInt8Array(int length) {
@@ -1476,10 +1522,6 @@
     _setInt8(index, value);
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1499,7 +1541,7 @@
 }
 
 
-class _ExternalUint8Array extends _TypedList implements Uint8List {
+class _ExternalUint8Array extends _TypedList with _IntListMixin implements Uint8List {
   // Factory constructors.
 
   factory _ExternalUint8Array(int length) {
@@ -1523,10 +1565,6 @@
     _setUint8(index, _toUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1546,7 +1584,7 @@
 }
 
 
-class _ExternalUint8ClampedArray extends _TypedList implements Uint8ClampedList {
+class _ExternalUint8ClampedArray extends _TypedList with _IntListMixin implements Uint8ClampedList {
   // Factory constructors.
 
   factory _ExternalUint8ClampedArray(int length) {
@@ -1569,10 +1607,6 @@
     _setUint8(index, _toClampedUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1592,7 +1626,7 @@
 }
 
 
-class _ExternalInt16Array extends _TypedList implements Int16List {
+class _ExternalInt16Array extends _TypedList with _IntListMixin implements Int16List {
   // Factory constructors.
 
   factory _ExternalInt16Array(int length) {
@@ -1616,10 +1650,6 @@
     _setIndexedInt16(index, _toInt16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1647,7 +1677,7 @@
 }
 
 
-class _ExternalUint16Array extends _TypedList implements Uint16List {
+class _ExternalUint16Array extends _TypedList with _IntListMixin implements Uint16List {
   // Factory constructors.
 
   factory _ExternalUint16Array(int length) {
@@ -1671,10 +1701,6 @@
     _setIndexedUint16(index, _toUint16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1702,7 +1728,7 @@
 }
 
 
-class _ExternalInt32Array extends _TypedList implements Int32List {
+class _ExternalInt32Array extends _TypedList with _IntListMixin implements Int32List {
   // Factory constructors.
 
   factory _ExternalInt32Array(int length) {
@@ -1726,10 +1752,6 @@
     _setIndexedInt32(index, _toInt32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1757,7 +1779,7 @@
 }
 
 
-class _ExternalUint32Array extends _TypedList implements Uint32List {
+class _ExternalUint32Array extends _TypedList with _IntListMixin implements Uint32List {
   // Factory constructors.
 
   factory _ExternalUint32Array(int length) {
@@ -1781,10 +1803,6 @@
     _setIndexedUint32(index, _toUint32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1812,7 +1830,7 @@
 }
 
 
-class _ExternalInt64Array extends _TypedList implements Int64List {
+class _ExternalInt64Array extends _TypedList with _IntListMixin implements Int64List {
   // Factory constructors.
 
   factory _ExternalInt64Array(int length) {
@@ -1836,10 +1854,6 @@
     _setIndexedInt64(index, _toInt64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1867,7 +1881,7 @@
 }
 
 
-class _ExternalUint64Array extends _TypedList implements Uint64List {
+class _ExternalUint64Array extends _TypedList with _IntListMixin implements Uint64List {
   // Factory constructors.
 
   factory _ExternalUint64Array(int length) {
@@ -1891,10 +1905,6 @@
     _setIndexedUint64(index, _toUint64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1922,7 +1932,7 @@
 }
 
 
-class _ExternalFloat32Array extends _TypedList implements Float32List {
+class _ExternalFloat32Array extends _TypedList with _DoubleListMixin implements Float32List {
   // Factory constructors.
 
   factory _ExternalFloat32Array(int length) {
@@ -1946,10 +1956,6 @@
     _setIndexedFloat32(index, value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -1977,7 +1983,7 @@
 }
 
 
-class _ExternalFloat64Array extends _TypedList implements Float64List {
+class _ExternalFloat64Array extends _TypedList with _DoubleListMixin implements Float64List {
   // Factory constructors.
 
   factory _ExternalFloat64Array(int length) {
@@ -2001,10 +2007,6 @@
     _setIndexedFloat64(index, value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -2032,7 +2034,7 @@
 }
 
 
-class _ExternalFloat32x4Array extends _TypedList implements Float32x4List {
+class _ExternalFloat32x4Array extends _TypedList with _Float32x4ListMixin implements Float32x4List {
   // Factory constructors.
 
   factory _ExternalFloat32x4Array(int length) {
@@ -2056,10 +2058,6 @@
     _setIndexedFloat32x4(index, value);
   }
 
-  Iterator<Float32x4> get iterator {
-    return new _TypedListIterator<Float32x4>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -2087,7 +2085,7 @@
 }
 
 
-class _ExternalInt32x4Array extends _TypedList implements Int32x4List {
+class _ExternalInt32x4Array extends _TypedList with _Int32x4ListMixin implements Int32x4List {
   // Factory constructors.
 
   factory _ExternalInt32x4Array(int length) {
@@ -2111,10 +2109,6 @@
     _setIndexedInt32x4(index, value);
   }
 
-  Iterator<Int32x4> get iterator {
-    return new _TypedListIterator<Int32x4>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -2142,7 +2136,7 @@
 }
 
 
-class _ExternalFloat64x2Array extends _TypedList implements Float64x2List {
+class _ExternalFloat64x2Array extends _TypedList with _Float64x2ListMixin implements Float64x2List {
   // Factory constructors.
 
   factory _ExternalFloat64x2Array(int length) {
@@ -2166,10 +2160,6 @@
     _setIndexedFloat64x2(index, value);
   }
 
-  Iterator<Float64x2> get iterator {
-    return new _TypedListIterator<Float64x2>(this);
-  }
-
 
   // Method(s) implementing the TypedData interface.
 
@@ -2469,7 +2459,7 @@
 }
 
 
-class _Int8ArrayView extends _TypedListView implements Int8List {
+class _Int8ArrayView extends _TypedListView with _IntListMixin implements Int8List {
   // Constructor.
   _Int8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2500,10 +2490,6 @@
                         _toInt8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2520,7 +2506,7 @@
 }
 
 
-class _Uint8ArrayView extends _TypedListView implements Uint8List {
+class _Uint8ArrayView extends _TypedListView with _IntListMixin implements Uint8List {
   // Constructor.
   _Uint8ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2551,10 +2537,6 @@
                          _toUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2571,7 +2553,7 @@
 }
 
 
-class _Uint8ClampedArrayView extends _TypedListView implements Uint8ClampedList {
+class _Uint8ClampedArrayView extends _TypedListView with _IntListMixin implements Uint8ClampedList {
   // Constructor.
   _Uint8ClampedArrayView(ByteBuffer buffer,
                          [int _offsetInBytes = 0, int _length])
@@ -2603,10 +2585,6 @@
                          _toClampedUint8(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2623,7 +2601,7 @@
 }
 
 
-class _Int16ArrayView extends _TypedListView implements Int16List {
+class _Int16ArrayView extends _TypedListView with _IntListMixin implements Int16List {
   // Constructor.
   _Int16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2655,10 +2633,6 @@
                          _toInt16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2675,7 +2649,7 @@
 }
 
 
-class _Uint16ArrayView extends _TypedListView implements Uint16List {
+class _Uint16ArrayView extends _TypedListView with _IntListMixin implements Uint16List {
   // Constructor.
   _Uint16ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2707,10 +2681,6 @@
                           _toUint16(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2727,7 +2697,7 @@
 }
 
 
-class _Int32ArrayView extends _TypedListView implements Int32List {
+class _Int32ArrayView extends _TypedListView with _IntListMixin implements Int32List {
   // Constructor.
   _Int32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2759,10 +2729,6 @@
                          _toInt32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2779,7 +2745,7 @@
 }
 
 
-class _Uint32ArrayView extends _TypedListView implements Uint32List {
+class _Uint32ArrayView extends _TypedListView with _IntListMixin implements Uint32List {
   // Constructor.
   _Uint32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2811,10 +2777,6 @@
                           _toUint32(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2831,7 +2793,7 @@
 }
 
 
-class _Int64ArrayView extends _TypedListView implements Int64List {
+class _Int64ArrayView extends _TypedListView with _IntListMixin implements Int64List {
   // Constructor.
   _Int64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2863,10 +2825,6 @@
                          _toInt64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2883,7 +2841,7 @@
 }
 
 
-class _Uint64ArrayView extends _TypedListView implements Uint64List {
+class _Uint64ArrayView extends _TypedListView with _IntListMixin implements Uint64List {
   // Constructor.
   _Uint64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2915,10 +2873,6 @@
                           _toUint64(value));
   }
 
-  Iterator<int> get iterator {
-    return new _TypedListIterator<int>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2935,7 +2889,7 @@
 }
 
 
-class _Float32ArrayView extends _TypedListView implements Float32List {
+class _Float32ArrayView extends _TypedListView with _DoubleListMixin implements Float32List {
   // Constructor.
   _Float32ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -2967,10 +2921,6 @@
                            (index * Float32List.BYTES_PER_ELEMENT), value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -2987,7 +2937,7 @@
 }
 
 
-class _Float64ArrayView extends _TypedListView implements Float64List {
+class _Float64ArrayView extends _TypedListView with _DoubleListMixin implements Float64List {
   // Constructor.
   _Float64ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -3019,10 +2969,6 @@
                           (index * Float64List.BYTES_PER_ELEMENT), value);
   }
 
-  Iterator<double> get iterator {
-    return new _TypedListIterator<double>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -3039,7 +2985,7 @@
 }
 
 
-class _Float32x4ArrayView extends _TypedListView implements Float32x4List {
+class _Float32x4ArrayView extends _TypedListView with _Float32x4ListMixin implements Float32x4List {
   // Constructor.
   _Float32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -3071,10 +3017,6 @@
                              (index * Float32x4List.BYTES_PER_ELEMENT), value);
   }
 
-  Iterator<Float32x4> get iterator {
-    return new _TypedListIterator<Float32x4>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -3091,7 +3033,7 @@
 }
 
 
-class _Int32x4ArrayView extends _TypedListView implements Int32x4List {
+class _Int32x4ArrayView extends _TypedListView with _Int32x4ListMixin implements Int32x4List {
   // Constructor.
   _Int32x4ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -3123,10 +3065,6 @@
                             (index * Int32x4List.BYTES_PER_ELEMENT), value);
   }
 
-  Iterator<Int32x4> get iterator {
-    return new _TypedListIterator<Int32x4>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -3143,7 +3081,7 @@
 }
 
 
-class _Float64x2ArrayView extends _TypedListView implements Float64x2List {
+class _Float64x2ArrayView extends _TypedListView with _Float64x2ListMixin implements Float64x2List {
   // Constructor.
   _Float64x2ArrayView(ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
     : super(buffer, _offsetInBytes,
@@ -3175,10 +3113,6 @@
                              (index * Float64x2List.BYTES_PER_ELEMENT), value);
   }
 
-  Iterator<Float64x2> get iterator {
-    return new _TypedListIterator<Float64x2>(this);
-  }
-
 
   // Method(s) implementing TypedData interface.
 
@@ -3528,12 +3462,12 @@
 
 
 int _toInt64(int value) {
-  return _toInt(value, 0xFFFFFFFFFFFFFFFF);
+  return _toInt(value, 0xFFFFFFFFFFFFFFFF);  // TODO(regis): Avoid bigint mask.
 }
 
 
 int _toUint64(int value) {
-  return value & 0xFFFFFFFFFFFFFFFF;
+  return value & 0xFFFFFFFFFFFFFFFF;  // TODO(regis): Avoid bigint mask.
 }
 
 
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 2b8ec1a..01ab6c1 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -53,10 +53,6 @@
 cc/ThreadInterrupterLow: Skip
 cc/Service_Profile: Skip
 
-[ $arch == simmips || $arch == mips ]
-cc/Coverage_MainWithClass: Skip # Issue 16250
-cc/Service_ClassesCoverage: Skip # Issue 16250
-
 [ $compiler == dart2js ]
 dart/redirection_type_shuffling_test: Skip # Depends on lazy enforcement of type bounds
 dart/byte_array_test: Skip # compilers not aware of byte arrays
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 09f02aa..1fe7e91 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -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.
 
-#include "vm/globals.h"
+#include "vm/globals.h"  // NOLINT
 #if defined(TARGET_ARCH_ARM)
 
 #include "vm/assembler.h"
@@ -1641,12 +1641,104 @@
 }
 
 
+Operand Assembler::GetVerifiedMemoryShadow() {
+  Operand offset;
+  if (!Operand::CanHold(VerifiedMemory::offset(), &offset)) {
+    FATAL1("Offset 0x%" Px " not representable", VerifiedMemory::offset());
+  }
+  return offset;
+}
+
+
+void Assembler::WriteShadowedField(Register base,
+                                   intptr_t offset,
+                                   Register value,
+                                   Condition cond) {
+  if (VerifiedMemory::enabled()) {
+    ASSERT(base != value);
+    Operand shadow(GetVerifiedMemoryShadow());
+    add(base, base, shadow, cond);
+    str(value, Address(base, offset), cond);
+    sub(base, base, shadow, cond);
+  }
+  str(value, Address(base, offset), cond);
+}
+
+
+void Assembler::WriteShadowedFieldPair(Register base,
+                                       intptr_t offset,
+                                       Register value_even,
+                                       Register value_odd,
+                                       Condition cond) {
+  ASSERT(value_odd == value_even + 1);
+  if (VerifiedMemory::enabled()) {
+    ASSERT(base != value_even);
+    ASSERT(base != value_odd);
+    Operand shadow(GetVerifiedMemoryShadow());
+    add(base, base, shadow, cond);
+    strd(value_even, Address(base, offset), cond);
+    sub(base, base, shadow, cond);
+  }
+  strd(value_even, Address(base, offset), cond);
+}
+
+
+Register UseRegister(Register reg, RegList* used) {
+  ASSERT(reg != SP);
+  ASSERT(reg != PC);
+  ASSERT((*used & (1 << reg)) == 0);
+  *used |= (1 << reg);
+  return reg;
+}
+
+
+Register AllocateRegister(RegList* used) {
+  const RegList free = ~*used;
+  return (free == 0) ?
+      kNoRegister :
+      UseRegister(static_cast<Register>(Utils::CountTrailingZeros(free)), used);
+}
+
+
+void Assembler::VerifiedWrite(const Address& address, Register new_value) {
+  if (VerifiedMemory::enabled()) {
+    ASSERT(address.mode() == Address::Offset ||
+           address.mode() == Address::NegOffset);
+    // Allocate temporary registers (and check for register collisions).
+    RegList used = 0;
+    UseRegister(new_value, &used);
+    Register base = UseRegister(address.rn(), &used);
+    if (address.rm() != kNoRegister) UseRegister(address.rm(), &used);
+    Register old_value = AllocateRegister(&used);
+    Register shadow_value = AllocateRegister(&used);
+    PushList(used);
+    // Verify old value.
+    ldr(old_value, address);
+    Operand shadow_offset(GetVerifiedMemoryShadow());
+    add(base, base, shadow_offset);
+    ldr(shadow_value, address);
+    cmp(old_value, Operand(shadow_value));
+    Label ok;
+    b(&ok);
+    Stop("Write barrier verification failed");
+    Bind(&ok);
+    // Write new value.
+    str(new_value, address);
+    sub(base, base, shadow_offset);
+    str(new_value, address);
+    PopList(used);
+  } else {
+    str(new_value, address);
+  }
+}
+
+
 void Assembler::StoreIntoObject(Register object,
                                 const Address& dest,
                                 Register value,
                                 bool can_value_be_smi) {
   ASSERT(object != value);
-  str(value, dest);
+  VerifiedWrite(dest, value);
   Label done;
   if (can_value_be_smi) {
     StoreIntoObjectFilter(object, value, &done);
@@ -1687,7 +1779,7 @@
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
-  str(value, dest);
+  VerifiedWrite(dest, value);
 #if defined(DEBUG)
   Label done;
   StoreIntoObjectFilter(object, value, &done);
@@ -1718,7 +1810,7 @@
          (value.IsOld() && value.IsNotTemporaryScopedHandle()));
   // No store buffer update.
   LoadObject(IP, value);
-  str(IP, dest);
+  VerifiedWrite(dest, IP);
 }
 
 
@@ -1745,9 +1837,9 @@
   Bind(&init_loop);
   AddImmediate(begin, 2 * kWordSize);
   cmp(begin, Operand(end));
-  strd(value_even, Address(begin, -2 * kWordSize), LS);
+  WriteShadowedFieldPair(begin, -2 * kWordSize, value_even, value_odd, LS);
   b(&init_loop, CC);
-  str(value_even, Address(begin, -2 * kWordSize), HI);
+  WriteShadowedField(begin, -2 * kWordSize, value_even, HI);
 #if defined(DEBUG)
   Label done;
   StoreIntoObjectFilter(object, value_even, &done);
@@ -1760,19 +1852,19 @@
 
 
 void Assembler::InitializeFieldsNoBarrierUnrolled(Register object,
-                                                  Register begin,
-                                                  intptr_t count,
+                                                  Register base,
+                                                  intptr_t begin_offset,
+                                                  intptr_t end_offset,
                                                   Register value_even,
                                                   Register value_odd) {
   ASSERT(value_odd == value_even + 1);
-  intptr_t current_offset = 0;
-  const intptr_t end_offset = count * kWordSize;
+  intptr_t current_offset = begin_offset;
   while (current_offset + kWordSize < end_offset) {
-    strd(value_even, Address(begin, current_offset));
+    WriteShadowedFieldPair(base, current_offset, value_even, value_odd);
     current_offset += 2*kWordSize;
   }
   while (current_offset < end_offset) {
-    str(value_even, Address(begin, current_offset));
+    WriteShadowedField(base, current_offset, value_even);
     current_offset += kWordSize;
   }
 #if defined(DEBUG)
@@ -1786,6 +1878,19 @@
 }
 
 
+void Assembler::StoreIntoSmiField(const Address& dest, Register value) {
+  // TODO(koda): Verify previous value was Smi.
+  VerifiedWrite(dest, value);
+#if defined(DEBUG)
+  Label done;
+  tst(value, Operand(kHeapObjectTag));
+  b(&done, EQ);
+  Stop("Smi expected");
+  Bind(&done);
+#endif  // defined(DEBUG)
+}
+
+
 void Assembler::LoadClassId(Register result, Register object, Condition cond) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
@@ -2164,8 +2269,10 @@
     case kImmutableArrayCid:
       return kWord;
     case kOneByteStringCid:
+    case kExternalOneByteStringCid:
       return kByte;
     case kTwoByteStringCid:
+    case kExternalTwoByteStringCid:
       return kHalfword;
     case kTypedDataInt8ArrayCid:
       return kByte;
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index d557640..4b479a9 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -197,6 +197,7 @@
 
   // Memory operand addressing mode
   enum Mode {
+    kModeMask    = (8|4|1) << 21,
     // bit encoding P U W
     Offset       = (8|4|0) << 21,  // offset (w/o writeback to base)
     PreIndex     = (8|4|1) << 21,  // pre-indexed addressing with writeback
@@ -263,6 +264,18 @@
                                      int64_t offset);
 
  private:
+  Register rn() const {
+    return Instr::At(reinterpret_cast<uword>(&encoding_))->RnField();
+  }
+
+  Register rm() const {
+    return ((kind() == IndexRegister) || (kind() == ScaledIndexRegister)) ?
+        Instr::At(reinterpret_cast<uword>(&encoding_))->RmField() :
+        kNoRegister;
+  }
+
+  Mode mode() const { return static_cast<Mode>(encoding() & kModeMask); }
+
   uint32_t encoding() const { return encoding_; }
 
   // Encoding for addressing mode 3.
@@ -333,10 +346,13 @@
     return FLAG_use_far_branches || use_far_branches_;
   }
 
+#if defined(TESTING) || defined(DEBUG)
+  // Used in unit tests and to ensure predictable verification code size in
+  // FlowGraphCompiler::EmitEdgeCounter.
   void set_use_far_branches(bool b) {
-    ASSERT(buffer_.Size() == 0);
     use_far_branches_ = b;
   }
+#endif  // TESTING || DEBUG
 
   void FinalizeInstructions(const MemoryRegion& region) {
     buffer_.FinalizeInstructions(region);
@@ -678,13 +694,17 @@
                                  Register end,
                                  Register value_even,
                                  Register value_odd);
-  // Like above, for the range [begin, begin+count*kWordSize), unrolled.
+  // Like above, for the range [base+begin_offset, base+end_offset), unrolled.
   void InitializeFieldsNoBarrierUnrolled(Register object,
-                                         Register begin,
-                                         intptr_t count,
+                                         Register base,
+                                         intptr_t begin_offset,
+                                         intptr_t end_offset,
                                          Register value_even,
                                          Register value_odd);
 
+  // Stores a Smi value into a heap object field that always contains a Smi.
+  void StoreIntoSmiField(const Address& dest, Register value);
+
   void LoadClassId(Register result, Register object, Condition cond = AL);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object, Register scratch);
@@ -697,6 +717,13 @@
                       Register base,
                       int32_t offset,
                       Condition cond = AL);
+  void LoadFieldFromOffset(OperandSize type,
+                           Register reg,
+                           Register base,
+                           int32_t offset,
+                           Condition cond = AL) {
+    LoadFromOffset(type, reg, base, offset - kHeapObjectTag, cond);
+  }
   void StoreToOffset(OperandSize type,
                      Register reg,
                      Register base,
@@ -1041,6 +1068,24 @@
                                   Register value,
                                   Label* no_update);
 
+  // Helpers for write-barrier verification.
+
+  // Returns VerifiedMemory::offset() as an Operand.
+  Operand GetVerifiedMemoryShadow();
+  // Writes value to [base + offset] and also its shadow location, if enabled.
+  void WriteShadowedField(Register base,
+                          intptr_t offset,
+                          Register value,
+                          Condition cond = AL);
+  void WriteShadowedFieldPair(Register base,
+                              intptr_t offset,
+                              Register value_even,
+                              Register value_odd,
+                              Condition cond = AL);
+  // Writes new_value to address and its shadow location, if enabled, after
+  // verifying that its old value matches its shadow.
+  void VerifiedWrite(const Address& address, Register new_value);
+
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
 };
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 34eb8d8..e163e1d 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -234,7 +234,7 @@
   Emit(Utils::Low32Bits(reinterpret_cast<int64_t>(message)));
   Emit(Utils::High32Bits(reinterpret_cast<int64_t>(message)));
   Bind(&stop);
-  hlt(kImmExceptionIsDebug);
+  hlt(Instr::kStopMessageCode);
 }
 
 
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index d2623b2..f080961 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -243,8 +243,10 @@
       case kImmutableArrayCid:
         return kWord;
       case kOneByteStringCid:
+      case kExternalOneByteStringCid:
         return kByte;
       case kTwoByteStringCid:
+      case kExternalTwoByteStringCid:
         return kHalfword;
       case kTypedDataInt8ArrayCid:
         return kByte;
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 8468c21..811023d 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -1227,7 +1227,7 @@
     b(&msg);
     Emit(reinterpret_cast<int32_t>(message));
     Bind(&msg);
-    break_(Instr::kMsgMessageCode);
+    break_(Instr::kSimulatorMessageCode);
   }
 #endif
 }
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 1a73e44..6e12f0b 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1163,6 +1163,10 @@
     }
   }
 
+  void LoadFieldFromOffset(Register reg, Register base, int32_t offset) {
+    LoadFromOffset(reg, base, offset - kHeapObjectTag);
+  }
+
   void StoreToOffset(Register reg, Register base, int32_t offset) {
     ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, offset)) {
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 43544b5..d463af6 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -3209,7 +3209,8 @@
   }
 
   // Store general purpose registers with the highest register number at the
-  // lowest address.
+  // lowest address. The order in which the registers are pushed must match the
+  // order in which the registers are encoded in the safe point's stack map.
   for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (RegisterSet::Contains(cpu_register_set, reg)) {
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 1e2dd98..3f902d7 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -65,7 +65,7 @@
 
 
 void BlockScheduler::AssignEdgeWeights() const {
-  const Code& unoptimized_code = flow_graph()->parsed_function().code();
+  const Code& unoptimized_code = flow_graph()->parsed_function()->code();
   ASSERT(!unoptimized_code.IsNull());
 
   intptr_t entry_count =
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 7dd31ea..b606d39 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -41,6 +41,8 @@
   V(Integer_leftShiftWithMask32, 3)                                            \
   V(Bool_fromEnvironment, 3)                                                   \
   V(CapabilityImpl_factory, 1)                                                 \
+  V(CapabilityImpl_equals, 2)                                                  \
+  V(CapabilityImpl_get_hashcode, 1)                                            \
   V(RawReceivePortImpl_factory, 1)                                             \
   V(RawReceivePortImpl_get_id, 1)                                              \
   V(RawReceivePortImpl_get_sendport, 1)                                        \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 05e306e..41343ef 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -3101,6 +3101,7 @@
     error = cls.EnsureIsFinalized(isolate);
     ASSERT(error.IsNull());
     cls = cls.SuperClass();  // Get it's super class '_TypedListView'.
+    cls = cls.SuperClass();
     fields_array ^= cls.fields();
     ASSERT(fields_array.Length() == TypedDataView::NumberOfFields());
     field ^= fields_array.At(0);
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index c2e6f75..849c7a1 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -54,6 +54,7 @@
 DEFINE_FLAG(bool, trace_type_checks, false, "Trace runtime type checks.");
 
 DECLARE_FLAG(int, deoptimization_counter_threshold);
+DECLARE_FLAG(bool, enable_asserts);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
@@ -559,12 +560,29 @@
 
 
 // Report that the type of the given object is not bool in conditional context.
+// Throw assertion error if the object is null. (cf. Boolean Conversion
+// in language Spec.)
 // Arg0: bad object.
-// Return value: none, throws a TypeError.
+// Return value: none, throws TypeError or AssertionError.
 DEFINE_RUNTIME_ENTRY(NonBoolTypeError, 1) {
   const intptr_t location = GetCallerLocation();
   const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0));
-  ASSERT(src_instance.IsNull() || !src_instance.IsBool());
+
+  if (src_instance.IsNull()) {
+    const Array& args = Array::Handle(Array::New(4));
+    args.SetAt(0, String::Handle(
+        String::New("Failed assertion: boolean expression must not be null")));
+
+    // No source code for this assertion, set url to null.
+    args.SetAt(1, String::Handle(String::null()));
+    args.SetAt(2, Smi::Handle(Smi::New(0)));
+    args.SetAt(3, Smi::Handle(Smi::New(0)));
+
+    Exceptions::ThrowByType(Exceptions::kAssertion, args);
+    UNREACHABLE();
+  }
+
+  ASSERT(!src_instance.IsBool());
   const Type& bool_interface = Type::Handle(Type::BoolType());
   const AbstractType& src_type = AbstractType::Handle(src_instance.GetType());
   const String& src_type_name = String::Handle(src_type.UserVisibleName());
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 43072b2..92de85e 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -7,6 +7,7 @@
 
 #include "vm/code_patcher.h"
 
+#include "vm/flow_graph_compiler.h"
 #include "vm/instructions.h"
 #include "vm/object.h"
 
@@ -103,7 +104,8 @@
 class EdgeCounter : public ValueObject {
  public:
   EdgeCounter(uword pc, const Code& code)
-      : end_(pc - kAdjust), object_pool_(Array::Handle(code.ObjectPool())) {
+      : end_(pc - FlowGraphCompiler::EdgeCounterIncrementSizeInBytes()),
+        object_pool_(Array::Handle(code.ObjectPool())) {
     // An IsValid predicate is complicated and duplicates the code in the
     // decoding function.  Instead we rely on decoding the pattern which
     // will assert partial validity.
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index d746b53..f039ecf 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -138,7 +138,7 @@
                              NULL,  // NULL = not inlining.
                              osr_id);
 
-    return new(isolate_) FlowGraph(builder,
+    return new(isolate_) FlowGraph(parsed_function,
                                    result.graph_entry,
                                    result.num_blocks);
   }
@@ -425,8 +425,11 @@
                                               osr_id);
       }
 
-      if (FLAG_print_flow_graph ||
-          (optimized && FLAG_print_flow_graph_optimized)) {
+      const bool print_flow_graph =
+          FLAG_print_flow_graph ||
+          (optimized && FLAG_print_flow_graph_optimized);
+
+      if (print_flow_graph) {
         if (osr_id == Isolate::kNoDeoptId) {
           FlowGraphPrinter::PrintGraph("Before Optimizations", flow_graph);
         } else {
@@ -448,7 +451,7 @@
         // Transform to SSA (virtual register 0 and no inlining arguments).
         flow_graph->ComputeSSA(0, NULL);
         DEBUG_ASSERT(flow_graph->VerifyUseLists());
-        if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
+        if (print_flow_graph) {
           FlowGraphPrinter::PrintGraph("After SSA", flow_graph);
         }
       }
@@ -667,7 +670,7 @@
         allocator.AllocateRegisters();
         if (reorder_blocks) block_scheduler.ReorderBlocks();
 
-        if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
+        if (print_flow_graph) {
           FlowGraphPrinter::PrintGraph("After Optimizations", flow_graph);
         }
       }
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 53c0a16..81e31cf 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -340,15 +340,11 @@
 
 
 // Special Supervisor Call 24-bit codes used in the presence of the ARM
-// simulator for redirection, breakpoints, stop messages, and spill markers.
+// simulator for redirection, breakpoints, and stop messages.
 // See /usr/include/asm/unistd.h
 const uint32_t kRedirectionSvcCode = 0x90001f;  //  unused syscall, was sys_stty
 const uint32_t kBreakpointSvcCode = 0x900020;  // unused syscall, was sys_gtty
 const uint32_t kStopMessageSvcCode = 0x9f0001;  // __ARM_NR_breakpoint
-const uint32_t kSpillMarkerSvcBase = 0x9f0100;  // unused ARM private syscall
-const uint32_t kWordSpillMarkerSvcCode = kSpillMarkerSvcBase + 1;
-const uint32_t kDWordSpillMarkerSvcCode = kSpillMarkerSvcBase + 2;
-
 
 // Constants used for the decoding or encoding of the individual fields of
 // instructions. Based on the "Figure 3-1 ARM instruction set summary".
@@ -450,12 +446,21 @@
 
   static const int32_t kNopInstruction =  // nop
       ((AL << kConditionShift) | (0x32 << 20) | (0xf << 12));
-  static const int32_t kBreakPointInstruction =  // svc #kBreakpointSvcCode
+
+  // Breakpoint instruction filling assembler code buffers in debug mode.
+  static const int32_t kBreakPointInstruction =  // bkpt(0xdeb0)
+      ((AL << kConditionShift) | (0x12 << 20) | (0xdeb << 8) | (0x7 << 4));
+
+  // Breakpoint instruction used by the simulator.
+  // Should be distinct from kBreakPointInstruction and from a typical user
+  // breakpoint inserted in generated code for debugging, e.g. bkpt(0).
+  static const int32_t kSimulatorBreakpointInstruction =
+      // svc #kBreakpointSvcCode
       ((AL << kConditionShift) | (0xf << 24) | kBreakpointSvcCode);
-  static const int kBreakPointInstructionSize = kInstrSize;
-  bool IsBreakPoint() {
-    return IsBkpt();
-  }
+
+  // Runtime call redirection instruction used by the simulator.
+  static const int32_t kSimulatorRedirectInstruction =
+      ((AL << kConditionShift) | (0xf << 24) | kRedirectionSvcCode);
 
   // Get the raw instruction bits.
   inline int32_t InstructionBits() const {
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index fd13edf..200a1b0 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -753,11 +753,6 @@
 };
 
 
-const uint32_t kImmExceptionIsRedirectedCall = 0xca11;
-const uint32_t kImmExceptionIsUnreachable = 0xdebf;
-const uint32_t kImmExceptionIsDebug = 0xdeb0;
-const uint32_t kImmExceptionIsPrintf = 0xdeb1;
-
 // Helper functions for decoding logical immediates.
 static inline uint64_t RotateRight(
     uint64_t value, uint8_t rotate, uint8_t width) {
@@ -799,11 +794,27 @@
   };
 
   static const int32_t kNopInstruction = HINT;  // hint #0 === nop.
-  static const int32_t kBreakPointInstruction =  // hlt #kImmExceptionIsDebug.
-      HLT | (kImmExceptionIsDebug << kImm16Shift);
-  static const int kBreakPointInstructionSize = kInstrSize;
+
+  // Reserved brk and hlt instruction codes.
+  static const int32_t kBreakPointCode = 0xdeb0;  // For breakpoint.
+  static const int32_t kStopMessageCode = 0xdeb1;  // For Stop(message).
+  static const int32_t kSimulatorMessageCode = 0xdeb2;  // For trace msg in sim.
+  static const int32_t kSimulatorBreakCode = 0xdeb3;  // For breakpoint in sim.
+  static const int32_t kSimulatorRedirectCode = 0xca11;  // For redirection.
+
+  // Breakpoint instruction filling assembler code buffers in debug mode.
+  static const int32_t kBreakPointInstruction =  // brk(0xdeb0).
+      BRK | (kBreakPointCode << kImm16Shift);
+
+  // Breakpoint instruction used by the simulator.
+  // Should be distinct from kBreakPointInstruction and from a typical user
+  // breakpoint inserted in generated code for debugging, e.g. brk(0).
+  static const int32_t kSimulatorBreakpointInstruction =
+      HLT | (kSimulatorBreakCode << kImm16Shift);
+
+  // Runtime call redirection instruction used by the simulator.
   static const int32_t kRedirectInstruction =
-      HLT | (kImmExceptionIsRedirectedCall << kImm16Shift);
+      HLT | (kSimulatorRedirectCode << kImm16Shift);
 
   // Read one particular bit out of the instruction bits.
   inline int Bit(int nr) const {
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index e850b2c..f568c81 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -459,16 +459,29 @@
   static const int32_t kNopInstruction = 0;
 
   // Reserved break instruction codes.
-  static const int32_t kStopMessageCode = 1 << 16;  // For Stop(message).
-  static const int32_t kRedirectCode = 2 << 16;  // For call redirection in sim.
-  static const int32_t kMsgMessageCode = 3 << 16;  // For trace message in sim.
-  static const int32_t kSimulatorBreakCode = 4 << 16;  // For breakpoint in sim.
+  static const int32_t kBreakPointCode = 0xdeb0;  // For breakpoint.
+  static const int32_t kStopMessageCode = 0xdeb1;  // For Stop(message).
+  static const int32_t kSimulatorMessageCode = 0xdeb2;  // For trace msg in sim.
+  static const int32_t kSimulatorBreakCode = 0xdeb3;  // For breakpoint in sim.
+  static const int32_t kSimulatorRedirectCode = 0xca11;  // For redirection.
 
-  // General breakpoint instruction: break(0), for user breakpoint and to fill
-  // assembler code buffers in debug mode.
-  static const int32_t kBreakPointInstruction =
+  static const int32_t kBreakPointZeroInstruction =
       (SPECIAL << kOpcodeShift) | (BREAK << kFunctionShift);
 
+  // Breakpoint instruction filling assembler code buffers in debug mode.
+  static const int32_t kBreakPointInstruction =
+      kBreakPointZeroInstruction | (kBreakPointCode << kBreakCodeShift);
+
+  // Breakpoint instruction used by the simulator.
+  // Should be distinct from kBreakPointInstruction and from a typical user
+  // breakpoint inserted in generated code for debugging, e.g. break_(0).
+  static const int32_t kSimulatorBreakpointInstruction =
+      kBreakPointZeroInstruction | (kSimulatorBreakCode << kBreakCodeShift);
+
+  // Runtime call redirection instruction used by the simulator.
+  static const int32_t kSimulatorRedirectInstruction =
+      kBreakPointZeroInstruction | (kSimulatorRedirectCode << kBreakCodeShift);
+
   // Get the raw instruction bits.
   inline int32_t InstructionBits() const {
     return *reinterpret_cast<const int32_t*>(this);
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index c736248..7e7c94a 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -2256,9 +2256,6 @@
   Dart_Handle list_type = Dart_InstanceGetType(list_access_test_obj);
   Dart_Handle super_type = Dart_GetSupertype(list_type);
   EXPECT(!Dart_IsError(super_type));
-  super_type = Dart_GetSupertype(super_type);
-  EXPECT(!Dart_IsError(super_type));
-  EXPECT(super_type == Dart_Null());
 }
 
 TEST_CASE(Debug_ScriptGetTokenInfo_Basic) {
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index dcfc848..d882a14 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -832,6 +832,8 @@
   } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
              (instr->Bits(21, 3) == 2)) {
     Format(instr, "hlt 'imm16");
+  } else {
+    Unknown(instr);
   }
 }
 
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index a270344..cef0667 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -208,9 +208,16 @@
     }
     case Flag::kInteger: {
       char* endptr = NULL;
-      int val = strtol(argument, &endptr, 10);
-      if (endptr != argument) {
+      const intptr_t len = strlen(argument);
+      int base = 10;
+      if ((len > 2) && (argument[0] == '0') && (argument[1] == 'x')) {
+        base = 16;
+      }
+      int val = strtol(argument, &endptr, base);
+      if (endptr == argument + len) {
         *flag->int_ptr_ = val;
+      } else {
+        return false;
       }
       break;
     }
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 085d914..20c1fa5 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -19,17 +19,16 @@
 DECLARE_FLAG(bool, verify_compiler);
 
 
-FlowGraph::FlowGraph(const FlowGraphBuilder& builder,
+FlowGraph::FlowGraph(ParsedFunction* parsed_function,
                      GraphEntryInstr* graph_entry,
                      intptr_t max_block_id)
   : isolate_(Isolate::Current()),
     parent_(),
     current_ssa_temp_index_(0),
     max_block_id_(max_block_id),
-    builder_(builder),
-    parsed_function_(*builder.parsed_function()),
-    num_copied_params_(builder.num_copied_params()),
-    num_non_copied_params_(builder.num_non_copied_params()),
+    parsed_function_(parsed_function),
+    num_copied_params_(parsed_function->num_copied_params()),
+    num_non_copied_params_(parsed_function->num_non_copied_params()),
     graph_entry_(graph_entry),
     preorder_(),
     postorder_(),
@@ -42,8 +41,8 @@
     licm_allowed_(true),
     loop_headers_(NULL),
     loop_invariant_loads_(NULL),
-    guarded_fields_(builder.guarded_fields()),
-    deferred_prefixes_(builder.deferred_prefixes()),
+    guarded_fields_(parsed_function->guarded_fields()),
+    deferred_prefixes_(parsed_function->deferred_prefixes()),
     captured_parameters_(
         new(isolate_) BitVector(isolate_, variable_count())) {
   DiscoverBlocks();
@@ -89,7 +88,7 @@
 
 GrowableArray<BlockEntryInstr*>* FlowGraph::CodegenBlockOrder(
     bool is_optimized) {
-  return ShouldReorderBlocks(parsed_function().function(), is_optimized)
+  return ShouldReorderBlocks(parsed_function()->function(), is_optimized)
       ? &optimized_block_order_
       : &reverse_postorder_;
 }
@@ -223,6 +222,49 @@
 }
 
 
+void FlowGraph::MergeBlocks() {
+  bool changed = false;
+  BitVector* merged = new(isolate()) BitVector(isolate(), postorder().length());
+  for (BlockIterator block_it = reverse_postorder_iterator();
+       !block_it.Done();
+       block_it.Advance()) {
+    BlockEntryInstr* block = block_it.Current();
+    if (block->IsGraphEntry()) continue;
+    if (merged->Contains(block->postorder_number())) continue;
+
+    Instruction* last = block->last_instruction();
+    BlockEntryInstr* successor = NULL;
+    while ((last->SuccessorCount() == 1) &&
+           (last->SuccessorAt(0)->PredecessorCount() == 1) &&
+           (block->try_index() == last->SuccessorAt(0)->try_index())) {
+      successor = last->SuccessorAt(0);
+      ASSERT(last->IsGoto());
+
+      // Remove environment uses and unlink goto and block entry.
+      successor->UnuseAllInputs();
+      last->previous()->LinkTo(successor->next());
+      last->UnuseAllInputs();
+
+      last = successor->last_instruction();
+      merged->Add(successor->postorder_number());
+      changed = true;
+      if (FLAG_trace_optimization) {
+        OS::Print("Merged blocks B%" Pd " and B%" Pd "\n",
+                  block->block_id(),
+                  successor->block_id());
+      }
+    }
+    // The new block inherits the block id of the last successor to maintain
+    // the order of phi inputs at its successors consistent with block ids.
+    if (successor != NULL) {
+      block->set_block_id(successor->block_id());
+    }
+  }
+  // Recompute block order after changes were made.
+  if (changed) DiscoverBlocks();
+}
+
+
 // Debugging code to verify the construction of use lists.
 static intptr_t MembershipCount(Value* use, Value* list) {
   intptr_t count = 0;
@@ -812,7 +854,7 @@
   if (!IsCompiledForOsr()) {
     for (intptr_t i = parameter_count(); i < variable_count(); ++i) {
       if (i == CurrentContextEnvIndex()) {
-        if (parsed_function().function().IsClosureFunction()) {
+        if (parsed_function()->function().IsClosureFunction()) {
           CurrentContextInstr* context = new CurrentContextInstr();
           context->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
           AddToInitialDefinitions(context);
@@ -842,7 +884,7 @@
       Environment::From(isolate(),
                         *env,
                         num_non_copied_params_,
-                        &parsed_function_);
+                        parsed_function_);
   if (instr->IsClosureCall()) {
     deopt_env = deopt_env->DeepCopy(isolate(),
                                     deopt_env->Length() - instr->InputCount());
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index b6929cc..eb48373 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -83,26 +83,22 @@
 // Class to encapsulate the construction and manipulation of the flow graph.
 class FlowGraph : public ZoneAllocated {
  public:
-  FlowGraph(const FlowGraphBuilder& builder,
+  FlowGraph(ParsedFunction* parsed_function,
             GraphEntryInstr* graph_entry,
             intptr_t max_block_id);
 
-  const FlowGraphBuilder& builder() const {
-    return builder_;
-  }
-
   // Function properties.
-  ParsedFunction& parsed_function() const {
+  ParsedFunction* parsed_function() const {
     return parsed_function_;
   }
   intptr_t parameter_count() const {
     return num_copied_params_ + num_non_copied_params_;
   }
   intptr_t variable_count() const {
-    return parameter_count() + num_stack_locals();
+    return parameter_count() + parsed_function_->num_stack_locals();
   }
   intptr_t num_stack_locals() const {
-    return parsed_function().num_stack_locals();
+    return parsed_function_->num_stack_locals();
   }
   intptr_t num_copied_params() const {
     return num_copied_params_;
@@ -111,15 +107,15 @@
     return num_non_copied_params_;
   }
   bool IsIrregexpFunction() const {
-    return parsed_function().function().IsIrregexpFunction();
+    return parsed_function()->function().IsIrregexpFunction();
   }
 
   LocalVariable* CurrentContextVar() const {
-    return parsed_function().current_context_var();
+    return parsed_function()->current_context_var();
   }
 
   intptr_t CurrentContextEnvIndex() const {
-    return parsed_function().current_context_var()->BitIndexIn(
+    return parsed_function()->current_context_var()->BitIndexIn(
         num_non_copied_params_);
   }
 
@@ -214,6 +210,8 @@
 
   void DiscoverBlocks();
 
+  void MergeBlocks();
+
   // Compute information about effects occuring in different blocks and
   // discover side-effect free paths.
   void ComputeBlockEffects();
@@ -338,8 +336,7 @@
   intptr_t max_block_id_;
 
   // Flow graph fields.
-  const FlowGraphBuilder& builder_;
-  ParsedFunction& parsed_function_;
+  ParsedFunction* parsed_function_;
   const intptr_t num_copied_params_;
   const intptr_t num_non_copied_params_;
   GraphEntryInstr* graph_entry_;
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 8a4bc56..d52bc59 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -2921,7 +2921,7 @@
   }
 
   if (FLAG_print_ssa_liveranges) {
-    const Function& function = flow_graph_.parsed_function().function();
+    const Function& function = flow_graph_.parsed_function()->function();
 
     OS::Print("-- [before ssa allocator] ranges [%s] ---------\n",
               function.ToFullyQualifiedCString());
@@ -2962,7 +2962,7 @@
   entry->set_spill_slot_count(cpu_spill_slot_count_ + double_spill_slot_count);
 
   if (FLAG_print_ssa_liveranges) {
-    const Function& function = flow_graph_.parsed_function().function();
+    const Function& function = flow_graph_.parsed_function()->function();
 
     OS::Print("-- [after ssa allocator] ranges [%s] ---------\n",
               function.ToFullyQualifiedCString());
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 6d99ae4..7e32c7b 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -38,6 +38,7 @@
 DEFINE_FLAG(bool, trace_type_check_elimination, false,
             "Trace type check elimination at compile time.");
 
+DECLARE_FLAG(bool, enable_asserts);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
@@ -249,7 +250,6 @@
             : 0),
         num_stack_locals_(parsed_function->num_stack_locals()),
         exit_collector_(exit_collector),
-        guarded_fields_(new(I) ZoneGrowableArray<const Field*>()),
         last_used_block_id_(0),  // 0 is used for the graph entry.
         try_index_(CatchClauseNode::kInvalidTryIndex),
         catch_try_index_(CatchClauseNode::kInvalidTryIndex),
@@ -340,7 +340,8 @@
 
 
 Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
-                                             Instruction** last_instruction) {
+                                             Instruction** last_instruction,
+                                             intptr_t try_index) {
   // First sort the list of exits by block id (caching return instruction
   // block entries as a side effect).
   SortExits();
@@ -356,7 +357,7 @@
     intptr_t join_id = caller_graph_->max_block_id() + 1;
     caller_graph_->set_max_block_id(join_id);
     JoinEntryInstr* join =
-        new(I) JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex);
+        new(I) JoinEntryInstr(join_id, try_index);
     join->InheritDeoptTargetAfter(isolate(), call_);
 
     // The dominator set of the join is the intersection of the dominator
@@ -486,7 +487,8 @@
 
   } else {
     Definition* callee_result = JoinReturns(&callee_exit,
-                                            &callee_last_instruction);
+                                            &callee_last_instruction,
+                                            call_block->try_index());
     if (callee_result != NULL) {
       call_->ReplaceUsesWith(callee_result);
     }
@@ -768,10 +770,10 @@
     Value* tmp_val = Bind(new(I) LoadLocalInstr(*tmp_var));
     StoreInstanceFieldInstr* store =
         new(I) StoreInstanceFieldInstr(Context::variable_offset(local.index()),
-                                    context,
-                                    tmp_val,
-                                    kEmitStoreBarrier,
-                                    Scanner::kNoSourcePos);
+                                       context,
+                                       tmp_val,
+                                       kEmitStoreBarrier,
+                                       Scanner::kNoSourcePos);
     Do(store);
     return ExitTempLocalScope(tmp_var);
   } else {
@@ -883,7 +885,7 @@
 
 
 void TestGraphVisitor::ReturnValue(Value* value) {
-  if (FLAG_enable_type_checks) {
+  if (FLAG_enable_type_checks || FLAG_enable_asserts) {
     value = Bind(new(I) AssertBooleanInstr(condition_token_pos(), value));
   }
   Value* constant_true = Bind(new(I) ConstantInstr(Bool::True()));
@@ -1238,7 +1240,7 @@
     TestGraphVisitor for_left(owner(), node->left()->token_pos());
     node->left()->Visit(&for_left);
     EffectGraphVisitor empty(owner());
-    if (FLAG_enable_type_checks) {
+    if (FLAG_enable_type_checks || FLAG_enable_asserts) {
       ValueGraphVisitor for_right(owner());
       node->right()->Visit(&for_right);
       Value* right_value = for_right.value();
@@ -1303,7 +1305,7 @@
     ValueGraphVisitor for_right(owner());
     node->right()->Visit(&for_right);
     Value* right_value = for_right.value();
-    if (FLAG_enable_type_checks) {
+    if (FLAG_enable_type_checks|| FLAG_enable_asserts) {
       right_value =
           for_right.Bind(new(I) AssertBooleanInstr(node->right()->token_pos(),
                                                    right_value));
@@ -1762,7 +1764,7 @@
         2,
         owner()->ic_data_array());
     if (node->kind() == Token::kNE) {
-      if (FLAG_enable_type_checks) {
+      if (FLAG_enable_type_checks || FLAG_enable_asserts) {
         Value* value = Bind(result);
         result = new(I) AssertBooleanInstr(node->token_pos(), value);
       }
@@ -1808,7 +1810,7 @@
     node->operand()->Visit(&for_value);
     Append(for_value);
     Value* value = for_value.value();
-    if (FLAG_enable_type_checks) {
+    if (FLAG_enable_type_checks || FLAG_enable_asserts) {
       value =
           Bind(new(I) AssertBooleanInstr(node->operand()->token_pos(), value));
     }
@@ -2314,7 +2316,7 @@
   intptr_t num_temps = node->num_temps();
   if (num_temps > 0) {
     owner()->DeallocateTemps(num_temps);
-    Do(new(I) DropTempsInstr(num_temps));
+    Do(new(I) DropTempsInstr(num_temps, NULL));
   }
 }
 
@@ -3474,8 +3476,8 @@
   store_value = Bind(BuildLoadExprTemp());
   GuardFieldLengthInstr* guard_field_length =
       new(I) GuardFieldLengthInstr(store_value,
-                                node->field(),
-                                I->GetNextDeoptId());
+                                   node->field(),
+                                   I->GetNextDeoptId());
   AddInstruction(guard_field_length);
 
   store_value = Bind(BuildLoadExprTemp());
@@ -4281,7 +4283,8 @@
     PruneUnreachable();
   }
 
-  FlowGraph* graph = new(I) FlowGraph(*this, graph_entry_, last_used_block_id_);
+  FlowGraph* graph =
+      new(I) FlowGraph(parsed_function(), graph_entry_, last_used_block_id_);
   return graph;
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index d74a42c..fca8342 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -127,7 +127,8 @@
   void SortExits();
 
   Definition* JoinReturns(BlockEntryInstr** exit_block,
-                          Instruction** last_instruction);
+                          Instruction** last_instruction,
+                          intptr_t try_index);
 
   Isolate* isolate() const { return caller_graph_->isolate(); }
 
@@ -201,7 +202,7 @@
   InlineExitCollector* exit_collector() const { return exit_collector_; }
 
   ZoneGrowableArray<const Field*>* guarded_fields() const {
-    return guarded_fields_;
+    return parsed_function_->guarded_fields();
   }
 
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes() const {
@@ -247,7 +248,6 @@
   const intptr_t num_non_copied_params_;
   const intptr_t num_stack_locals_;  // Does not include any parameters.
   InlineExitCollector* const exit_collector_;
-  ZoneGrowableArray<const Field*>* guarded_fields_;
 
   intptr_t last_used_block_id_;
   intptr_t try_index_;
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 1a7854f..3c2d60b 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -85,7 +85,7 @@
                                      bool is_optimizing)
     : isolate_(Isolate::Current()),
       assembler_(assembler),
-      parsed_function_(flow_graph->parsed_function()),
+      parsed_function_(*flow_graph->parsed_function()),
       flow_graph_(*flow_graph),
       block_order_(*flow_graph->CodegenBlockOrder(is_optimizing)),
       current_block_(NULL),
@@ -126,7 +126,7 @@
       (*deopt_id_to_ic_data_)[i] = NULL;
     }
     const Array& old_saved_icdata = Array::Handle(isolate(),
-        flow_graph->parsed_function().function().ic_data_array());
+        flow_graph->parsed_function()->function().ic_data_array());
     const intptr_t saved_len =
         old_saved_icdata.IsNull() ? 0 : old_saved_icdata.Length();
     for (intptr_t i = 0; i < saved_len; i++) {
@@ -400,7 +400,7 @@
 
 void FlowGraphCompiler::EmitTrySync(Instruction* instr, intptr_t try_index) {
   ASSERT(is_optimizing());
-  Environment* env = instr->env();
+  Environment* env = instr->env()->Outermost();
   CatchBlockEntryInstr* catch_block =
       flow_graph().graph_entry()->GetCatchEntry(try_index);
   const GrowableArray<Definition*>* idefs = catch_block->initial_definitions();
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 58f312b..ae3791f 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -384,9 +384,9 @@
 
   void EmitEdgeCounter();
 
-#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
+#if !defined(TARGET_ARCH_ARM64) && !defined(TARGET_ARCH_MIPS)
   static int32_t EdgeCounterIncrementSizeInBytes();
-#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_X64
+#endif  // !TARGET_ARCH_ARM64 && !TARGET_ARCH_MIPS
 
   void EmitOptimizedInstanceCall(ExternalLabel* target_label,
                                  const ICData& ic_data,
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 2bb3011..d6aa12c 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -19,6 +19,7 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/verified_memory.h"
 
 namespace dart {
 
@@ -1195,9 +1196,35 @@
   counter.SetAt(0, Smi::Handle(Smi::New(0)));
   __ Comment("Edge counter");
   __ LoadObject(R0, counter);
+#if defined(DEBUG)
+  intptr_t increment_start = assembler_->CodeSize();
+  bool old_use_far_branches = assembler_->use_far_branches();
+  assembler_->set_use_far_branches(true);
+#endif  // DEBUG
   __ ldr(IP, FieldAddress(R0, Array::element_offset(0)));
   __ add(IP, IP, Operand(Smi::RawValue(1)));
-  __ str(IP, FieldAddress(R0, Array::element_offset(0)));
+  __ StoreIntoSmiField(FieldAddress(R0, Array::element_offset(0)), IP);
+#if defined(DEBUG)
+  assembler_->set_use_far_branches(old_use_far_branches);
+  // If the assertion below fails, update EdgeCounterIncrementSizeInBytes.
+  intptr_t expected = EdgeCounterIncrementSizeInBytes();
+  intptr_t actual = assembler_->CodeSize() - increment_start;
+  if (actual != expected) {
+    FATAL2("Edge counter increment length: %" Pd ", expected %" Pd "\n",
+           actual,
+           expected);
+  }
+#endif  // DEBUG
+}
+
+
+int32_t FlowGraphCompiler::EdgeCounterIncrementSizeInBytes() {
+  // Used by CodePatcher; so must be constant across all code in an isolate.
+#if defined(DEBUG)
+  return (VerifiedMemory::enabled() ? 42 : 19) * Instr::kInstrSize;
+#else
+  return 3 * Instr::kInstrSize;
+#endif  // DEBUG
 }
 
 
@@ -1464,8 +1491,7 @@
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
   // General purpose registers have the highest register number at the
-  // lowest address. The order in which the registers are popped must match the
-  // order in which the registers are pushed in SaveLiveRegisters.
+  // lowest address.
   for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (locs->live_registers()->ContainsRegister(reg)) {
@@ -1690,11 +1716,19 @@
     Exchange(source.base_reg(), source.ToStackSlotOffset(),
              destination.base_reg(), destination.ToStackSlotOffset());
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
-    const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
-    DRegister src = EvenDRegisterOf(source.fpu_reg());
-    __ vmovd(DTMP, src);
-    __ vmovd(src, dst);
-    __ vmovd(dst, DTMP);
+    if (TargetCPUFeatures::neon_supported()) {
+      const QRegister dst = destination.fpu_reg();
+      const QRegister src = source.fpu_reg();
+      __ vmovq(QTMP, src);
+      __ vmovq(src, dst);
+      __ vmovq(dst, QTMP);
+    } else {
+      const DRegister dst = EvenDRegisterOf(destination.fpu_reg());
+      const DRegister src = EvenDRegisterOf(source.fpu_reg());
+      __ vmovd(DTMP, src);
+      __ vmovd(src, dst);
+      __ vmovd(dst, DTMP);
+    }
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
            destination.IsQuadStackSlot() ||
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 6bf0070..7501c58 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1445,7 +1445,8 @@
   }
 
   // Store general purpose registers with the highest register number at the
-  // lowest address.
+  // lowest address. The order in which the registers are pushed must match the
+  // order in which the registers are encoded in the safe point's stack map.
   for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (locs->live_registers()->ContainsRegister(reg)) {
@@ -1671,9 +1672,9 @@
   } else if (source.IsFpuRegister() && destination.IsFpuRegister()) {
     const VRegister dst = destination.fpu_reg();
     const VRegister src = source.fpu_reg();
-    __ fmovdd(VTMP, src);
-    __ fmovdd(src, dst);
-    __ fmovdd(dst, VTMP);
+    __ vmov(VTMP, src);
+    __ vmov(src, dst);
+    __ vmov(dst, VTMP);
   } else if (source.IsFpuRegister() || destination.IsFpuRegister()) {
     ASSERT(destination.IsDoubleStackSlot() ||
            destination.IsQuadStackSlot() ||
@@ -1697,7 +1698,7 @@
     } else {
       __ LoadQFromOffset(VTMP, base_reg, slot_offset, PP);
       __ StoreQToOffset(reg, base_reg, slot_offset, PP);
-      __ fmovdd(reg, VTMP);
+      __ vmov(reg, VTMP);
     }
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
     const intptr_t source_offset = source.ToStackSlotOffset();
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index fbc513a..78d7683 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1470,7 +1470,8 @@
   }
 
   // Store general purpose registers with the highest register number at the
-  // lowest address.
+  // lowest address. The order in which the registers are pushed must match the
+  // order in which the registers are encoded in the safe point's stack map.
   for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (locs->live_registers()->ContainsRegister(reg)) {
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 7061dc6..3434984 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -40,7 +40,7 @@
 
 
 bool FlowGraphCompiler::SupportsUnboxedMints() {
-  return false;
+  return true;
 }
 
 
@@ -1490,41 +1490,46 @@
     ASSERT(offset == (fpu_regs_count * kFpuRegisterSize));
   }
 
-  // Store general purpose registers with the lowest register number at the
-  // lowest address.
+  // Store general purpose registers with the highest register number at the
+  // lowest address. The order in which the registers are pushed must match the
+  // order in which the registers are encoded in the safe point's stack map.
   const intptr_t cpu_registers = locs->live_registers()->cpu_registers();
   ASSERT((cpu_registers & ~kAllCpuRegistersList) == 0);
   const int register_count = Utils::CountOneBits(cpu_registers);
-  int registers_pushed = 0;
-
-  __ addiu(SP, SP, Immediate(-register_count * kWordSize));
-  for (int i = 0; i < kNumberOfCpuRegisters; i++) {
-    Register r = static_cast<Register>(i);
-    if (locs->live_registers()->ContainsRegister(r)) {
-      __ sw(r, Address(SP, registers_pushed * kWordSize));
-      registers_pushed++;
+  if (register_count > 0) {
+    __ addiu(SP, SP, Immediate(-register_count * kWordSize));
+    intptr_t offset = register_count * kWordSize;
+    for (int i = 0; i < kNumberOfCpuRegisters; i++) {
+      Register r = static_cast<Register>(i);
+      if (locs->live_registers()->ContainsRegister(r)) {
+        offset -= kWordSize;
+        __ sw(r, Address(SP, offset));
+      }
     }
+    ASSERT(offset == 0);
   }
 }
 
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
-  // General purpose registers have the lowest register number at the
+  // General purpose registers have the highest register number at the
   // lowest address.
   __ TraceSimMsg("RestoreLiveRegisters");
   const intptr_t cpu_registers = locs->live_registers()->cpu_registers();
   ASSERT((cpu_registers & ~kAllCpuRegistersList) == 0);
   const int register_count = Utils::CountOneBits(cpu_registers);
-  int registers_popped = 0;
-
-  for (int i = 0; i < kNumberOfCpuRegisters; i++) {
-    Register r = static_cast<Register>(i);
-    if (locs->live_registers()->ContainsRegister(r)) {
-      __ lw(r, Address(SP, registers_popped * kWordSize));
-      registers_popped++;
+  if (register_count > 0) {
+    intptr_t offset = register_count * kWordSize;
+    for (int i = 0; i < kNumberOfCpuRegisters; i++) {
+      Register r = static_cast<Register>(i);
+      if (locs->live_registers()->ContainsRegister(r)) {
+        offset -= kWordSize;
+        __ lw(r, Address(SP, offset));
+      }
     }
+    ASSERT(offset == 0);
+    __ addiu(SP, SP, Immediate(register_count * kWordSize));
   }
-  __ addiu(SP, SP, Immediate(register_count * kWordSize));
 
   const intptr_t fpu_regs_count = locs->live_registers()->FpuRegisterCount();
   if (fpu_regs_count > 0) {
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 1734ee1..207582a 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -41,7 +41,9 @@
 DEFINE_FLAG(int, inlining_constant_arguments_count, 1,
     "Inline function calls with sufficient constant arguments "
     "and up to the increased threshold on instructions");
-DEFINE_FLAG(int, inlining_constant_arguments_size_threshold, 60,
+DEFINE_FLAG(int, inlining_constant_arguments_max_size_threshold, 200,
+    "Do not inline callees larger than threshold if constant arguments");
+DEFINE_FLAG(int, inlining_constant_arguments_min_size_threshold, 60,
     "Inline function calls with sufficient constant arguments "
     "and up to the increased threshold on instructions");
 DEFINE_FLAG(int, inlining_hotness, 10,
@@ -192,7 +194,7 @@
                      FlowGraph* flow_graph)
         : call(call_arg),
           ratio(0.0),
-          caller(&flow_graph->parsed_function().function()) {}
+          caller(&flow_graph->parsed_function()->function()) {}
   };
 
   struct StaticCallInfo {
@@ -202,7 +204,7 @@
     StaticCallInfo(StaticCallInstr* value, FlowGraph* flow_graph)
         : call(value),
           ratio(0.0),
-          caller(&flow_graph->parsed_function().function()) {}
+          caller(&flow_graph->parsed_function()->function()) {}
   };
 
   struct ClosureCallInfo {
@@ -210,7 +212,7 @@
     const Function* caller;
     ClosureCallInfo(ClosureCallInstr* value, FlowGraph* flow_graph)
         : call(value),
-          caller(&flow_graph->parsed_function().function()) {}
+          caller(&flow_graph->parsed_function()->function()) {}
   };
 
   const GrowableArray<InstanceCallInfo>& instance_calls() const {
@@ -286,7 +288,7 @@
       FlowGraph* graph,
       intptr_t depth,
       GrowableArray<InlinedInfo>* inlined_info) {
-    const Function* caller = &graph->parsed_function().function();
+    const Function* caller = &graph->parsed_function()->function();
     Function& target  = Function::ZoneHandle();
     for (BlockIterator block_it = graph->postorder_iterator();
          !block_it.Done();
@@ -353,7 +355,7 @@
             // Method not inlined because inlining too deep and method
             // not recognized.
             if (FLAG_print_inlining_tree) {
-              const Function* caller = &graph->parsed_function().function();
+              const Function* caller = &graph->parsed_function()->function();
               const Function* target =
                   &Function::ZoneHandle(
                       instance_call->ic_data().GetTargetAt(0));
@@ -370,7 +372,7 @@
             // Method not inlined because inlining too deep and method
             // not recognized.
             if (FLAG_print_inlining_tree) {
-              const Function* caller = &graph->parsed_function().function();
+              const Function* caller = &graph->parsed_function()->function();
               const Function* target = &static_call->function();
               inlined_info->Add(InlinedInfo(
                   caller, target, depth + 1, static_call, "Too deep"));
@@ -498,7 +500,11 @@
       // Prevent methods becoming humongous and thus slow to compile.
       return false;
     }
-    if (instr_count > FLAG_inlining_callee_size_threshold) {
+    if (const_arg_count > 0) {
+      if (instr_count > FLAG_inlining_constant_arguments_max_size_threshold) {
+        return false;
+      }
+    } else if (instr_count > FLAG_inlining_callee_size_threshold) {
       return false;
     }
     // 'instr_count' can be 0 if it was not computed yet.
@@ -509,7 +515,7 @@
       return true;
     }
     if ((const_arg_count >= FLAG_inlining_constant_arguments_count) &&
-        (instr_count <= FLAG_inlining_constant_arguments_size_threshold)) {
+        (instr_count <= FLAG_inlining_constant_arguments_min_size_threshold)) {
       return true;
     }
     if (FlowGraphInliner::AlwaysInline(callee)) {
@@ -521,7 +527,7 @@
   void InlineCalls() {
     // If inlining depth is less then one abort.
     if (FLAG_inlining_depth_threshold < 1) return;
-    if (caller_graph_->parsed_function().function().deoptimization_counter() >=
+    if (caller_graph_->parsed_function()->function().deoptimization_counter() >=
         FLAG_deoptimization_counter_inlining_threshold) {
       return;
     }
@@ -591,15 +597,6 @@
                              function.ToCString(),
                              function.deoptimization_counter()));
 
-    // TODO(fschneider): Enable inlining inside try-blocks.
-    if (call_data->call->GetBlock()->try_index() !=
-        CatchClauseNode::kInvalidTryIndex) {
-      TRACE_INLINING(OS::Print("     Bailout: inside try-block\n"));
-      PRINT_INLINING_TREE("Inside try-block",
-          &call_data->caller, &function, call_data->call);
-      return false;
-    }
-
     // Make a handle for the unoptimized code so that it is not disconnected
     // from the function while we are trying to inline it.
     const Code& unoptimized_code = Code::Handle(function.unoptimized_code());
@@ -730,6 +727,17 @@
       ASSERT(arguments->length() == function.NumParameters());
       ASSERT(param_stubs->length() == callee_graph->parameter_count());
 
+      // Update try-index of the callee graph.
+      BlockEntryInstr* call_block = call_data->call->GetBlock();
+      if (call_block->InsideTryBlock()) {
+        intptr_t try_index = call_block->try_index();
+        for (BlockIterator it = callee_graph->reverse_postorder_iterator();
+             !it.Done(); it.Advance()) {
+          BlockEntryInstr* block = it.Current();
+          block->set_try_index(try_index);
+        }
+      }
+
       BlockScheduler block_scheduler(callee_graph);
       block_scheduler.AssignEdgeWeights();
 
@@ -785,7 +793,8 @@
         // If size is larger than all thresholds, don't consider it again.
         if ((size > FLAG_inlining_size_threshold) &&
             (call_site_count > FLAG_inlining_callee_call_sites_threshold) &&
-            (size > FLAG_inlining_constant_arguments_size_threshold)) {
+            (size > FLAG_inlining_constant_arguments_min_size_threshold) &&
+            (size > FLAG_inlining_constant_arguments_max_size_threshold)) {
           function.set_is_inlinable(false);
         }
         isolate()->set_deopt_id(prev_deopt_id);
@@ -1706,7 +1715,7 @@
 
 
 void FlowGraphInliner::CollectGraphInfo(FlowGraph* flow_graph, bool force) {
-  const Function& function = flow_graph->parsed_function().function();
+  const Function& function = flow_graph->parsed_function()->function();
   if (force || (function.optimized_instruction_count() == 0)) {
     GraphInfoCollector info;
     info.Collect(*flow_graph);
@@ -1743,7 +1752,7 @@
   // We might later use it for an early bailout from the inlining.
   CollectGraphInfo(flow_graph_);
 
-  const Function& top = flow_graph_->parsed_function().function();
+  const Function& top = flow_graph_->parsed_function()->function();
   if ((FLAG_inlining_filter != NULL) &&
       (strstr(top.ToFullyQualifiedCString(), FLAG_inlining_filter) == NULL)) {
     return;
@@ -1754,7 +1763,7 @@
   if (FLAG_trace_inlining &&
       (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized)) {
     OS::Print("Before Inlining of %s\n", flow_graph_->
-              parsed_function().function().ToFullyQualifiedCString());
+              parsed_function()->function().ToFullyQualifiedCString());
     FlowGraphPrinter printer(*flow_graph_);
     printer.PrintBlocks();
   }
@@ -1771,7 +1780,7 @@
       OS::Print("Inlining growth factor: %f\n", inliner.GrowthFactor());
       if (FLAG_print_flow_graph || FLAG_print_flow_graph_optimized) {
         OS::Print("After Inlining of %s\n", flow_graph_->
-                  parsed_function().function().ToFullyQualifiedCString());
+                  parsed_function()->function().ToFullyQualifiedCString());
         FlowGraphPrinter printer(*flow_graph_);
         printer.PrintBlocks();
       }
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 2ed1b29..6997014 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -198,7 +198,7 @@
   // TODO(srdjan): Prevent modification of ICData object that is
   // referenced in assembly code.
   ICData& ic_data = ICData::ZoneHandle(I, ICData::New(
-      flow_graph_->parsed_function().function(),
+      flow_graph_->parsed_function()->function(),
       call->function_name(),
       args_desc_array,
       call->deopt_id(),
@@ -717,15 +717,17 @@
     ConvertUse(it.Current(), from_rep);
   }
 
-  for (Value::Iterator it(def->env_use_list());
-       !it.Done();
-       it.Advance()) {
-    Value* use = it.Current();
-    if (use->instruction()->MayThrow() &&
-        use->instruction()->GetBlock()->InsideTryBlock()) {
-      // Environment uses at calls inside try-blocks must be converted to
-      // tagged representation.
-      ConvertEnvironmentUse(it.Current(), from_rep);
+  if (flow_graph()->graph_entry()->SuccessorCount() > 1) {
+    for (Value::Iterator it(def->env_use_list());
+         !it.Done();
+         it.Advance()) {
+      Value* use = it.Current();
+      if (use->instruction()->MayThrow() &&
+          use->instruction()->GetBlock()->InsideTryBlock()) {
+        // Environment uses at calls inside try-blocks must be converted to
+        // tagged representation.
+        ConvertEnvironmentUse(it.Current(), from_rep);
+      }
     }
   }
 }
@@ -2348,7 +2350,7 @@
   if (!FLAG_use_cha) return true;
   Definition* callee_receiver = call->ArgumentAt(0);
   ASSERT(callee_receiver != NULL);
-  const Function& function = flow_graph_->parsed_function().function();
+  const Function& function = flow_graph_->parsed_function()->function();
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
@@ -3721,7 +3723,7 @@
     case kTypedDataInt16ArrayCid:
     case kTypedDataUint16ArrayCid: {
       // Check that value is always smi.
-      value_check = ICData::New(flow_graph_->parsed_function().function(),
+      value_check = ICData::New(flow_graph_->parsed_function()->function(),
                                 i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
                                 Isolate::kNoDeoptId,
@@ -3733,7 +3735,7 @@
     case kTypedDataUint32ArrayCid:
       // On 64-bit platforms assume that stored value is always a smi.
       if (kSmiBits >= 32) {
-        value_check = ICData::New(flow_graph_->parsed_function().function(),
+        value_check = ICData::New(flow_graph_->parsed_function()->function(),
                                   i_call->function_name(),
                                   Object::empty_array(),  // Dummy args. descr.
                                   Isolate::kNoDeoptId,
@@ -3744,7 +3746,7 @@
     case kTypedDataFloat32ArrayCid:
     case kTypedDataFloat64ArrayCid: {
       // Check that value is always double.
-      value_check = ICData::New(flow_graph_->parsed_function().function(),
+      value_check = ICData::New(flow_graph_->parsed_function()->function(),
                                 i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
                                 Isolate::kNoDeoptId,
@@ -3754,7 +3756,7 @@
     }
     case kTypedDataInt32x4ArrayCid: {
       // Check that value is always Int32x4.
-      value_check = ICData::New(flow_graph_->parsed_function().function(),
+      value_check = ICData::New(flow_graph_->parsed_function()->function(),
                                 i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
                                 Isolate::kNoDeoptId,
@@ -3764,7 +3766,7 @@
     }
     case kTypedDataFloat32x4ArrayCid: {
       // Check that value is always Float32x4.
-      value_check = ICData::New(flow_graph_->parsed_function().function(),
+      value_check = ICData::New(flow_graph_->parsed_function()->function(),
                                 i_call->function_name(),
                                 Object::empty_array(),  // Dummy args. descr.
                                 Isolate::kNoDeoptId,
@@ -4936,7 +4938,7 @@
              instr_it.Advance()) {
           Instruction* current = instr_it.Current();
           if (current->MayThrow()) {
-            Environment* env = current->env();
+            Environment* env = current->env()->Outermost();
             ASSERT(env != NULL);
             for (intptr_t env_idx = 0; env_idx < cdefs.length(); ++env_idx) {
               if (cdefs[env_idx] != NULL &&
@@ -5076,7 +5078,7 @@
 
 
 void LICM::OptimisticallySpecializeSmiPhis() {
-  if (!flow_graph()->parsed_function().function().
+  if (!flow_graph()->parsed_function()->function().
           allows_hoisting_check_class()) {
     // Do not hoist any.
     return;
@@ -5099,7 +5101,7 @@
 
 
 void LICM::Optimize() {
-  if (!flow_graph()->parsed_function().function().
+  if (!flow_graph()->parsed_function()->function().
           allows_hoisting_check_class()) {
     // Do not hoist any.
     return;
@@ -8236,10 +8238,11 @@
 
 
 void ConstantPropagator::VisitLoadField(LoadFieldInstr* instr) {
+  Value* instance = instr->instance();
   if ((instr->recognized_kind() == MethodRecognizer::kObjectArrayLength) &&
-      (instr->instance()->definition()->IsCreateArray())) {
-    Value* num_elements =
-        instr->instance()->definition()->AsCreateArray()->num_elements();
+      instance->definition()->OriginalDefinition()->IsCreateArray()) {
+    Value* num_elements = instance->definition()->OriginalDefinition()
+        ->AsCreateArray()->num_elements();
     if (num_elements->BindsToConstant() &&
         num_elements->BoundConstant().IsSmi()) {
       intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
@@ -8250,7 +8253,8 @@
   }
 
   if (instr->IsImmutableLengthLoad()) {
-    ConstantInstr* constant = instr->instance()->definition()->AsConstant();
+    ConstantInstr* constant =
+        instance->definition()->OriginalDefinition()->AsConstant();
     if (constant != NULL) {
       if (constant->value().IsString()) {
         SetValue(instr, Smi::ZoneHandle(I,
@@ -9083,6 +9087,7 @@
   }
 
   graph_->DiscoverBlocks();
+  graph_->MergeBlocks();
   GrowableArray<BitVector*> dominance_frontier;
   graph_->ComputeDominators(&dominance_frontier);
 
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index 98d3da5..0233d55 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -1527,7 +1527,7 @@
 
 void RangeAnalysis::EliminateRedundantBoundsChecks() {
   if (FLAG_array_bounds_check_elimination) {
-    const Function& function = flow_graph_->parsed_function().function();
+    const Function& function = flow_graph_->parsed_function()->function();
     const bool try_generalization =
         function.allows_bounds_check_generalization();
 
@@ -2904,11 +2904,12 @@
 
 
 void LoadCodeUnitsInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  ASSERT(class_id() == kOneByteStringCid ||
-         class_id() == kTwoByteStringCid);
+  ASSERT(RawObject::IsStringClassId(class_id()));
   switch (class_id()) {
     case kOneByteStringCid:
     case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
       *range = Range(RangeBoundary::FromConstant(0),
                      RangeBoundary::FromConstant(kMaxUint32));
       break;
diff --git a/runtime/vm/il_printer.h b/runtime/vm/il_printer.h
index e61f65b..3bcefb9 100644
--- a/runtime/vm/il_printer.h
+++ b/runtime/vm/il_printer.h
@@ -37,7 +37,7 @@
  public:
   FlowGraphPrinter(const FlowGraph& flow_graph,
                    bool print_locations = false)
-      : function_(flow_graph.parsed_function().function()),
+      : function_(flow_graph.parsed_function()->function()),
         block_order_(flow_graph.reverse_postorder()),
         print_locations_(print_locations) { }
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 9ac5c3f..8476a7c 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -1202,6 +1202,10 @@
     return !is_truncating() &&
         !RangeUtils::Fits(value()->definition()->range(),
                           RangeBoundary::kRangeBoundaryInt32);
+  } else if ((kSmiBits < 32) && value()->Type()->IsInt()) {
+    // Note: we don't support truncation of Bigint values.
+    return !RangeUtils::Fits(value()->definition()->range(),
+                             RangeBoundary::kRangeBoundaryInt32);
   } else {
     return true;
   }
@@ -1822,7 +1826,8 @@
   // For fixed length arrays if the array is the result of a known constructor
   // call we can replace the length load with the length argument passed to
   // the constructor.
-  StaticCallInstr* call = instance()->definition()->AsStaticCall();
+  StaticCallInstr* call =
+      instance()->definition()->OriginalDefinition()->AsStaticCall();
   if (call != NULL) {
     if (call->is_known_list_constructor() &&
         IsFixedLengthArrayCid(call->Type()->ToCid())) {
@@ -1833,7 +1838,8 @@
     }
   }
 
-  CreateArrayInstr* create_array = instance()->definition()->AsCreateArray();
+  CreateArrayInstr* create_array =
+      instance()->definition()->OriginalDefinition()->AsCreateArray();
   if ((create_array != NULL) &&
       (recognized_kind() == MethodRecognizer::kObjectArrayLength)) {
     return create_array->num_elements()->definition();
@@ -1841,7 +1847,8 @@
 
   // For arrays with guarded lengths, replace the length load
   // with a constant.
-  LoadFieldInstr* load_array = instance()->definition()->AsLoadField();
+  LoadFieldInstr* load_array =
+      instance()->definition()->OriginalDefinition()->AsLoadField();
   if (load_array != NULL) {
     const Field* field = load_array->field();
     if ((field != NULL) && (field->guarded_list_length() >= 0)) {
@@ -2142,7 +2149,7 @@
   Definition* defn = value()->definition();
   if (defn->IsComparison() && defn->HasOnlyUse(value())) {
     // Comparisons always have a bool result.
-    ASSERT(value()->Type()->ToCid() == kBoolCid);
+    ASSERT(value()->definition()->Type()->ToCid() == kBoolCid);
     defn->AsComparison()->NegateComparison();
     return defn;
   }
@@ -3205,7 +3212,7 @@
   //   v8 <- StringInterpolate(v2)
 
   // Don't compile-time fold when optimizing the interpolation function itself.
-  if (flow_graph->parsed_function().function().raw() == CallFunction().raw()) {
+  if (flow_graph->parsed_function()->function().raw() == CallFunction().raw()) {
     return this;
   }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index ea0ef61..5d5b537 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1149,6 +1149,9 @@
   virtual bool MayThrow() const { return false; }
 
   intptr_t try_index() const { return try_index_; }
+  void set_try_index(intptr_t index) {
+    try_index_ = index;
+  }
 
   // True for blocks inside a try { } region.
   bool InsideTryBlock() const {
@@ -1204,7 +1207,7 @@
   void set_dominator(BlockEntryInstr* instr) { dominator_ = instr; }
 
   intptr_t block_id_;
-  const intptr_t try_index_;
+  intptr_t try_index_;
   intptr_t preorder_number_;
   intptr_t postorder_number_;
   // Starting and ending lifetime positions for this block.  Used by
@@ -3247,7 +3250,7 @@
 
 class DropTempsInstr : public Definition {
  public:
-  explicit DropTempsInstr(intptr_t num_temps, Value* value = NULL)
+  DropTempsInstr(intptr_t num_temps, Value* value)
       : num_temps_(num_temps), value_(NULL) {
     if (value != NULL) {
       SetInputAt(0, value);
@@ -3695,7 +3698,7 @@
         element_count_(element_count),
         representation_(kTagged) {
     ASSERT(element_count == 1 || element_count == 2 || element_count == 4);
-    ASSERT(class_id == kOneByteStringCid || class_id == kTwoByteStringCid);
+    ASSERT(RawObject::IsStringClassId(class_id));
     SetInputAt(0, str);
     SetInputAt(1, index);
   }
@@ -4213,6 +4216,12 @@
   DECLARE_INSTRUCTION(LoadUntagged)
   virtual CompileType ComputeType() const;
 
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    // The object may be tagged or untagged (for external objects).
+    return kNoRepresentation;
+  }
+
   Value* object() const { return inputs_[0]; }
   intptr_t offset() const { return offset_; }
 
@@ -7858,6 +7867,12 @@
 
   Environment* outer() const { return outer_; }
 
+  Environment* Outermost() {
+    Environment* result = this;
+    while (result->outer() != NULL) result = result->outer();
+    return result;
+  }
+
   Value* ValueAt(intptr_t ix) const {
     return values_[ix];
   }
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 4391ca6..e8649f4 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -25,6 +25,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, emit_edge_counters);
+DECLARE_FLAG(bool, enable_asserts);
+DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -42,7 +44,7 @@
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
@@ -376,10 +378,17 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  __ CompareObject(reg, Bool::True());
-  __ b(&done, EQ);
-  __ CompareObject(reg, Bool::False());
-  __ b(&done, EQ);
+
+  if (FLAG_enable_type_checks) {
+    __ CompareObject(reg, Bool::True());
+    __ b(&done, EQ);
+    __ CompareObject(reg, Bool::False());
+    __ b(&done, EQ);
+  } else {
+    ASSERT(FLAG_enable_asserts);
+    __ CompareObject(reg, Object::null_instance());
+    __ b(&done, NE);
+  }
 
   __ Push(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos,
@@ -570,7 +579,8 @@
 
 static Condition EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
                                              LocationSummary* locs,
-                                             Token::Kind kind) {
+                                             Token::Kind kind,
+                                             BranchLabels labels) {
   PairLocation* left_pair = locs->in(0).AsPairLocation();
   Register left_lo = left_pair->At(0).reg();
   Register left_hi = left_pair->At(1).reg();
@@ -578,42 +588,37 @@
   Register right_lo = right_pair->At(0).reg();
   Register right_hi = right_pair->At(1).reg();
 
-  Register out = locs->temp(0).reg();
-
-  // 64-bit comparison
-  Condition hi_true_cond, hi_false_cond, lo_false_cond;
+  // 64-bit comparison.
+  Condition hi_cond, lo_cond;
   switch (kind) {
     case Token::kLT:
-    case Token::kLTE:
-      hi_true_cond = LT;
-      hi_false_cond = GT;
-      lo_false_cond = (kind == Token::kLT) ? CS : HI;
+      hi_cond = LT;
+      lo_cond = CC;
       break;
     case Token::kGT:
+      hi_cond = GT;
+      lo_cond = HI;
+      break;
+    case Token::kLTE:
+      hi_cond = LT;
+      lo_cond = LS;
+      break;
     case Token::kGTE:
-      hi_true_cond = GT;
-      hi_false_cond = LT;
-      lo_false_cond = (kind == Token::kGT) ? LS : CC;
+      hi_cond = GT;
+      lo_cond = CS;
       break;
     default:
       UNREACHABLE();
-      hi_true_cond = hi_false_cond = lo_false_cond = VS;
+      hi_cond = lo_cond = VS;
   }
-
-  Label done;
   // Compare upper halves first.
   __ cmp(left_hi, Operand(right_hi));
-  __ LoadImmediate(out, 0, hi_false_cond);
-  __ LoadImmediate(out, 1, hi_true_cond);
-  // If higher words aren't equal, skip comparing lower words.
-  __ b(&done, NE);
+  __ b(labels.true_label, hi_cond);
+  __ b(labels.false_label, FlipCondition(hi_cond));
 
+  // If higher words are equal, compare lower words.
   __ cmp(left_lo, Operand(right_lo));
-  __ LoadImmediate(out, 1);
-  __ LoadImmediate(out, 0, lo_false_cond);
-  __ Bind(&done);
-
-  return NegateCondition(lo_false_cond);
+  return lo_cond;
 }
 
 
@@ -822,14 +827,13 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
-    const intptr_t kNumTemps = 1;
+    const intptr_t kNumTemps = 0;
     LocationSummary* locs = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
-    locs->set_temp(0, Location::RequiresRegister());  // TODO(regis): Improve.
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -860,7 +864,7 @@
   if (operation_cid() == kSmiCid) {
     return EmitSmiComparisonOp(compiler, locs(), kind());
   } else if (operation_cid() == kMintCid) {
-    return EmitUnboxedMintComparisonOp(compiler, locs(), kind());
+    return EmitUnboxedMintComparisonOp(compiler, locs(), kind(), labels);
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, locs(), kind());
@@ -869,8 +873,8 @@
 
 
 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  // The ARM code does not use true- and false-labels here.
-  BranchLabels labels = { NULL, NULL, NULL };
+  Label is_true, is_false;
+  BranchLabels labels = { &is_true, &is_false, &is_false };
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
   const Register result = locs()->out(0).reg();
@@ -878,10 +882,14 @@
     __ LoadObject(result, Bool::True(), true_condition);
     __ LoadObject(result, Bool::False(), NegateCondition(true_condition));
   } else if (operation_cid() == kMintCid) {
-    const Register cr = locs()->temp(0).reg();
+    EmitBranchOnCondition(compiler, true_condition, labels);
+    Label done;
+    __ Bind(&is_false);
+    __ LoadObject(result, Bool::False());
+    __ b(&done);
+    __ Bind(&is_true);
     __ LoadObject(result, Bool::True());
-    __ CompareImmediate(cr, 1);
-    __ LoadObject(result, Bool::False(), NE);
+    __ Bind(&done);
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     Label done;
@@ -900,13 +908,8 @@
   BranchLabels labels = compiler->CreateBranchLabels(branch);
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
-  if (operation_cid() == kSmiCid) {
+  if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) {
     EmitBranchOnCondition(compiler, true_condition, labels);
-  } else if (operation_cid() == kMintCid) {
-    const Register result = locs()->temp(0).reg();  // TODO(regis): Improve.
-    __ CompareImmediate(result, 1);
-    __ b(labels.true_label, EQ);
-    __ b(labels.false_label, NE);
   } else if (operation_cid() == kDoubleCid) {
     Label* nan_result = (true_condition == NE) ?
         labels.true_label : labels.false_label;
@@ -1053,9 +1056,14 @@
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register object = locs()->in(0).reg();
+  const Register obj = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(kWord, result, object, offset() - kHeapObjectTag);
+  if (object()->definition()->representation() == kUntagged) {
+    __ LoadFromOffset(kWord, result, obj, offset());
+  } else {
+    ASSERT(object()->definition()->representation() == kTagged);
+    __ LoadFieldFromOffset(kWord, result, obj, offset());
+  }
 }
 
 
@@ -1893,11 +1901,12 @@
 
 
 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
+  // The string register points to the backing store for external strings.
+  const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true,  IsExternal(), class_id(), index_scale(), array, index.reg());
+        true,  IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register IP as base.
 
   if (representation() == kUnboxedMint) {
@@ -2218,8 +2227,7 @@
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register field = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadFromOffset(kWord, result,
-                    field, Field::value_offset() - kHeapObjectTag);
+  __ LoadFieldFromOffset(kWord, result, field, Field::value_offset());
 }
 
 
@@ -2323,14 +2331,22 @@
   // R3: new object end address.
   // R8: iterator which initially points to the start of the variable
   // data area to be initialized.
-  // R6, R7: null
+  // R6: null
   if (num_elements > 0) {
     const intptr_t array_size = instance_size - sizeof(RawArray);
     __ LoadImmediate(R6, reinterpret_cast<intptr_t>(Object::null()));
-    __ mov(R7, Operand(R6));
+    if (num_elements >= 2) {
+      __ mov(R7, Operand(R6));
+    } else {
+#if defined(DEBUG)
+      // Clobber R7 with an invalid pointer.
+      __ LoadImmediate(R7, 0x1);
+#endif  // DEBUG
+    }
     __ AddImmediate(R8, R0, sizeof(RawArray) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * kWordSize)) {
-      __ InitializeFieldsNoBarrierUnrolled(R0, R8, num_elements, R6, R7);
+      __ InitializeFieldsNoBarrierUnrolled(R0, R8, 0, num_elements * kWordSize,
+                                           R6, R7);
     } else {
       __ InitializeFieldsNoBarrier(R0, R8, R3, R6, R7);
     }
@@ -2520,8 +2536,7 @@
 
     __ Bind(&load_pointer);
   }
-  __ LoadFromOffset(kWord, result_reg,
-                    instance_reg, offset_in_bytes() - kHeapObjectTag);
+  __ LoadFieldFromOffset(kWord, result_reg, instance_reg, offset_in_bytes());
   __ Bind(&done);
 }
 
@@ -3718,14 +3733,14 @@
   switch (representation()) {
     case kUnboxedMint: {
       PairLocation* result = locs()->out(0).AsPairLocation();
-      __ LoadFromOffset(kWord,
-                        result->At(0).reg(),
-                        box,
-                        ValueOffset() - kHeapObjectTag);
-      __ LoadFromOffset(kWord,
-                        result->At(1).reg(),
-                        box,
-                        ValueOffset() - kHeapObjectTag + kWordSize);
+      __ LoadFieldFromOffset(kWord,
+                             result->At(0).reg(),
+                             box,
+                             ValueOffset());
+      __ LoadFieldFromOffset(kWord,
+                             result->At(1).reg(),
+                             box,
+                             ValueOffset() + kWordSize);
       break;
     }
 
@@ -3945,15 +3960,12 @@
                               Register result,
                               Register temp,
                               Label* deopt) {
-  __ LoadFromOffset(kWord,
-                    result,
-                    mint,
-                    Mint::value_offset() - kHeapObjectTag);
+  __ LoadFieldFromOffset(kWord, result, mint, Mint::value_offset());
   if (deopt != NULL) {
-    __ LoadFromOffset(kWord,
-                      temp,
-                      mint,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ LoadFieldFromOffset(kWord,
+                           temp,
+                           mint,
+                           Mint::value_offset() + kWordSize);
     __ cmp(temp, Operand(result, ASR, kBitsPerWord - 1));
     __ b(deopt, NE);
   }
@@ -3992,6 +4004,11 @@
     __ SmiUntag(out, value);
   } else if (value_cid == kMintCid) {
     LoadInt32FromMint(compiler, value, out, temp, out_of_range);
+  } else if (!CanDeoptimize()) {
+    Label done;
+    __ SmiUntag(out, value, &done);
+    LoadInt32FromMint(compiler, value, out, kNoRegister, NULL);
+    __ Bind(&done);
   } else {
     Label done;
     __ SmiUntag(out, value, &done);
@@ -6543,8 +6560,7 @@
   // Non constant shift value.
   Register shifter = locs()->in(1).reg();
 
-  __ mov(temp, Operand(shifter));
-  __ SmiUntag(temp);
+  __ SmiUntag(temp, shifter);
   __ CompareImmediate(temp, 0);
   // If shift value is < 0, deoptimize.
   __ b(deopt, LT);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 47f9089..99c35bc 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -24,6 +24,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, emit_edge_counters);
+DECLARE_FLAG(bool, enable_asserts);
+DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_osr);
 
@@ -40,7 +42,7 @@
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
@@ -363,10 +365,17 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  __ CompareObject(reg, Bool::True(), PP);
-  __ b(&done, EQ);
-  __ CompareObject(reg, Bool::False(), PP);
-  __ b(&done, EQ);
+
+  if (FLAG_enable_type_checks) {
+    __ CompareObject(reg, Bool::True(), PP);
+    __ b(&done, EQ);
+    __ CompareObject(reg, Bool::False(), PP);
+    __ b(&done, EQ);
+  } else {
+    ASSERT(FLAG_enable_asserts);
+    __ CompareObject(reg, Object::null_instance(), PP);
+    __ b(&done, NE);
+  }
 
   __ Push(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos,
@@ -903,9 +912,14 @@
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register object = locs()->in(0).reg();
+  const Register obj = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadFieldFromOffset(result, object, offset(), PP);
+  if (object()->definition()->representation() == kUntagged) {
+    __ LoadFromOffset(result, obj, offset(), PP);
+  } else {
+    ASSERT(object()->definition()->representation() == kTagged);
+    __ LoadFieldFromOffset(result, obj, offset(), PP);
+  }
 }
 
 
@@ -1149,11 +1163,12 @@
 
 
 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
+  // The string register points to the backing store for external strings.
+  const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true,  IsExternal(), class_id(), index_scale(), array, index.reg());
+        true,  IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register TMP as base.
 
   Register result = locs()->out(0).reg();
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index ccf4a25..3b4fe76 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -23,6 +23,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, emit_edge_counters);
+DECLARE_FLAG(bool, enable_asserts);
+DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -32,7 +34,7 @@
 // on the stack and return the result in a fixed register EAX.
 LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) {
   const intptr_t kNumInputs = 0;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(EAX));
@@ -43,7 +45,7 @@
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
@@ -248,10 +250,17 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  __ CompareObject(reg, Bool::True());
-  __ j(EQUAL, &done, Assembler::kNearJump);
-  __ CompareObject(reg, Bool::False());
-  __ j(EQUAL, &done, Assembler::kNearJump);
+
+  if (FLAG_enable_type_checks) {
+    __ CompareObject(reg, Bool::True());
+    __ j(EQUAL, &done, Assembler::kNearJump);
+    __ CompareObject(reg, Bool::False());
+    __ j(EQUAL, &done, Assembler::kNearJump);
+  } else {
+    ASSERT(FLAG_enable_asserts);
+    __ CompareObject(reg, Object::null_instance());
+    __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  }
 
   __ pushl(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos,
@@ -523,7 +532,6 @@
       break;
   }
   ASSERT(hi_cond != OVERFLOW && lo_cond != OVERFLOW);
-  Label is_true, is_false;
   // Compare upper halves first.
   __ cmpl(left2, right2);
   __ j(hi_cond, labels.true_label);
@@ -939,9 +947,14 @@
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register object = locs()->in(0).reg();
+  Register obj = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ movl(result, FieldAddress(object, offset()));
+  if (object()->definition()->representation() == kUntagged) {
+    __ movl(result, Address(obj, offset()));
+  } else {
+    ASSERT(object()->definition()->representation() == kTagged);
+    __ movl(result, FieldAddress(obj, offset()));
+  }
 }
 
 
@@ -3674,6 +3687,13 @@
                       FieldAddress(value, hi_offset),
                       temp,
                       out_of_range);
+  } else if (!CanDeoptimize()) {
+    ASSERT(value == result);
+    Label done;
+    __ SmiUntag(value);
+    __ j(NOT_CARRY, &done);
+    __ movl(value, Address(value, TIMES_2, lo_offset));
+    __ Bind(&done);
   } else {
     ASSERT(value == result);
     Label done;
@@ -3725,11 +3745,12 @@
 
 
 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
+  // The string register points to the backing store for external strings.
+  const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
   Address element_address = Assembler::ElementAddressForRegIndex(
-        IsExternal(), class_id(), index_scale(), array, index.reg());
+        IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 1257aed..4f51f63 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -24,6 +24,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, emit_edge_counters);
+DECLARE_FLAG(bool, enable_asserts);
+DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -41,7 +43,7 @@
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
@@ -70,7 +72,7 @@
 
 
 LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
-                                                         bool opt) const {
+                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
@@ -121,8 +123,7 @@
     case GT: return LE;
     case GE: return LT;
     default:
-      OS::Print("Error: Condition not recognized: %d\n", condition);
-      UNIMPLEMENTED();
+      UNREACHABLE();
       return EQ;
   }
 }
@@ -278,7 +279,7 @@
 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("LoadLocalInstr");
   Register result = locs()->out(0).reg();
-  __ lw(result, Address(FP, local().index() * kWordSize));
+  __ LoadFromOffset(result, FP, local().index() * kWordSize);
 }
 
 
@@ -296,7 +297,7 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ sw(value, Address(FP, local().index() * kWordSize));
+  __ StoreToOffset(value, FP, local().index() * kWordSize);
 }
 
 
@@ -399,8 +400,14 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  __ BranchEqual(reg, Bool::True(), &done);
-  __ BranchEqual(reg, Bool::False(), &done);
+
+  if (FLAG_enable_type_checks) {
+    __ BranchEqual(reg, Bool::True(), &done);
+    __ BranchEqual(reg, Bool::False(), &done);
+  } else {
+    ASSERT(FLAG_enable_asserts);
+    __ BranchNotEqual(reg, Object::null_instance(), &done);
+  }
 
   __ Push(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos,
@@ -428,12 +435,13 @@
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
-    const intptr_t kNumTemps = 1;
+    const intptr_t kNumTemps = 0;
     LocationSummary* locs = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresFpuRegister());
-    locs->set_in(1, Location::RequiresFpuRegister());
-    locs->set_temp(0, Location::RequiresRegister());
+    locs->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
+    locs->set_in(1, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -553,8 +561,7 @@
 
 static Condition EmitSmiComparisonOp(FlowGraphCompiler* compiler,
                                      const LocationSummary& locs,
-                                     Token::Kind kind,
-                                     BranchLabels labels) {
+                                     Token::Kind kind) {
   __ TraceSimMsg("EmitSmiComparisonOp");
   __ Comment("EmitSmiComparisonOp");
   Location left = locs.in(0);
@@ -576,6 +583,69 @@
 }
 
 
+static Condition TokenKindToMintCondition(Token::Kind kind) {
+  switch (kind) {
+    case Token::kEQ: return EQ;
+    case Token::kNE: return NE;
+    case Token::kLT: return LT;
+    case Token::kGT: return GT;
+    case Token::kLTE: return LE;
+    case Token::kGTE: return GE;
+    default:
+      UNREACHABLE();
+      return VS;
+  }
+}
+
+
+static Condition EmitUnboxedMintEqualityOp(FlowGraphCompiler* compiler,
+                                           const LocationSummary& locs,
+                                           Token::Kind kind) {
+  __ TraceSimMsg("EmitUnboxedMintEqualityOp");
+  __ Comment("EmitUnboxedMintEqualityOp");
+  ASSERT(Token::IsEqualityOperator(kind));
+  PairLocation* left_pair = locs.in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* right_pair = locs.in(1).AsPairLocation();
+  Register right_lo = right_pair->At(0).reg();
+  Register right_hi = right_pair->At(1).reg();
+
+  __ xor_(CMPRES1, left_lo, right_lo);
+  __ xor_(CMPRES2, left_hi, right_hi);
+  __ or_(CMPRES1, CMPRES1, CMPRES2);
+  __ mov(CMPRES2, ZR);
+  return TokenKindToMintCondition(kind);
+}
+
+
+static Condition EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler,
+                                             const LocationSummary& locs,
+                                             Token::Kind kind) {
+  __ TraceSimMsg("EmitUnboxedMintComparisonOp");
+  __ Comment("EmitUnboxedMintComparisonOp");
+  PairLocation* left_pair = locs.in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* right_pair = locs.in(1).AsPairLocation();
+  Register right_lo = right_pair->At(0).reg();
+  Register right_hi = right_pair->At(1).reg();
+
+  Label done;
+  // Compare upper halves first.
+  __ slt(CMPRES1, left_hi, right_hi);
+  __ slt(CMPRES2, right_hi, left_hi);
+  // If higher words aren't equal, skip comparing lower words.
+  __ bne(CMPRES1, CMPRES2, &done);
+
+  __ sltu(CMPRES1, left_lo, right_lo);
+  __ sltu(CMPRES2, right_lo, left_lo);
+  __ Bind(&done);
+
+  return TokenKindToMintCondition(kind);
+}
+
+
 static Condition TokenKindToDoubleCondition(Token::Kind kind) {
   switch (kind) {
     case Token::kEQ: return EQ;
@@ -637,7 +707,9 @@
 Condition EqualityCompareInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                    BranchLabels labels) {
   if (operation_cid() == kSmiCid) {
-    return EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+    return EmitSmiComparisonOp(compiler, *locs(), kind());
+  } else if (operation_cid() == kMintCid) {
+    return EmitUnboxedMintEqualityOp(compiler, *locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
@@ -801,13 +873,13 @@
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
-    const intptr_t kNumTemps = 2;
+    const intptr_t kNumTemps = 0;
     LocationSummary* locs = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-    locs->set_in(0, Location::RequiresFpuRegister());
-    locs->set_in(1, Location::RequiresFpuRegister());
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_temp(1, Location::RequiresRegister());
+    locs->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
+    locs->set_in(1, Location::Pair(Location::RequiresRegister(),
+                                   Location::RequiresRegister()));
     locs->set_out(0, Location::RequiresRegister());
     return locs;
   }
@@ -836,7 +908,9 @@
 Condition RelationalOpInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
                                                 BranchLabels labels) {
   if (operation_cid() == kSmiCid) {
-    return EmitSmiComparisonOp(compiler, *locs(), kind(), labels);
+    return EmitSmiComparisonOp(compiler, *locs(), kind());
+  } else if (operation_cid() == kMintCid) {
+    return EmitUnboxedMintComparisonOp(compiler, *locs(), kind());
   } else {
     ASSERT(operation_cid() == kDoubleCid);
     return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels);
@@ -1022,9 +1096,14 @@
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register object = locs()->in(0).reg();
+  Register obj = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadFromOffset(result, object, offset() - kHeapObjectTag);
+  if (object()->definition()->representation() == kUntagged) {
+    __ LoadFromOffset(result, obj, offset());
+  } else {
+    ASSERT(object()->definition()->representation() == kTagged);
+    __ LoadFieldFromOffset(result, obj, offset());
+  }
 }
 
 
@@ -1191,13 +1270,16 @@
   if ((representation() == kUnboxedUint32) ||
       (representation() == kUnboxedInt32)) {
     const Register result = locs()->out(0).reg();
+    if ((index_scale() == 1) && index.IsRegister()) {
+      __ SmiUntag(index.reg());
+    }
     switch (class_id()) {
       case kTypedDataInt32ArrayCid:
-        ASSERT(representation() == kUnboxedUint32);
+        ASSERT(representation() == kUnboxedInt32);
         __ lw(result, element_address);
         break;
       case kTypedDataUint32ArrayCid:
-        ASSERT(representation() == kUnboxedInt32);
+        ASSERT(representation() == kUnboxedUint32);
         __ lw(result, element_address);
         break;
       default:
@@ -1259,17 +1341,19 @@
 
 
 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
+  // The string register points to the backing store for external strings.
+  const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
   Address element_address = __ ElementAddressForRegIndex(
-        true, IsExternal(), class_id(), index_scale(), array, index.reg());
+        true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register TMP as base.
 
   ASSERT(representation() == kTagged);
   Register result = locs()->out(0).reg();
   switch (class_id()) {
     case kOneByteStringCid:
+    case kExternalOneByteStringCid:
       switch (element_count()) {
         case 1: __ lbu(result, element_address); break;
         case 2: __ lhu(result, element_address); break;
@@ -1279,6 +1363,7 @@
       __ SmiTag(result);
       break;
     case kTwoByteStringCid:
+    case kExternalTwoByteStringCid:
       switch (element_count()) {
         case 1: __ lhu(result, element_address); break;
         case 2:  // Loading multiple code units is disabled on MIPS.
@@ -1385,6 +1470,7 @@
       : __ ElementAddressForIntIndex(
             IsExternal(), class_id(), index_scale(),
             array, Smi::Cast(index.constant()).Value());
+  ASSERT(element_address.base() != TMP);  // Allowed for load only.
 
   switch (class_id()) {
     case kArrayCid:
@@ -1980,7 +2066,7 @@
   __ TraceSimMsg("LoadStaticFieldInstr");
   Register field = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ lw(result, FieldAddress(field, Field::value_offset()));
+  __ LoadFromOffset(result, field, Field::value_offset() - kHeapObjectTag);
 }
 
 
@@ -2241,8 +2327,7 @@
 
     __ Bind(&load_pointer);
   }
-  __ LoadFromOffset(
-      result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
+  __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes());
   __ Bind(&done);
 }
 
@@ -2570,10 +2655,10 @@
 
   // Restore stack and initialize the two exception variables:
   // exception and stack trace variables.
-  __ sw(kExceptionObjectReg,
-        Address(FP, exception_var().index() * kWordSize));
-  __ sw(kStackTraceObjectReg,
-        Address(FP, stacktrace_var().index() * kWordSize));
+  __ StoreToOffset(kExceptionObjectReg,
+                   FP, exception_var().index() * kWordSize);
+  __ StoreToOffset(kStackTraceObjectReg,
+                   FP, stacktrace_var().index() * kWordSize);
 }
 
 
@@ -3149,7 +3234,12 @@
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
-  summary->set_out(0, Location::RequiresFpuRegister());
+  if (representation() == kUnboxedMint) {
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
+  } else {
+    summary->set_out(0, Location::RequiresFpuRegister());
+  }
   return summary;
 }
 
@@ -3159,7 +3249,13 @@
 
   switch (representation()) {
     case kUnboxedMint: {
-      UNIMPLEMENTED();
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      __ LoadFromOffset(result->At(0).reg(),
+                        box,
+                        ValueOffset() - kHeapObjectTag);
+      __ LoadFromOffset(result->At(1).reg(),
+                        box,
+                        ValueOffset() - kHeapObjectTag + kWordSize);
       break;
     }
 
@@ -3188,7 +3284,9 @@
 
   switch (representation()) {
     case kUnboxedMint: {
-      UNIMPLEMENTED();
+      PairLocation* result = locs()->out(0).AsPairLocation();
+      __ SmiUntag(result->At(0).reg(), box);
+      __ sra(result->At(1).reg(), result->At(0).reg(), 31);
       break;
     }
 
@@ -3264,10 +3362,10 @@
   Register out = locs()->out(0).reg();
   ASSERT(value != out);
 
-  Label done;
   __ SmiTag(out, value);
   if (!ValueFitsSmi()) {
     Register temp = locs()->temp(0).reg();
+    Label done;
     if (from_representation() == kUnboxedInt32) {
       __ SmiUntag(CMPRES1, out);
       __ BranchEqual(CMPRES1, value, &done);
@@ -3301,7 +3399,62 @@
 }
 
 
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr);
+LocationSummary* BoxInt64Instr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate,
+      kNumInputs,
+      kNumTemps,
+      ValueFitsSmi() ? LocationSummary::kNoCall
+                     : LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  if (!ValueFitsSmi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxInt64Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (ValueFitsSmi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ SmiTag(out_reg, value_lo);
+    return;
+  }
+
+  PairLocation* value_pair = locs()->in(0).AsPairLocation();
+  Register value_lo = value_pair->At(0).reg();
+  Register value_hi = value_pair->At(1).reg();
+  Register tmp = locs()->temp(0).reg();
+  Register out_reg = locs()->out(0).reg();
+
+  Label not_smi, done;
+  __ SmiTag(out_reg, value_lo);
+  __ SmiUntag(tmp, out_reg);
+  __ bne(tmp, value_lo, &not_smi);
+  __ delay_slot()->sra(tmp, out_reg, 31);
+  __ beq(tmp, value_hi, &done);
+
+  __ Bind(&not_smi);
+  BoxAllocationSlowPath::Allocate(
+      compiler,
+      this,
+      compiler->mint_class(),
+      out_reg,
+      tmp);
+  __ StoreToOffset(value_lo, out_reg, Mint::value_offset() - kHeapObjectTag);
+  __ StoreToOffset(value_hi,
+                   out_reg,
+                   Mint::value_offset() - kHeapObjectTag + kWordSize);
+  __ Bind(&done);
+}
+
 
 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate,
                                                           bool opt) const {
@@ -3321,13 +3474,11 @@
                               Register mint,
                               Register result,
                               Label* deopt) {
-  __ LoadFromOffset(result,
-                    mint,
-                    Mint::value_offset() - kHeapObjectTag);
+  __ LoadFieldFromOffset(result, mint, Mint::value_offset());
   if (deopt != NULL) {
-    __ LoadFromOffset(CMPRES1,
-                      mint,
-                      Mint::value_offset() - kHeapObjectTag + kWordSize);
+    __ LoadFieldFromOffset(CMPRES1,
+                           mint,
+                           Mint::value_offset() + kWordSize);
     __ sra(CMPRES2, result, kBitsPerWord - 1);
     __ BranchNotEqual(CMPRES1, CMPRES2, deopt);
   }
@@ -3347,6 +3498,13 @@
     __ SmiUntag(out, value);
   } else if (value_cid == kMintCid) {
     LoadInt32FromMint(compiler, value, out, out_of_range);
+  } else if (!CanDeoptimize()) {
+    Label done;
+    __ SmiUntag(out, value);
+    __ andi(CMPRES1, value, Immediate(kSmiTagMask));
+    __ beq(CMPRES1, ZR, &done);
+    LoadInt32FromMint(compiler, value, out, NULL);
+    __ Bind(&done);
   } else {
     Label done;
     __ SmiUntag(out, value);
@@ -4441,7 +4599,7 @@
   }
 
   // Load receiver into T0.
-  __ lw(T0, Address(SP, (instance_call()->ArgumentCount() - 1) * kWordSize));
+  __ LoadFromOffset(T0, SP, (instance_call()->ArgumentCount() - 1) * kWordSize);
 
   Label* deopt = compiler->AddDeoptStub(
       deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail);
@@ -4645,15 +4803,300 @@
   }
 }
 
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryMintOpInstr);
-
-bool ShiftMintOpInstr::has_shift_count_check() const {
-  UNREACHABLE();
-  return false;
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_in(1, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+  return summary;
 }
 
-DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftMintOpInstr);
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryMintOpInstr);
+
+void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  PairLocation* left_pair = locs()->in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* right_pair = locs()->in(1).AsPairLocation();
+  Register right_lo = right_pair->At(0).reg();
+  Register right_hi = right_pair->At(1).reg();
+  PairLocation* out_pair = locs()->out(0).AsPairLocation();
+  Register out_lo = out_pair->At(0).reg();
+  Register out_hi = out_pair->At(1).reg();
+
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryMintOp);
+  }
+  switch (op_kind()) {
+    case Token::kBIT_AND: {
+      __ and_(out_lo, left_lo, right_lo);
+      __ and_(out_hi, left_hi, right_hi);
+      break;
+    }
+    case Token::kBIT_OR: {
+      __ or_(out_lo, left_lo, right_lo);
+      __ or_(out_hi, left_hi, right_hi);
+      break;
+    }
+    case Token::kBIT_XOR: {
+     __ xor_(out_lo, left_lo, right_lo);
+     __ xor_(out_hi, left_hi, right_hi);
+     break;
+    }
+    case Token::kADD:
+    case Token::kSUB: {
+      if (op_kind() == Token::kADD) {
+        __ addu(out_lo, left_lo, right_lo);
+        __ sltu(TMP, out_lo, left_lo);  // TMP = carry of left_lo + right_lo.
+        __ addu(out_hi, left_hi, right_hi);
+        __ addu(out_hi, out_hi, TMP);
+        if (can_overflow()) {
+          __ xor_(CMPRES1, out_hi, left_hi);
+          __ xor_(TMP, out_hi, right_hi);
+          __ and_(CMPRES1, TMP, CMPRES1);
+          __ bltz(CMPRES1, deopt);
+        }
+      } else {
+        __ subu(out_lo, left_lo, right_lo);
+        __ sltu(TMP, left_lo, out_lo);  // TMP = borrow of left_lo - right_lo.
+        __ subu(out_hi, left_hi, right_hi);
+        __ subu(out_hi, out_hi, TMP);
+        if (can_overflow()) {
+          __ xor_(CMPRES1, out_hi, left_hi);
+          __ xor_(TMP, left_hi, right_hi);
+          __ and_(CMPRES1, TMP, CMPRES1);
+          __ bltz(CMPRES1, deopt);
+        }
+      }
+      break;
+    }
+    case Token::kMUL: {
+      // The product of two signed 32-bit integers fits in a signed 64-bit
+      // result without causing overflow.
+      // We deopt on larger inputs.
+      // TODO(regis): Range analysis may eliminate the deopt check.
+      __ sra(CMPRES1, left_lo, 31);
+      __ bne(CMPRES1, left_hi, deopt);
+      __ delay_slot()->sra(CMPRES2, right_lo, 31);
+      __ bne(CMPRES2, right_hi, deopt);
+      __ delay_slot()->mult(left_lo, right_lo);
+      __ mflo(out_lo);
+      __ mfhi(out_hi);
+      break;
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+  summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+  return summary;
+}
+
+
+static const intptr_t kMintShiftCountLimit = 63;
+
+bool ShiftMintOpInstr::has_shift_count_check() const {
+  return !RangeUtils::IsWithin(
+      right()->definition()->range(), 0, kMintShiftCountLimit);
+}
+
+
+void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  PairLocation* left_pair = locs()->in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+  PairLocation* out_pair = locs()->out(0).AsPairLocation();
+  Register out_lo = out_pair->At(0).reg();
+  Register out_hi = out_pair->At(1).reg();
+
+  Label* deopt = NULL;
+  if (CanDeoptimize()) {
+    deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
+  }
+  if (locs()->in(1).IsConstant()) {
+    // Code for a constant shift amount.
+    ASSERT(locs()->in(1).constant().IsSmi());
+    const int32_t shift =
+        reinterpret_cast<int32_t>(locs()->in(1).constant().raw()) >> 1;
+    switch (op_kind()) {
+      case Token::kSHR: {
+        if (shift < 32) {
+          __ sll(out_lo, left_hi, 32 - shift);
+          __ srl(TMP, left_lo, shift);
+          __ or_(out_lo, out_lo, TMP);
+          __ sra(out_hi, left_hi, shift);
+        } else {
+          __ sra(out_lo, left_hi, shift - 32);
+          __ sra(out_hi, left_hi, 31);
+        }
+        break;
+      }
+      case Token::kSHL: {
+        if (shift < 32) {
+          __ srl(out_hi, left_lo, 32 - shift);
+          __ sll(TMP, left_hi, shift);
+          __ or_(out_hi, out_hi, TMP);
+          __ sll(out_lo, left_lo, shift);
+        } else {
+          __ sll(out_hi, left_lo, shift - 32);
+          __ mov(out_lo, ZR);
+        }
+        // Check for overflow.
+        if (can_overflow()) {
+          // Compare high word from input with shifted high word from output.
+          // Overflow if they aren't equal.
+          // If shift > 32, also compare low word from input with high word from
+          // output shifted back shift - 32.
+          if (shift > 32) {
+            __ sra(TMP, out_hi, shift - 32);
+            __ bne(left_lo, TMP, deopt);
+            __ delay_slot()->sra(TMP, out_hi, 31);
+          } else if (shift == 32) {
+            __ sra(TMP, out_hi, 31);
+          } else {
+            __ sra(TMP, out_hi, shift);
+          }
+          __ bne(left_hi, TMP, deopt);
+        }
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  } else {
+    // Code for a variable shift amount.
+    Register shift = locs()->in(1).reg();
+
+    // Deopt if shift is larger than 63 or less than 0.
+    if (has_shift_count_check()) {
+      __ sltiu(CMPRES1, shift, Immediate(2*(kMintShiftCountLimit + 1)));
+      __ beq(CMPRES1, ZR, deopt);
+      // Untag shift count.
+      __ delay_slot()->SmiUntag(shift);
+    } else {
+      // Untag shift count.
+      __ SmiUntag(shift);
+    }
+
+    switch (op_kind()) {
+      case Token::kSHR: {
+        Label large_shift, done;
+        __ sltiu(CMPRES1, shift, Immediate(32));
+        __ beq(CMPRES1, ZR, &large_shift);
+
+        // shift < 32.
+        __ delay_slot()->ori(TMP, ZR, Immediate(32));
+        __ subu(TMP, TMP, shift);  // TMP = 32 - shift; 0 < TMP <= 31.
+        __ sllv(out_lo, left_hi, TMP);
+        __ srlv(TMP, left_lo, shift);
+        __ or_(out_lo, out_lo, TMP);
+        __ b(&done);
+        __ delay_slot()->srav(out_hi, left_hi, shift);
+
+        // shift >= 32.
+        __ Bind(&large_shift);
+        __ sra(out_hi, left_hi, 31);
+        __ srav(out_lo, left_hi, shift);  // Only 5 low bits of shift used.
+
+        __ Bind(&done);
+        break;
+      }
+      case Token::kSHL: {
+        Label large_shift, done;
+        __ sltiu(CMPRES1, shift, Immediate(32));
+        __ beq(CMPRES1, ZR, &large_shift);
+
+        // shift < 32.
+        __ delay_slot()->ori(TMP, ZR, Immediate(32));
+        __ subu(TMP, TMP, shift);  // TMP = 32 - shift; 0 < TMP <= 31.
+        __ srlv(out_hi, left_lo, TMP);
+        __ sllv(TMP, left_hi, shift);
+        __ or_(out_hi, out_hi, TMP);
+        // Check for overflow.
+        if (can_overflow()) {
+          // Compare high word from input with shifted high word from output.
+          __ srav(TMP, out_hi, shift);
+          __ beq(TMP, left_hi, &done);
+          __ delay_slot()->sllv(out_lo, left_lo, shift);
+          __ b(deopt);
+        } else {
+          __ b(&done);
+          __ delay_slot()->sllv(out_lo, left_lo, shift);
+        }
+
+        // shift >= 32.
+        __ Bind(&large_shift);
+        __ sllv(out_hi, left_lo, shift);  // Only 5 low bits of shift used.
+        // Check for overflow.
+        if (can_overflow()) {
+          // Compare low word from input with shifted high word from output and
+          // high word from input to sign of output.
+          // Overflow if they aren't equal.
+          __ srav(TMP, out_hi, shift);
+          __ bne(TMP, left_lo, deopt);
+          __ delay_slot()->sra(TMP, out_hi, 31);
+          __ bne(TMP, left_hi, deopt);
+          __ delay_slot()->mov(out_lo, ZR);
+        } else {
+          __ mov(out_lo, ZR);
+        }
+        __ Bind(&done);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+}
+
+
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                    Location::RequiresRegister()));
+  summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                     Location::RequiresRegister()));
+  return summary;
+}
+
+
+void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  ASSERT(op_kind() == Token::kBIT_NOT);
+  PairLocation* left_pair = locs()->in(0).AsPairLocation();
+  Register left_lo = left_pair->At(0).reg();
+  Register left_hi = left_pair->At(1).reg();
+
+  PairLocation* out_pair = locs()->out(0).AsPairLocation();
+  Register out_lo = out_pair->At(0).reg();
+  Register out_hi = out_pair->At(1).reg();
+
+  __ nor(out_lo, ZR, left_lo);
+  __ nor(out_hi, ZR, left_hi);
+}
+
 
 CompileType BinaryUint32OpInstr::ComputeType() const {
   return CompileType::Int();
@@ -4670,9 +5113,142 @@
 }
 
 
-DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
-DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  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:
+      __ and_(out, left, right);
+      break;
+    case Token::kBIT_OR:
+      __ or_(out, left, right);
+      break;
+    case Token::kBIT_XOR:
+      __ xor_(out, left, right);
+      break;
+    case Token::kADD:
+      __ addu(out, left, right);
+      break;
+    case Token::kSUB:
+      __ subu(out, left, right);
+      break;
+    case Token::kMUL:
+      __ multu(left, right);
+      __ mflo(out);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t kShifterLimit = 31;
+
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  ASSERT(left != out);
+
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
+
+  if (locs()->in(1).IsConstant()) {
+    // Shifter is constant.
+
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    const intptr_t shift_value = Smi::Cast(constant).Value();
+
+    // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
+    switch (op_kind()) {
+      case Token::kSHR:
+        __ srl(out, left, shift_value);
+        break;
+      case Token::kSHL:
+        __ sll(out, left, shift_value);
+        break;
+      default:
+        UNREACHABLE();
+    }
+    return;
+  }
+
+  // Non constant shift value.
+  Register shifter = locs()->in(1).reg();
+
+  __ SmiUntag(temp, shifter);
+  // If shift value is < 0, deoptimize.
+  __ bltz(temp, deopt);
+  __ delay_slot()->mov(out, left);
+  __ sltiu(CMPRES1, temp, Immediate(kShifterLimit + 1));
+  __ movz(out, ZR, CMPRES1);  // out = shift > kShifterLimit ? 0 : left.
+  // Do the shift % 32.
+  switch (op_kind()) {
+    case Token::kSHR:
+      __ srlv(out, out, temp);
+      break;
+    case Token::kSHL:
+      __ sllv(out, out, temp);
+      break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left != out);
+
+  ASSERT(op_kind() == Token::kBIT_NOT);
+
+  __ nor(out, ZR, left);
+}
+
+
 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
 
 
@@ -4683,9 +5259,15 @@
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (from() == kUnboxedMint) {
-    UNREACHABLE();
+    ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
+    summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+    summary->set_out(0, Location::RequiresRegister());
   } else if (to() == kUnboxedMint) {
-    UNREACHABLE();
+    ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
   } else {
     ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
     ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
@@ -4711,10 +5293,34 @@
       __ BranchSignedLess(out, Immediate(0), deopt);
     }
   } else if (from() == kUnboxedMint) {
-    UNREACHABLE();
-  } else if (to() == kUnboxedMint) {
-    ASSERT(from() == kUnboxedUint32 || from() == kUnboxedInt32);
-    UNREACHABLE();
+    ASSERT(to() == kUnboxedUint32 || to() == kUnboxedInt32);
+    PairLocation* in_pair = locs()->in(0).AsPairLocation();
+    Register in_lo = in_pair->At(0).reg();
+    Register in_hi = in_pair->At(1).reg();
+    Register out = locs()->out(0).reg();
+    // Copy low word.
+    __ mov(out, in_lo);
+    if (CanDeoptimize()) {
+      Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
+      ASSERT(to() == kUnboxedInt32);
+      __ sra(TMP, in_lo, 31);
+      __ bne(in_hi, TMP, deopt);
+    }
+  } else if (from() == kUnboxedUint32 || from() == kUnboxedInt32) {
+    ASSERT(to() == kUnboxedMint);
+    Register in = locs()->in(0).reg();
+    PairLocation* out_pair = locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+    // Copy low word.
+    __ mov(out_lo, in);
+    if (from() == kUnboxedUint32) {
+      __ xor_(out_hi, out_hi, out_hi);
+    } else {
+      ASSERT(from() == kUnboxedInt32);
+      __ sra(out_hi, in, 31);
+    }
   } else {
     UNREACHABLE();
   }
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index e45d150..9045aca 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -23,6 +23,8 @@
 namespace dart {
 
 DECLARE_FLAG(bool, emit_edge_counters);
+DECLARE_FLAG(bool, enable_asserts);
+DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
@@ -41,7 +43,7 @@
 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps= 0;
+  const intptr_t kNumTemps = 0;
   LocationSummary* locs = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
@@ -329,10 +331,17 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  __ CompareObject(reg, Bool::True(), PP);
-  __ j(EQUAL, &done, Assembler::kNearJump);
-  __ CompareObject(reg, Bool::False(), PP);
-  __ j(EQUAL, &done, Assembler::kNearJump);
+
+  if (FLAG_enable_type_checks) {
+    __ CompareObject(reg, Bool::True(), PP);
+    __ j(EQUAL, &done, Assembler::kNearJump);
+    __ CompareObject(reg, Bool::False(), PP);
+    __ j(EQUAL, &done, Assembler::kNearJump);
+  } else {
+    ASSERT(FLAG_enable_asserts);
+    __ CompareObject(reg, Object::null_instance(), PP);
+    __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  }
 
   __ pushq(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos,
@@ -889,9 +898,14 @@
 
 
 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register object = locs()->in(0).reg();
+  Register obj = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ movq(result, FieldAddress(object, offset()));
+  if (object()->definition()->representation() == kUntagged) {
+    __ movq(result, Address(obj, offset()));
+  } else {
+    ASSERT(object()->definition()->representation() == kTagged);
+    __ movq(result, FieldAddress(obj, offset()));
+  }
 }
 
 
@@ -1148,11 +1162,12 @@
 
 
 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const Register array = locs()->in(0).reg();
+  // The string register points to the backing store for external strings.
+  const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
   Address element_address = Assembler::ElementAddressForRegIndex(
-        IsExternal(), class_id(), index_scale(), array, index.reg());
+        IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index a59af23..b0802ba 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -138,7 +138,7 @@
                            CatchClauseNode::kInvalidTryIndex);
   GraphEntryInstr* graph_entry = new GraphEntryInstr(
       parsed_function, normal_entry, Isolate::kNoDeoptId);  // No OSR id.
-  FlowGraph* graph = new FlowGraph(builder, graph_entry, block_id);
+  FlowGraph* graph = new FlowGraph(parsed_function, graph_entry, block_id);
   const Function& function = parsed_function->function();
   switch (function.recognized_kind()) {
 #define EMIT_CASE(test_class_name, test_function_name, enum_name, fp)          \
@@ -250,7 +250,7 @@
   }
 
   intptr_t TokenPos() {
-    return flow_graph_->parsed_function().function().token_pos();
+    return flow_graph_->parsed_function()->function().token_pos();
   }
 
  private:
@@ -438,13 +438,13 @@
   PrepareIndexedOp(&builder, array, index, TypedData::length_offset());
 
   const ICData& value_check = ICData::ZoneHandle(ICData::New(
-      flow_graph->parsed_function().function(),
-      String::Handle(flow_graph->parsed_function().function().name()),
+      flow_graph->parsed_function()->function(),
+      String::Handle(flow_graph->parsed_function()->function().name()),
       Object::empty_array(),  // Dummy args. descr.
       Isolate::kNoDeoptId,
       1));
   value_check.AddReceiverCheck(kDoubleCid,
-                               flow_graph->parsed_function().function());
+                               flow_graph->parsed_function()->function());
   builder.AddInstruction(
       new CheckClassInstr(new Value(value),
                           Isolate::kNoDeoptId,
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index f608b5a..4256241 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -132,7 +132,8 @@
 
   // Set the length field in the growable array object to 0.
   __ LoadImmediate(R1, 0);
-  __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ StoreIntoSmiField(FieldAddress(R0, GrowableObjectArray::length_offset()),
+                       R1);
   __ Ret();  // Returns the newly allocated object in R0.
 
   __ Bind(&fall_through);
@@ -193,12 +194,15 @@
 // be greater than the length of the data container.
 // On stack: growable array (+1), length (+0).
 void Intrinsifier::GrowableArraySetLength(Assembler* assembler) {
+  Label fall_through;
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Growable array.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Length value.
-  __ tst(R1, Operand(kSmiTagMask));  // Check for Smi.
-  __ str(R1, FieldAddress(R0, GrowableObjectArray::length_offset()), EQ);
-  __ bx(LR, EQ);
-  // Fall through on non-Smi.
+  __ tst(R1, Operand(kSmiTagMask));
+  __ b(&fall_through, NE);  // Non-smi length.
+  __ StoreIntoSmiField(FieldAddress(R0, GrowableObjectArray::length_offset()),
+                       R1);
+  __ Ret();
+  __ Bind(&fall_through);
 }
 
 
@@ -247,7 +251,8 @@
   const int32_t value_one = reinterpret_cast<int32_t>(Smi::New(1));
   // len = len + 1;
   __ add(R3, R1, Operand(value_one));
-  __ str(R3, FieldAddress(R0, GrowableObjectArray::length_offset()));
+  __ StoreIntoSmiField(FieldAddress(R0, GrowableObjectArray::length_offset()),
+                       R3);
   __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
   ASSERT(kSmiTagShift == 1);
   __ add(R1, R2, Operand(R1, LSL, 1));
@@ -1739,7 +1744,7 @@
   __ Bind(&done);
   __ mov(R0, Operand(1), EQ);
   __ SmiTag(R0);
-  __ str(R0, FieldAddress(R1, String::hash_offset()));
+  __ StoreIntoSmiField(FieldAddress(R1, String::hash_offset()), R0);
   __ Ret();
 }
 
@@ -1812,7 +1817,7 @@
                               R6);
   // Clear hash.
   __ LoadImmediate(TMP, 0);
-  __ str(TMP, FieldAddress(R0, String::hash_offset()));
+  __ StoreIntoSmiField(FieldAddress(R0, String::hash_offset()), TMP);
 
   __ IncrementAllocationStatsWithSize(R4, R2, cid, space);
   __ b(ok);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 6be38c3..7aa282d 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -52,6 +52,21 @@
 #define I (isolate())
 
 
+static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
+  void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
+  return reinterpret_cast<uint8_t*>(new_ptr);
+}
+
+
+static void SerializeObject(const Instance& obj,
+                            uint8_t** obj_data,
+                            intptr_t* obj_len) {
+  MessageWriter writer(obj_data, &allocator);
+  writer.WriteMessage(obj);
+  *obj_len = writer.BytesWritten();
+}
+
+
 void Isolate::RegisterClass(const Class& cls) {
   class_table()->Register(cls);
 }
@@ -89,7 +104,12 @@
   // Keep in sync with isolate_patch.dart.
   enum {
     kPauseMsg = 1,
-    kResumeMsg
+    kResumeMsg = 2,
+    kPingMsg = 3,
+
+    kImmediateAction = 0,
+    kBeforeNextEventAction = 1,
+    kAsEventAction = 2
   };
 
   void HandleLibMessage(const Array& message);
@@ -147,6 +167,50 @@
       }
       break;
     }
+    case kPingMsg: {
+      // [ OOB, kPingMsg, responsePort, pingType ]
+      if (message.Length() != 4) return;
+      const Object& obj2 = Object::Handle(I, message.At(2));
+      if (!obj2.IsSendPort()) return;
+      const SendPort& send_port = SendPort::Cast(obj2);
+      const Object& obj3 = Object::Handle(I, message.At(3));
+      if (!obj3.IsSmi()) return;
+      const intptr_t ping_type = Smi::Cast(obj3).Value();
+      if (ping_type == kImmediateAction) {
+        uint8_t* data = NULL;
+        intptr_t len = 0;
+        SerializeObject(Object::null_instance(), &data, &len);
+        PortMap::PostMessage(new Message(send_port.Id(),
+                                         data, len,
+                                         Message::kNormalPriority));
+      } else if (ping_type == kBeforeNextEventAction) {
+        // Update the message so that it will be handled immediately when it
+        // is picked up from the message queue the next time.
+        message.SetAt(
+            0, Smi::Handle(I, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
+        message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
+        uint8_t* data = NULL;
+        intptr_t len = 0;
+        SerializeObject(message, &data, &len);
+        this->PostMessage(new Message(Message::kIllegalPort,
+                                      data, len,
+                                      Message::kNormalPriority),
+                          true /* at_head */);
+      } else if (ping_type == kAsEventAction) {
+        // Update the message so that it will be handled immediately when it
+        // is picked up from the message queue the next time.
+        message.SetAt(
+            0, Smi::Handle(I, Smi::New(Message::kDelayedIsolateLibOOBMsg)));
+        message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
+        uint8_t* data = NULL;
+        intptr_t len = 0;
+        SerializeObject(message, &data, &len);
+        this->PostMessage(new Message(Message::kIllegalPort,
+                                      data, len,
+                                      Message::kNormalPriority));
+      }
+      break;
+    }
 #if defined(DEBUG)
     // Malformed OOB messages are silently ignored in release builds.
     default:
@@ -180,8 +244,10 @@
 
   // If the message is in band we lookup the handler to dispatch to.  If the
   // receive port was closed, we drop the message without deserializing it.
+  // Illegal port is a special case for artificially enqueued isolate library
+  // messages which are handled in C++ code below.
   Object& msg_handler = Object::Handle(I);
-  if (!message->IsOOB()) {
+  if (!message->IsOOB() && (message->dest_port() != Message::kIllegalPort)) {
     msg_handler = DartLibraryCalls::LookupHandler(message->dest_port());
     if (msg_handler.IsError()) {
       delete message;
@@ -251,6 +317,20 @@
         }
       }
     }
+  } else if (message->dest_port() == Message::kIllegalPort) {
+    // Check whether this is a delayed OOB message which needed handling as
+    // part of the regular message dispatch. All other messages are dropped on
+    // the floor.
+    if (msg.IsArray()) {
+      const Array& msg_arr = Array::Cast(msg);
+      if (msg_arr.Length() > 0) {
+        const Object& oob_tag = Object::Handle(I, msg_arr.At(0));
+        if (oob_tag.IsSmi() &&
+            (Smi::Cast(oob_tag).Value() == Message::kDelayedIsolateLibOOBMsg)) {
+          HandleLibMessage(Array::Cast(msg_arr));
+        }
+      }
+    }
   } else {
     const Object& result = Object::Handle(I,
         DartLibraryCalls::HandleMessage(msg_handler, msg));
@@ -1409,21 +1489,6 @@
 }
 
 
-static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
-  void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
-  return reinterpret_cast<uint8_t*>(new_ptr);
-}
-
-
-static void SerializeObject(const Instance& obj,
-                            uint8_t** obj_data,
-                            intptr_t* obj_len) {
-  MessageWriter writer(obj_data, &allocator);
-  writer.WriteMessage(obj);
-  *obj_len = writer.BytesWritten();
-}
-
-
 static RawInstance* DeserializeObject(Isolate* isolate,
                                       uint8_t* obj_data,
                                       intptr_t obj_len) {
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index 2a83dc7..ea9b986 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -31,7 +31,7 @@
 }
 
 
-void MessageQueue::Enqueue(Message* msg) {
+void MessageQueue::Enqueue(Message* msg, bool before_events) {
   // Make sure messages are not reused.
   ASSERT(msg->next_ == NULL);
   if (head_ == NULL) {
@@ -41,9 +41,34 @@
     tail_ = msg;
   } else {
     ASSERT(tail_ != NULL);
-    // Append at the tail.
-    tail_->next_ = msg;
-    tail_ = msg;
+    if (!before_events) {
+        // Append at the tail.
+        tail_->next_ = msg;
+        tail_ = msg;
+    } else {
+      ASSERT(msg->dest_port() == Message::kIllegalPort);
+      if (head_->dest_port() != Message::kIllegalPort) {
+        msg->next_ = head_;
+        head_ = msg;
+      } else {
+        Message* cur = head_;
+        while (cur->next_ != NULL) {
+          if (cur->next_->dest_port() != Message::kIllegalPort) {
+            // Splice in the new message at the break.
+            msg->next_ = cur->next_;
+            cur->next_ = msg;
+            return;
+          }
+          cur = cur->next_;
+        }
+        // All pending messages are isolate library control messages. Append at
+        // the tail.
+        ASSERT(tail_ == cur);
+        ASSERT(tail_->dest_port() == Message::kIllegalPort);
+        tail_->next_ = msg;
+        tail_ = msg;
+      }
+    }
   }
 }
 
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index 113a943..3c08ae9 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -30,7 +30,8 @@
   typedef enum {
     kIllegalOOB = 0,
     kServiceOOBMsg = 1,
-    kIsolateLibOOBMsg = 2
+    kIsolateLibOOBMsg = 2,
+    kDelayedIsolateLibOOBMsg = 3,
   } OOBMsgTag;
 
   // A port number which is never used.
@@ -50,7 +51,6 @@
         data_(data),
         len_(len),
         priority_(priority) {
-    ASSERT(dest_port != kIllegalPort);
     ASSERT((priority == kNormalPriority) ||
            (delivery_failure_port == kIllegalPort));
   }
@@ -87,7 +87,7 @@
   MessageQueue();
   ~MessageQueue();
 
-  void Enqueue(Message* msg);
+  void Enqueue(Message* msg, bool before_events);
 
   // Gets the next message from the message queue or NULL if no
   // message is available.  This function will not block.
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 1f67d6b..741bbba 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -92,7 +92,7 @@
 }
 
 
-void MessageHandler::PostMessage(Message* message) {
+void MessageHandler::PostMessage(Message* message, bool before_events) {
   MonitorLocker ml(&monitor_);
   if (FLAG_trace_isolates) {
     const char* source_name = "<native code>";
@@ -109,9 +109,9 @@
 
   Message::Priority saved_priority = message->priority();
   if (message->IsOOB()) {
-    oob_queue_->Enqueue(message);
+    oob_queue_->Enqueue(message, before_events);
   } else {
-    queue_->Enqueue(message);
+    queue_->Enqueue(message, before_events);
   }
   message = NULL;  // Do not access message.  May have been deleted.
 
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 0d2cc54..93d2923 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -117,7 +117,9 @@
   virtual Isolate* isolate() const { return NULL; }
 
   // Posts a message on this handler's message queue.
-  void PostMessage(Message* message);
+  // If before_events is true, then the message is enqueued before any pending
+  // events, but after any pending isolate library events.
+  void PostMessage(Message* message, bool before_events = false);
 
   // Notifies this handler that a port is being closed.
   void ClosePort(Dart_Port port);
diff --git a/runtime/vm/message_test.cc b/runtime/vm/message_test.cc
index e2203a3..b02df47 100644
--- a/runtime/vm/message_test.cc
+++ b/runtime/vm/message_test.cc
@@ -22,19 +22,20 @@
 
   const char* str1 = "msg1";
   const char* str2 = "msg2";
+  const char* str3 = "msg3";
+  const char* str4 = "msg4";
+  const char* str5 = "msg5";
+  const char* str6 = "msg6";
 
   // Add two messages.
-  Message* msg1 =
-      new Message(port, AllocMsg(str1), strlen(str1) + 1,
-                  Message::kNormalPriority);
-  queue.Enqueue(msg1);
+  Message* msg1 = new Message(
+      port, AllocMsg(str1), strlen(str1) + 1, Message::kNormalPriority);
+  queue.Enqueue(msg1, false);
   EXPECT(!queue.IsEmpty());
 
-  Message* msg2 =
-      new Message(port, AllocMsg(str2), strlen(str2) + 1,
-                  Message::kNormalPriority);
-
-  queue.Enqueue(msg2);
+  Message* msg2 = new Message(
+      port, AllocMsg(str2), strlen(str2) + 1, Message::kNormalPriority);
+  queue.Enqueue(msg2, false);
   EXPECT(!queue.IsEmpty());
 
   // Remove two messages.
@@ -48,8 +49,55 @@
   EXPECT_STREQ(str2, reinterpret_cast<char*>(msg->data()));
   EXPECT(queue.IsEmpty());
 
+  Message* msg3 = new Message(Message::kIllegalPort,
+                              AllocMsg(str3), strlen(str3) + 1,
+                              Message::kNormalPriority);
+  queue.Enqueue(msg3, true);
+  EXPECT(!queue.IsEmpty());
+
+  Message* msg4 = new Message(Message::kIllegalPort,
+                              AllocMsg(str4), strlen(str4) + 1,
+                              Message::kNormalPriority);
+  queue.Enqueue(msg4, true);
+  EXPECT(!queue.IsEmpty());
+
+  Message* msg5 = new Message(
+      port, AllocMsg(str5), strlen(str5) + 1, Message::kNormalPriority);
+  queue.Enqueue(msg5, false);
+  EXPECT(!queue.IsEmpty());
+
+  Message* msg6 = new Message(Message::kIllegalPort,
+                              AllocMsg(str6), strlen(str6) + 1,
+                              Message::kNormalPriority);
+  queue.Enqueue(msg6, true);
+  EXPECT(!queue.IsEmpty());
+
+  msg = queue.Dequeue();
+  EXPECT(msg != NULL);
+  EXPECT_STREQ(str3, reinterpret_cast<char*>(msg->data()));
+  EXPECT(!queue.IsEmpty());
+
+  msg = queue.Dequeue();
+  EXPECT(msg != NULL);
+  EXPECT_STREQ(str4, reinterpret_cast<char*>(msg->data()));
+  EXPECT(!queue.IsEmpty());
+
+  msg = queue.Dequeue();
+  EXPECT(msg != NULL);
+  EXPECT_STREQ(str6, reinterpret_cast<char*>(msg->data()));
+  EXPECT(!queue.IsEmpty());
+
+  msg = queue.Dequeue();
+  EXPECT(msg != NULL);
+  EXPECT_STREQ(str5, reinterpret_cast<char*>(msg->data()));
+  EXPECT(queue.IsEmpty());
+
   delete msg1;
   delete msg2;
+  delete msg3;
+  delete msg4;
+  delete msg5;
+  delete msg6;
 }
 
 
@@ -65,11 +113,11 @@
   Message* msg1 =
       new Message(port1, AllocMsg(str1), strlen(str1) + 1,
                   Message::kNormalPriority);
-  queue.Enqueue(msg1);
+  queue.Enqueue(msg1, false);
   Message* msg2 =
       new Message(port2, AllocMsg(str2), strlen(str2) + 1,
                   Message::kNormalPriority);
-  queue.Enqueue(msg2);
+  queue.Enqueue(msg2, false);
 
   EXPECT(!queue.IsEmpty());
   queue.Clear();
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
index 9801697..84cd00a 100644
--- a/runtime/vm/method_recognizer.cc
+++ b/runtime/vm/method_recognizer.cc
@@ -37,6 +37,7 @@
 void MethodRecognizer::InitializeState() {
   GrowableArray<Library*> libs(3);
   libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
+  libs.Add(&Library::ZoneHandle(Library::CollectionLibrary()));
   libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
   libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
   libs.Add(&Library::ZoneHandle(Library::InternalLibrary()));
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index e4506e7..4a36585 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -331,7 +331,7 @@
   V(_List, ., ObjectArrayAllocate, 335347617)                                  \
   V(_List, [], ObjectArrayGetIndexed, 390939163)                               \
   V(_List, []=, ObjectArraySetIndexed, 1768442583)                             \
-  V(_List, get:isEmpty, ObjectArrayIsEmpty, 702383416)                         \
+  V(ListMixin, get:isEmpty, ListMixinIsEmpty, 2102252776)                      \
   V(_List, get:iterator, ObjectArrayIterator, 308726049)                       \
   V(_List, forEach, ObjectArrayForEach, 1720909126)                            \
   V(_List, _slice, ObjectArraySlice, 1738717516)                               \
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 557e24d..bbcb076 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -162,28 +162,48 @@
 
 // The following functions are marked as invisible, meaning they will be hidden
 // in the stack trace and will be hidden from reflective access.
-// (Library, class name, method name)
 // Additionally, private functions in dart:* that are native or constructors are
 // marked as invisible by the parser.
 #define INVISIBLE_CLASS_FUNCTIONS(V)                                           \
-  V(CoreLibrary, int, _throwFormatException)                                   \
-  V(CoreLibrary, int, _parse)                                                  \
+  V(AsyncLibrary, _AsyncRun, _scheduleImmediate)                               \
+  V(CoreLibrary, StringBuffer, _addPart)                                       \
   V(CoreLibrary, _Bigint, _absAdd)                                             \
   V(CoreLibrary, _Bigint, _absSub)                                             \
+  V(CoreLibrary, _Bigint, _estQuotientDigit)                                   \
   V(CoreLibrary, _Bigint, _mulAdd)                                             \
   V(CoreLibrary, _Bigint, _sqrAdd)                                             \
-  V(CoreLibrary, _Bigint, _estQuotientDigit)                                   \
+  V(CoreLibrary, _Double, _addFromInteger)                                     \
+  V(CoreLibrary, _Double, _moduloFromInteger)                                  \
+  V(CoreLibrary, _Double, _mulFromInteger)                                     \
+  V(CoreLibrary, _Double, _remainderFromInteger)                               \
+  V(CoreLibrary, _Double, _subFromInteger)                                     \
+  V(CoreLibrary, _Double, _truncDivFromInteger)                                \
   V(CoreLibrary, _Montgomery, _mulMod)                                         \
+  V(CoreLibrary, int, _parse)                                                  \
+  V(CoreLibrary, int, _throwFormatException)                                   \
+
 
 #define INVISIBLE_LIBRARY_FUNCTIONS(V)                                         \
-  V(TypedDataLibrary, _toInt8)                                                 \
+  V(AsyncLibrary, _asyncRunCallback)                                           \
+  V(AsyncLibrary, _rootHandleUncaughtError)                                    \
+  V(AsyncLibrary, _scheduleAsyncCallback)                                      \
+  V(AsyncLibrary, _schedulePriorityAsyncCallback)                              \
+  V(AsyncLibrary, _setScheduleImmediateClosure)                                \
+  V(AsyncLibrary, _setTimerFactoryClosure)                                     \
+  V(IsolateLibrary, _isolateScheduleImmediate)                                 \
+  V(IsolateLibrary, _startIsolate)                                             \
+  V(IsolateLibrary, _startMainIsolate)                                         \
+  V(MirrorsLibrary, _n)                                                        \
+  V(MirrorsLibrary, _s)                                                        \
   V(TypedDataLibrary, _toInt16)                                                \
   V(TypedDataLibrary, _toInt32)                                                \
   V(TypedDataLibrary, _toInt64)                                                \
-  V(TypedDataLibrary, _toUint8)                                                \
+  V(TypedDataLibrary, _toInt8)                                                 \
   V(TypedDataLibrary, _toUint16)                                               \
   V(TypedDataLibrary, _toUint32)                                               \
   V(TypedDataLibrary, _toUint64)                                               \
+  V(TypedDataLibrary, _toUint8)                                                \
+
 
 static void MarkClassFunctionAsInvisible(const Library& lib,
                                          const char* class_name,
@@ -1021,7 +1041,6 @@
   // declared in RawArray.
   cls.set_type_arguments_field_offset(Array::type_arguments_offset());
   cls.set_num_type_arguments(1);
-  cls.set_num_own_type_arguments(1);
 
   // Set up the growable object array class (Has to be done after the array
   // class is setup as one of its field is an array object).
@@ -1030,7 +1049,6 @@
   cls.set_type_arguments_field_offset(
       GrowableObjectArray::type_arguments_offset());
   cls.set_num_type_arguments(1);
-  cls.set_num_own_type_arguments(1);
 
   // canonical_type_arguments_ are Smi terminated.
   // Last element contains the count of used slots.
@@ -1105,7 +1123,6 @@
   object_store->set_immutable_array_class(cls);
   cls.set_type_arguments_field_offset(Array::type_arguments_offset());
   cls.set_num_type_arguments(1);
-  cls.set_num_own_type_arguments(1);
   ASSERT(object_store->immutable_array_class() != object_store->array_class());
   cls.set_is_prefinalized();
   RegisterPrivateClass(cls, Symbols::_ImmutableList(), core_lib);
@@ -1503,7 +1520,7 @@
   CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
 #undef ADD_SET_FIELD
 
-  isolate->object_store()->InitAsyncObjects();
+  isolate->object_store()->InitKnownObjects();
 
   return Error::null();
 }
@@ -2108,6 +2125,19 @@
 }
 
 
+void Class::RemoveFunction(const Function& function) const {
+  const Array& arr = Array::Handle(functions());
+  StorePointer(&raw_ptr()->functions_, Object::empty_array().raw());
+  Function& entry = Function::Handle();
+  for (intptr_t i = 0; i < arr.Length(); i++) {
+    entry ^= arr.At(i);
+    if (function.raw() != entry.raw()) {
+      AddFunction(entry);
+    }
+  }
+}
+
+
 intptr_t Class::FindFunctionIndex(const Function& needle) const {
   Isolate* isolate = Isolate::Current();
   if (EnsureIsFinalized(isolate) != Error::null()) {
@@ -13637,6 +13667,10 @@
       return OneByteString::kBytesPerElement;
     case kTwoByteStringCid:
       return TwoByteString::kBytesPerElement;
+    case kExternalOneByteStringCid:
+      return ExternalOneByteString::kBytesPerElement;
+    case kExternalTwoByteStringCid:
+      return ExternalTwoByteString::kBytesPerElement;
     default:
       UNIMPLEMENTED();
       return 0;
@@ -18327,7 +18361,7 @@
 RawOneByteString* OneByteString::New(const uint16_t* characters,
                                      intptr_t len,
                                      Heap::Space space) {
-  const String& result =String::Handle(OneByteString::New(len, space));
+  const String& result = String::Handle(OneByteString::New(len, space));
   NoGCScope no_gc;
   for (intptr_t i = 0; i < len; ++i) {
     ASSERT(Utf::IsLatin1(characters[i]));
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a46c121..cdf9ddb 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1107,6 +1107,7 @@
   RawArray* functions() const { return raw_ptr()->functions_; }
   void SetFunctions(const Array& value) const;
   void AddFunction(const Function& function) const;
+  void RemoveFunction(const Function& function) const;
   intptr_t FindFunctionIndex(const Function& function) const;
   RawFunction* FunctionFromIndex(intptr_t idx) const;
   intptr_t FindImplicitClosureFunctionIndex(const Function& needle) const;
@@ -2274,6 +2275,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object);
   friend class Class;
+  friend class Parser;  // For set_eval_script.
   // RawFunction::VisitFunctionPointers accesses the private constructor of
   // Function.
   friend class RawFunction;
@@ -6089,6 +6091,10 @@
     return raw_ptr(str)->external_data_->peer();
   }
 
+  static intptr_t external_data_offset() {
+    return OFFSET_OF(RawExternalOneByteString, external_data_);
+  }
+
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = String::kMaxElements;
@@ -6165,6 +6171,10 @@
     return raw_ptr(str)->external_data_->peer();
   }
 
+  static intptr_t external_data_offset() {
+    return OFFSET_OF(RawExternalTwoByteString, external_data_);
+  }
+
   // We use the same maximum elements for all strings.
   static const intptr_t kBytesPerElement = 2;
   static const intptr_t kMaxElements = String::kMaxElements;
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 91a420c..1658291 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -9,6 +9,7 @@
 #include "vm/isolate.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
+#include "vm/reusable_handles.h"
 #include "vm/visitor.h"
 
 namespace dart {
@@ -370,4 +371,94 @@
   return visitor.length();
 }
 
+
+void WritePtr(RawObject* raw, WriteStream* stream) {
+  ASSERT(raw->IsHeapObject());
+  ASSERT(raw->IsOldObject());
+  uword addr = RawObject::ToAddr(raw);
+  ASSERT(Utils::IsAligned(addr, kObjectAlignment));
+  // Using units of kObjectAlignment makes the ids fit into Smis when parsed
+  // in the Dart code of the Observatory.
+  // TODO(koda): Use delta-encoding/back-references to further compress this.
+  stream->WriteUnsigned(addr / kObjectAlignment);
+}
+
+
+class WritePointerVisitor : public ObjectPointerVisitor {
+ public:
+  WritePointerVisitor(Isolate* isolate, WriteStream* stream)
+      : ObjectPointerVisitor(isolate), stream_(stream), count_(0) {}
+  virtual void VisitPointers(RawObject** first, RawObject** last) {
+    for (RawObject** current = first; current <= last; ++current) {
+      if (!(*current)->IsHeapObject() || (*current == Object::null())) {
+        // Ignore smis and nulls for now.
+        // TODO(koda): To track which field each pointer corresponds to,
+        // we'll need to encode which fields were omitted here.
+        continue;
+      }
+      WritePtr(*current, stream_);
+      ++count_;
+    }
+  }
+
+  intptr_t count() const { return count_; }
+
+ private:
+  WriteStream* stream_;
+  intptr_t count_;
+};
+
+
+void WriteHeader(RawObject* raw, intptr_t size, intptr_t cid,
+                 WriteStream* stream) {
+  WritePtr(raw, stream);
+  ASSERT(Utils::IsAligned(size, kObjectAlignment));
+  stream->WriteUnsigned(size);
+  stream->WriteUnsigned(cid);
+}
+
+
+class WriteGraphVisitor : public ObjectGraph::Visitor {
+ public:
+  WriteGraphVisitor(Isolate* isolate, WriteStream* stream)
+    : stream_(stream), ptr_writer_(isolate, stream), count_(0) {}
+
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    RawObject* raw_obj = it->Get();
+    Isolate* isolate = Isolate::Current();
+    REUSABLE_OBJECT_HANDLESCOPE(isolate);
+    Object& obj = isolate->ObjectHandle();
+    obj = raw_obj;
+    // Each object is a header + a zero-terminated list of its neighbors.
+    WriteHeader(raw_obj, raw_obj->Size(), obj.GetClassId(), stream_);
+    raw_obj->VisitPointers(&ptr_writer_);
+    stream_->WriteUnsigned(0);
+    ++count_;
+    return kProceed;
+  }
+
+  intptr_t count() const { return count_; }
+
+ private:
+  WriteStream* stream_;
+  WritePointerVisitor ptr_writer_;
+  intptr_t count_;
+};
+
+
+void ObjectGraph::Serialize(WriteStream* stream) {
+  // Current encoding assumes objects do not move, so promote everything to old.
+  isolate()->heap()->new_space()->Evacuate();
+  WriteGraphVisitor visitor(isolate(), stream);
+  stream->WriteUnsigned(0);
+  stream->WriteUnsigned(0);
+  stream->WriteUnsigned(0);
+  {
+    WritePointerVisitor ptr_writer(isolate(), stream);
+    isolate()->VisitObjectPointers(&ptr_writer, false, false);
+  }
+  stream->WriteUnsigned(0);
+  IterateObjects(&visitor);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index 5822c7d..a5748b3 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -89,6 +89,10 @@
   // be live due to references from the stack or embedder handles.
   intptr_t InboundReferences(Object* obj, const Array& references);
 
+  // Write the isolate's object graph to 'stream'. Smis and nulls are omitted.
+  // TODO(koda): Document format; support streaming/chunking.
+  void Serialize(WriteStream* stream);
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectGraph);
 };
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 5854176..3cb7d03 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -38,6 +38,7 @@
     future_class_(Class::null()),
     completer_class_(Class::null()),
     stream_iterator_class_(Class::null()),
+    symbol_class_(Class::null()),
     one_byte_string_class_(Class::null()),
     two_byte_string_class_(Class::null()),
     external_one_byte_string_class_(Class::null()),
@@ -170,7 +171,7 @@
 }
 
 
-void ObjectStore::InitAsyncObjects() {
+void ObjectStore::InitKnownObjects() {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL && isolate->object_store() == this);
 
@@ -186,6 +187,10 @@
   cls = async_lib.LookupClass(Symbols::StreamIterator());
   ASSERT(!cls.IsNull());
   set_stream_iterator_class(cls);
+
+  const Library& internal_lib = Library::Handle(internal_library());
+  cls = internal_lib.LookupClass(Symbols::Symbol());
+  set_symbol_class(cls);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index cf123e4..7453dba 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -129,6 +129,11 @@
     stream_iterator_class_ = value.raw();
   }
 
+  RawClass* symbol_class() { return symbol_class_; }
+  void set_symbol_class(const Class& value) {
+    symbol_class_ = value.raw();
+  }
+
   RawClass* one_byte_string_class() const { return one_byte_string_class_; }
   void set_one_byte_string_class(const Class& value) {
     one_byte_string_class_ = value.raw();
@@ -422,7 +427,7 @@
   // information is stored in sticky_error().
   bool PreallocateObjects();
 
-  void InitAsyncObjects();
+  void InitKnownObjects();
 
   static void Init(Isolate* isolate);
 
@@ -453,6 +458,7 @@
   RawClass* future_class_;
   RawClass* completer_class_;
   RawClass* stream_iterator_class_;
+  RawClass* symbol_class_;
   RawClass* one_byte_string_class_;
   RawClass* two_byte_string_class_;
   RawClass* external_one_byte_string_class_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 048f8af..7623f33 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -1106,6 +1106,42 @@
 }
 
 
+RawObject* Parser::ParseFunctionFromSource(const Class& owning_class,
+                                           const String& source) {
+  Isolate* isolate = Isolate::Current();
+  StackZone zone(isolate);
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    const String& uri = String::Handle(Symbols::New("dynamically-added"));
+    const Script& script = Script::Handle(
+        Script::New(uri, source, RawScript::kSourceTag));
+    const Library& owning_library = Library::Handle(owning_class.library());
+    const String& private_key = String::Handle(owning_library.private_key());
+    script.Tokenize(private_key);
+    const intptr_t token_pos = 0;
+    Parser parser(script, owning_library, token_pos);
+    parser.is_top_level_ = true;
+    parser.set_current_class(owning_class);
+    const String& class_name = String::Handle(owning_class.Name());
+    ClassDesc members(owning_class, class_name, false, token_pos);
+    const intptr_t metadata_pos = parser.SkipMetadata();
+    parser.ParseClassMemberDefinition(&members, metadata_pos);
+    ASSERT(members.functions().Length() == 1);
+    const Function& func =
+        Function::ZoneHandle(Function::RawCast(members.functions().At(0)));
+    func.set_eval_script(script);
+    ParsedFunction* parsed_function = new ParsedFunction(isolate, func);
+    Parser::ParseFunction(parsed_function);
+    return func.raw();
+  } else {
+    const Error& error = Error::Handle(isolate->object_store()->sticky_error());
+    isolate->object_store()->clear_sticky_error();
+    return error.raw();
+  }
+  UNREACHABLE();
+}
+
+
 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) {
   TRACE_PARSER("ParseStaticFinalGetter");
   ParamList params;
@@ -3301,7 +3337,6 @@
   TRACE_PARSER("ParseMethodOrConstructor");
   ASSERT(CurrentToken() == Token::kLPAREN || method->IsGetter());
   ASSERT(method->type != NULL);
-  ASSERT(method->name_pos > 0);
   ASSERT(current_member_ == method);
 
   if (method->has_var) {
@@ -6112,7 +6147,7 @@
       Class::ZoneHandle(I, I->object_store()->future_class());
   ASSERT(!future.IsNull());
   const Function& constructor = Function::ZoneHandle(I,
-      future.LookupFunction(Symbols::FutureConstructor()));
+      future.LookupFunction(Symbols::FutureMicrotask()));
   ASSERT(!constructor.IsNull());
   const Class& completer =
       Class::ZoneHandle(I, I->object_store()->completer_class());
@@ -7215,6 +7250,9 @@
     if (val.clazz() != first_value.clazz()) {
       ReportError(val_pos, "all case expressions must be of same type");
     }
+    if (val.clazz() == I->object_store()->symbol_class()) {
+      continue;
+    }
     if (i == 0) {
       // The value is of some type other than int, String or double.
       // Check that the type class does not override the == operator.
@@ -10984,6 +11022,7 @@
       }
       if (!key_value.IsInteger() &&
           !key_value.IsString() &&
+          (key_value.clazz() != I->object_store()->symbol_class()) &&
           ImplementsEqualOperator(key_value)) {
         ReportError(key_pos, "key value must not implement operator ==");
       }
@@ -11178,11 +11217,9 @@
   } else {
     ReportError("illegal symbol literal");
   }
-  // Lookup class Symbol from internal library and call the
-  // constructor to create a symbol instance.
-  const Library& lib = Library::Handle(I, Library::InternalLibrary());
-  const Class& symbol_class = Class::Handle(I,
-                                            lib.LookupClass(Symbols::Symbol()));
+
+  // Call Symbol class constructor to create a symbol instance.
+  const Class& symbol_class = Class::Handle(I->object_store()->symbol_class());
   ASSERT(!symbol_class.IsNull());
   ArgumentListNode* constr_args = new(I) ArgumentListNode(symbol_pos);
   constr_args->Add(new(I) LiteralNode(
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 44f9c77..e951046 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -51,6 +51,7 @@
         expression_temp_var_(NULL),
         finally_return_temp_var_(NULL),
         deferred_prefixes_(new ZoneGrowableArray<const LibraryPrefix*>()),
+        guarded_fields_(new ZoneGrowableArray<const Field*>()),
         first_parameter_index_(0),
         first_stack_local_index_(0),
         num_copied_params_(0),
@@ -132,10 +133,18 @@
   }
   void AddDeferredPrefix(const LibraryPrefix& prefix);
 
+  ZoneGrowableArray<const Field*>* guarded_fields() const {
+    return guarded_fields_;
+  }
+
   int first_parameter_index() const { return first_parameter_index_; }
   int first_stack_local_index() const { return first_stack_local_index_; }
   int num_copied_params() const { return num_copied_params_; }
   int num_stack_locals() const { return num_stack_locals_; }
+  int num_non_copied_params() const {
+    return (num_copied_params_ == 0)
+        ? function().num_fixed_parameters() : 0;
+  }
 
   void AllocateVariables();
   void AllocateIrregexpVariables(intptr_t num_stack_locals);
@@ -174,6 +183,7 @@
   LocalVariable* expression_temp_var_;
   LocalVariable* finally_return_temp_var_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
+  ZoneGrowableArray<const Field*>* guarded_fields_;
 
   int first_parameter_index_;
   int first_stack_local_index_;
@@ -211,6 +221,10 @@
   // given static field.
   static ParsedFunction* ParseStaticFieldInitializer(const Field& field);
 
+  // Returns a RawFunction or RawError.
+  static RawObject* ParseFunctionFromSource(const Class& owning_class,
+                                            const String& source);
+
   // Parse a function to retrieve parameter information that is not retained in
   // the dart::Function object. Returns either an error if the parse fails
   // (which could be the case for local functions), or a flat array of entries
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index e83e01e..5c0f9a9 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1589,6 +1589,10 @@
     return peer_;
   }
 
+  static intptr_t data_offset() {
+    return OFFSET_OF(ExternalStringData<T>, data_);
+  }
+
  private:
   const T* data_;
   void* peer_;
@@ -1598,16 +1602,22 @@
 
 class RawExternalOneByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalOneByteString);
+ public:
+  typedef ExternalStringData<uint8_t> ExternalData;
 
-  ExternalStringData<uint8_t>* external_data_;
+ private:
+  ExternalData* external_data_;
   friend class Api;
 };
 
 
 class RawExternalTwoByteString : public RawString {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExternalTwoByteString);
+ public:
+  typedef ExternalStringData<uint16_t> ExternalData;
 
-  ExternalStringData<uint16_t>* external_data_;
+ private:
+  ExternalData* external_data_;
   friend class Api;
 };
 
diff --git a/runtime/vm/regexp_assembler.cc b/runtime/vm/regexp_assembler.cc
index fa666ae..ace8691 100644
--- a/runtime/vm/regexp_assembler.cc
+++ b/runtime/vm/regexp_assembler.cc
@@ -158,6 +158,7 @@
   match_end_index_ = Local(Symbols::match_end_index());
   char_in_capture_ = Local(Symbols::char_in_capture());
   char_in_match_ = Local(Symbols::char_in_match());
+  index_temp_ = Local(Symbols::index_temp());
   result_ = Local(Symbols::result());
 
   string_param_ = Parameter(Symbols::string_param(), 0);
@@ -944,8 +945,8 @@
     BlockLabel loop;
     BindBlock(&loop);
 
-    StoreLocal(char_in_capture_, CharacterAt(LoadLocal(capture_start_index_)));
-    StoreLocal(char_in_match_, CharacterAt(LoadLocal(match_start_index_)));
+    StoreLocal(char_in_capture_, CharacterAt(capture_start_index_));
+    StoreLocal(char_in_match_, CharacterAt(match_start_index_));
 
     BranchOrBacktrack(Comparison(kEQ,
                                  LoadLocal(char_in_capture_),
@@ -1105,8 +1106,8 @@
   BlockLabel loop;
   BindBlock(&loop);
 
-  StoreLocal(char_in_capture_, CharacterAt(LoadLocal(capture_start_index_)));
-  StoreLocal(char_in_match_, CharacterAt(LoadLocal(match_start_index_)));
+  StoreLocal(char_in_capture_, CharacterAt(capture_start_index_));
+  StoreLocal(char_in_match_, CharacterAt(match_start_index_));
 
   BranchOrBacktrack(Comparison(kNE,
                                LoadLocal(char_in_capture_),
@@ -1765,9 +1766,6 @@
     ASSERT(characters == 1 || characters == 2);
   }
 
-  // Bind the pattern as the load receiver.
-  Value* pattern = BindLoadLocal(*string_param_);
-
   // Calculate the addressed string index as:
   //    cp_offset + current_position_ + string_param_length_
   // TODO(zerny): Avoid generating 'add' instance-calls here.
@@ -1779,30 +1777,53 @@
       PushArgument(Bind(Add(off_arg, pos_arg)));
   PushArgumentInstr* len_arg =
       PushArgument(BindLoadLocal(*string_param_length_));
-  Value* index = Bind(Add(off_pos_arg, len_arg));
+  // Index is stored in a temporary local so that we can later load it safely.
+  StoreLocal(index_temp_, Bind(Add(off_pos_arg, len_arg)));
 
   // Load and store the code units.
-  Value* code_unit_value = LoadCodeUnitsAt(pattern, index, characters);
+  Value* code_unit_value = LoadCodeUnitsAt(index_temp_, characters);
   StoreLocal(current_character_, code_unit_value);
   PRINT(PushLocal(current_character_));
 }
 
 
-Value* IRRegExpMacroAssembler::CharacterAt(Definition* index) {
-  Value* pattern_val = BindLoadLocal(*string_param_);
-  Value* index_val = Bind(index);
-  return LoadCodeUnitsAt(pattern_val, index_val, 1);
+Value* IRRegExpMacroAssembler::CharacterAt(LocalVariable* index) {
+  return LoadCodeUnitsAt(index, 1);
 }
 
 
-// Note: We can't replace pattern with a load-local of string_param_
-// because we need to maintain the stack discipline in unoptimized code.
-Value* IRRegExpMacroAssembler::LoadCodeUnitsAt(Value* pattern,
-                                               Value* index,
+Value* IRRegExpMacroAssembler::LoadCodeUnitsAt(LocalVariable* index,
                                                intptr_t characters) {
+  // Bind the pattern as the load receiver.
+  Value* pattern_val = BindLoadLocal(*string_param_);
+  if (RawObject::IsExternalStringClassId(specialization_cid_)) {
+    // The data of an external string is stored through two indirections.
+    intptr_t external_offset = 0;
+    intptr_t data_offset = 0;
+    if (specialization_cid_ == kExternalOneByteStringCid) {
+      external_offset = ExternalOneByteString::external_data_offset();
+      data_offset = RawExternalOneByteString::ExternalData::data_offset();
+    } else if (specialization_cid_ == kExternalTwoByteStringCid) {
+      external_offset = ExternalTwoByteString::external_data_offset();
+      data_offset = RawExternalTwoByteString::ExternalData::data_offset();
+    } else {
+      UNREACHABLE();
+    }
+    // This pushes untagged values on the stack which are immediately consumed:
+    // the first value is consumed to obtain the second value which is consumed
+    // by LoadCodeUnitsAtInstr below.
+    Value* external_val =
+        Bind(new(I) LoadUntaggedInstr(pattern_val, external_offset));
+    pattern_val =
+        Bind(new(I) LoadUntaggedInstr(external_val, data_offset));
+  }
+
+  // Here pattern_val might be untagged so this must not trigger a GC.
+  Value* index_val = BindLoadLocal(*index);
+
   return Bind(new(I) LoadCodeUnitsInstr(
-      pattern,
-      index,
+      pattern_val,
+      index_val,
       characters,
       specialization_cid_,
       Scanner::kNoSourcePos));
diff --git a/runtime/vm/regexp_assembler.h b/runtime/vm/regexp_assembler.h
index 1c5d4fe..4a4696c 100644
--- a/runtime/vm/regexp_assembler.h
+++ b/runtime/vm/regexp_assembler.h
@@ -469,12 +469,10 @@
                                      intptr_t character_count);
 
   // Returns the character within the passed string at the specified index.
-  Value* CharacterAt(Definition* index);
+  Value* CharacterAt(LocalVariable* index);
 
   // Load a number of characters starting from index in the pattern string.
-  Value* LoadCodeUnitsAt(Value* pattern,
-                         Value* index,
-                         intptr_t character_count);
+  Value* LoadCodeUnitsAt(LocalVariable* index, intptr_t character_count);
 
   // Check whether preemption has been requested.
   void CheckPreemption();
@@ -606,6 +604,7 @@
   LocalVariable* match_end_index_;
   LocalVariable* char_in_capture_;
   LocalVariable* char_in_match_;
+  LocalVariable* index_temp_;
 
   LocalVariable* result_;
 
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
new file mode 100644
index 0000000..4af8974
--- /dev/null
+++ b/runtime/vm/regexp_test.cc
@@ -0,0 +1,123 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/globals.h"
+
+#include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/regexp.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+DECLARE_FLAG(bool, use_jscre);
+
+static RawArray* Match(const String& pat, const String& str) {
+  Isolate* isolate = Isolate::Current();
+  const JSRegExp& regexp = JSRegExp::Handle(
+      RegExpEngine::CreateJSRegExp(isolate, pat, false, false));
+  const intptr_t cid = str.GetClassId();
+  const Function& fn = Function::Handle(regexp.function(cid));
+  EXPECT(!fn.IsNull());
+  const Smi& idx = Smi::Handle(Smi::New(0));
+  return IRRegExpMacroAssembler::Execute(fn, str, idx, Isolate::Current());
+}
+
+TEST_CASE(RegExp_OneByteString) {
+  if (FLAG_use_jscre)
+    return;
+
+  uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  intptr_t len = ARRAY_SIZE(chars);
+  const String& str = String::Handle(
+      OneByteString::New(chars, len, Heap::kNew));
+
+  const String& pat = String::Handle(String::New("bc"));
+  const Array& res = Array::Handle(Match(pat, str));
+  EXPECT_EQ(2, res.Length());
+
+  const Object& res_1 = Object::Handle(res.At(0));
+  const Object& res_2 = Object::Handle(res.At(1));
+  EXPECT(res_1.IsSmi());
+  EXPECT(res_2.IsSmi());
+
+  const Smi& smi_1 = Smi::Cast(res_1);
+  const Smi& smi_2 = Smi::Cast(res_2);
+  EXPECT_EQ(1, smi_1.Value());
+  EXPECT_EQ(3, smi_2.Value());
+}
+
+TEST_CASE(RegExp_TwoByteString) {
+  if (FLAG_use_jscre)
+    return;
+
+  uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  intptr_t len = ARRAY_SIZE(chars);
+  const String& str = String::Handle(
+      TwoByteString::New(chars, len, Heap::kNew));
+
+  const String& pat = String::Handle(String::New("bc"));
+  const Array& res = Array::Handle(Match(pat, str));
+  EXPECT_EQ(2, res.Length());
+
+  const Object& res_1 = Object::Handle(res.At(0));
+  const Object& res_2 = Object::Handle(res.At(1));
+  EXPECT(res_1.IsSmi());
+  EXPECT(res_2.IsSmi());
+
+  const Smi& smi_1 = Smi::Cast(res_1);
+  const Smi& smi_2 = Smi::Cast(res_2);
+  EXPECT_EQ(1, smi_1.Value());
+  EXPECT_EQ(3, smi_2.Value());
+}
+
+TEST_CASE(RegExp_ExternalOneByteString) {
+  if (FLAG_use_jscre)
+    return;
+
+  uint8_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  intptr_t len = ARRAY_SIZE(chars);
+  const String& str = String::Handle(
+      ExternalOneByteString::New(chars, len, NULL, NULL, Heap::kNew));
+
+  const String& pat = String::Handle(String::New("bc"));
+  const Array& res = Array::Handle(Match(pat, str));
+  EXPECT_EQ(2, res.Length());
+
+  const Object& res_1 = Object::Handle(res.At(0));
+  const Object& res_2 = Object::Handle(res.At(1));
+  EXPECT(res_1.IsSmi());
+  EXPECT(res_2.IsSmi());
+
+  const Smi& smi_1 = Smi::Cast(res_1);
+  const Smi& smi_2 = Smi::Cast(res_2);
+  EXPECT_EQ(1, smi_1.Value());
+  EXPECT_EQ(3, smi_2.Value());
+}
+
+TEST_CASE(RegExp_ExternalTwoByteString) {
+  if (FLAG_use_jscre)
+    return;
+
+  uint16_t chars[] = { 'a', 'b', 'c', 'b', 'a' };
+  intptr_t len = ARRAY_SIZE(chars);
+  const String& str = String::Handle(
+      ExternalTwoByteString::New(chars, len, NULL, NULL, Heap::kNew));
+
+  const String& pat = String::Handle(String::New("bc"));
+  const Array& res = Array::Handle(Match(pat, str));
+  EXPECT_EQ(2, res.Length());
+
+  const Object& res_1 = Object::Handle(res.At(0));
+  const Object& res_2 = Object::Handle(res.At(1));
+  EXPECT(res_1.IsSmi());
+  EXPECT(res_2.IsSmi());
+
+  const Smi& smi_1 = Smi::Cast(res_1);
+  const Smi& smi_2 = Smi::Cast(res_2);
+  EXPECT_EQ(1, smi_1.Value());
+  EXPECT_EQ(3, smi_2.Value());
+}
+
+}  // namespace dart
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 1b5e550..75af237 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -159,6 +159,13 @@
   void Scavenge();
   void Scavenge(bool invoke_api_callbacks);
 
+  // Promote all live objects.
+  void Evacuate() {
+    Scavenge();
+    Scavenge();
+    ASSERT(UsedInWords() == 0);
+  }
+
   // Accessors to generate code for inlined allocation.
   uword* TopAddress() { return &top_; }
   uword* EndAddress() { return &end_; }
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index bd204c2..900349a 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -22,6 +22,7 @@
 #include "vm/object_graph.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_store.h"
+#include "vm/parser.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
 #include "vm/reusable_handles.h"
@@ -1276,6 +1277,36 @@
 }
 
 
+static bool HandleFunctionSetSource(
+    Isolate* isolate, const Class& cls, const Function& func, JSONStream* js) {
+  if (js->LookupOption("source") == NULL) {
+    PrintError(js, "set_source expects a 'source' option\n");
+    return true;
+  }
+  const String& source =
+      String::Handle(String::New(js->LookupOption("source")));
+  const Object& result = Object::Handle(
+      Parser::ParseFunctionFromSource(cls, source));
+  if (result.IsError()) {
+    Error::Cast(result).PrintJSON(js, false);
+    return true;
+  }
+  if (!result.IsFunction()) {
+    PrintError(js, "source did not compile to a function.\n");
+    return true;
+  }
+
+  // Replace function.
+  cls.RemoveFunction(func);
+  cls.AddFunction(Function::Cast(result));
+
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "Success");
+  jsobj.AddProperty("id", "");
+  return true;
+}
+
+
 static bool HandleClassesFunctions(Isolate* isolate, const Class& cls,
                                    JSONStream* js) {
   if (js->num_arguments() != 4 && js->num_arguments() != 5) {
@@ -1298,11 +1329,13 @@
     func.PrintJSON(js, false);
     return true;
   } else {
-    const char* subcollection = js->GetArgument(4);
-    if (strcmp(subcollection, "coverage") == 0) {
+    const char* subcommand = js->GetArgument(4);
+    if (strcmp(subcommand, "coverage") == 0) {
       return HandleClassesFunctionsCoverage(isolate, func, js);
+    } else if (strcmp(subcommand, "set_source") == 0) {
+      return HandleFunctionSetSource(isolate, cls, func, js);
     } else {
-      PrintError(js, "Invalid sub collection %s", subcollection);
+      PrintError(js, "Invalid sub command %s", subcommand);
       return true;
     }
   }
@@ -2266,6 +2299,34 @@
 }
 
 
+static bool HandleGraph(Isolate* isolate, JSONStream* js) {
+  Service::SendGraphEvent(isolate);
+  // TODO(koda): Provide some id that ties this request to async response(s).
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "OK");
+  jsobj.AddProperty("id", "ok");
+  return true;
+}
+
+
+void Service::SendGraphEvent(Isolate* isolate) {
+  uint8_t* buffer = NULL;
+  WriteStream stream(&buffer, &allocator, 1 * MB);
+  ObjectGraph graph(isolate);
+  graph.Serialize(&stream);
+  JSONStream js;
+  {
+    JSONObject jsobj(&js);
+    jsobj.AddProperty("type", "ServiceEvent");
+    jsobj.AddPropertyF("id", "_graphEvent");
+    jsobj.AddProperty("eventType", "_Graph");
+    jsobj.AddProperty("isolate", isolate);
+  }
+  const String& message = String::Handle(String::New(js.ToCString()));
+  SendEvent(kEventFamilyDebug, message, buffer, stream.bytes_written());
+}
+
+
 class ContainsAddressVisitor : public FindObjectVisitor {
  public:
   ContainsAddressVisitor(Isolate* isolate, uword addr)
@@ -2302,7 +2363,7 @@
     ContainsAddressVisitor visitor(isolate, addr);
     object = isolate->heap()->FindObject(&visitor);
   }
-  object.PrintJSON(js, true);
+  object.PrintJSON(js, false);
   return true;
 }
 
@@ -2338,6 +2399,7 @@
   { "code", HandleCode },
   { "coverage", HandleCoverage },
   { "debug", HandleDebug },
+  { "graph", HandleGraph },
   { "heapmap", HandleHeapMap },
   { "libraries", HandleLibraries },
   { "metrics", HandleMetrics },
@@ -2467,6 +2529,7 @@
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "VM");
   jsobj.AddProperty("id", "vm");
+  jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord));
   jsobj.AddProperty("targetCPU", CPU::Id());
   jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware());
   jsobj.AddPropertyF("date", "%" Pd64 "", OS::GetCurrentTimeMillis());
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index ec3a807..a7f8d1e 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -71,6 +71,7 @@
   }
 
   static void SendEchoEvent(Isolate* isolate);
+  static void SendGraphEvent(Isolate* isolate);
 
  private:
   // These must be kept in sync with service/constants.dart
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 20863b0..519c2db 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -1074,7 +1074,7 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
-    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection x\","
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub command x\","
     "\"request\":"
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"b\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
@@ -1120,6 +1120,127 @@
 }
 
 
+TEST_CASE(Service_SetSource) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class A {\n"
+      "  a() { return 1; }\n"
+      "  b() { return 0; }\n"
+      "  c(String f) { return f.length; }\n"
+      "}\n"
+      "main() {\n"
+      "  var z = new A();\n"
+      "  return z.a();\n"
+      "}\n"
+      "runB() {\n"
+      "  var z = new A();\n"
+      "  return z.b();\n"
+      "}\n"
+      "runC() {\n"
+      "  var z = new A();\n"
+      "  return z.c();\n"
+      "}\n";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Library& vmlib = Library::Handle();
+  vmlib ^= Api::UnwrapHandle(lib);
+  EXPECT(!vmlib.IsNull());
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+  const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
+  EXPECT(!class_a.IsNull());
+  intptr_t cid = class_a.id();
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+  Array& service_msg = Array::Handle();
+
+  // Request the class A over the service.
+  service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
+  ExpectSubstringF(handler.msg(),
+                   "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
+  ExpectSubstringF(handler.msg(), "\"allocationStats\":");
+  ExpectSubstringF(handler.msg(), "\"tokenPos\":");
+  ExpectSubstringF(handler.msg(), "\"endTokenPos\":");
+
+  // Request function 'b' from class A.
+  service_msg = EvalF(lib,
+                      "[0, port, ['classes', '%" Pd "', 'functions', 'b'],"
+                      "[], []]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg());
+  ExpectSubstringF(handler.msg(),
+                   "\"id\":\"classes\\/%" Pd "\\/functions\\/b\","
+                   "\"name\":\"b\",", cid);
+
+  // Invalid set source of function 'b' from class A.
+  service_msg = EvalF(
+    lib,
+    "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source'],"
+    "[], []]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+  EXPECT_SUBSTRING("set_source expects a 'source' option", handler.msg());
+
+  // Set source (with syntax error) of function 'b' from class A.
+  service_msg = EvalF(
+    lib,
+    "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source'],"
+    "['source'], ['b() { return 4 }']]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+
+  // Set source of function 'b' from class A.
+  service_msg = EvalF(
+    lib,
+    "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source'],"
+    "['source'], ['b() { return 4; }']]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("Success", handler.msg());
+
+  // Run function 'b' see that it is executing replaced code.
+  result = Dart_Invoke(lib, NewString("runB"), 0, NULL);
+  EXPECT_VALID(result);
+  ASSERT(Dart_IsInteger(result));
+  int64_t r;
+  result = Dart_IntegerToInt64(result, &r);
+  EXPECT_VALID(result);
+  EXPECT_EQ(4, r);
+
+  // Set source of function 'c' from class A, changing its signature.
+  service_msg = EvalF(
+    lib,
+    "[0, port, ['classes', '%" Pd "', 'functions', 'c', 'set_source'],"
+    "['source'], ['c() { return 99; }']]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("Success", handler.msg());
+
+  // Run function 'c' see that it is executing replaced code.
+  result = Dart_Invoke(lib, NewString("runC"), 0, NULL);
+  EXPECT_VALID(result);
+  ASSERT(Dart_IsInteger(result));
+  result = Dart_IntegerToInt64(result, &r);
+  EXPECT_VALID(result);
+  EXPECT_EQ(99, r);
+}
+
+
 TEST_CASE(Service_Types) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
@@ -2039,7 +2160,7 @@
     service_msg = Eval(lib, buf);
     Service::HandleIsolateMessage(isolate, service_msg);
     handler.HandleNextMessage();
-    EXPECT_SUBSTRING("\"type\":\"@String\"", handler.msg());
+    EXPECT_SUBSTRING("\"type\":\"String\"", handler.msg());
     EXPECT_SUBSTRING("foobar", handler.msg());
   }
   // Expect null when no object is found.
@@ -2047,8 +2168,8 @@
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   // TODO(turnidge): Should this be a ServiceException instead?
-  EXPECT_STREQ("{\"type\":\"@null\",\"id\":\"objects\\/null\","
-               "\"valueAsString\":\"null\"}",
+  EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\","
+                   "\"valueAsString\":\"null\"",
                handler.msg());
 }
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 6532308..a456c7d 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -25,7 +25,8 @@
 namespace dart {
 
 DEFINE_FLAG(bool, trace_sim, false, "Trace simulator execution.");
-DEFINE_FLAG(int, stop_sim_at, 0, "Address to stop simulator at.");
+DEFINE_FLAG(int, stop_sim_at, 0,
+            "Instruction address or instruction count to stop simulator at.");
 
 
 // This macro provides a platform independent use of sscanf. The reason for
@@ -35,19 +36,6 @@
 #define SScanF sscanf  // NOLINT
 
 
-// Unimplemented counter class for debugging and measurement purposes.
-class StatsCounter {
- public:
-  explicit StatsCounter(const char* name) {
-    // UNIMPLEMENTED();
-  }
-
-  void Increment() {
-    // UNIMPLEMENTED();
-  }
-};
-
-
 // SimulatorSetjmpBuffer are linked together, and the last created one
 // is referenced by the Simulator. When an exception is thrown, the exception
 // runtime looks at where to jump and finds the corresponding
@@ -100,15 +88,9 @@
 
   void Stop(Instr* instr, const char* message);
   void Debug();
-
   char* ReadLine(const char* prompt);
 
  private:
-  static const int32_t kSimulatorBreakpointInstr =  // svc #kBreakpointSvcCode
-    ((AL << kConditionShift) | (0xf << 24) | kBreakpointSvcCode);
-  static const int32_t kNopInstr =  // nop
-    ((AL << kConditionShift) | (0x32 << 20) | (0xf << 12));
-
   Simulator* sim_;
 
   bool GetValue(char* desc, uint32_t* value);
@@ -217,6 +199,10 @@
       return true;
     }
   }
+  if (strcmp("icount", desc) == 0) {
+    *value = sim_->get_icount();
+    return true;
+  }
   bool retval = SScanF(desc, "0x%x", value) == 1;
   if (!retval) {
     retval = SScanF(desc, "%x", value) == 1;
@@ -392,7 +378,7 @@
 
 void SimulatorDebugger::RedoBreakpoints() {
   if (sim_->break_pc_ != NULL) {
-    sim_->break_pc_->SetInstructionBits(kSimulatorBreakpointInstr);
+    sim_->break_pc_->SetInstructionBits(Instr::kSimulatorBreakpointInstruction);
   }
 }
 
@@ -452,7 +438,7 @@
                   "gdb -- transfer control to gdb\n"
                   "h/help -- print this help string\n"
                   "break <address> -- set break point at specified address\n"
-                  "p/print <reg or value or *addr> -- print integer value\n"
+                  "p/print <reg or icount or value or *addr> -- print integer\n"
                   "ps/printsingle <sreg or *addr> -- print float value\n"
                   "pd/printdouble <dreg or *addr> -- print double value\n"
                   "po/printobject <*reg or *addr> -- print object\n"
@@ -540,17 +526,32 @@
           end = start + (10 * Instr::kInstrSize);
         } else if (args == 2) {
           if (GetValue(arg1, &start)) {
-            // no length parameter passed, assume 10 instructions
+            // No length parameter passed, assume 10 instructions.
+            if (Simulator::IsIllegalAddress(start)) {
+              // If start isn't a valid address, warn and use PC instead.
+              OS::Print("First argument yields invalid address: 0x%x\n", start);
+              OS::Print("Using PC instead\n");
+              start = sim_->get_pc();
+            }
             end = start + (10 * Instr::kInstrSize);
           }
         } else {
           uint32_t length;
           if (GetValue(arg1, &start) && GetValue(arg2, &length)) {
+            if (Simulator::IsIllegalAddress(start)) {
+              // If start isn't a valid address, warn and use PC instead.
+              OS::Print("First argument yields invalid address: 0x%x\n", start);
+              OS::Print("Using PC instead\n");
+              start = sim_->get_pc();
+            }
             end = start + (length * Instr::kInstrSize);
           }
         }
-
-        Disassembler::Disassemble(start, end);
+        if ((start > 0) && (end > start)) {
+          Disassembler::Disassemble(start, end);
+        } else {
+          OS::Print("disasm [<address> [<number_of_instructions>]]\n");
+        }
       } else if (strcmp(cmd, "gdb") == 0) {
         OS::Print("relinquishing control to gdb\n");
         OS::DebugBreak();
@@ -587,7 +588,7 @@
         intptr_t stop_pc = sim_->get_pc() - Instr::kInstrSize;
         Instr* stop_instr = reinterpret_cast<Instr*>(stop_pc);
         if (stop_instr->IsSvc() || stop_instr->IsBkpt()) {
-          stop_instr->SetInstructionBits(kNopInstr);
+          stop_instr->SetInstructionBits(Instr::kNopInstruction);
         } else {
           OS::Print("Not at debugger stop.\n");
         }
@@ -618,7 +619,7 @@
 char* SimulatorDebugger::ReadLine(const char* prompt) {
   char* result = NULL;
   char line_buf[256];
-  int offset = 0;
+  intptr_t offset = 0;
   bool keep_going = true;
   OS::Print("%s", prompt);
   while (keep_going) {
@@ -629,7 +630,7 @@
       }
       return NULL;
     }
-    int len = strlen(line_buf);
+    intptr_t len = strlen(line_buf);
     if (len > 1 &&
         line_buf[len - 2] == '\\' &&
         line_buf[len - 1] == '\n') {
@@ -652,7 +653,7 @@
       }
     } else {
       // Allocate a new result with enough room for the new addition.
-      int new_len = offset + len + 1;
+      intptr_t new_len = offset + len + 1;
       char* new_result = new char[new_len];
       if (new_result == NULL) {
         // OOM, free the buffer allocated so far and return NULL.
@@ -797,15 +798,13 @@
   }
 
  private:
-  static const int32_t kRedirectSvcInstruction =
-    ((AL << kConditionShift) | (0xf << 24) | kRedirectionSvcCode);
   Redirection(uword external_function,
               Simulator::CallKind call_kind,
               int argument_count)
       : external_function_(external_function),
         call_kind_(call_kind),
         argument_count_(argument_count),
-        svc_instruction_(kRedirectSvcInstruction),
+        svc_instruction_(Instr::kSimulatorRedirectInstruction),
         next_(list_) {
     list_ = this;
   }
@@ -1002,8 +1001,6 @@
 
 
 intptr_t Simulator::ReadW(uword addr, Instr* instr) {
-  static StatsCounter counter_read_w("Simulated word reads");
-  counter_read_w.Increment();
   if ((addr & 3) == 0) {
     intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
     return *ptr;
@@ -1014,8 +1011,6 @@
 
 
 void Simulator::WriteW(uword addr, intptr_t value, Instr* instr) {
-  static StatsCounter counter_write_w("Simulated word writes");
-  counter_write_w.Increment();
   if ((addr & 3) == 0) {
     intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
     *ptr = value;
@@ -1026,8 +1021,6 @@
 
 
 uint16_t Simulator::ReadHU(uword addr, Instr* instr) {
-  static StatsCounter counter_read_hu("Simulated unsigned halfword reads");
-  counter_read_hu.Increment();
   if ((addr & 1) == 0) {
     uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
     return *ptr;
@@ -1038,8 +1031,6 @@
 
 
 int16_t Simulator::ReadH(uword addr, Instr* instr) {
-  static StatsCounter counter_read_h("Simulated signed halfword reads");
-  counter_read_h.Increment();
   if ((addr & 1) == 0) {
     int16_t* ptr = reinterpret_cast<int16_t*>(addr);
     return *ptr;
@@ -1050,8 +1041,6 @@
 
 
 void Simulator::WriteH(uword addr, uint16_t value, Instr* instr) {
-  static StatsCounter counter_write_h("Simulated halfword writes");
-  counter_write_h.Increment();
   if ((addr & 1) == 0) {
     uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
     *ptr = value;
@@ -1062,24 +1051,18 @@
 
 
 uint8_t Simulator::ReadBU(uword addr) {
-  static StatsCounter counter_read_bu("Simulated unsigned byte reads");
-  counter_read_bu.Increment();
   uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
   return *ptr;
 }
 
 
 int8_t Simulator::ReadB(uword addr) {
-  static StatsCounter counter_read_b("Simulated signed byte reads");
-  counter_read_b.Increment();
   int8_t* ptr = reinterpret_cast<int8_t*>(addr);
   return *ptr;
 }
 
 
 void Simulator::WriteB(uword addr, uint8_t value) {
-  static StatsCounter counter_write_b("Simulated byte writes");
-  counter_write_b.Increment();
   uint8_t* ptr = reinterpret_cast<uint8_t*>(addr);
   *ptr = value;
 }
@@ -1640,16 +1623,6 @@
       dbg.Stop(instr, message);
       break;
     }
-    case kWordSpillMarkerSvcCode: {
-      static StatsCounter counter_spill_w("Simulated word spills");
-      counter_spill_w.Increment();
-      break;
-    }
-    case kDWordSpillMarkerSvcCode: {
-      static StatsCounter counter_spill_d("Simulated double word spills");
-      counter_spill_d.Increment();
-      break;
-    }
     default: {
       UNREACHABLE();
       break;
@@ -3654,8 +3627,6 @@
 
 
 void Simulator::Execute() {
-  static StatsCounter counter_instructions("Simulated instructions");
-
   // Get the PC to simulate. Cannot use the accessor here as we need the
   // raw PC value and not the one used as input to arithmetic instructions.
   uword program_counter = get_pc();
@@ -3666,7 +3637,6 @@
     while (program_counter != kEndSimulatingPC) {
       Instr* instr = reinterpret_cast<Instr*>(program_counter);
       icount_++;
-      counter_instructions.Increment();
       if (IsIllegalAddress(program_counter)) {
         HandleIllegalAccess(program_counter, instr);
       } else {
@@ -3676,14 +3646,16 @@
     }
   } else {
     // FLAG_stop_sim_at is at the non-default value. Stop in the debugger when
-    // we reach the particular instruction count.
+    // we reach the particular instruction count or address.
     while (program_counter != kEndSimulatingPC) {
       Instr* instr = reinterpret_cast<Instr*>(program_counter);
       icount_++;
-      counter_instructions.Increment();
-      if (icount_ == FLAG_stop_sim_at) {
+      if (static_cast<intptr_t>(icount_) == FLAG_stop_sim_at) {
         SimulatorDebugger dbg(this);
         dbg.Stop(instr, "Instruction count reached");
+      } else if (reinterpret_cast<intptr_t>(instr) == FLAG_stop_sim_at) {
+        SimulatorDebugger dbg(this);
+        dbg.Stop(instr, "Instruction address reached");
       } else if (IsIllegalAddress(program_counter)) {
         HandleIllegalAccess(program_counter, instr);
       } else {
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 322c582..12a5ea0 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -72,6 +72,9 @@
   // Accessor to the internal simulator stack top.
   uword StackTop() const;
 
+  // Accessor to the instruction counter.
+  intptr_t get_icount() const { return icount_; }
+
   // The isolate's top_exit_frame_info refers to a Dart frame in the simulator
   // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
   // native stack.
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index d284e1e..2a1efed 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -15,7 +15,6 @@
 
 #include "vm/assembler.h"
 #include "vm/constants_arm64.h"
-#include "vm/cpu.h"
 #include "vm/disassembler.h"
 #include "vm/lockers.h"
 #include "vm/native_arguments.h"
@@ -25,7 +24,8 @@
 namespace dart {
 
 DEFINE_FLAG(bool, trace_sim, false, "Trace simulator execution.");
-DEFINE_FLAG(int, stop_sim_at, 0, "Address to stop simulator at.");
+DEFINE_FLAG(int, stop_sim_at, 0,
+            "Instruction address or instruction count to stop simulator at.");
 
 
 // This macro provides a platform independent use of sscanf. The reason for
@@ -92,11 +92,28 @@
  private:
   Simulator* sim_;
 
-  bool GetValue(char* desc, int64_t* value);
-  bool GetSValue(char* desc, int32_t* value);
-  bool GetDValue(char* desc, int64_t* value);
+  bool GetValue(char* desc, uint64_t* value);
+  bool GetSValue(char* desc, uint32_t* value);
+  bool GetDValue(char* desc, uint64_t* value);
   bool GetQValue(char* desc, simd_value_t* value);
-  // TODO(zra): Breakpoints.
+
+  static intptr_t GetApproximateTokenIndex(const Code& code, uword pc);
+
+  static void PrintDartFrame(uword pc, uword fp, uword sp,
+                             const Function& function,
+                             intptr_t token_pos,
+                             bool is_optimized,
+                             bool is_inlined);
+  void PrintBacktrace();
+
+  // Set or delete a breakpoint. Returns true if successful.
+  bool SetBreakpoint(Instr* breakpc);
+  bool DeleteBreakpoint(Instr* breakpc);
+
+  // Undo and redo all breakpoints. This is needed to bracket disassembly and
+  // execution to skip past breakpoints when run from the debugger.
+  void UndoBreakpoints();
+  void RedoBreakpoints();
 };
 
 
@@ -108,6 +125,7 @@
 SimulatorDebugger::~SimulatorDebugger() {
 }
 
+
 void SimulatorDebugger::Stop(Instr* instr, const char* message) {
   OS::Print("Simulator hit %s\n", message);
   Debug();
@@ -155,7 +173,7 @@
 }
 
 
-bool SimulatorDebugger::GetValue(char* desc, int64_t* value) {
+bool SimulatorDebugger::GetValue(char* desc, uint64_t* value) {
   Register reg = LookupCpuRegisterByName(desc);
   if (reg != kNoRegister) {
     if (reg == ZR) {
@@ -166,7 +184,7 @@
     return true;
   }
   if (desc[0] == '*') {
-    int64_t addr;
+    uint64_t addr;
     if (GetValue(desc + 1, &addr)) {
       if (Simulator::IsIllegalAddress(addr)) {
         return false;
@@ -179,6 +197,10 @@
     *value = sim_->get_pc();
     return true;
   }
+  if (strcmp("icount", desc) == 0) {
+    *value = sim_->get_icount();
+    return true;
+  }
   bool retval = SScanF(desc, "0x%"Px64, value) == 1;
   if (!retval) {
     retval = SScanF(desc, "%"Px64, value) == 1;
@@ -187,19 +209,19 @@
 }
 
 
-bool SimulatorDebugger::GetSValue(char* desc, int32_t* value) {
+bool SimulatorDebugger::GetSValue(char* desc, uint32_t* value) {
   VRegister vreg = LookupVRegisterByName(desc);
   if (vreg != kNoVRegister) {
     *value = sim_->get_vregisters(vreg, 0);
     return true;
   }
   if (desc[0] == '*') {
-    int64_t addr;
+    uint64_t addr;
     if (GetValue(desc + 1, &addr)) {
       if (Simulator::IsIllegalAddress(addr)) {
         return false;
       }
-      *value = *(reinterpret_cast<int32_t*>(addr));
+      *value = *(reinterpret_cast<uint32_t*>(addr));
       return true;
     }
   }
@@ -207,19 +229,19 @@
 }
 
 
-bool SimulatorDebugger::GetDValue(char* desc, int64_t* value) {
+bool SimulatorDebugger::GetDValue(char* desc, uint64_t* value) {
   VRegister vreg = LookupVRegisterByName(desc);
   if (vreg != kNoVRegister) {
     *value = sim_->get_vregisterd(vreg, 0);
     return true;
   }
   if (desc[0] == '*') {
-    int64_t addr;
+    uint64_t addr;
     if (GetValue(desc + 1, &addr)) {
       if (Simulator::IsIllegalAddress(addr)) {
         return false;
       }
-      *value = *(reinterpret_cast<int64_t*>(addr));
+      *value = *(reinterpret_cast<uint64_t*>(addr));
       return true;
     }
   }
@@ -234,7 +256,7 @@
     return true;
   }
   if (desc[0] == '*') {
-    int64_t addr;
+    uint64_t addr;
     if (GetValue(desc + 1, &addr)) {
       if (Simulator::IsIllegalAddress(addr)) {
         return false;
@@ -247,6 +269,138 @@
 }
 
 
+intptr_t SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
+                                                     uword pc) {
+  intptr_t token_pos = -1;
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(code.pc_descriptors());
+  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  while (iter.MoveNext()) {
+    if (iter.Pc() == pc) {
+      return iter.TokenPos();
+    } else if ((token_pos <= 0) && (iter.Pc() > pc)) {
+      token_pos = iter.TokenPos();
+    }
+  }
+  return token_pos;
+}
+
+
+void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp,
+                                       const Function& function,
+                                       intptr_t token_pos,
+                                       bool is_optimized,
+                                       bool is_inlined) {
+  const Script& script = Script::Handle(function.script());
+  const String& func_name = String::Handle(function.QualifiedUserVisibleName());
+  const String& url = String::Handle(script.url());
+  intptr_t line = -1;
+  intptr_t column = -1;
+  if (token_pos >= 0) {
+    script.GetTokenLocation(token_pos, &line, &column);
+  }
+  OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd
+            ":%" Pd ")\n",
+            pc, fp, sp,
+            is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
+            func_name.ToCString(),
+            url.ToCString(),
+            line, column);
+}
+
+
+void SimulatorDebugger::PrintBacktrace() {
+  StackFrameIterator frames(sim_->get_register(FP),
+                            sim_->get_register(SP),
+                            sim_->get_pc(),
+                            StackFrameIterator::kDontValidateFrames);
+  StackFrame* frame = frames.NextFrame();
+  ASSERT(frame != NULL);
+  Function& function = Function::Handle();
+  Function& inlined_function = Function::Handle();
+  Code& code = Code::Handle();
+  Code& unoptimized_code = Code::Handle();
+  while (frame != NULL) {
+    if (frame->IsDartFrame()) {
+      code = frame->LookupDartCode();
+      function = code.function();
+      if (code.is_optimized()) {
+        // For optimized frames, extract all the inlined functions if any
+        // into the stack trace.
+        InlinedFunctionsIterator it(code, frame->pc());
+        while (!it.Done()) {
+          // Print each inlined frame with its pc in the corresponding
+          // unoptimized frame.
+          inlined_function = it.function();
+          unoptimized_code = it.code();
+          uword unoptimized_pc = it.pc();
+          it.Advance();
+          if (!it.Done()) {
+            PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(),
+                           inlined_function,
+                           GetApproximateTokenIndex(unoptimized_code,
+                                                    unoptimized_pc),
+                           true, true);
+          }
+        }
+        // Print the optimized inlining frame below.
+      }
+      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(),
+                     function,
+                     GetApproximateTokenIndex(code, frame->pc()),
+                     code.is_optimized(), false);
+    } else {
+      OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
+                frame->pc(), frame->fp(), frame->sp(),
+                frame->IsEntryFrame() ? "entry" :
+                    frame->IsExitFrame() ? "exit" :
+                        frame->IsStubFrame() ? "stub" : "invalid");
+    }
+    frame = frames.NextFrame();
+  }
+}
+
+
+bool SimulatorDebugger::SetBreakpoint(Instr* breakpc) {
+  // Check if a breakpoint can be set. If not return without any side-effects.
+  if (sim_->break_pc_ != NULL) {
+    return false;
+  }
+
+  // Set the breakpoint.
+  sim_->break_pc_ = breakpc;
+  sim_->break_instr_ = breakpc->InstructionBits();
+  // Not setting the breakpoint instruction in the code itself. It will be set
+  // when the debugger shell continues.
+  return true;
+}
+
+
+bool SimulatorDebugger::DeleteBreakpoint(Instr* breakpc) {
+  if (sim_->break_pc_ != NULL) {
+    sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
+  }
+
+  sim_->break_pc_ = NULL;
+  sim_->break_instr_ = 0;
+  return true;
+}
+
+
+void SimulatorDebugger::UndoBreakpoints() {
+  if (sim_->break_pc_ != NULL) {
+    sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
+  }
+}
+
+
+void SimulatorDebugger::RedoBreakpoints() {
+  if (sim_->break_pc_ != NULL) {
+    sim_->break_pc_->SetInstructionBits(Instr::kSimulatorBreakpointInstruction);
+  }
+}
+
+
 void SimulatorDebugger::Debug() {
   intptr_t last_pc = -1;
   bool done = false;
@@ -266,9 +420,9 @@
   arg1[ARG_SIZE] = 0;
   arg2[ARG_SIZE] = 0;
 
-  // TODO(zra): Undo all set breakpoints while running in the debugger shell.
-  // This will make them invisible to all commands.
-  // UndoBreakpoints();
+  // Undo all set breakpoints while running in the debugger shell. This will
+  // make them invisible to all commands.
+  UndoBreakpoints();
 
   while (!done) {
     if (last_pc != sim_->get_pc()) {
@@ -297,15 +451,20 @@
                   "    disasm <address>\n"
                   "    disasm <address> <number_of_instructions>\n"
                   "  by default 10 instrs are disassembled\n"
+                  "del -- delete breakpoints\n"
                   "flags -- print flag values\n"
                   "gdb -- transfer control to gdb\n"
                   "h/help -- print this help string\n"
-                  "p/print <reg or value or *addr> -- print integer value\n"
+                  "break <address> -- set break point at specified address\n"
+                  "p/print <reg or icount or value or *addr> -- print integer\n"
                   "pf/printfloat <vreg or *addr> --print float value\n"
                   "pd/printdouble <vreg or *addr> -- print double value\n"
                   "pq/printquad <vreg or *addr> -- print vector register\n"
                   "po/printobject <*reg or *addr> -- print object\n"
                   "si/stepi -- single step an instruction\n"
+                  "trace -- toggle execution tracing mode\n"
+                  "bt -- print backtrace\n"
+                  "unstop -- if current pc is a stop instr make it a nop\n"
                   "q/quit -- Quit the debugger and exit the program\n");
       } else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) {
         OS::Print("Quitting\n");
@@ -319,7 +478,7 @@
         done = true;
       } else if ((strcmp(cmd, "p") == 0) || (strcmp(cmd, "print") == 0)) {
         if (args == 2) {
-          int64_t value;
+          uint64_t value;
           if (GetValue(arg1, &value)) {
             OS::Print("%s: %"Pu64" 0x%"Px64"\n", arg1, value, value);
           } else {
@@ -331,9 +490,9 @@
       } else if ((strcmp(cmd, "pf") == 0) ||
                  (strcmp(cmd, "printfloat") == 0)) {
         if (args == 2) {
-          int32_t value;
+          uint32_t value;
           if (GetSValue(arg1, &value)) {
-            float svalue = bit_cast<float, int32_t>(value);
+            float svalue = bit_cast<float, uint32_t>(value);
             OS::Print("%s: %d 0x%x %.8g\n",
                 arg1, value, value, svalue);
           } else {
@@ -345,9 +504,9 @@
       } else if ((strcmp(cmd, "pd") == 0) ||
                  (strcmp(cmd, "printdouble") == 0)) {
         if (args == 2) {
-          int64_t long_value;
+          uint64_t long_value;
           if (GetDValue(arg1, &long_value)) {
-            double dvalue = bit_cast<double, int64_t>(long_value);
+            double dvalue = bit_cast<double, uint64_t>(long_value);
             OS::Print("%s: %"Pu64" 0x%"Px64" %.8g\n",
                 arg1, long_value, long_value, dvalue);
           } else {
@@ -388,7 +547,7 @@
       } else if ((strcmp(cmd, "po") == 0) ||
                  (strcmp(cmd, "printobject") == 0)) {
         if (args == 2) {
-          int64_t value;
+          uint64_t value;
           // Make the dereferencing '*' optional.
           if (((arg1[0] == '*') && GetValue(arg1 + 1, &value)) ||
               GetValue(arg1, &value)) {
@@ -409,28 +568,28 @@
           OS::Print("printobject <*reg or *addr>\n");
         }
       } else if (strcmp(cmd, "disasm") == 0) {
-        int64_t start = 0;
-        int64_t end = 0;
+        uint64_t start = 0;
+        uint64_t end = 0;
         if (args == 1) {
           start = sim_->get_pc();
           end = start + (10 * Instr::kInstrSize);
         } else if (args == 2) {
           if (GetValue(arg1, &start)) {
-            // no length parameter passed, assume 10 instructions
+            // No length parameter passed, assume 10 instructions.
             if (Simulator::IsIllegalAddress(start)) {
-              // If start isn't a valid address, warn and use PC instead
+              // If start isn't a valid address, warn and use PC instead.
               OS::Print("First argument yields invalid address: 0x%"Px64"\n",
                         start);
-              OS::Print("Using PC instead");
+              OS::Print("Using PC instead\n");
               start = sim_->get_pc();
             }
             end = start + (10 * Instr::kInstrSize);
           }
         } else {
-          int64_t length;
+          uint64_t length;
           if (GetValue(arg1, &start) && GetValue(arg2, &length)) {
             if (Simulator::IsIllegalAddress(start)) {
-              // If start isn't a valid address, warn and use PC instead
+              // If start isn't a valid address, warn and use PC instead.
               OS::Print("First argument yields invalid address: 0x%"Px64"\n",
                         start);
               OS::Print("Using PC instead\n");
@@ -439,17 +598,51 @@
             end = start + (length * Instr::kInstrSize);
           }
         }
-        Disassembler::Disassemble(start, end);
+        if ((start > 0) && (end > start)) {
+          Disassembler::Disassemble(start, end);
+        } else {
+          OS::Print("disasm [<address> [<number_of_instructions>]]\n");
+        }
+      } else if (strcmp(cmd, "gdb") == 0) {
+        OS::Print("relinquishing control to gdb\n");
+        OS::DebugBreak();
+        OS::Print("regaining control from gdb\n");
+      } else if (strcmp(cmd, "break") == 0) {
+        if (args == 2) {
+          uint64_t addr;
+          if (GetValue(arg1, &addr)) {
+            if (!SetBreakpoint(reinterpret_cast<Instr*>(addr))) {
+              OS::Print("setting breakpoint failed\n");
+            }
+          } else {
+            OS::Print("%s unrecognized\n", arg1);
+          }
+        } else {
+          OS::Print("break <addr>\n");
+        }
+      } else if (strcmp(cmd, "del") == 0) {
+        if (!DeleteBreakpoint(NULL)) {
+          OS::Print("deleting breakpoint failed\n");
+        }
       } else if (strcmp(cmd, "flags") == 0) {
         OS::Print("APSR: ");
         OS::Print("N flag: %d; ", sim_->n_flag_);
         OS::Print("Z flag: %d; ", sim_->z_flag_);
         OS::Print("C flag: %d; ", sim_->c_flag_);
         OS::Print("V flag: %d\n", sim_->v_flag_);
-      } else if (strcmp(cmd, "gdb") == 0) {
-        OS::Print("relinquishing control to gdb\n");
-        OS::DebugBreak();
-        OS::Print("regaining control from gdb\n");
+      } else if (strcmp(cmd, "unstop") == 0) {
+        intptr_t stop_pc = sim_->get_pc() - Instr::kInstrSize;
+        Instr* stop_instr = reinterpret_cast<Instr*>(stop_pc);
+        if (stop_instr->IsExceptionGenOp()) {
+          stop_instr->SetInstructionBits(Instr::kNopInstruction);
+        } else {
+          OS::Print("Not at debugger stop.\n");
+        }
+      } else if (strcmp(cmd, "trace") == 0) {
+        FLAG_trace_sim = !FLAG_trace_sim;
+        OS::Print("execution tracing %s\n", FLAG_trace_sim ? "on" : "off");
+      } else if (strcmp(cmd, "bt") == 0) {
+        PrintBacktrace();
       } else {
         OS::Print("Unknown command: %s\n", cmd);
       }
@@ -457,9 +650,9 @@
     delete[] line;
   }
 
-  // TODO(zra): Add all the breakpoints back to stop execution and enter the
-  // debugger shell when hit.
-  // RedoBreakpoints();
+  // Add all the breakpoints back to stop execution and enter the debugger
+  // shell when hit.
+  RedoBreakpoints();
 
 #undef COMMAND_SIZE
 #undef ARG_SIZE
@@ -806,7 +999,6 @@
 void Simulator::HandleIllegalAccess(uword addr, Instr* instr) {
   uword fault_pc = get_pc();
   uword last_pc = get_last_pc();
-  // TODO(zra): drop into debugger.
   char buffer[128];
   snprintf(buffer, sizeof(buffer),
       "illegal memory access at 0x%" Px ", pc=0x%" Px ", last_pc=0x%" Px"\n",
@@ -1478,26 +1670,32 @@
   } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
              (instr->Bits(21, 3) == 1)) {
     // Format(instr, "brk 'imm16");
-    UnimplementedInstruction(instr);
+    SimulatorDebugger dbg(this);
+    uint16_t imm = static_cast<uint16_t>(instr->Imm16Field());
+    char buffer[32];
+    snprintf(buffer, sizeof(buffer), "brk #0x%x", imm);
+    set_pc(get_pc() + Instr::kInstrSize);
+    dbg.Stop(instr, buffer);
   } else if ((instr->Bits(0, 2) == 0) && (instr->Bits(2, 3) == 0) &&
              (instr->Bits(21, 3) == 2)) {
     // Format(instr, "hlt 'imm16");
     uint16_t imm = static_cast<uint16_t>(instr->Imm16Field());
-    if (imm == kImmExceptionIsDebug) {
+    if (imm == Instr::kSimulatorMessageCode) {
       SimulatorDebugger dbg(this);
       const char* message = *reinterpret_cast<const char**>(
           reinterpret_cast<intptr_t>(instr) - 2 * Instr::kInstrSize);
       set_pc(get_pc() + Instr::kInstrSize);
       dbg.Stop(instr, message);
-    } else if (imm == kImmExceptionIsPrintf) {
-      const char* message = *reinterpret_cast<const char**>(
-          reinterpret_cast<intptr_t>(instr) - 2 * Instr::kInstrSize);
-      OS::Print("Simulator hit: %s", message);
-    } else if (imm == kImmExceptionIsRedirectedCall) {
+    } else if (imm == Instr::kSimulatorBreakCode) {
+      SimulatorDebugger dbg(this);
+      dbg.Stop(instr, "breakpoint");
+    } else if (imm == Instr::kSimulatorRedirectCode) {
       DoRedirectedCall(instr);
     } else {
       UnimplementedInstruction(instr);
     }
+  } else {
+    UnimplementedInstruction(instr);
   }
 }
 
@@ -3122,13 +3320,16 @@
     }
   } else {
     // FLAG_stop_sim_at is at the non-default value. Stop in the debugger when
-    // we reach the particular instruction count.
+    // we reach the particular instruction count or address.
     while (program_counter != kEndSimulatingPC) {
       Instr* instr = reinterpret_cast<Instr*>(program_counter);
       icount_++;
-      if (icount_ == FLAG_stop_sim_at) {
-        // TODO(zra): Add a debugger.
-        UNIMPLEMENTED();
+      if (static_cast<intptr_t>(icount_) == FLAG_stop_sim_at) {
+        SimulatorDebugger dbg(this);
+        dbg.Stop(instr, "Instruction count reached");
+      } else if (reinterpret_cast<intptr_t>(instr) == FLAG_stop_sim_at) {
+        SimulatorDebugger dbg(this);
+        dbg.Stop(instr, "Instruction address reached");
       } else if (IsIllegalAddress(program_counter)) {
         HandleIllegalAccess(program_counter, instr);
       } else {
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 1a0fe9b..4e83d43 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -71,6 +71,9 @@
   // Accessor to the internal simulator stack top.
   uword StackTop() const;
 
+  // Accessor to the instruction counter.
+  intptr_t get_icount() const { return icount_; }
+
   // The isolate's top_exit_frame_info refers to a Dart frame in the simulator
   // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
   // native stack.
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 09109c0..dc8ed3f 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -18,12 +18,14 @@
 #include "vm/disassembler.h"
 #include "vm/lockers.h"
 #include "vm/native_arguments.h"
+#include "vm/stack_frame.h"
 #include "vm/thread.h"
 
 namespace dart {
 
 DEFINE_FLAG(bool, trace_sim, false, "Trace simulator execution.");
-DEFINE_FLAG(int, stop_sim_at, 0, "Address to stop simulator at.");
+DEFINE_FLAG(int, stop_sim_at, 0,
+            "Instruction address or instruction count to stop simulator at.");
 
 
 // This macro provides a platform independent use of sscanf. The reason for
@@ -94,9 +96,14 @@
   bool GetFValue(char* desc, double* value);
   bool GetDValue(char* desc, double* value);
 
-  static const int32_t kSimulatorBreakpointInstruction =
-      Instr::kBreakPointInstruction |
-      (Instr::kSimulatorBreakCode << kBreakCodeShift);
+  static intptr_t GetApproximateTokenIndex(const Code& code, uword pc);
+
+  static void PrintDartFrame(uword pc, uword fp, uword sp,
+                             const Function& function,
+                             intptr_t token_pos,
+                             bool is_optimized,
+                             bool is_inlined);
+  void PrintBacktrace();
 
   // Set or delete a breakpoint. Returns true if successful.
   bool SetBreakpoint(Instr* breakpc);
@@ -203,6 +210,10 @@
     *value = sim_->get_pc();
     return true;
   }
+  if (strcmp("icount", desc) == 0) {
+    *value = sim_->get_icount();
+    return true;
+  }
   bool retval = SScanF(desc, "0x%x", value) == 1;
   if (!retval) {
     retval = SScanF(desc, "%x", value) == 1;
@@ -251,6 +262,98 @@
 }
 
 
+intptr_t SimulatorDebugger::GetApproximateTokenIndex(const Code& code,
+                                                     uword pc) {
+  intptr_t token_pos = -1;
+  const PcDescriptors& descriptors =
+      PcDescriptors::Handle(code.pc_descriptors());
+  PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
+  while (iter.MoveNext()) {
+    if (iter.Pc() == pc) {
+      return iter.TokenPos();
+    } else if ((token_pos <= 0) && (iter.Pc() > pc)) {
+      token_pos = iter.TokenPos();
+    }
+  }
+  return token_pos;
+}
+
+
+void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp,
+                                       const Function& function,
+                                       intptr_t token_pos,
+                                       bool is_optimized,
+                                       bool is_inlined) {
+  const Script& script = Script::Handle(function.script());
+  const String& func_name = String::Handle(function.QualifiedUserVisibleName());
+  const String& url = String::Handle(script.url());
+  intptr_t line = -1;
+  intptr_t column = -1;
+  if (token_pos >= 0) {
+    script.GetTokenLocation(token_pos, &line, &column);
+  }
+  OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd
+            ":%" Pd ")\n",
+            pc, fp, sp,
+            is_optimized ? (is_inlined ? "inlined " : "optimized ") : "",
+            func_name.ToCString(),
+            url.ToCString(),
+            line, column);
+}
+
+
+void SimulatorDebugger::PrintBacktrace() {
+  StackFrameIterator frames(sim_->get_register(FP),
+                            sim_->get_register(SP),
+                            sim_->get_pc(),
+                            StackFrameIterator::kDontValidateFrames);
+  StackFrame* frame = frames.NextFrame();
+  ASSERT(frame != NULL);
+  Function& function = Function::Handle();
+  Function& inlined_function = Function::Handle();
+  Code& code = Code::Handle();
+  Code& unoptimized_code = Code::Handle();
+  while (frame != NULL) {
+    if (frame->IsDartFrame()) {
+      code = frame->LookupDartCode();
+      function = code.function();
+      if (code.is_optimized()) {
+        // For optimized frames, extract all the inlined functions if any
+        // into the stack trace.
+        InlinedFunctionsIterator it(code, frame->pc());
+        while (!it.Done()) {
+          // Print each inlined frame with its pc in the corresponding
+          // unoptimized frame.
+          inlined_function = it.function();
+          unoptimized_code = it.code();
+          uword unoptimized_pc = it.pc();
+          it.Advance();
+          if (!it.Done()) {
+            PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(),
+                           inlined_function,
+                           GetApproximateTokenIndex(unoptimized_code,
+                                                    unoptimized_pc),
+                           true, true);
+          }
+        }
+        // Print the optimized inlining frame below.
+      }
+      PrintDartFrame(frame->pc(), frame->fp(), frame->sp(),
+                     function,
+                     GetApproximateTokenIndex(code, frame->pc()),
+                     code.is_optimized(), false);
+    } else {
+      OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n",
+                frame->pc(), frame->fp(), frame->sp(),
+                frame->IsEntryFrame() ? "entry" :
+                    frame->IsExitFrame() ? "exit" :
+                        frame->IsStubFrame() ? "stub" : "invalid");
+    }
+    frame = frames.NextFrame();
+  }
+}
+
+
 bool SimulatorDebugger::SetBreakpoint(Instr* breakpc) {
   // Check if a breakpoint can be set. If not return without any side-effects.
   if (sim_->break_pc_ != NULL) {
@@ -286,7 +389,7 @@
 
 void SimulatorDebugger::RedoBreakpoints() {
   if (sim_->break_pc_ != NULL) {
-    sim_->break_pc_->SetInstructionBits(kSimulatorBreakpointInstruction);
+    sim_->break_pc_->SetInstructionBits(Instr::kSimulatorBreakpointInstruction);
   }
 }
 
@@ -345,10 +448,12 @@
                   "gdb -- transfer control to gdb\n"
                   "h/help -- print this help string\n"
                   "break <address> -- set break point at specified address\n"
-                  "p/print <reg or value or *addr> -- print integer value\n"
+                  "p/print <reg or icount or value or *addr> -- print integer\n"
                   "pf/printfloat <freg or *addr> -- print float value\n"
                   "po/printobject <*reg or *addr> -- print object\n"
                   "si/stepi -- single step an instruction\n"
+                  "trace -- toggle execution tracing mode\n"
+                  "bt -- print backtrace\n"
                   "unstop -- if current pc is a stop instr make it a nop\n"
                   "q/quit -- Quit the debugger and exit the program\n");
       } else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) {
@@ -431,11 +536,11 @@
           end = start + (10 * Instr::kInstrSize);
         } else if (args == 2) {
           if (GetValue(arg1, &start)) {
-            // no length parameter passed, assume 10 instructions
+            // No length parameter passed, assume 10 instructions.
             if (Simulator::IsIllegalAddress(start)) {
-              // If start isn't a valid address, warn and use PC instead
+              // If start isn't a valid address, warn and use PC instead.
               OS::Print("First argument yields invalid address: 0x%x\n", start);
-              OS::Print("Using PC instead");
+              OS::Print("Using PC instead\n");
               start = sim_->get_pc();
             }
             end = start + (10 * Instr::kInstrSize);
@@ -444,7 +549,7 @@
           uint32_t length;
           if (GetValue(arg1, &start) && GetValue(arg2, &length)) {
             if (Simulator::IsIllegalAddress(start)) {
-              // If start isn't a valid address, warn and use PC instead
+              // If start isn't a valid address, warn and use PC instead.
               OS::Print("First argument yields invalid address: 0x%x\n", start);
               OS::Print("Using PC instead\n");
               start = sim_->get_pc();
@@ -452,8 +557,11 @@
             end = start + (length * Instr::kInstrSize);
           }
         }
-
-        Disassembler::Disassemble(start, end);
+        if ((start > 0) && (end > start)) {
+          Disassembler::Disassemble(start, end);
+        } else {
+          OS::Print("disasm [<address> [<number_of_instructions>]]\n");
+        }
       } else if (strcmp(cmd, "gdb") == 0) {
         OS::Print("relinquishing control to gdb\n");
         OS::DebugBreak();
@@ -483,6 +591,11 @@
         } else {
           OS::Print("Not at debugger stop.\n");
         }
+      } else if (strcmp(cmd, "trace") == 0) {
+        FLAG_trace_sim = !FLAG_trace_sim;
+        OS::Print("execution tracing %s\n", FLAG_trace_sim ? "on" : "off");
+      } else if (strcmp(cmd, "bt") == 0) {
+        PrintBacktrace();
       } else {
         OS::Print("Unknown command: %s\n", cmd);
       }
@@ -667,16 +780,13 @@
   }
 
  private:
-  static const int32_t kRedirectInstruction =
-    Instr::kBreakPointInstruction | (Instr::kRedirectCode << kBreakCodeShift);
-
   Redirection(uword external_function,
               Simulator::CallKind call_kind,
               int argument_count)
       : external_function_(external_function),
         call_kind_(call_kind),
         argument_count_(argument_count),
-        break_instruction_(kRedirectInstruction),
+        break_instruction_(Instr::kSimulatorRedirectInstruction),
         next_(list_) {
     list_ = this;
   }
@@ -1004,7 +1114,7 @@
   bool result = false;
   for (int i = 0; i < kNumAddressTags; i++) {
     if (exclusive_access_state_[i].isolate == isolate) {
-      // Check whether the current isolates address reservation matches.
+      // Check whether the current isolate's address reservation matches.
       if (exclusive_access_state_[i].addr == addr) {
         result = true;
       }
@@ -1063,24 +1173,6 @@
 }
 
 
-bool Simulator::OverflowFrom(int32_t alu_out,
-                             int32_t left, int32_t right, bool addition) {
-  bool overflow;
-  if (addition) {
-               // Operands have the same sign.
-    overflow = ((left >= 0 && right >= 0) || (left < 0 && right < 0))
-               // And operands and result have different sign.
-               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
-  } else {
-               // Operands have different signs.
-    overflow = ((left < 0 && right >= 0) || (left >= 0 && right < 0))
-               // And first operand and result have different signs.
-               && ((left < 0 && alu_out >= 0) || (left >= 0 && alu_out < 0));
-  }
-  return overflow;
-}
-
-
 // Calls into the Dart runtime are based on this interface.
 typedef void (*SimulatorRuntimeCall)(NativeArguments arguments);
 
@@ -1107,7 +1199,7 @@
     dbg.Stop(instr, message);
     // Adjust for extra pc increment.
     set_pc(get_pc() - Instr::kInstrSize);
-  } else if (instr->BreakCodeField() == Instr::kMsgMessageCode) {
+  } else if (instr->BreakCodeField() == Instr::kSimulatorMessageCode) {
     const char* message = *reinterpret_cast<const char**>(
         reinterpret_cast<intptr_t>(instr) - Instr::kInstrSize);
     if (FLAG_trace_sim) {
@@ -1116,7 +1208,7 @@
       OS::PrintErr("Bad break code: 0x%x\n", instr->InstructionBits());
       UnimplementedInstruction(instr);
     }
-  } else if (instr->BreakCodeField() == Instr::kRedirectCode) {
+  } else if (instr->BreakCodeField() == Instr::kSimulatorRedirectCode) {
     SimulatorSetjmpBuffer buffer(this);
 
     if (!setjmp(buffer.buffer_)) {
@@ -2172,9 +2264,14 @@
   delay_slot_ = true;
   icount_++;
   Instr* instr = Instr::At(pc_ + Instr::kInstrSize);
-  if ((FLAG_stop_sim_at != 0) && (icount_ == FLAG_stop_sim_at)) {
-    SimulatorDebugger dbg(this);
-    dbg.Stop(instr, "Instruction count reached");
+  if (FLAG_stop_sim_at != 0) {
+    if (static_cast<int>(icount_) == FLAG_stop_sim_at) {
+      SimulatorDebugger dbg(this);
+      dbg.Stop(instr, "Instruction count reached");
+    } else if (reinterpret_cast<int>(instr) == FLAG_stop_sim_at) {
+      SimulatorDebugger dbg(this);
+      dbg.Stop(instr, "Instruction address reached");
+    }
   }
   InstructionDecode(instr);
   delay_slot_ = false;
@@ -2196,19 +2293,20 @@
     }
   } else {
     // FLAG_stop_sim_at is at the non-default value. Stop in the debugger when
-    // we reach the particular instruction count.
+    // we reach the particular instruction count or address.
     while (pc_ != kEndSimulatingPC) {
-      icount_++;
       Instr* instr = Instr::At(pc_);
-      if (icount_ == FLAG_stop_sim_at) {
+      icount_++;
+      if (static_cast<intptr_t>(icount_) == FLAG_stop_sim_at) {
         SimulatorDebugger dbg(this);
         dbg.Stop(instr, "Instruction count reached");
+      } else if (reinterpret_cast<intptr_t>(instr) == FLAG_stop_sim_at) {
+        SimulatorDebugger dbg(this);
+        dbg.Stop(instr, "Instruction address reached");
+      } else if (IsIllegalAddress(pc_)) {
+        HandleIllegalAccess(pc_, instr);
       } else {
-        if (IsIllegalAddress(pc_)) {
-          HandleIllegalAccess(pc_, instr);
-        } else {
-          InstructionDecode(instr);
-        }
+        InstructionDecode(instr);
       }
     }
   }
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h
index d84f04a..9d825e1 100644
--- a/runtime/vm/simulator_mips.h
+++ b/runtime/vm/simulator_mips.h
@@ -90,6 +90,9 @@
   // Accessor to the internal simulator stack top.
   uword StackTop() const;
 
+  // Accessor to the instruction counter.
+  intptr_t get_icount() const { return icount_; }
+
   // The isolate's top_exit_frame_info refers to a Dart frame in the simulator
   // stack. The simulator's top_exit_frame_info refers to a C++ frame in the
   // native stack.
@@ -177,11 +180,6 @@
   // Handles a legal instruction that the simulator does not implement.
   void UnimplementedInstruction(Instr* instr);
 
-  bool OverflowFrom(int32_t alu_out,
-                    int32_t left,
-                    int32_t right,
-                    bool addition);
-
   void set_pc(uword value) { pc_ = value; }
 
   void Format(Instr* instr, const char* format);
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 1933d66..9c85374 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -917,7 +917,8 @@
     // R3: next object start.
     // R6: allocation stats address.
     __ LoadImmediate(R4, reinterpret_cast<intptr_t>(Object::null()));
-    __ str(R4, FieldAddress(R0, Context::parent_offset()));
+    __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Context::parent_offset()),
+                                R4);
 
     // Initialize the context variables.
     // R0: new object.
@@ -1100,22 +1101,15 @@
     // R5: allocation stats table.
     // First try inlining the initialization without a loop.
     if (instance_size < (kInlineInstanceSize * kWordSize)) {
-      // Check if the object contains any non-header fields.
       // Small objects are initialized using a consecutive set of writes.
-      intptr_t current_offset = Instance::NextFieldOffset();
-      // Write two nulls at a time.
-      if (instance_size >= 2 * kWordSize) {
+      intptr_t begin_offset = Instance::NextFieldOffset() - kHeapObjectTag;
+      intptr_t end_offset = instance_size - kHeapObjectTag;
+      // Save one move if less than two fields.
+      if ((end_offset - begin_offset) >= (2 * kWordSize)) {
         __ mov(R3, Operand(R2));
-        while (current_offset + kWordSize < instance_size) {
-          __ StoreToOffset(kWordPair, R2, R0, current_offset - kHeapObjectTag);
-          current_offset += 2 * kWordSize;
-        }
       }
-      // Write remainder.
-      while (current_offset < instance_size) {
-        __ StoreToOffset(kWord, R2, R0, current_offset - kHeapObjectTag);
-        current_offset += kWordSize;
-      }
+      __ InitializeFieldsNoBarrierUnrolled(R0, R0, begin_offset, end_offset,
+                                           R2, R3);
     } else {
       // There are more than kInlineInstanceSize(12) fields
       __ add(R4, R0, Operand(Instance::NextFieldOffset() - kHeapObjectTag));
@@ -1132,8 +1126,8 @@
     if (is_cls_parameterized) {
       // Set the type arguments in the new object.
       __ ldr(R4, Address(SP, 0));
-      __ StoreToOffset(kWord, R4,
-                       R0, cls.type_arguments_field_offset() - kHeapObjectTag);
+      FieldAddress type_args(R0, cls.type_arguments_field_offset());
+      __ StoreIntoObjectNoBarrier(R0, type_args, R4);
     }
 
     // Done allocating and initializing the instance.
@@ -1303,7 +1297,7 @@
   __ LoadFromOffset(kWord, R1, R6, count_offset);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), VS);  // Overflow.
-  __ StoreToOffset(kWord, R1, R6, count_offset);
+  __ StoreIntoSmiField(Address(R6, count_offset), R1);
   __ Ret();
 }
 
@@ -1447,7 +1441,7 @@
   __ LoadFromOffset(kWord, R1, R6, count_offset);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), VS);  // Overflow.
-  __ StoreToOffset(kWord, R1, R6, count_offset);
+  __ StoreIntoSmiField(Address(R6, count_offset), R1);
 
   __ Bind(&call_target_function);
   // R0: target function.
@@ -1580,7 +1574,7 @@
   __ LoadFromOffset(kWord, R1, R6, count_offset);
   __ adds(R1, R1, Operand(Smi::RawValue(1)));
   __ LoadImmediate(R1, Smi::RawValue(Smi::kMaxValue), VS);  // Overflow.
-  __ StoreToOffset(kWord, R1, R6, count_offset);
+  __ StoreIntoSmiField(Address(R6, count_offset), R1);
 
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index bab0a96..22a4ba9 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -85,7 +85,7 @@
   V(AwaitContextVar, ":await_ctx_var")                                         \
   V(AwaitJumpVar, ":await_jump_var")                                           \
   V(Future, "Future")                                                          \
-  V(FutureConstructor, "Future.")                                              \
+  V(FutureMicrotask, "Future.microtask")                                       \
   V(FutureValue, "Future.value")                                               \
   V(FutureThen, "then")                                                        \
   V(FutureCatchError, "catchError")                                            \
@@ -347,6 +347,7 @@
   V(match_end_index, ":match_end_index")                                       \
   V(char_in_capture, ":char_in_capture")                                       \
   V(char_in_match, ":char_in_match")                                           \
+  V(index_temp, ":index_temp")                                                 \
   V(result, ":result")                                                         \
   V(position_registers, ":position_registers")                                 \
   V(string_param, ":string_param")                                             \
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 30d1ff0..4bdb9c5 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -339,6 +339,7 @@
     'regexp_ast.h',
     'regexp_parser.cc',
     'regexp_parser.h',
+    'regexp_test.cc',
     'report.cc',
     'report.h',
     'report_test.cc',
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 07d944f..1110e89 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -56,11 +56,6 @@
 DART="$BUILD_DIR/dart-sdk/bin/dart"
 PACKAGES_DIR="$BUILD_DIR/pub_packages/"
 
-# Compile async/await down to vanilla Dart.
-# TODO(rnystrom): Remove this when #104 is fixed.
-ASYNC_COMPILER="$SDK_DIR/lib/_internal/pub/bin/async_compile.dart"
-"$DART" "--package-root=$PACKAGES_DIR" "$ASYNC_COMPILER" "$BUILD_DIR"
-
 # Run the async/await compiled pub.
 PUB="$SDK_DIR/lib/_internal/pub_generated/bin/pub.dart"
 exec "$DART" "${VM_OPTIONS[@]}" "--package-root=$PACKAGES_DIR" "$PUB" "$@"
diff --git a/sdk/bin/pub.bat b/sdk/bin/pub.bat
index 8207746..2a91e30 100644
--- a/sdk/bin/pub.bat
+++ b/sdk/bin/pub.bat
Binary files differ
diff --git a/sdk/lib/_internal/compiler/js_lib/collection_patch.dart b/sdk/lib/_internal/compiler/js_lib/collection_patch.dart
index 78147f8..184e8ce 100644
--- a/sdk/lib/_internal/compiler/js_lib/collection_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/collection_patch.dart
@@ -4,7 +4,8 @@
 
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show fillLiteralMap, NoInline, patch;
+import 'dart:_js_helper' show
+    fillLiteralMap, InternalMap, NoInline, NoThrows, patch;
 
 @patch
 class HashMap<K, V> {
@@ -523,13 +524,13 @@
   }
 
   // Private factory constructor called by generated code for map literals.
-  @NoInline()
+  @NoThrows() @NoInline()
   factory LinkedHashMap._empty() {
     return new _LinkedHashMap<K, V>();
   }
 }
 
-class _LinkedHashMap<K, V> implements LinkedHashMap<K, V> {
+class _LinkedHashMap<K, V> implements LinkedHashMap<K, V>, InternalMap {
   int _length = 0;
 
   // The hash map contents are divided into three parts: one part for
diff --git a/sdk/lib/_internal/compiler/js_lib/core_patch.dart b/sdk/lib/_internal/compiler/js_lib/core_patch.dart
index 2e2bab9..9f5bf1c 100644
--- a/sdk/lib/_internal/compiler/js_lib/core_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/core_patch.dart
@@ -59,12 +59,12 @@
                List positionalArguments,
                [Map<Symbol, dynamic> namedArguments]) {
     return Primitives.applyFunction(
-        function, positionalArguments, _toMangledNames(namedArguments));
+        function, positionalArguments,
+        namedArguments == null ? null : _toMangledNames(namedArguments));
   }
 
   static Map<String, dynamic> _toMangledNames(
       Map<Symbol, dynamic> namedArguments) {
-    if (namedArguments == null) return null;
     Map<String, dynamic> result = {};
     namedArguments.forEach((symbol, value) {
       result[_symbolToString(symbol)] = value;
@@ -363,16 +363,10 @@
 
 @patch
 class StringBuffer {
-  String _contents = "";
+  String _contents;
 
   @patch
-  StringBuffer([Object content = ""]) {
-    if (content is String) {
-      _contents = content;
-    } else {
-      write(content);
-    }
-  }
+  StringBuffer([Object content = ""]) : _contents = '$content';
 
   @patch
   int get length => _contents.length;
diff --git a/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart b/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
index 90620fa..deebe80 100644
--- a/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/isolate_helper.dart
@@ -5,19 +5,27 @@
 library _isolate_helper;
 
 import 'shared/embedded_names.dart' show
+    CLASS_ID_EXTRACTOR,
+    CLASS_FIELDS_EXTRACTOR,
     CURRENT_SCRIPT,
-    GLOBAL_FUNCTIONS;
+    GLOBAL_FUNCTIONS,
+    INITIALIZE_EMPTY_INSTANCE,
+    INSTANCE_FROM_CLASS_ID;
 
 import 'dart:async';
 import 'dart:collection' show Queue, HashMap;
 import 'dart:isolate';
+import 'dart:_native_typed_data' show NativeByteBuffer, NativeTypedData;
+
 import 'dart:_js_helper' show
     Closure,
+    InternalMap,
     Null,
     Primitives,
     convertDartClosureToJS,
     random64,
     requiresPreamble;
+
 import 'dart:_foreign_helper' show DART_CLOSURE_TO_JS,
                                    JS,
                                    JS_CREATE_ISOLATE,
@@ -26,7 +34,17 @@
                                    JS_EMBEDDED_GLOBAL,
                                    JS_SET_CURRENT_ISOLATE,
                                    IsolateContext;
-import 'dart:_interceptors' show JSExtendableArray;
+
+import 'dart:_interceptors' show Interceptor,
+                                 JSArray,
+                                 JSExtendableArray,
+                                 JSFixedArray,
+                                 JSIndexable,
+                                 JSMutableArray,
+                                 JSObject;
+
+
+part 'isolate_serialization.dart';
 
 /**
  * Called by the compiler to support switching
@@ -186,13 +204,6 @@
   bool get useWorkers => supportsWorkers;
 
   /**
-   * Whether to use the web-worker JSON-based message serialization protocol. By
-   * default this is only used with web workers. For debugging, you can force
-   * using this protocol by changing this field value to [:true:].
-   */
-  bool get needSerialization => useWorkers;
-
-  /**
    * Registry of isolates. Isolates must be registered if, and only if, receive
    * ports are alive.  Normally no open receive-ports means that the isolate is
    * dead, but DOM callbacks could resurrect it.
@@ -980,6 +991,10 @@
       bool startPaused,
       SendPort replyPort,
       void onError(String message)) {
+    // Make sure that the args list is a fresh generic list. A newly spawned
+    // isolate should be able to assume that the arguments list is an
+    // extendable list.
+    if (args != null) args = new List<String>.from(args);
     if (_globalState.isWorker) {
       _globalState.mainManager.postMessage(_serializeMessage({
           'command': 'spawn-worker',
@@ -1007,8 +1022,13 @@
       throw new UnsupportedError(
           "Currently spawnUri is not supported without web workers.");
     }
-    message = _serializeMessage(message);
-    args = _serializeMessage(args);  // Or just args.toList() ?
+    // Clone the message to enforce the restrictions we have on isolate
+    // messages.
+    message = _clone(message);
+    // Make sure that the args list is a fresh generic list. A newly spawned
+    // isolate should be able to assume that the arguments list is an
+    // extendable list.
+    if (args != null) args = new List<String>.from(args);
     _globalState.topEventLoop.enqueue(new _IsolateContext(), () {
       final func = _getJSFunctionFromName(functionName);
       _startIsolate(func, args, message, isSpawnUri, startPaused, replyPort);
@@ -1165,28 +1185,15 @@
     final isolate = _globalState.isolates[_isolateId];
     if (isolate == null) return;
     if (_receivePort._isClosed) return;
-    // We force serialization/deserialization as a simple way to ensure
-    // isolate communication restrictions are respected between isolates that
-    // live in the same worker. [_NativeJsSendPort] delivers both messages
-    // from the same worker and messages from other workers. In particular,
-    // messages sent from a worker via a [_WorkerSendPort] are received at
-    // [_processWorkerMessage] and forwarded to a native port. In such cases,
-    // here we'll see [_globalState.currentContext == null].
-    final shouldSerialize = _globalState.currentContext != null
-        && _globalState.currentContext.id != _isolateId;
-    var msg = message;
-    if (shouldSerialize) {
-      msg = _serializeMessage(msg);
-    }
+    // Clone the message to enforce the restrictions we have on isolate
+    // messages.
+    var msg = _clone(message);
     if (isolate.controlPort == _receivePort) {
       isolate.handleControlMessage(msg);
       return;
     }
     _globalState.topEventLoop.enqueue(isolate, () {
       if (!_receivePort._isClosed) {
-        if (shouldSerialize) {
-          msg = _deserializeMessage(msg);
-        }
         _receivePort._add(msg);
       }
     }, 'receive $message');
@@ -1317,420 +1324,6 @@
   SendPort get sendPort => _rawPort.sendPort;
 }
 
-
-/********************************************************
-  Inserted from lib/isolate/dart2js/messages.dart
- ********************************************************/
-
-// Defines message visitors, serialization, and deserialization.
-
-/** Serialize [message] (or simulate serialization). */
-_serializeMessage(message) {
-  if (_globalState.needSerialization) {
-    return new _JsSerializer().traverse(message);
-  } else {
-    return new _JsCopier().traverse(message);
-  }
-}
-
-/** Deserialize [message] (or simulate deserialization). */
-_deserializeMessage(message) {
-  if (_globalState.needSerialization) {
-    return new _JsDeserializer().deserialize(message);
-  } else {
-    // Nothing more to do.
-    return message;
-  }
-}
-
-class _JsSerializer extends _Serializer {
-
-  _JsSerializer() : super() { _visited = new _JsVisitedMap(); }
-
-  visitSendPort(SendPort x) {
-    if (x is _NativeJsSendPort) return visitNativeJsSendPort(x);
-    if (x is _WorkerSendPort) return visitWorkerSendPort(x);
-    throw "Illegal underlying port $x";
-  }
-
-  visitCapability(Capability x) {
-    if (x is CapabilityImpl) {
-      return ['capability', x._id];
-    }
-    throw "Capability not serializable: $x";
-  }
-
-  visitNativeJsSendPort(_NativeJsSendPort port) {
-    return ['sendport', _globalState.currentManagerId,
-        port._isolateId, port._receivePort._id];
-  }
-
-  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];
-  }
-}
-
-
-class _JsCopier extends _Copier {
-
-  _JsCopier() : super() { _visited = new _JsVisitedMap(); }
-
-  visitSendPort(SendPort x) {
-    if (x is _NativeJsSendPort) return visitNativeJsSendPort(x);
-    if (x is _WorkerSendPort) return visitWorkerSendPort(x);
-    throw "Illegal underlying port $x";
-  }
-
-  visitCapability(Capability x) {
-    if (x is CapabilityImpl) {
-      return new CapabilityImpl._internal(x._id);
-    }
-    throw "Capability not serializable: $x";
-  }
-
-  SendPort visitNativeJsSendPort(_NativeJsSendPort port) {
-    return new _NativeJsSendPort(port._receivePort, port._isolateId);
-  }
-
-  SendPort visitWorkerSendPort(_WorkerSendPort port) {
-    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 {
-
-  SendPort deserializeSendPort(List list) {
-    int managerId = list[1];
-    int isolateId = list[2];
-    int receivePortId = list[3];
-    // If two isolates are in the same manager, we use NativeJsSendPorts to
-    // deliver messages directly without using postMessage.
-    if (managerId == _globalState.currentManagerId) {
-      var isolate = _globalState.isolates[isolateId];
-      if (isolate == null) return null; // Isolate has been closed.
-      var receivePort = isolate.lookup(receivePortId);
-      if (receivePort == null) return null; // Port has been closed.
-      return new _NativeJsSendPort(receivePort, isolateId);
-    } else {
-      return new _WorkerSendPort(managerId, isolateId, receivePortId);
-    }
-  }
-
-  Capability deserializeCapability(List list) {
-    return new CapabilityImpl._internal(list[1]);
-  }
-
-  Function deserializeFunction(List list) {
-    return IsolateNatives._getJSFunctionFromName(list[1]);
-  }
-}
-
-class _JsVisitedMap implements _MessageTraverserVisitedMap {
-  List tagged;
-
-  /** Retrieves any information stored in the native object [object]. */
-  operator[](var object) {
-    return _getAttachedInfo(object);
-  }
-
-  /** Injects some information into the native [object]. */
-  void operator[]=(var object, var info) {
-    tagged.add(object);
-    _setAttachedInfo(object, info);
-  }
-
-  /** Get ready to rumble. */
-  void reset() {
-    assert(tagged == null);
-    tagged = new List();
-  }
-
-  /** Remove all information injected in the native objects. */
-  void cleanup() {
-    for (int i = 0, length = tagged.length; i < length; i++) {
-      _clearAttachedInfo(tagged[i]);
-    }
-    tagged = null;
-  }
-
-  void _clearAttachedInfo(var o) {
-    JS("void", "#['__MessageTraverser__attached_info__'] = #", o, null);
-  }
-
-  void _setAttachedInfo(var o, var info) {
-    JS("void", "#['__MessageTraverser__attached_info__'] = #", o, info);
-  }
-
-  _getAttachedInfo(var o) {
-    return JS("", "#['__MessageTraverser__attached_info__']", o);
-  }
-}
-
-// only visible for testing purposes
-// TODO(sigmund): remove once we can disable privacy for testing (bug #1882)
-class TestingOnly {
-  static copy(x) {
-    return new _JsCopier().traverse(x);
-  }
-
-  // only visible for testing purposes
-  static serialize(x) {
-    _Serializer serializer = new _JsSerializer();
-    _Deserializer deserializer = new _JsDeserializer();
-    return deserializer.deserialize(serializer.traverse(x));
-  }
-}
-
-/********************************************************
-  Inserted from lib/isolate/serialization.dart
- ********************************************************/
-
-class _MessageTraverserVisitedMap {
-
-  operator[](var object) => null;
-  void operator[]=(var object, var info) { }
-
-  void reset() { }
-  void cleanup() { }
-
-}
-
-/** Abstract visitor for dart objects that can be sent as isolate messages. */
-abstract class _MessageTraverser {
-
-  _MessageTraverserVisitedMap _visited;
-  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();
-
-  /** Visitor's entry point. */
-  traverse(var x) {
-    if (isPrimitive(x)) return visitPrimitive(x);
-    _visited.reset();
-    var result;
-    try {
-      result = _dispatch(x);
-    } finally {
-      _visited.cleanup();
-    }
-    return result;
-  }
-
-  _dispatch(var x) {
-    // This code likely fails for user classes implementing
-    // SendPort and Capability because it assumes the internal classes.
-    if (isPrimitive(x)) return visitPrimitive(x);
-    if (x is List) return visitList(x);
-    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);
-  }
-
-  visitPrimitive(x);
-  visitList(List x);
-  visitMap(Map x);
-  visitSendPort(SendPort x);
-  visitCapability(Capability x);
-  visitFunction(Function f);
-
-  visitObject(Object x) {
-    // TODO(floitsch): make this a real exception. (which one)?
-    throw "Message serialization: Illegal value $x passed";
-  }
-
-  static bool isPrimitive(x) {
-    return (x == null) || (x is String) || (x is num) || (x is bool);
-  }
-}
-
-
-/** A visitor that recursively copies a message. */
-class _Copier extends _MessageTraverser {
-
-  visitPrimitive(x) => x;
-
-  List visitList(List list) {
-    List copy = _visited[list];
-    if (copy != null) return copy;
-
-    int len = list.length;
-
-    // TODO(floitsch): we loose the generic type of the List.
-    copy = new List(len);
-    _visited[list] = copy;
-    for (int i = 0; i < len; i++) {
-      copy[i] = _dispatch(list[i]);
-    }
-    return copy;
-  }
-
-  Map visitMap(Map map) {
-    Map copy = _visited[map];
-    if (copy != null) return copy;
-
-    // TODO(floitsch): we loose the generic type of the map.
-    copy = new Map();
-    _visited[map] = copy;
-    map.forEach((key, val) {
-      copy[_dispatch(key)] = _dispatch(val);
-    });
-    return copy;
-  }
-
-  visitFunction(Function f) => throw new UnimplementedError();
-
-  visitSendPort(SendPort x) => throw new UnimplementedError();
-
-  visitCapability(Capability x) => throw new UnimplementedError();
-}
-
-/** Visitor that serializes a message as a JSON array. */
-class _Serializer extends _MessageTraverser {
-  int _nextFreeRefId = 0;
-
-  visitPrimitive(x) => x;
-
-  visitList(List list) {
-    int copyId = _visited[list];
-    if (copyId != null) return ['ref', copyId];
-
-    int id = _nextFreeRefId++;
-    _visited[list] = id;
-    var jsArray = _serializeList(list);
-    // TODO(floitsch): we are losing the generic type.
-    return ['list', id, jsArray];
-  }
-
-  visitMap(Map map) {
-    int copyId = _visited[map];
-    if (copyId != null) return ['ref', copyId];
-
-    int id = _nextFreeRefId++;
-    _visited[map] = id;
-    var keys = _serializeList(map.keys.toList());
-    var values = _serializeList(map.values.toList());
-    // TODO(floitsch): we are losing the generic type.
-    return ['map', id, keys, values];
-  }
-
-  _serializeList(List list) {
-    int len = list.length;
-    // Use a growable list because we do not add extra properties on
-    // them.
-    var result = new List()..length = len;
-    for (int i = 0; i < len; i++) {
-      result[i] = _dispatch(list[i]);
-    }
-    return result;
-  }
-
-  visitSendPort(SendPort x) => throw new UnimplementedError();
-
-  visitCapability(Capability x) => throw new UnimplementedError();
-
-  visitFunction(Function f) => throw new UnimplementedError();
-}
-
-/** Deserializes arrays created with [_Serializer]. */
-abstract class _Deserializer {
-  Map<int, dynamic> _deserialized;
-
-  _Deserializer();
-
-  static bool isPrimitive(x) {
-    return (x == null) || (x is String) || (x is num) || (x is bool);
-  }
-
-  deserialize(x) {
-    if (isPrimitive(x)) return x;
-    // TODO(floitsch): this should be new HashMap<int, dynamic>()
-    _deserialized = new HashMap();
-    return _deserializeHelper(x);
-  }
-
-  _deserializeHelper(x) {
-    if (isPrimitive(x)) return x;
-    assert(x is List);
-    switch (x[0]) {
-      case 'ref': return _deserializeRef(x);
-      case 'list': return _deserializeList(x);
-      case 'map': return _deserializeMap(x);
-      case 'sendport': return deserializeSendPort(x);
-      case 'capability': return deserializeCapability(x);
-      case 'function' : return deserializeFunction(x);
-      default: return deserializeObject(x);
-    }
-  }
-
-  _deserializeRef(List x) {
-    int id = x[1];
-    var result = _deserialized[id];
-    assert(result != null);
-    return result;
-  }
-
-  List _deserializeList(List x) {
-    int id = x[1];
-    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
-    List dartList = x[2];
-    _deserialized[id] = dartList;
-    int len = dartList.length;
-    for (int i = 0; i < len; i++) {
-      dartList[i] = _deserializeHelper(dartList[i]);
-    }
-    return dartList;
-  }
-
-  Map _deserializeMap(List x) {
-    Map result = new Map();
-    int id = x[1];
-    _deserialized[id] = result;
-    List keys = x[2];
-    List values = x[3];
-    int len = keys.length;
-    assert(len == values.length);
-    for (int i = 0; i < len; i++) {
-      var key = _deserializeHelper(keys[i]);
-      var value = _deserializeHelper(values[i]);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  deserializeFunction(List x);
-
-  deserializeSendPort(List x);
-
-  deserializeCapability(List x);
-
-  deserializeObject(List x) {
-    // TODO(floitsch): Use real exception (which one?).
-    throw "Unexpected serialized object";
-  }
-}
-
 class TimerImpl implements Timer {
   final bool _once;
   bool _inEventLoop = false;
diff --git a/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart b/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart
new file mode 100644
index 0000000..51a2943
--- /dev/null
+++ b/sdk/lib/_internal/compiler/js_lib/isolate_serialization.dart
@@ -0,0 +1,361 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 _isolate_helper;
+
+/// Serialize [message].
+_serializeMessage(message) {
+  return new _Serializer().serialize(message);
+}
+
+/// Deserialize [message].
+_deserializeMessage(message) {
+  return new _Deserializer().deserialize(message);
+}
+
+/// Clones the message.
+///
+/// Contrary to a `_deserializeMessage(_serializeMessage(x))` the `_clone`
+/// function will not try to adjust SendPort values and pass them through.
+_clone(message) {
+  _Serializer serializer = new _Serializer(serializeSendPorts: false);
+  _Deserializer deserializer = new _Deserializer();
+  return deserializer.deserialize(serializer.serialize(message));
+}
+
+class _Serializer {
+  final bool _serializeSendPorts;
+  Map<dynamic, int> serializedObjectIds = new Map<dynamic, int>.identity();
+
+  _Serializer({serializeSendPorts: true})
+      : _serializeSendPorts = serializeSendPorts;
+
+  /// Returns a message that can be transmitted through web-worker channels.
+  serialize(x) {
+    if (isPrimitive(x)) return serializePrimitive(x);
+
+    int serializationId = serializedObjectIds[x];
+    if (serializationId != null) return makeRef(serializationId);
+
+    serializationId = serializedObjectIds.length;
+    serializedObjectIds[x] = serializationId;
+
+    if (x is NativeByteBuffer) return serializeByteBuffer(x);
+    if (x is NativeTypedData) return serializeTypedData(x);
+    if (x is JSIndexable) return serializeJSIndexable(x);
+    if (x is InternalMap) return serializeMap(x);
+
+    if (x is JSObject) return serializeJSObject(x);
+
+    // We should not have any interceptors any more.
+    if (x is Interceptor) unsupported(x);
+
+    if (x is RawReceivePort) {
+      unsupported(x, "RawReceivePorts can't be transmitted:");
+    }
+
+    // SendPorts need their workerIds adjusted (either during serialization or
+    // deserialization).
+    if (x is _NativeJsSendPort) return serializeJsSendPort(x);
+    if (x is _WorkerSendPort) return serializeWorkerSendPort(x);
+
+    if (x is Closure) return serializeClosure(x);
+
+    return serializeDartObject(x);
+  }
+
+  void unsupported(x, [String message]) {
+    if (message == null) message = "Can't transmit:";
+    throw new UnsupportedError("$message $x");
+  }
+
+  makeRef(int serializationId) => ["ref", serializationId];
+
+  bool isPrimitive(x) => x == null || x is String || x is num || x is bool;
+  serializePrimitive(primitive) => primitive;
+
+  serializeByteBuffer(NativeByteBuffer buffer) {
+    return ["buffer", buffer];
+  }
+
+  serializeTypedData(NativeTypedData data) {
+    return ["typed", data];
+  }
+
+  serializeJSIndexable(JSIndexable indexable) {
+    // Strings are JSIndexable but should have been treated earlier.
+    assert(indexable is! String);
+    List serialized = serializeArray(indexable);
+    if (indexable is JSFixedArray) return ["fixed", serialized];
+    if (indexable is JSExtendableArray) return ["extendable", serialized];
+    // MutableArray check must be last, since JSFixedArray and JSExtendableArray
+    // extend JSMutableArray.
+    if (indexable is JSMutableArray) return ["mutable", serialized];
+    // The only JSArrays left are the const Lists (as in `const [1, 2]`).
+    if (indexable is JSArray) return ["const", serialized];
+    unsupported(indexable, "Can't serialize indexable: ");
+    return null;
+  }
+
+  serializeArray(JSArray x) {
+    List serialized = [];
+    serialized.length = x.length;
+    for (int i = 0; i < x.length; i++) {
+      serialized[i] = serialize(x[i]);
+    }
+    return serialized;
+  }
+
+  serializeArrayInPlace(JSArray x) {
+    for (int i = 0; i < x.length; i++) {
+      x[i] = serialize(x[i]);
+    }
+    return x;
+  }
+
+  serializeMap(Map x) {
+    Function serializeTearOff = serialize;
+    return ['map',
+            x.keys.map(serializeTearOff).toList(),
+            x.values.map(serializeTearOff).toList()];
+  }
+
+  serializeJSObject(JSObject x) {
+    // Don't serialize objects if their `constructor` property isn't `Object`
+    // or undefined/null.
+    // A different constructor is taken as a sign that the object has complex
+    // internal state, or that it is a function, and won't be serialized.
+    if (JS('bool', '!!(#.constructor)', x) &&
+        JS('bool', 'x.constructor !== Object')) {
+      unsupported(x, "Only plain JS Objects are supported:");
+    }
+    List keys = JS('JSArray', 'Object.keys(#)', x);
+    List values = [];
+    values.length = keys.length;
+    for (int i = 0; i < keys.length; i++) {
+      values[i] = serialize(JS('', '#[#]', x, keys[i]));
+    }
+    return ['js-object', keys, values];
+  }
+
+  serializeWorkerSendPort(_WorkerSendPort x) {
+    if (_serializeSendPorts) {
+      return ['sendport', x._workerId, x._isolateId, x._receivePortId];
+    }
+    return ['raw sendport', x];
+  }
+
+  serializeJsSendPort(_NativeJsSendPort x) {
+    if (_serializeSendPorts) {
+      int workerId = _globalState.currentManagerId;
+      return ['sendport', workerId, x._isolateId, x._receivePort._id];
+    }
+    return ['raw sendport', x];
+  }
+
+  serializeCapability(CapabilityImpl x) => ['capability', x._id];
+
+  serializeClosure(Closure x) {
+    final name = IsolateNatives._getJSFunctionName(x);
+    if (name == null) {
+      unsupported(x, "Closures can't be transmitted:");
+    }
+    return ['function', name];
+  }
+
+  serializeDartObject(x) {
+    var classExtractor = JS_EMBEDDED_GLOBAL('', CLASS_ID_EXTRACTOR);
+    var fieldsExtractor = JS_EMBEDDED_GLOBAL('', CLASS_FIELDS_EXTRACTOR);
+    String classId = JS('String', '#(#)', classExtractor, x);
+    List fields = JS('JSArray', '#(#)', fieldsExtractor, x);
+    return ['dart', classId, serializeArrayInPlace(fields)];
+  }
+}
+
+class _Deserializer {
+  /// When `true`, encodes sendports specially so that they can be adjusted on
+  /// the receiving end.
+  ///
+  /// When `false`, sendports are cloned like any other object.
+  final bool _adjustSendPorts;
+
+  List<dynamic> deserializedObjects = new List<dynamic>();
+
+  _Deserializer({adjustSendPorts: true}) : _adjustSendPorts = adjustSendPorts;
+
+  /// Returns a message that can be transmitted through web-worker channels.
+  deserialize(x) {
+    if (isPrimitive(x)) return deserializePrimitive(x);
+
+    if (x is! JSArray) throw new ArgumentError("Bad serialized message: $x");
+
+    switch (x.first) {
+      case "ref": return deserializeRef(x);
+      case "buffer": return deserializeByteBuffer(x);
+      case "typed": return deserializeTypedData(x);
+      case "fixed": return deserializeFixed(x);
+      case "extendable": return deserializeExtendable(x);
+      case "mutable": return deserializeMutable(x);
+      case "const": return deserializeConst(x);
+      case "map": return deserializeMap(x);
+      case "sendport": return deserializeSendPort(x);
+      case "raw sendport": return deserializeRawSendPort(x);
+      case "js-object": return deserializeJSObject(x);
+      case "function": return deserializeClosure(x);
+      case "dart": return deserializeDartObject(x);
+      default: throw "couldn't deserialize: $x";
+    }
+  }
+
+  bool isPrimitive(x) => x == null || x is String || x is num || x is bool;
+  deserializePrimitive(x) => x;
+
+  // ['ref', id].
+  deserializeRef(x) {
+    assert(x[0] == 'ref');
+    int serializationId = x[1];
+    return deserializedObjects[serializationId];
+  }
+
+  // ['buffer', <byte buffer>].
+  NativeByteBuffer deserializeByteBuffer(x) {
+    assert(x[0] == 'buffer');
+    NativeByteBuffer result = x[1];
+    deserializedObjects.add(result);
+    return result;
+  }
+
+  // ['typed', <typed array>].
+  NativeTypedData deserializeTypedData(x) {
+    assert(x[0] == 'typed');
+    NativeTypedData result = x[1];
+    deserializedObjects.add(result);
+    return result;
+  }
+
+  // Updates the given array in place with its deserialized content.
+  List deserializeArrayInPlace(JSArray x) {
+    for (int i = 0; i < x.length; i++) {
+      x[i] = deserialize(x[i]);
+    }
+    return x;
+  }
+
+  // ['fixed', <array>].
+  List deserializeFixed(x) {
+    assert(x[0] == 'fixed');
+    List result = x[1];
+    deserializedObjects.add(result);
+    return new JSArray.markFixed(deserializeArrayInPlace(result));
+  }
+
+  // ['extendable', <array>].
+  List deserializeExtendable(x) {
+    assert(x[0] == 'extendable');
+    List result = x[1];
+    deserializedObjects.add(result);
+    return new JSArray.markGrowable(deserializeArrayInPlace(result));
+  }
+
+  // ['mutable', <array>].
+  List deserializeMutable(x) {
+    assert(x[0] == 'mutable');
+    List result = x[1];
+    deserializedObjects.add(result);
+    return deserializeArrayInPlace(result);
+  }
+
+  // ['const', <array>].
+  List deserializeConst(x) {
+    assert(x[0] == 'const');
+    List result = x[1];
+    deserializedObjects.add(result);
+    // TODO(floitsch): need to mark list as non-changeable.
+    return new JSArray.markFixed(deserializeArrayInPlace(result));
+  }
+
+  // ['map', <key-list>, <value-list>].
+  Map deserializeMap(x) {
+    assert(x[0] == 'map');
+    List keys = x[1];
+    List values = x[2];
+    Map result = {};
+    deserializedObjects.add(result);
+    // We need to keep the order of how objects were serialized.
+    // First deserialize all keys, and then only deserialize the values.
+    keys = keys.map(deserialize).toList();
+
+    for (int i = 0; i < keys.length; i++) {
+      result[keys[i]] = deserialize(values[i]);
+    }
+    return result;
+  }
+
+  // ['sendport', <managerId>, <isolateId>, <receivePortId>].
+  SendPort deserializeSendPort(x) {
+    assert(x[0] == 'sendport');
+    int managerId = x[1];
+    int isolateId = x[2];
+    int receivePortId = x[3];
+    SendPort result;
+    // If two isolates are in the same manager, we use NativeJsSendPorts to
+    // deliver messages directly without using postMessage.
+    if (managerId == _globalState.currentManagerId) {
+      var isolate = _globalState.isolates[isolateId];
+      if (isolate == null) return null; // Isolate has been closed.
+      var receivePort = isolate.lookup(receivePortId);
+      if (receivePort == null) return null; // Port has been closed.
+      result = new _NativeJsSendPort(receivePort, isolateId);
+    } else {
+      result = new _WorkerSendPort(managerId, isolateId, receivePortId);
+    }
+    deserializedObjects.add(result);
+    return result;
+  }
+
+  // ['raw sendport', <sendport>].
+  SendPort deserializeRawSendPort(x) {
+    assert(x[0] == 'raw sendport');
+    SendPort result = x[1];
+    deserializedObjects.add(result);
+    return result;
+  }
+
+  // ['js-object', <key-list>, <value-list>].
+  deserializeJSObject(x) {
+    assert(x[0] == 'js-object');
+    List keys = x[1];
+    List values = x[2];
+    var o = JS('', '{}');
+    deserializedObjects.add(o);
+    for (int i = 0; i < keys.length; i++) {
+      JS('', '#[#]=#', o, keys[i], deserialize(values[i]));
+    }
+    return o;
+  }
+
+  // ['function', <name>].
+  Function deserializeClosure(x) {
+    assert(x[0] == 'function');
+    String name = x[1];
+    Function result = IsolateNatives._getJSFunctionFromName(name);
+    deserializedObjects.add(result);
+    return result;
+  }
+
+  // ['dart', <class-id>, <field-list>].
+  deserializeDartObject(x) {
+    assert(x[0] == 'dart');
+    String classId = x[1];
+    List fields = x[2];
+    var instanceFromClassId = JS_EMBEDDED_GLOBAL('', INSTANCE_FROM_CLASS_ID);
+    var initializeObject = JS_EMBEDDED_GLOBAL('', INITIALIZE_EMPTY_INSTANCE);
+
+    var emptyInstance = JS('', '#(#)', instanceFromClassId, classId);
+    deserializedObjects.add(emptyInstance);
+    deserializeArrayInPlace(fields);
+    return JS('', '#(#, #, #)',
+              initializeObject, classId, emptyInstance, fields);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/js_lib/js_helper.dart b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
index 3ce3a10..cca4e0e 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_helper.dart
@@ -77,6 +77,12 @@
 
 const _Patch patch = const _Patch();
 
+
+/// Marks the internal map in dart2js, so that internal libraries can is-check
+// them.
+abstract class InternalMap {
+}
+
 /// No-op method that is called to inform the compiler that preambles might
 /// be needed when executing the resulting JS file in a command-line
 /// JS engine.
@@ -826,7 +832,7 @@
   }
 
   static String flattenString(String str) {
-    return JS('', "#.charCodeAt(0) == 0 ? # : #", str, str, str);
+    return JS('String', "#.charCodeAt(0) == 0 ? # : #", str, str, str);
   }
 
   static String getTimeZoneName(receiver) {
@@ -1080,11 +1086,17 @@
     }
 
     int argumentCount = 0;
-    List arguments = [];
+    List arguments;
 
     if (positionalArguments != null) {
-      argumentCount += positionalArguments.length;
-      arguments.addAll(positionalArguments);
+      if (JS('bool', '# instanceof Array', positionalArguments)) {
+        arguments = positionalArguments;
+      } else {
+        arguments = new List.from(positionalArguments);
+      }
+      argumentCount = JS('int', '#.length', arguments);
+    } else {
+      arguments = [];
     }
 
     String selectorName = '${JS_GET_NAME("CALL_PREFIX")}\$$argumentCount';
@@ -1955,7 +1967,7 @@
     // var dynClosureConstructor =
     //     new Function('self', 'target', 'receiver', 'name',
     //                  'this._init(self, target, receiver, name)');
-    // proto.constructor = dynClosureConstructor; // Necessary?
+    // proto.constructor = dynClosureConstructor;
     // dynClosureConstructor.prototype = proto;
     // return dynClosureConstructor;
 
diff --git a/sdk/lib/_internal/compiler/js_lib/js_rti.dart b/sdk/lib/_internal/compiler/js_lib/js_rti.dart
index 5293613..2cf4b48 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_rti.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_rti.dart
@@ -232,12 +232,9 @@
  */
 substitute(var substitution, var arguments) {
   assert(isNull(substitution) ||
-         isJsArray(substitution) ||
          isJsFunction(substitution));
   assert(isNull(arguments) || isJsArray(arguments));
-  if (isJsArray(substitution)) {
-    arguments = substitution;
-  } else if (isJsFunction(substitution)) {
+  if (isJsFunction(substitution)) {
     substitution = invoke(substitution, arguments);
     if (isJsArray(substitution)) {
       arguments = substitution;
diff --git a/sdk/lib/_internal/compiler/js_lib/native_helper.dart b/sdk/lib/_internal/compiler/js_lib/native_helper.dart
index 7de3c6f..42c5a95 100644
--- a/sdk/lib/_internal/compiler/js_lib/native_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/native_helper.dart
@@ -443,8 +443,11 @@
 const _baseHooks = const JS_CONST(r'''
 function() {
   function typeNameInChrome(o) {
-    var name = o.constructor.name;
-    if (name) return name;
+    var constructor = o.constructor;
+    if (constructor) {
+      var name = constructor.name;
+      if (name) return name;
+    }
     var s = Object.prototype.toString.call(o);
     return s.substring(8, s.length - 1);
   }
diff --git a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
index 353442a..3cc1835 100644
--- a/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/compiler/js_lib/shared/embedded_names.dart
@@ -31,4 +31,8 @@
 const DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
 const DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
 const INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
-const IS_HUNK_LOADED = 'isHunkLoaded';
\ No newline at end of file
+const IS_HUNK_LOADED = 'isHunkLoaded';
+const CLASS_ID_EXTRACTOR = 'classIdExtractor';
+const CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
+const INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
+const INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
diff --git a/sdk/lib/_internal/pub/bin/async_compile.dart b/sdk/lib/_internal/pub/bin/async_compile.dart
index 1cc386f..7fded88 100644
--- a/sdk/lib/_internal/pub/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub/bin/async_compile.dart
@@ -7,6 +7,7 @@
 import 'package:args/args.dart';
 import 'package:analyzer/src/services/formatter_impl.dart';
 import 'package:async_await/async_await.dart' as async_await;
+import 'package:stack_trace/stack_trace.dart';
 import 'package:path/path.dart' as p;
 
 /// The path to pub's root directory (sdk/lib/_internal/pub) in the Dart repo.
@@ -18,7 +19,7 @@
 final sourceUrl = p.toUri(sourceDir).toString();
 
 /// The directory that compiler output should be written to.
-final generatedDir = p.join(p.dirname(sourceDir), 'pub_generated');
+String generatedDir;
 
 /// `true` if any file failed to compile.
 bool hadFailure = false;
@@ -34,6 +35,30 @@
 /// one.
 final _commitPattern = new RegExp(r"[a-f0-9]{40}");
 
+/// The template for the README that's added to the generated source.
+///
+/// This is used to store the current commit of the async_await compiler.
+const _README = """
+Pub is currently dogfooding the new Dart async/await syntax. Since the Dart VM
+doesn't natively support it yet, we are using the [async-await][] compiler
+package.
+
+[async-await]: https://github.com/dart-lang/async_await
+
+We run that to compile pub-using-await from sdk/lib/_internal/pub down to
+vanilla Dart code which is what you see here. To interoperate more easily with
+the rest of the repositry, we check in that generated code.
+
+When bug #104 is fixed, we can remove this entirely.
+
+The code here was compiled using the async-await compiler at commit:
+
+    <<COMMIT>>
+
+(Note: this file is also parsed by a tool to update the above commit, so be
+careful not to reformat it.)
+""";
+
 /// This runs the async/await compiler on all of the pub source code.
 ///
 /// It reads from the repo and writes the compiled output into the given build
@@ -49,22 +74,24 @@
   parser.addFlag("force", callback: (value) => force = value);
 
   var buildDir;
+  parser.addOption("snapshot-build-dir", callback: (value) => buildDir = value);
 
   try {
     var rest = parser.parse(arguments).rest;
     if (rest.isEmpty) {
-      throw new FormatException('Missing build directory.');
+      throw new FormatException('Missing generated directory.');
     } else if (rest.length > 1) {
       throw new FormatException(
           'Unexpected arguments: ${rest.skip(1).join(" ")}.');
     }
 
-    buildDir = rest.first;
+    generatedDir = rest.first;
   } on FormatException catch(ex) {
     stderr.writeln(ex);
     stderr.writeln();
     stderr.writeln(
-        "Usage: dart async_compile.dart [--verbose] [--force] <build dir>");
+        "Usage: dart async_compile.dart [--verbose] [--force] "
+        "[--snapshot-build-dir <dir>] <generated dir>");
     exit(64);
   }
 
@@ -75,14 +102,21 @@
 
   var readmePath = p.join(generatedDir, "README.md");
   var lastCommit;
-  var readme = new File(readmePath).readAsStringSync();
-  var match = _commitPattern.firstMatch(readme);
-  if (match == null) {
-    stderr.writeln("Could not find compiler commit hash in README.md.");
-    exit(1);
-  }
+  try {
+    var readme = new File(readmePath).readAsStringSync();
+    var match = _commitPattern.firstMatch(readme);
+    if (match == null) {
+      stderr.writeln("Could not find compiler commit hash in README.md.");
+      exit(1);
+    }
 
-  lastCommit = match[0];
+    lastCommit = match[0];
+  } on IOException catch (error, stackTrace) {
+    if (verbose) {
+      stderr.writeln("Failed to load $readmePath: $error\n"
+          "${new Trace.from(stackTrace)}");
+    }
+  }
 
   var numFiles = 0;
   var numCompiled = 0;
@@ -123,12 +157,11 @@
 
   // Update the README.
   if (currentCommit != lastCommit) {
-    readme = readme.replaceAll(_commitPattern, currentCommit);
-    _writeFile(readmePath, readme);
+    _writeFile(readmePath, _README.replaceAll("<<COMMIT>>", currentCommit));
     if (verbose) print("Updated README.md");
   }
 
-  if (numCompiled > 0) _generateSnapshot(buildDir);
+  if (numCompiled > 0 && buildDir != null) _generateSnapshot(buildDir);
 
   if (verbose) print("Compiled $numCompiled out of $numFiles files");
 
@@ -214,6 +247,7 @@
 /// build.
 void _generateSnapshot(String buildDir) {
   buildDir = p.normalize(buildDir);
+  new Directory(buildDir).createSync(recursive: true);
 
   var entrypoint = p.join(generatedDir, 'bin/pub.dart');
   var packageRoot = p.join(buildDir, 'packages');
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 ca83a87..99fdad5 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
@@ -132,10 +132,14 @@
   var stages = [];
 
   stageNumberFor(id) {
+    // Built-in transformers don't have to be loaded in stages, since they're
+    // run from pub's source. Return -1 so that the "next stage" is 0.
+    if (id.isBuiltInTransformer) return -1;
+
     if (stageNumbers.containsKey(id)) return stageNumbers[id];
     var dependencies = transformerDependencies[id];
-    stageNumbers[id] = dependencies.isEmpty ? 0 :
-        maxAll(dependencies.map(stageNumberFor)) + 1;
+    stageNumbers[id] = dependencies.isEmpty ?
+        0 : maxAll(dependencies.map(stageNumberFor)) + 1;
     return stageNumbers[id];
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
index dfeab5e..d5b3212 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
@@ -42,6 +42,17 @@
       log.message("Failed to reinstall ${log.red(failures)} $packages.");
     }
 
+    var results = await globals.repairActivatedPackages();
+    if (results.first > 0) {
+      var packages = pluralize("package", results.first);
+      log.message("Reactivated ${log.green(results.first)} $packages.");
+    }
+
+    if (results.last > 0) {
+      var packages = pluralize("package", results.last);
+      log.message("Failed to reactivate ${log.red(results.last)} $packages.");
+    }
+
     if (successes == 0 && failures == 0) {
       log.message("No packages in cache, so nothing to repair.");
     }
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 940efab..5c2c845 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -348,6 +348,10 @@
   /// contains dependencies that are not in the lockfile or that don't match
   /// what's in there.
   bool _isLockFileUpToDate(LockFile lockFile) {
+    /// If this is an entrypoint for an in-memory package, trust the in-memory
+    /// lockfile provided for it.
+    if (root.dir == null) return true;
+
     return root.immediateDependencies.every((package) {
       var locked = lockFile.packages[package.name];
       if (locked == null) return false;
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index 73a0c0a..2c06069 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -13,6 +13,7 @@
 
 import 'barback/asset_environment.dart';
 import 'entrypoint.dart';
+import 'exceptions.dart';
 import 'executable.dart' as exe;
 import 'io.dart';
 import 'lock_file.dart';
@@ -27,10 +28,6 @@
 import 'system_cache.dart';
 import 'utils.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/
@@ -377,29 +374,35 @@
   String _getLockFilePath(String name) =>
       p.join(_directory, name, "pubspec.lock");
 
-  /// Shows to the user formatted list of globally activated packages.
+  /// Shows the user a formatted list of globally activated packages.
   void listActivePackages() {
     if (!dirExists(_directory)) return;
 
-    // Loads lock [file] and returns [PackageId] of the activated package.
-    loadPackageId(file, name) {
-      var lockFile = new LockFile.load(p.join(_directory, file), cache.sources);
-      return lockFile.packages[name];
-    }
-
-    var packages = listDir(_directory).map((entry) {
-      if (fileExists(entry)) {
-        return loadPackageId(entry, p.basenameWithoutExtension(entry));
-      } else {
-        return loadPackageId(p.join(entry, 'pubspec.lock'), p.basename(entry));
-      }
-    }).toList();
-
-    packages
+    listDir(_directory).map(_loadPackageId).toList()
         ..sort((id1, id2) => id1.name.compareTo(id2.name))
         ..forEach((id) => log.message(_formatPackage(id)));
   }
 
+  /// Returns the [PackageId] for the globally-activated package at [path].
+  ///
+  /// [path] should be a path within [_directory]. It can either be an old-style
+  /// path to a single lockfile or a new-style path to a directory containing a
+  /// lockfile.
+  PackageId _loadPackageId(String path) {
+    var name = p.basenameWithoutExtension(path);
+    if (!fileExists(path)) path = p.join(path, 'pubspec.lock');
+
+    var id = new LockFile.load(p.join(_directory, path), cache.sources)
+        .packages[name];
+
+    if (id == null) {
+      throw new FormatException("Pubspec for activated package $name didn't "
+          "contain an entry for itself.");
+    }
+
+    return id;
+  }
+
   /// Returns formatted string representing the package [id].
   String _formatPackage(PackageId id) {
     if (id.source == 'git') {
@@ -413,6 +416,92 @@
     }
   }
 
+  /// Repairs any corrupted globally-activated packages and their binstubs.
+  ///
+  /// Returns a pair of two [int]s. The first indicates how many packages were
+  /// successfully re-activated; the second indicates how many failed.
+  Future<Pair<int, int>> repairActivatedPackages() async {
+    var executables = {};
+    if (dirExists(_binStubDir)) {
+      for (var entry in listDir(_binStubDir)) {
+        try {
+          var binstub = readTextFile(entry);
+          var package = _binStubProperty(binstub, "Package");
+          if (package == null) {
+            throw new ApplicationException("No 'Package' property.");
+          }
+
+          var executable = _binStubProperty(binstub, "Executable");
+          if (executable == null) {
+            throw new ApplicationException("No 'Executable' property.");
+          }
+
+          executables.putIfAbsent(package, () => []).add(executable);
+        } catch (error, stackTrace) {
+          log.error(
+              "Error reading binstub for "
+                  "\"${p.basenameWithoutExtension(entry)}\"",
+              error, stackTrace);
+
+          tryDeleteEntry(entry);
+        }
+      }
+    }
+
+    var successes = 0;
+    var failures = 0;
+    if (dirExists(_directory)) {
+      for (var entry in listDir(_directory)) {
+        var id;
+        try {
+          id = _loadPackageId(entry);
+          log.message("Reactivating ${log.bold(id.name)} ${id.version}...");
+
+          var entrypoint = await find(id.name);
+
+          var graph = await entrypoint.loadPackageGraph();
+          var snapshots = await _precompileExecutables(entrypoint, id.name);
+          var packageExecutables = executables.remove(id.name);
+          if (packageExecutables == null) packageExecutables = [];
+          _updateBinStubs(graph.packages[id.name], packageExecutables,
+              overwriteBinStubs: true, snapshots: snapshots,
+              suggestIfNotOnPath: false);
+          successes++;
+        } catch (error, stackTrace) {
+          var message = "Failed to reactivate "
+              "${log.bold(p.basenameWithoutExtension(entry))}";
+          if (id != null) {
+            message += " ${id.version}";
+            if (id.source != "hosted") message += " from ${id.source}";
+          }
+
+          log.error(message, error, stackTrace);
+          failures++;
+
+          tryDeleteEntry(entry);
+        }
+      }
+    }
+
+    if (executables.isNotEmpty) {
+      var packages = pluralize("package", executables.length);
+      var message = new StringBuffer("Binstubs exist for non-activated "
+          "packages:\n");
+      executables.forEach((package, executableNames) {
+        // TODO(nweiz): Use a normal for loop here when
+        // https://github.com/dart-lang/async_await/issues/68 is fixed.
+        executableNames.forEach((executable) =>
+            deleteEntry(p.join(_binStubDir, executable)));
+
+        message.writeln("  From ${log.bold(package)}: "
+            "${toSentence(executableNames)}");
+      });
+      log.error(message);
+    }
+
+    return new Pair(successes, failures);
+  }
+
   /// Updates the binstubs for [package].
   ///
   /// A binstub is a little shell script in `PUB_CACHE/bin` that runs an
@@ -430,10 +519,14 @@
   /// 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.
+  /// snapshots were precompiled to the paths of those snapshots. Binstubs for
+  /// those will run the snapshot directly and skip pub entirely.
+  ///
+  /// If [suggestIfNotOnPath] is `true` (the default), this will warn the user if
+  /// the bin directory isn't on their path.
   void _updateBinStubs(Package package, List<String> executables,
-      {bool overwriteBinStubs, Map<String, String> snapshots}) {
+      {bool overwriteBinStubs, Map<String, String> snapshots,
+       bool suggestIfNotOnPath: true}) {
     if (snapshots == null) snapshots = const {};
 
     // Remove any previously activated binstubs for this package, in case the
@@ -513,7 +606,9 @@
       }
     }
 
-    if (installed.isNotEmpty) _suggestIfNotOnPath(installed);
+    if (suggestIfNotOnPath && installed.isNotEmpty) {
+      _suggestIfNotOnPath(installed.first);
+    }
   }
 
   /// Creates a binstub named [executable] that runs [script] from [package].
@@ -537,12 +632,11 @@
     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 {
+      previousPackage = _binStubProperty(contents, "Package");
+      if (previousPackage == null) {
         log.fine("Could not parse binstub $binStubPath:\n$contents");
+      } else if (!overwrite) {
+        return previousPackage;
       }
     }
 
@@ -568,6 +662,20 @@
 rem Script: ${script}
 $invocation %*
 """;
+
+      if (snapshot != null) {
+        batch += """
+
+rem The VM exits with code 255 if the snapshot version is out-of-date.
+rem If it is, we need to delete it and run "pub global" manually.
+if not errorlevel 255 (
+  exit /b %errorlevel%
+)
+
+pub global run ${package.name}:$script %*
+""";
+      }
+
       writeTextFile(binStubPath, batch);
     } else {
       var bash = """
@@ -579,6 +687,21 @@
 # Script: ${script}
 $invocation "\$@"
 """;
+
+      if (snapshot != null) {
+        bash += """
+
+# The VM exits with code 255 if the snapshot version is out-of-date.
+# If it is, we need to delete it and run "pub global" manually.
+exit_code=\$?
+if [[ \$exit_code != 255 ]]; then
+  exit \$exit_code
+fi
+
+pub global run ${package.name}:$script "\$@"
+""";
+      }
+
       writeTextFile(binStubPath, bash);
 
       // Make it executable.
@@ -606,13 +729,13 @@
 
     for (var file in listDir(_binStubDir, includeDirs: false)) {
       var contents = readTextFile(file);
-      var match = _binStubPackagePattern.firstMatch(contents);
-      if (match == null) {
+      var binStubPackage = _binStubProperty(contents, "Package");
+      if (binStubPackage == null) {
         log.fine("Could not parse binstub $file:\n$contents");
         continue;
       }
 
-      if (match[1] == package) {
+      if (binStubPackage == package) {
         log.fine("Deleting old binstub $file");
         deleteEntry(file);
       }
@@ -621,11 +744,14 @@
 
   /// 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) {
+  ///
+  /// [installed] should be the name of an installed executable that can be used
+  /// to test whether accessing it on the path works.
+  void _suggestIfNotOnPath(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"]);
+      var result = runProcessSync("where", [r"\q", installed + ".bat"]);
       if (result.exitCode == 0) return;
 
       log.warning(
@@ -636,7 +762,7 @@
           '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]);
+      var result = runProcessSync("which", [installed]);
       if (result.exitCode == 0) return;
 
       var binDir = _binStubDir;
@@ -655,4 +781,12 @@
           "\n");
     }
   }
+
+  /// Returns the value of the property named [name] in the bin stub script
+  /// [source].
+  String _binStubProperty(String source, String name) {
+    var pattern = new RegExp(quoteRegExp(name) + r": ([a-zA-Z0-9_-]+)");
+    var match = pattern.firstMatch(source);
+    return match == null ? null : match[1];
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index c55c17b..3f7f553 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -392,6 +392,17 @@
   });
 }
 
+/// Attempts to delete whatever's at [path], but doesn't throw an exception if
+/// the deletion fails.
+void tryDeleteEntry(String path) {
+  try {
+    deleteEntry(path);
+  } catch (error, stackTrace) {
+    log.fine("Failed to delete $path: $error\n"
+        "${new Chain.forTrace(stackTrace)}");
+  }
+}
+
 /// "Cleans" [dir].
 ///
 /// If that directory already exists, it is deleted. Then a new empty directory
@@ -474,11 +485,13 @@
     return path.join(
         sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target);
   } else {
-    return path.join(
-        path.dirname(libraryPath('pub.io')), '..', '..', 'asset', target);
+    return path.join(pubRoot, 'asset', target);
   }
 }
 
+/// Returns the path to the root of pub's sources in the Dart repo.
+String get pubRoot => path.join(repoRoot, 'sdk', 'lib', '_internal', 'pub');
+
 /// Returns the path to the root of the Dart repository.
 ///
 /// This throws a [StateError] if it's called when running pub from the SDK.
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index edc7fe0..1462712 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -182,16 +182,16 @@
 }
 
 /// Logs [message] at [Level.ERROR].
-void error(message, [error]) {
+///
+/// If [error] is passed, it's appended to [message]. If [trace] is passed, it's
+/// printed at log level fine.
+void error(message, [error, StackTrace trace]) {
   if (error != null) {
     message = "$message: $error";
-    var trace;
-    if (error is Error) trace = error.stackTrace;
-    if (trace != null) {
-      message = "$message\nStackTrace: $trace";
-    }
+    if (error is Error && trace == null) trace = error.stackTrace;
   }
   write(Level.ERROR, message);
+  if (trace != null) write(Level.FINE, new Chain.forTrace(trace));
 }
 
 /// Logs [message] at [Level.WARNING].
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index 9d08f83..58ab066 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -143,8 +143,8 @@
 
   /// Resets all cached packages back to the pristine state of the Git
   /// repository at the revision they are pinned to.
-  Future<Pair<int, int>> repairCachedPackages() {
-    if (!dirExists(systemCacheRoot)) return new Future.value(new Pair(0, 0));
+  Future<Pair<int, int>> repairCachedPackages() async {
+    if (!dirExists(systemCacheRoot)) return new Pair(0, 0);
 
     var successes = 0;
     var failures = 0;
@@ -159,25 +159,30 @@
     // (pinned to different commits). The sort order of those is unspecified.
     packages.sort(Package.orderByNameAndVersion);
 
-    return Future.wait(packages.map((package) {
+    for (var package in packages) {
       log.message("Resetting Git repository for "
           "${log.bold(package.name)} ${package.version}...");
 
-      // Remove all untracked files.
-      return git.run(["clean", "-d", "--force", "-x"],
-          workingDir: package.dir).then((_) {
+      try {
+        // Remove all untracked files.
+        await git.run(["clean", "-d", "--force", "-x"],
+            workingDir: package.dir);
+
         // Discard all changes to tracked files.
-        return git.run(["reset", "--hard", "HEAD"], workingDir: package.dir);
-      }).then((_) {
+        await git.run(["reset", "--hard", "HEAD"], workingDir: package.dir);
+
         successes++;
-      }).catchError((error, stackTrace) {
-        failures++;
+      } on git.GitException catch (error, stackTrace) {
         log.error("Failed to reset ${log.bold(package.name)} "
             "${package.version}. Error:\n$error");
         log.fine(stackTrace);
         failures++;
-      }, test: (error) => error is git.GitException);
-    })).then((_) => new Pair(successes, failures));
+
+        tryDeleteEntry(package.dir);
+      }
+    }
+
+    return new Pair(successes, failures);
   }
 
   /// Ensure that the canonical clone of the repository referred to by [id] (the
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 3bb0ea1..593f993 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -124,30 +124,36 @@
 
   /// Re-downloads all packages that have been previously downloaded into the
   /// system cache from any server.
-  Future<Pair<int, int>> repairCachedPackages() {
-    if (!dirExists(systemCacheRoot)) return new Future.value(new Pair(0, 0));
+  Future<Pair<int, int>> repairCachedPackages() async {
+    if (!dirExists(systemCacheRoot)) return new Pair(0, 0);
 
     var successes = 0;
     var failures = 0;
 
-    return Future.wait(listDir(systemCacheRoot).map((serverDir) {
+    for (var serverDir in listDir(systemCacheRoot)) {
       var url = _directoryToUrl(path.basename(serverDir));
       var packages = _getCachedPackagesInDirectory(path.basename(serverDir));
       packages.sort(Package.orderByNameAndVersion);
-      return Future.wait(packages.map((package) {
-        return _download(url, package.name, package.version, package.dir)
-            .then((_) {
+      // TODO(nweiz): Use a normal for loop here when
+      // https://github.com/dart-lang/async_await/issues/72 is fixed.
+      await Future.forEach(packages, (package) async {
+        try {
+          await _download(url, package.name, package.version, package.dir);
           successes++;
-        }).catchError((error, stackTrace) {
+        } catch (error, stackTrace) {
           failures++;
           var message = "Failed to repair ${log.bold(package.name)} "
               "${package.version}";
           if (url != defaultUrl) message += " from $url";
           log.error("$message. Error:\n$error");
           log.fine(stackTrace);
-        });
-      }));
-    })).then((_) => new Pair(successes, failures));
+
+          tryDeleteEntry(package.dir);
+        }
+      });
+    }
+
+    return new Pair(successes, failures);
   }
 
   /// Gets all of the packages that have been downloaded into the system cache
diff --git a/sdk/lib/_internal/pub/test/async_compile_test.dart b/sdk/lib/_internal/pub/test/async_compile_test.dart
new file mode 100644
index 0000000..a3216d7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/async_compile_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 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_process.dart';
+
+import 'test_pub.dart';
+import '../lib/src/io.dart';
+
+void main() {
+  integration("the generated pub source is up to date", () {
+    var compilerArgs = Platform.executableArguments.toList()..addAll([
+      p.join(pubRoot, 'bin', 'async_compile.dart'),
+      '--force', '--verbose',
+      p.join(sandboxDir, "pub_generated")
+    ]);
+
+    new ScheduledProcess.start(Platform.executable, compilerArgs).shouldExit(0);
+
+    new d.DirectoryDescriptor.fromFilesystem("pub_generated",
+        p.join(pubRoot, "..", "pub_generated")).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_binstub_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_binstub_test.dart
new file mode 100644
index 0000000..5af3b47
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_binstub_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.
+
+library pub_tests;
+
+import 'dart:io';
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('handles a corrupted binstub script', () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(cachePath, [
+      d.dir('bin', [
+        d.file(binStubName('script'), 'junk')
+      ])
+    ]).create();
+
+    schedulePub(args: ["cache", "repair"],
+        error: contains('Error reading binstub for "script":'));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_global_lockfile_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_global_lockfile_test.dart
new file mode 100644
index 0000000..098f602
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_corrupted_global_lockfile_test.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('handles a corrupted global lockfile', () {
+    d.dir(cachePath, [
+      d.dir('global_packages/foo', [
+        d.file('pubspec.lock', 'junk')
+      ])
+    ]).create();
+
+    schedulePub(args: ["cache", "repair"],
+        error: contains('Failed to reactivate foo:'),
+        output: contains('Failed to reactivate 1 package.'));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_orphaned_binstub_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_orphaned_binstub_test.dart
new file mode 100644
index 0000000..af6fd33
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_orphaned_binstub_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.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _ORPHANED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration('handles an orphaned binstub script', () {
+    d.dir(cachePath, [
+      d.dir('bin', [
+        d.file(binStubName('script'), _ORPHANED_BINSTUB)
+      ])
+    ]).create();
+
+    schedulePub(args: ["cache", "repair"], error: allOf([
+      contains('Binstubs exist for non-activated packages:'),
+      contains('From foo: foo-script')
+    ]));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/recompiles_snapshots_test.dart b/sdk/lib/_internal/pub/test/cache/repair/recompiles_snapshots_test.dart
new file mode 100644
index 0000000..feb9f39
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/cache/repair/recompiles_snapshots_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('recompiles activated executable snapshots', () {
+    servePackages((builder) {
+      builder.serve("foo", "1.0.0", contents: [
+        d.dir("bin", [
+          d.file("script.dart", "main(args) => print('ok');")
+        ])
+      ]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(cachePath, [
+      d.dir('global_packages/foo/bin', [
+        d.file('script.dart.snapshot', 'junk')
+      ])
+    ]).create();
+
+    schedulePub(args: ["cache", "repair"],
+        output: '''
+          Downloading foo 1.0.0...
+          Reinstalled 1 package.
+          Reactivating foo 1.0.0...
+          Precompiling executables...
+          Loading source assets...
+          Precompiled foo:script.
+          Reactivated 1 package.''');
+
+    var pub = pubRun(global: true, args: ["foo:script"]);
+    pub.stdout.expect("ok");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/updates_binstubs_test.dart b/sdk/lib/_internal/pub/test/cache/repair/updates_binstubs_test.dart
new file mode 100644
index 0000000..1d612a1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/cache/repair/updates_binstubs_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _OUTDATED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration('updates an outdated binstub script', () {
+    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"]);
+
+    d.dir(cachePath, [
+      d.dir('bin', [
+        d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)
+      ])
+    ]).create();
+
+    // Repair them.
+    schedulePub(args: ["cache", "repair"],
+        output: '''
+          Downloading foo 1.0.0...
+          Reinstalled 1 package.
+          Reactivating foo 1.0.0...
+          Precompiling executables...
+          Loading source assets...
+          Precompiled foo:script.
+          Installed executable foo-script.
+          Reactivated 1 package.''');
+
+    // The broken versions should have been replaced.
+    d.dir(cachePath, [
+      d.dir('bin', [
+        // 255 is the VM's exit code upon seeing an out-of-date snapshot.
+        d.matcherFile(binStubName('foo-script'), contains('255'))
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/outdated_binstub_test.dart b/sdk/lib/_internal/pub/test/global/activate/outdated_binstub_test.dart
new file mode 100644
index 0000000..51bcc83
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/activate/outdated_binstub_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 'dart:io';
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _OUTDATED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration("an outdated binstub is replaced", () {
+    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"]);
+
+    d.dir(cachePath, [
+      d.dir('bin', [
+        d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)
+      ])
+    ]).create();
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(cachePath, [
+      d.dir('bin', [
+        // 255 is the VM's exit code upon seeing an out-of-date snapshot.
+        d.matcherFile(binStubName('foo-script'), contains("255"))
+      ])
+    ]).validate();
+  });
+}
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
index 30167b0..a3353e9 100644
--- 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
@@ -62,16 +62,3 @@
     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
index e8f7d15..a5d02be 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 3d704e7..9e75382 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index f631748..ca0f42b 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index a5b6c7a..14ba50a 100644
--- a/sdk/lib/_internal/pub/test/global/binstubs/explicit_executables_test.dart
+++ b/sdk/lib/_internal/pub/test/global/binstubs/explicit_executables_test.dart
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 57f6a8e..e07975a 100644
--- a/sdk/lib/_internal/pub/test/global/binstubs/name_collision_test.dart
+++ b/sdk/lib/_internal/pub/test/global/binstubs/name_collision_test.dart
@@ -7,7 +7,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 6afa39e..3752525 100644
--- 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
@@ -7,7 +7,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 1eb1bb8..4b1bf33 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
new file mode 100644
index 0000000..e2f276d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/outdated_binstub_runs_pub_global_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 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+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("an outdated binstub runs 'pub global run'", () {
+    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('global_packages', [
+        d.dir('foo', [
+          d.dir('bin', [d.outOfDateSnapshot('script.dart.snapshot')])
+        ])
+      ])
+    ]).create();
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stdout.expect(consumeThrough("ok"));
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/outdated_snapshot_test.dart b/sdk/lib/_internal/pub/test/global/binstubs/outdated_snapshot_test.dart
new file mode 100644
index 0000000..9e6acc9
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/binstubs/outdated_snapshot_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 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("a binstub runs 'pub global run' for an outdated snapshot", () {
+    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"]);
+
+    d.dir(cachePath, [
+      d.dir('global_packages', [
+        d.dir('foo', [
+          d.dir('bin', [d.outOfDateSnapshot('script.dart.snapshot')])
+        ])
+      ])
+    ]).create();
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stderr.expect(startsWith("Wrong script snapshot version"));
+    process.stdout.expect(consumeThrough("ok [arg1, arg2]"));
+    process.shouldExit();
+
+    d.dir(cachePath, [
+      d.dir('global_packages/foo/bin', [
+        d.binaryMatcherFile('script.dart.snapshot', isNot(equals(
+            readBinaryFile(testAssetPath('out-of-date.snapshot')))))
+      ])
+    ]).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
index 1141131..901c0f8 100644
--- a/sdk/lib/_internal/pub/test/global/binstubs/path_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/binstubs/path_package_test.dart
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 748ce04..bf1365c 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub/test/global/binstubs/utils.dart b/sdk/lib/_internal/pub/test/global/binstubs/utils.dart
index e52a1eb..ca70df8 100644
--- a/sdk/lib/_internal/pub/test/global/binstubs/utils.dart
+++ b/sdk/lib/_internal/pub/test/global/binstubs/utils.dart
@@ -2,12 +2,22 @@
 // for 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';
 
-/// 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;
+import 'package:path/path.dart' as p;
+
+import '../../test_pub.dart';
+
+/// 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.
+Future<Map> getEnvironment() async {
+  var binDir = p.dirname(Platform.executable);
+  var separator = Platform.operatingSystem == "windows" ? ";" : ":";
+  var path = "${Platform.environment["PATH"]}$separator$binDir";
+
+  var environment = await getPubTestEnvironment();
+  environment["PATH"] = path;
+  return environment;
 }
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 6a6fec1..51eb18a 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -486,7 +486,7 @@
 }
 
 /// Gets the environment variables used to run pub in a test context.
-Map getPubTestEnvironment([String tokenEndpoint]) {
+Future<Map> getPubTestEnvironment([String tokenEndpoint]) async {
   var environment = {};
   environment['_PUB_TESTING'] = 'true';
   environment['PUB_CACHE'] = _pathInSandbox(cachePath);
@@ -498,6 +498,13 @@
     environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
   }
 
+  if (_hasServer) {
+    return port.then((p) {
+      environment['PUB_HOSTED_URL'] = "http://localhost:$p";
+      return environment;
+    });
+  }
+
   return environment;
 }
 
@@ -534,20 +541,9 @@
   dartArgs.addAll(args);
 
   if (tokenEndpoint == null) tokenEndpoint = new Future.value();
-  var environmentFuture = tokenEndpoint.then((tokenEndpoint) {
-    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) {
-        pubEnvironment['PUB_HOSTED_URL'] = "http://localhost:$p";
-        return pubEnvironment;
-      });
-    }
-
-    return pubEnvironment;
-  }).then((pubEnvironment) {
+  var environmentFuture = tokenEndpoint
+      .then((tokenEndpoint) => getPubTestEnvironment(tokenEndpoint))
+      .then((pubEnvironment) {
     if (environment != null) pubEnvironment.addAll(environment);
     return pubEnvironment;
   });
@@ -854,6 +850,11 @@
   return map;
 }
 
+/// Returns the name of the shell script for a binstub named [name].
+///
+/// Adds a ".bat" extension on Windows.
+String binStubName(String name) => Platform.isWindows ? '$name.bat' : name;
+
 /// Compares the [actual] output from running pub with [expected].
 ///
 /// If [expected] is a [String], ignores leading and trailing whitespace
diff --git a/sdk/lib/_internal/pub/test/transformer/dart2js_transformer_before_another_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/dart2js_transformer_before_another_transformer_test.dart
new file mode 100644
index 0000000..30bb374
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/dart2js_transformer_before_another_transformer_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+// Regression test for issue 21726.
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("runs a dart2js transformer before a local transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            r"$dart2js",
+            "myapp/src/transformer"
+          ]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", REWRITE_TRANSFORMER)
+        ])]),
+        d.dir("web", [
+          d.file("foo.txt", "foo")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/bin/async_compile.dart b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
index a029c52..2e96717 100644
--- a/sdk/lib/_internal/pub_generated/bin/async_compile.dart
+++ b/sdk/lib/_internal/pub_generated/bin/async_compile.dart
@@ -7,6 +7,7 @@
 import 'package:args/args.dart';
 import 'package:analyzer/src/services/formatter_impl.dart';
 import 'package:async_await/async_await.dart' as async_await;
+import 'package:stack_trace/stack_trace.dart';
 import 'package:path/path.dart' as p;
 
 /// The path to pub's root directory (sdk/lib/_internal/pub) in the Dart repo.
@@ -18,7 +19,7 @@
 final sourceUrl = p.toUri(sourceDir).toString();
 
 /// The directory that compiler output should be written to.
-final generatedDir = p.join(p.dirname(sourceDir), 'pub_generated');
+String generatedDir;
 
 /// `true` if any file failed to compile.
 bool hadFailure = false;
@@ -34,6 +35,30 @@
 /// one.
 final _commitPattern = new RegExp(r"[a-f0-9]{40}");
 
+/// The template for the README that's added to the generated source.
+///
+/// This is used to store the current commit of the async_await compiler.
+const _README = """
+Pub is currently dogfooding the new Dart async/await syntax. Since the Dart VM
+doesn't natively support it yet, we are using the [async-await][] compiler
+package.
+
+[async-await]: https://github.com/dart-lang/async_await
+
+We run that to compile pub-using-await from sdk/lib/_internal/pub down to
+vanilla Dart code which is what you see here. To interoperate more easily with
+the rest of the repositry, we check in that generated code.
+
+When bug #104 is fixed, we can remove this entirely.
+
+The code here was compiled using the async-await compiler at commit:
+
+    <<COMMIT>>
+
+(Note: this file is also parsed by a tool to update the above commit, so be
+careful not to reformat it.)
+""";
+
 /// This runs the async/await compiler on all of the pub source code.
 ///
 /// It reads from the repo and writes the compiled output into the given build
@@ -49,22 +74,24 @@
   parser.addFlag("force", callback: (value) => force = value);
 
   var buildDir;
+  parser.addOption("snapshot-build-dir", callback: (value) => buildDir = value);
 
   try {
     var rest = parser.parse(arguments).rest;
     if (rest.isEmpty) {
-      throw new FormatException('Missing build directory.');
+      throw new FormatException('Missing generated directory.');
     } else if (rest.length > 1) {
       throw new FormatException(
           'Unexpected arguments: ${rest.skip(1).join(" ")}.');
     }
 
-    buildDir = rest.first;
+    generatedDir = rest.first;
   } on FormatException catch (ex) {
     stderr.writeln(ex);
     stderr.writeln();
     stderr.writeln(
-        "Usage: dart async_compile.dart [--verbose] [--force] <build dir>");
+        "Usage: dart async_compile.dart [--verbose] [--force] "
+            "[--snapshot-build-dir <dir>] <generated dir>");
     exit(64);
   }
 
@@ -75,14 +102,21 @@
 
   var readmePath = p.join(generatedDir, "README.md");
   var lastCommit;
-  var readme = new File(readmePath).readAsStringSync();
-  var match = _commitPattern.firstMatch(readme);
-  if (match == null) {
-    stderr.writeln("Could not find compiler commit hash in README.md.");
-    exit(1);
-  }
+  try {
+    var readme = new File(readmePath).readAsStringSync();
+    var match = _commitPattern.firstMatch(readme);
+    if (match == null) {
+      stderr.writeln("Could not find compiler commit hash in README.md.");
+      exit(1);
+    }
 
-  lastCommit = match[0];
+    lastCommit = match[0];
+  } on IOException catch (error, stackTrace) {
+    if (verbose) {
+      stderr.writeln(
+          "Failed to load $readmePath: $error\n" "${new Trace.from(stackTrace)}");
+    }
+  }
 
   var numFiles = 0;
   var numCompiled = 0;
@@ -123,12 +157,11 @@
 
   // Update the README.
   if (currentCommit != lastCommit) {
-    readme = readme.replaceAll(_commitPattern, currentCommit);
-    _writeFile(readmePath, readme);
+    _writeFile(readmePath, _README.replaceAll("<<COMMIT>>", currentCommit));
     if (verbose) print("Updated README.md");
   }
 
-  if (numCompiled > 0) _generateSnapshot(buildDir);
+  if (numCompiled > 0 && buildDir != null) _generateSnapshot(buildDir);
 
   if (verbose) print("Compiled $numCompiled out of $numFiles files");
 
@@ -216,6 +249,7 @@
 /// build.
 void _generateSnapshot(String buildDir) {
   buildDir = p.normalize(buildDir);
+  new Directory(buildDir).createSync(recursive: true);
 
   var entrypoint = p.join(generatedDir, 'bin/pub.dart');
   var packageRoot = p.join(buildDir, 'packages');
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 fee647f2..39d988e 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
@@ -235,6 +235,10 @@
   var stages = [];
 
   stageNumberFor(id) {
+    // Built-in transformers don't have to be loaded in stages, since they're
+    // run from pub's source. Return -1 so that the "next stage" is 0.
+    if (id.isBuiltInTransformer) return -1;
+
     if (stageNumbers.containsKey(id)) return stageNumbers[id];
     var dependencies = transformerDependencies[id];
     stageNumbers[id] =
diff --git a/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart b/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
index d8305ff..278b327 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/command/cache_repair.dart
@@ -29,29 +29,57 @@
         break0() {
           join0() {
             join1() {
-              join2() {
-                join3() {
-                  completer0.complete();
-                }
-                if (failures > 0) {
-                  flushThenExit(exit_codes.UNAVAILABLE).then((x0) {
-                    try {
-                      x0;
-                      join3();
-                    } catch (e0, s0) {
-                      completer0.completeError(e0, s0);
+              globals.repairActivatedPackages().then((x0) {
+                try {
+                  var results = x0;
+                  join2() {
+                    join3() {
+                      join4() {
+                        join5() {
+                          completer0.complete();
+                        }
+                        if (failures > 0) {
+                          flushThenExit(exit_codes.UNAVAILABLE).then((x1) {
+                            try {
+                              x1;
+                              join5();
+                            } catch (e0, s0) {
+                              completer0.completeError(e0, s0);
+                            }
+                          }, onError: completer0.completeError);
+                        } else {
+                          join5();
+                        }
+                      }
+                      if (successes == 0 && failures == 0) {
+                        log.message(
+                            "No packages in cache, so nothing to repair.");
+                        join4();
+                      } else {
+                        join4();
+                      }
                     }
-                  }, onError: completer0.completeError);
-                } else {
-                  join3();
+                    if (results.last > 0) {
+                      var packages = pluralize("package", results.last);
+                      log.message(
+                          "Failed to reactivate ${log.red(results.last)} ${packages}.");
+                      join3();
+                    } else {
+                      join3();
+                    }
+                  }
+                  if (results.first > 0) {
+                    var packages = pluralize("package", results.first);
+                    log.message(
+                        "Reactivated ${log.green(results.first)} ${packages}.");
+                    join2();
+                  } else {
+                    join2();
+                  }
+                } catch (e1, s1) {
+                  completer0.completeError(e1, s1);
                 }
-              }
-              if (successes == 0 && failures == 0) {
-                log.message("No packages in cache, so nothing to repair.");
-                join2();
-              } else {
-                join2();
-              }
+              }, onError: completer0.completeError);
             }
             if (failures > 0) {
               var packages = pluralize("package", failures);
@@ -75,17 +103,17 @@
           trampoline0 = null;
           if (it0.moveNext()) {
             var source = it0.current;
-            join4() {
-              source.repairCachedPackages().then((x1) {
+            join6() {
+              source.repairCachedPackages().then((x2) {
                 trampoline0 = () {
                   trampoline0 = null;
                   try {
-                    var results = x1;
+                    var results = x2;
                     successes += results.first;
                     failures += results.last;
                     trampoline0 = continue0;
-                  } catch (e1, s1) {
-                    completer0.completeError(e1, s1);
+                  } catch (e2, s2) {
+                    completer0.completeError(e2, s2);
                   }
                 };
                 do trampoline0(); while (trampoline0 != null);
@@ -94,7 +122,7 @@
             if (source is! CachedSource) {
               continue0();
             } else {
-              join4();
+              join6();
             }
           } else {
             break0();
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index ee16741..b9fd11f 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -562,6 +562,10 @@
   /// contains dependencies that are not in the lockfile or that don't match
   /// what's in there.
   bool _isLockFileUpToDate(LockFile lockFile) {
+    /// If this is an entrypoint for an in-memory package, trust the in-memory
+    /// lockfile provided for it.
+    if (root.dir == null) return true;
+
     return root.immediateDependencies.every((package) {
       var locked = lockFile.packages[package.name];
       if (locked == null) return false;
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 6eb66cd..0419d8c 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/global_packages.dart
@@ -13,6 +13,7 @@
 
 import 'barback/asset_environment.dart';
 import 'entrypoint.dart';
+import 'exceptions.dart';
 import 'executable.dart' as exe;
 import 'io.dart';
 import 'lock_file.dart';
@@ -27,10 +28,6 @@
 import 'system_cache.dart';
 import 'utils.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/
@@ -523,29 +520,35 @@
   String _getLockFilePath(String name) =>
       p.join(_directory, name, "pubspec.lock");
 
-  /// Shows to the user formatted list of globally activated packages.
+  /// Shows the user a formatted list of globally activated packages.
   void listActivePackages() {
     if (!dirExists(_directory)) return;
 
-    // Loads lock [file] and returns [PackageId] of the activated package.
-    loadPackageId(file, name) {
-      var lockFile = new LockFile.load(p.join(_directory, file), cache.sources);
-      return lockFile.packages[name];
-    }
-
-    var packages = listDir(_directory).map((entry) {
-      if (fileExists(entry)) {
-        return loadPackageId(entry, p.basenameWithoutExtension(entry));
-      } else {
-        return loadPackageId(p.join(entry, 'pubspec.lock'), p.basename(entry));
-      }
-    }).toList();
-
-    packages
+    listDir(_directory).map(_loadPackageId).toList()
         ..sort((id1, id2) => id1.name.compareTo(id2.name))
         ..forEach((id) => log.message(_formatPackage(id)));
   }
 
+  /// Returns the [PackageId] for the globally-activated package at [path].
+  ///
+  /// [path] should be a path within [_directory]. It can either be an old-style
+  /// path to a single lockfile or a new-style path to a directory containing a
+  /// lockfile.
+  PackageId _loadPackageId(String path) {
+    var name = p.basenameWithoutExtension(path);
+    if (!fileExists(path)) path = p.join(path, 'pubspec.lock');
+
+    var id =
+        new LockFile.load(p.join(_directory, path), cache.sources).packages[name];
+
+    if (id == null) {
+      throw new FormatException(
+          "Pubspec for activated package $name didn't " "contain an entry for itself.");
+    }
+
+    return id;
+  }
+
   /// Returns formatted string representing the package [id].
   String _formatPackage(PackageId id) {
     if (id.source == 'git') {
@@ -559,6 +562,218 @@
     }
   }
 
+  /// Repairs any corrupted globally-activated packages and their binstubs.
+  ///
+  /// Returns a pair of two [int]s. The first indicates how many packages were
+  /// successfully re-activated; the second indicates how many failed.
+  Future<Pair<int, int>> repairActivatedPackages() {
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        var executables = {};
+        join0() {
+          var successes = 0;
+          var failures = 0;
+          join1() {
+            join2() {
+              completer0.complete(new Pair(successes, failures));
+            }
+            if (executables.isNotEmpty) {
+              var packages = pluralize("package", executables.length);
+              var message =
+                  new StringBuffer("Binstubs exist for non-activated " "packages:\n");
+              executables.forEach(((package, executableNames) {
+                executableNames.forEach(
+                    (executable) => deleteEntry(p.join(_binStubDir, executable)));
+                message.writeln(
+                    "  From ${log.bold(package)}: " "${toSentence(executableNames)}");
+              }));
+              log.error(message);
+              join2();
+            } else {
+              join2();
+            }
+          }
+          if (dirExists(_directory)) {
+            var it0 = listDir(_directory).iterator;
+            break0() {
+              join1();
+            }
+            var trampoline0;
+            continue0() {
+              trampoline0 = null;
+              if (it0.moveNext()) {
+                var entry = it0.current;
+                var id;
+                join3() {
+                  trampoline0 = continue0;
+                }
+                catch0(error, stackTrace) {
+                  try {
+                    var message =
+                        "Failed to reactivate " "${log.bold(p.basenameWithoutExtension(entry))}";
+                    join4() {
+                      log.error(message, error, stackTrace);
+                      failures++;
+                      tryDeleteEntry(entry);
+                      join3();
+                    }
+                    if (id != null) {
+                      message += " ${id.version}";
+                      join5() {
+                        join4();
+                      }
+                      if (id.source != "hosted") {
+                        message += " from ${id.source}";
+                        join5();
+                      } else {
+                        join5();
+                      }
+                    } else {
+                      join4();
+                    }
+                  } catch (error, stackTrace) {
+                    completer0.completeError(error, stackTrace);
+                  }
+                }
+                try {
+                  id = _loadPackageId(entry);
+                  log.message(
+                      "Reactivating ${log.bold(id.name)} ${id.version}...");
+                  find(id.name).then((x0) {
+                    trampoline0 = () {
+                      trampoline0 = null;
+                      try {
+                        var entrypoint = x0;
+                        entrypoint.loadPackageGraph().then((x1) {
+                          trampoline0 = () {
+                            trampoline0 = null;
+                            try {
+                              var graph = x1;
+                              _precompileExecutables(
+                                  entrypoint,
+                                  id.name).then((x2) {
+                                trampoline0 = () {
+                                  trampoline0 = null;
+                                  try {
+                                    var snapshots = x2;
+                                    var packageExecutables =
+                                        executables.remove(id.name);
+                                    join6() {
+                                      _updateBinStubs(
+                                          graph.packages[id.name],
+                                          packageExecutables,
+                                          overwriteBinStubs: true,
+                                          snapshots: snapshots,
+                                          suggestIfNotOnPath: false);
+                                      successes++;
+                                      join3();
+                                    }
+                                    if (packageExecutables == null) {
+                                      packageExecutables = [];
+                                      join6();
+                                    } else {
+                                      join6();
+                                    }
+                                  } catch (e0, s0) {
+                                    catch0(e0, s0);
+                                  }
+                                };
+                                do trampoline0(); while (trampoline0 != null);
+                              }, onError: catch0);
+                            } catch (e1, s1) {
+                              catch0(e1, s1);
+                            }
+                          };
+                          do trampoline0(); while (trampoline0 != null);
+                        }, onError: catch0);
+                      } catch (e2, s2) {
+                        catch0(e2, s2);
+                      }
+                    };
+                    do trampoline0(); while (trampoline0 != null);
+                  }, onError: catch0);
+                } catch (e3, s3) {
+                  catch0(e3, s3);
+                }
+              } else {
+                break0();
+              }
+            }
+            trampoline0 = continue0;
+            do trampoline0(); while (trampoline0 != null);
+          } else {
+            join1();
+          }
+        }
+        if (dirExists(_binStubDir)) {
+          var it1 = listDir(_binStubDir).iterator;
+          break1() {
+            join0();
+          }
+          var trampoline1;
+          continue1() {
+            trampoline1 = null;
+            if (it1.moveNext()) {
+              var entry = it1.current;
+              join7() {
+                trampoline1 = continue1;
+              }
+              catch1(error, stackTrace) {
+                try {
+                  log.error(
+                      "Error reading binstub for " "\"${p.basenameWithoutExtension(entry)}\"",
+                      error,
+                      stackTrace);
+                  tryDeleteEntry(entry);
+                  join7();
+                } catch (error, stackTrace) {
+                  completer0.completeError(error, stackTrace);
+                }
+              }
+              try {
+                var binstub = readTextFile(entry);
+                var package = _binStubProperty(binstub, "Package");
+                join8() {
+                  var executable = _binStubProperty(binstub, "Executable");
+                  join9() {
+                    executables.putIfAbsent(package, (() {
+                      return [];
+                    })).add(executable);
+                    join7();
+                  }
+                  if (executable == null) {
+                    throw new ApplicationException("No 'Executable' property.");
+                    join9();
+                  } else {
+                    join9();
+                  }
+                }
+                if (package == null) {
+                  throw new ApplicationException("No 'Package' property.");
+                  join8();
+                } else {
+                  join8();
+                }
+              } catch (e4, s4) {
+                catch1(e4, s4);
+              }
+            } else {
+              break1();
+            }
+          }
+          trampoline1 = continue1;
+          do trampoline1(); while (trampoline1 != null);
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
+  }
+
   /// Updates the binstubs for [package].
   ///
   /// A binstub is a little shell script in `PUB_CACHE/bin` that runs an
@@ -576,10 +791,15 @@
   /// 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.
+  /// snapshots were precompiled to the paths of those snapshots. Binstubs for
+  /// those will run the snapshot directly and skip pub entirely.
+  ///
+
+      /// If [suggestIfNotOnPath] is `true` (the default), this will warn the user if
+  /// the bin directory isn't on their path.
   void _updateBinStubs(Package package, List<String> executables,
-      {bool overwriteBinStubs, Map<String, String> snapshots}) {
+      {bool overwriteBinStubs, Map<String, String> snapshots, bool suggestIfNotOnPath:
+      true}) {
     if (snapshots == null) snapshots = const {};
 
     // Remove any previously activated binstubs for this package, in case the
@@ -667,7 +887,9 @@
       }
     }
 
-    if (installed.isNotEmpty) _suggestIfNotOnPath(installed);
+    if (suggestIfNotOnPath && installed.isNotEmpty) {
+      _suggestIfNotOnPath(installed.first);
+    }
   }
 
   /// Creates a binstub named [executable] that runs [script] from [package].
@@ -691,12 +913,11 @@
     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 {
+      previousPackage = _binStubProperty(contents, "Package");
+      if (previousPackage == null) {
         log.fine("Could not parse binstub $binStubPath:\n$contents");
+      } else if (!overwrite) {
+        return previousPackage;
       }
     }
 
@@ -722,6 +943,20 @@
 rem Script: ${script}
 $invocation %*
 """;
+
+      if (snapshot != null) {
+        batch += """
+
+rem The VM exits with code 255 if the snapshot version is out-of-date.
+rem If it is, we need to delete it and run "pub global" manually.
+if not errorlevel 255 (
+  exit /b %errorlevel%
+)
+
+pub global run ${package.name}:$script %*
+""";
+      }
+
       writeTextFile(binStubPath, batch);
     } else {
       var bash = """
@@ -733,6 +968,21 @@
 # Script: ${script}
 $invocation "\$@"
 """;
+
+      if (snapshot != null) {
+        bash += """
+
+# The VM exits with code 255 if the snapshot version is out-of-date.
+# If it is, we need to delete it and run "pub global" manually.
+exit_code=\$?
+if [[ \$exit_code != 255 ]]; then
+  exit \$exit_code
+fi
+
+pub global run ${package.name}:$script "\$@"
+""";
+      }
+
       writeTextFile(binStubPath, bash);
 
       // Make it executable.
@@ -761,13 +1011,13 @@
 
     for (var file in listDir(_binStubDir, includeDirs: false)) {
       var contents = readTextFile(file);
-      var match = _binStubPackagePattern.firstMatch(contents);
-      if (match == null) {
+      var binStubPackage = _binStubProperty(contents, "Package");
+      if (binStubPackage == null) {
         log.fine("Could not parse binstub $file:\n$contents");
         continue;
       }
 
-      if (match[1] == package) {
+      if (binStubPackage == package) {
         log.fine("Deleting old binstub $file");
         deleteEntry(file);
       }
@@ -776,11 +1026,14 @@
 
   /// 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) {
+  ///
+  /// [installed] should be the name of an installed executable that can be used
+  /// to test whether accessing it on the path works.
+  void _suggestIfNotOnPath(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"]);
+      var result = runProcessSync("where", [r"\q", installed + ".bat"]);
       if (result.exitCode == 0) return;
 
       log.warning(
@@ -791,7 +1044,7 @@
               '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]);
+      var result = runProcessSync("which", [installed]);
       if (result.exitCode == 0) return;
 
       var binDir = _binStubDir;
@@ -808,4 +1061,12 @@
               "  ${log.bold('export PATH="\$PATH":"$binDir"')}\n" "\n");
     }
   }
+
+  /// Returns the value of the property named [name] in the bin stub script
+  /// [source].
+  String _binStubProperty(String source, String name) {
+    var pattern = new RegExp(quoteRegExp(name) + r": ([a-zA-Z0-9_-]+)");
+    var match = pattern.firstMatch(source);
+    return match == null ? null : match[1];
+  }
 }
diff --git a/sdk/lib/_internal/pub_generated/lib/src/io.dart b/sdk/lib/_internal/pub_generated/lib/src/io.dart
index 8595415..35df8d1 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/io.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/io.dart
@@ -391,6 +391,17 @@
   });
 }
 
+/// Attempts to delete whatever's at [path], but doesn't throw an exception if
+/// the deletion fails.
+void tryDeleteEntry(String path) {
+  try {
+    deleteEntry(path);
+  } catch (error, stackTrace) {
+    log.fine(
+        "Failed to delete $path: $error\n" "${new Chain.forTrace(stackTrace)}");
+  }
+}
+
 /// "Cleans" [dir].
 ///
 /// If that directory already exists, it is deleted. Then a new empty directory
@@ -477,15 +488,13 @@
         'asset',
         target);
   } else {
-    return path.join(
-        path.dirname(libraryPath('pub.io')),
-        '..',
-        '..',
-        'asset',
-        target);
+    return path.join(pubRoot, 'asset', target);
   }
 }
 
+/// Returns the path to the root of pub's sources in the Dart repo.
+String get pubRoot => path.join(repoRoot, 'sdk', 'lib', '_internal', 'pub');
+
 /// Returns the path to the root of the Dart repository.
 ///
 /// This throws a [StateError] if it's called when running pub from the SDK.
diff --git a/sdk/lib/_internal/pub_generated/lib/src/log.dart b/sdk/lib/_internal/pub_generated/lib/src/log.dart
index f76a912..2b8cb4a 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/log.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/log.dart
@@ -182,16 +182,16 @@
 }
 
 /// Logs [message] at [Level.ERROR].
-void error(message, [error]) {
+///
+/// If [error] is passed, it's appended to [message]. If [trace] is passed, it's
+/// printed at log level fine.
+void error(message, [error, StackTrace trace]) {
   if (error != null) {
     message = "$message: $error";
-    var trace;
-    if (error is Error) trace = error.stackTrace;
-    if (trace != null) {
-      message = "$message\nStackTrace: $trace";
-    }
+    if (error is Error && trace == null) trace = error.stackTrace;
   }
   write(Level.ERROR, message);
+  if (trace != null) write(Level.FINE, new Chain.forTrace(trace));
 }
 
 /// Logs [message] at [Level.WARNING].
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 c36ecf4..b8cabb2 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/git.dart
@@ -148,47 +148,99 @@
   /// Resets all cached packages back to the pristine state of the Git
   /// repository at the revision they are pinned to.
   Future<Pair<int, int>> repairCachedPackages() {
-    if (!dirExists(systemCacheRoot)) return new Future.value(new Pair(0, 0));
-
-    var successes = 0;
-    var failures = 0;
-
-    var packages = listDir(
-        systemCacheRoot).where(
-            (entry) =>
-                dirExists(
-                    path.join(
-                        entry,
-                        ".git"))).map(
-                            (packageDir) =>
-                                new Package.load(null, packageDir, systemCache.sources)).toList();
-
-    // Note that there may be multiple packages with the same name and version
-    // (pinned to different commits). The sort order of those is unspecified.
-    packages.sort(Package.orderByNameAndVersion);
-
-    return Future.wait(packages.map((package) {
-      log.message(
-          "Resetting Git repository for "
-              "${log.bold(package.name)} ${package.version}...");
-
-      // Remove all untracked files.
-      return git.run(
-          ["clean", "-d", "--force", "-x"],
-          workingDir: package.dir).then((_) {
-        // Discard all changes to tracked files.
-        return git.run(["reset", "--hard", "HEAD"], workingDir: package.dir);
-      }).then((_) {
-        successes++;
-      }).catchError((error, stackTrace) {
-        failures++;
-        log.error(
-            "Failed to reset ${log.bold(package.name)} "
-                "${package.version}. Error:\n$error");
-        log.fine(stackTrace);
-        failures++;
-      }, test: (error) => error is git.GitException);
-    })).then((_) => new Pair(successes, failures));
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          var successes = 0;
+          var failures = 0;
+          var packages = listDir(systemCacheRoot).where(((entry) {
+            return dirExists(path.join(entry, ".git"));
+          })).map(((packageDir) {
+            return new Package.load(null, packageDir, systemCache.sources);
+          })).toList();
+          packages.sort(Package.orderByNameAndVersion);
+          var it0 = packages.iterator;
+          break0() {
+            completer0.complete(new Pair(successes, failures));
+          }
+          var trampoline0;
+          continue0() {
+            trampoline0 = null;
+            if (it0.moveNext()) {
+              var package = it0.current;
+              log.message(
+                  "Resetting Git repository for "
+                      "${log.bold(package.name)} ${package.version}...");
+              join1() {
+                trampoline0 = continue0;
+              }
+              catch0(error, stackTrace) {
+                try {
+                  if (error is git.GitException) {
+                    log.error(
+                        "Failed to reset ${log.bold(package.name)} "
+                            "${package.version}. Error:\n${error}");
+                    log.fine(stackTrace);
+                    failures++;
+                    tryDeleteEntry(package.dir);
+                    join1();
+                  } else {
+                    throw error;
+                  }
+                } catch (error, stackTrace) {
+                  completer0.completeError(error, stackTrace);
+                }
+              }
+              try {
+                git.run(
+                    ["clean", "-d", "--force", "-x"],
+                    workingDir: package.dir).then((x0) {
+                  trampoline0 = () {
+                    trampoline0 = null;
+                    try {
+                      x0;
+                      git.run(
+                          ["reset", "--hard", "HEAD"],
+                          workingDir: package.dir).then((x1) {
+                        trampoline0 = () {
+                          trampoline0 = null;
+                          try {
+                            x1;
+                            successes++;
+                            join1();
+                          } catch (e0, s0) {
+                            catch0(e0, s0);
+                          }
+                        };
+                        do trampoline0(); while (trampoline0 != null);
+                      }, onError: catch0);
+                    } catch (e1, s1) {
+                      catch0(e1, s1);
+                    }
+                  };
+                  do trampoline0(); while (trampoline0 != null);
+                }, onError: catch0);
+              } catch (e2, s2) {
+                catch0(e2, s2);
+              }
+            } else {
+              break0();
+            }
+          }
+          trampoline0 = continue0;
+          do trampoline0(); while (trampoline0 != null);
+        }
+        if (!dirExists(systemCacheRoot)) {
+          completer0.complete(new Pair(0, 0));
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
   }
 
   /// Ensure that the canonical clone of the repository referred to by [id] (the
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 6b47d1f..bc4bcd5 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/source/hosted.dart
@@ -129,32 +129,104 @@
   /// Re-downloads all packages that have been previously downloaded into the
   /// system cache from any server.
   Future<Pair<int, int>> repairCachedPackages() {
-    if (!dirExists(systemCacheRoot)) return new Future.value(new Pair(0, 0));
-
-    var successes = 0;
-    var failures = 0;
-
-    return Future.wait(listDir(systemCacheRoot).map((serverDir) {
-      var url = _directoryToUrl(path.basename(serverDir));
-      var packages = _getCachedPackagesInDirectory(path.basename(serverDir));
-      packages.sort(Package.orderByNameAndVersion);
-      return Future.wait(packages.map((package) {
-        return _download(
-            url,
-            package.name,
-            package.version,
-            package.dir).then((_) {
-          successes++;
-        }).catchError((error, stackTrace) {
-          failures++;
-          var message =
-              "Failed to repair ${log.bold(package.name)} " "${package.version}";
-          if (url != defaultUrl) message += " from $url";
-          log.error("$message. Error:\n$error");
-          log.fine(stackTrace);
-        });
-      }));
-    })).then((_) => new Pair(successes, failures));
+    final completer0 = new Completer();
+    scheduleMicrotask(() {
+      try {
+        join0() {
+          var successes = 0;
+          var failures = 0;
+          var it0 = listDir(systemCacheRoot).iterator;
+          break0() {
+            completer0.complete(new Pair(successes, failures));
+          }
+          var trampoline0;
+          continue0() {
+            trampoline0 = null;
+            if (it0.moveNext()) {
+              var serverDir = it0.current;
+              var url = _directoryToUrl(path.basename(serverDir));
+              var packages =
+                  _getCachedPackagesInDirectory(path.basename(serverDir));
+              packages.sort(Package.orderByNameAndVersion);
+              Future.forEach(packages, ((package) {
+                final completer0 = new Completer();
+                scheduleMicrotask(() {
+                  try {
+                    join0() {
+                      completer0.complete();
+                    }
+                    catch0(error, stackTrace) {
+                      try {
+                        failures++;
+                        var message =
+                            "Failed to repair ${log.bold(package.name)} " "${package.version}";
+                        join1() {
+                          log.error("${message}. Error:\n${error}");
+                          log.fine(stackTrace);
+                          tryDeleteEntry(package.dir);
+                          join0();
+                        }
+                        if (url != defaultUrl) {
+                          message += " from ${url}";
+                          join1();
+                        } else {
+                          join1();
+                        }
+                      } catch (error, stackTrace) {
+                        completer0.completeError(error, stackTrace);
+                      }
+                    }
+                    try {
+                      _download(
+                          url,
+                          package.name,
+                          package.version,
+                          package.dir).then((x0) {
+                        try {
+                          x0;
+                          successes++;
+                          join0();
+                        } catch (e0, s0) {
+                          catch0(e0, s0);
+                        }
+                      }, onError: catch0);
+                    } catch (e1, s1) {
+                      catch0(e1, s1);
+                    }
+                  } catch (e, s) {
+                    completer0.completeError(e, s);
+                  }
+                });
+                return completer0.future;
+              })).then((x0) {
+                trampoline0 = () {
+                  trampoline0 = null;
+                  try {
+                    x0;
+                    trampoline0 = continue0;
+                  } catch (e0, s0) {
+                    completer0.completeError(e0, s0);
+                  }
+                };
+                do trampoline0(); while (trampoline0 != null);
+              }, onError: completer0.completeError);
+            } else {
+              break0();
+            }
+          }
+          trampoline0 = continue0;
+          do trampoline0(); while (trampoline0 != null);
+        }
+        if (!dirExists(systemCacheRoot)) {
+          completer0.complete(new Pair(0, 0));
+        } else {
+          join0();
+        }
+      } catch (e, s) {
+        completer0.completeError(e, s);
+      }
+    });
+    return completer0.future;
   }
 
   /// Gets all of the packages that have been downloaded into the system cache
diff --git a/sdk/lib/_internal/pub_generated/test/async_compile_test.dart b/sdk/lib/_internal/pub_generated/test/async_compile_test.dart
new file mode 100644
index 0000000..6c0af59
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/async_compile_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.
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_process.dart';
+
+import 'test_pub.dart';
+import '../lib/src/io.dart';
+
+void main() {
+  integration("the generated pub source is up to date", () {
+    var compilerArgs = Platform.executableArguments.toList()..addAll(
+        [
+            p.join(pubRoot, 'bin', 'async_compile.dart'),
+            '--force',
+            '--verbose',
+            p.join(sandboxDir, "pub_generated")]);
+
+    new ScheduledProcess.start(Platform.executable, compilerArgs).shouldExit(0);
+
+    new d.DirectoryDescriptor.fromFilesystem(
+        "pub_generated",
+        p.join(pubRoot, "..", "pub_generated")).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_binstub_test.dart b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_binstub_test.dart
new file mode 100644
index 0000000..51c4deb
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_binstub_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'dart:io';
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('handles a corrupted binstub script', () {
+    servePackages((builder) {
+      builder.serve(
+          "foo",
+          "1.0.0",
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok');")])]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(
+        cachePath,
+        [d.dir('bin', [d.file(binStubName('script'), 'junk')])]).create();
+
+    schedulePub(
+        args: ["cache", "repair"],
+        error: contains('Error reading binstub for "script":'));
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_global_lockfile_test.dart b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_global_lockfile_test.dart
new file mode 100644
index 0000000..9839e64
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_corrupted_global_lockfile_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.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('handles a corrupted global lockfile', () {
+    d.dir(
+        cachePath,
+        [d.dir('global_packages/foo', [d.file('pubspec.lock', 'junk')])]).create();
+
+    schedulePub(
+        args: ["cache", "repair"],
+        error: contains('Failed to reactivate foo:'),
+        output: contains('Failed to reactivate 1 package.'));
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/cache/repair/handles_orphaned_binstub_test.dart b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_orphaned_binstub_test.dart
new file mode 100644
index 0000000..56f48ad
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/cache/repair/handles_orphaned_binstub_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.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _ORPHANED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration('handles an orphaned binstub script', () {
+    d.dir(
+        cachePath,
+        [d.dir('bin', [d.file(binStubName('script'), _ORPHANED_BINSTUB)])]).create();
+
+    schedulePub(
+        args: ["cache", "repair"],
+        error: allOf(
+            [
+                contains('Binstubs exist for non-activated packages:'),
+                contains('From foo: foo-script')]));
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/cache/repair/recompiles_snapshots_test.dart b/sdk/lib/_internal/pub_generated/test/cache/repair/recompiles_snapshots_test.dart
new file mode 100644
index 0000000..bb8f6c8
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/cache/repair/recompiles_snapshots_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('recompiles activated executable snapshots', () {
+    servePackages((builder) {
+      builder.serve(
+          "foo",
+          "1.0.0",
+          contents: [
+              d.dir("bin", [d.file("script.dart", "main(args) => print('ok');")])]);
+    });
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                'global_packages/foo/bin',
+                [d.file('script.dart.snapshot', 'junk')])]).create();
+
+    schedulePub(args: ["cache", "repair"], output: '''
+          Downloading foo 1.0.0...
+          Reinstalled 1 package.
+          Reactivating foo 1.0.0...
+          Precompiling executables...
+          Loading source assets...
+          Precompiled foo:script.
+          Reactivated 1 package.''');
+
+    var pub = pubRun(global: true, args: ["foo:script"]);
+    pub.stdout.expect("ok");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/cache/repair/updates_binstubs_test.dart b/sdk/lib/_internal/pub_generated/test/cache/repair/updates_binstubs_test.dart
new file mode 100644
index 0000000..874796e
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/cache/repair/updates_binstubs_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _OUTDATED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration('updates an outdated binstub script', () {
+    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"]);
+
+    d.dir(
+        cachePath,
+        [
+            d.dir('bin', [d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)])]).create();
+
+    // Repair them.
+    schedulePub(args: ["cache", "repair"], output: '''
+          Downloading foo 1.0.0...
+          Reinstalled 1 package.
+          Reactivating foo 1.0.0...
+          Precompiling executables...
+          Loading source assets...
+          Precompiled foo:script.
+          Installed executable foo-script.
+          Reactivated 1 package.''');
+
+    // The broken versions should have been replaced.
+    d.dir(
+        cachePath,
+        [d.dir('bin', [// 255 is the VM's exit code upon seeing an out-of-date snapshot.
+        d.matcherFile(
+            binStubName('foo-script'),
+            contains('255'))])]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/activate/outdated_binstub_test.dart b/sdk/lib/_internal/pub_generated/test/global/activate/outdated_binstub_test.dart
new file mode 100644
index 0000000..65fd10b
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/activate/outdated_binstub_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 'dart:io';
+import 'dart:async';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+const _OUTDATED_BINSTUB = """
+#!/usr/bin/env sh
+# This file was created by pub v0.1.2-3.
+# Package: foo
+# Version: 1.0.0
+# Executable: foo-script
+# Script: script
+dart "/path/to/.pub-cache/global_packages/foo/bin/script.dart.snapshot" "\$@"
+""";
+
+main() {
+  initConfig();
+  integration("an outdated binstub is replaced", () {
+    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"]);
+
+    d.dir(
+        cachePath,
+        [
+            d.dir('bin', [d.file(binStubName('foo-script'), _OUTDATED_BINSTUB)])]).create();
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    d.dir(
+        cachePath,
+        [d.dir('bin', [// 255 is the VM's exit code upon seeing an out-of-date snapshot.
+        d.matcherFile(
+            binStubName('foo-script'),
+            contains("255"))])]).validate();
+  });
+}
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
index 5bb8e86..314c2e5 100644
--- 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
@@ -58,16 +58,3 @@
     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_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
index 8cf8fa8..8b2bf6f 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 2717598..1a2115c 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 7bd2d8f..04aaa96 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index d86ec87..ffac259 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 91c385d..4667065 100644
--- 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
@@ -7,7 +7,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index c19ce97..a868a24 100644
--- 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
@@ -7,7 +7,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index f6266e5..050868e 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_binstub_runs_pub_global_test.dart
new file mode 100644
index 0000000..48da7f9
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_binstub_runs_pub_global_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 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+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("an outdated binstub runs 'pub global run'", () {
+    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(
+                'global_packages',
+                [
+                    d.dir(
+                        'foo',
+                        [d.dir('bin', [d.outOfDateSnapshot('script.dart.snapshot')])])])]).create();
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stdout.expect(consumeThrough("ok"));
+    process.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_snapshot_test.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_snapshot_test.dart
new file mode 100644
index 0000000..28da4f5
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/outdated_snapshot_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 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("a binstub runs 'pub global run' for an outdated snapshot", () {
+    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"]);
+
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                'global_packages',
+                [
+                    d.dir(
+                        'foo',
+                        [d.dir('bin', [d.outOfDateSnapshot('script.dart.snapshot')])])])]).create();
+
+    var process = new ScheduledProcess.start(
+        p.join(sandboxDir, cachePath, "bin", binStubName("foo-script")),
+        ["arg1", "arg2"],
+        environment: getEnvironment());
+
+    process.stderr.expect(startsWith("Wrong script snapshot version"));
+    process.stdout.expect(consumeThrough("ok [arg1, arg2]"));
+    process.shouldExit();
+
+    d.dir(
+        cachePath,
+        [
+            d.dir(
+                'global_packages/foo/bin',
+                [
+                    d.binaryMatcherFile(
+                        'script.dart.snapshot',
+                        isNot(
+                            equals(readBinaryFile(testAssetPath('out-of-date.snapshot')))))])]).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
index aecd1fd..49af05c 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
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
index 19a8dcf..e6cf443 100644
--- 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
@@ -6,7 +6,6 @@
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
-import 'utils.dart';
 
 main() {
   initConfig();
diff --git a/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
index e52a1eb..7e1a7ae 100644
--- a/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
+++ b/sdk/lib/_internal/pub_generated/test/global/binstubs/utils.dart
@@ -2,12 +2,42 @@
 // for 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';
 
-/// 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;
+import 'package:path/path.dart' as p;
+
+import '../../test_pub.dart';
+
+/// 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.
+Future<Map> getEnvironment() {
+  final completer0 = new Completer();
+  scheduleMicrotask(() {
+    try {
+      var binDir = p.dirname(Platform.executable);
+      join0(x0) {
+        var separator = x0;
+        var path = "${Platform.environment["PATH"]}${separator}${binDir}";
+        getPubTestEnvironment().then((x1) {
+          try {
+            var environment = x1;
+            environment["PATH"] = path;
+            completer0.complete(environment);
+          } catch (e0, s0) {
+            completer0.completeError(e0, s0);
+          }
+        }, onError: completer0.completeError);
+      }
+      if (Platform.operatingSystem == "windows") {
+        join0(";");
+      } else {
+        join0(":");
+      }
+    } catch (e, s) {
+      completer0.completeError(e, s);
+    }
+  });
+  return completer0.future;
 }
diff --git a/sdk/lib/_internal/pub_generated/test/test_pub.dart b/sdk/lib/_internal/pub_generated/test/test_pub.dart
index a3e6802..de82952 100644
--- a/sdk/lib/_internal/pub_generated/test/test_pub.dart
+++ b/sdk/lib/_internal/pub_generated/test/test_pub.dart
@@ -495,19 +495,38 @@
 }
 
 /// 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;
+Future<Map> getPubTestEnvironment([String tokenEndpoint]) {
+  final completer0 = new Completer();
+  scheduleMicrotask(() {
+    try {
+      var environment = {};
+      environment['_PUB_TESTING'] = 'true';
+      environment['PUB_CACHE'] = _pathInSandbox(cachePath);
+      environment['_PUB_TEST_SDK_VERSION'] = "0.1.2+3";
+      join0() {
+        join1() {
+          completer0.complete(environment);
+        }
+        if (_hasServer) {
+          completer0.complete(port.then(((p) {
+            environment['PUB_HOSTED_URL'] = "http://localhost:$p";
+            return environment;
+          })));
+        } else {
+          join1();
+        }
+      }
+      if (tokenEndpoint != null) {
+        environment['_PUB_TEST_TOKEN_ENDPOINT'] = tokenEndpoint.toString();
+        join0();
+      } else {
+        join0();
+      }
+    } catch (e, s) {
+      completer0.completeError(e, s);
+    }
+  });
+  return completer0.future;
 }
 
 /// Starts a Pub process and returns a [ScheduledProcess] that supports
@@ -543,20 +562,8 @@
   dartArgs.addAll(args);
 
   if (tokenEndpoint == null) tokenEndpoint = new Future.value();
-  var environmentFuture = tokenEndpoint.then((tokenEndpoint) {
-    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) {
-        pubEnvironment['PUB_HOSTED_URL'] = "http://localhost:$p";
-        return pubEnvironment;
-      });
-    }
-
-    return pubEnvironment;
-  }).then((pubEnvironment) {
+  var environmentFuture = tokenEndpoint.then(
+      (tokenEndpoint) => getPubTestEnvironment(tokenEndpoint)).then((pubEnvironment) {
     if (environment != null) pubEnvironment.addAll(environment);
     return pubEnvironment;
   });
@@ -868,6 +875,11 @@
   return map;
 }
 
+/// Returns the name of the shell script for a binstub named [name].
+///
+/// Adds a ".bat" extension on Windows.
+String binStubName(String name) => Platform.isWindows ? '$name.bat' : name;
+
 /// Compares the [actual] output from running pub with [expected].
 ///
 /// If [expected] is a [String], ignores leading and trailing whitespace
diff --git a/sdk/lib/_internal/pub_generated/test/transformer/dart2js_transformer_before_another_transformer_test.dart b/sdk/lib/_internal/pub_generated/test/transformer/dart2js_transformer_before_another_transformer_test.dart
new file mode 100644
index 0000000..5be8957
--- /dev/null
+++ b/sdk/lib/_internal/pub_generated/test/transformer/dart2js_transformer_before_another_transformer_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+// Regression test for issue 21726.
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("runs a dart2js transformer before a local transformer", () {
+      d.dir(appPath, [d.pubspec({
+          "name": "myapp",
+          "transformers": [r"$dart2js", "myapp/src/transformer"]
+        }),
+            d.dir("lib", [d.dir("src", [d.file("transformer.dart", REWRITE_TRANSFORMER)])]),
+            d.dir("web", [d.file("foo.txt", "foo")])]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("foo.out", "foo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index df5ab4e..b7401e9 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -322,7 +322,7 @@
   }
 
   Map<int, E> asMap() {
-    return new ListMapView(this);
+    return new ListMapView<E>(this);
   }
 
   List<E> sublist(int start, [int end]) {
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index f43d72c..a2289fd 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -19449,6 +19449,11 @@
   @Experimental()
   TextTrack addTextTrack(String kind, [String label, String language]) native;
 
+  @DomName('HTMLMediaElement.canPlayType')
+  @DocsEditable()
+  @Unstable()
+  String canPlayType(String type, [String keySystem]) native;
+
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
   void load() native;
@@ -19520,11 +19525,6 @@
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   @Experimental()
   ElementStream<MediaKeyEvent> get onNeedKey => needKeyEvent.forElement(this);
-
-  @DomName('HTMLMediaElement.canPlayType')
-  @DocsEditable()
-  @Unstable()
-  String canPlayType(String type, [String keySystem]) native;
 }
 // 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
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 232de55..601400b 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -21059,6 +21059,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.
 
+// WARNING: Do not edit - generated code.
+
 
 @DocsEditable()
 @DomName('HTMLMediaElement')
@@ -21381,6 +21383,13 @@
     return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_1_(this, kind);
   }
 
+  String canPlayType(String type, [String keySystem]) {
+    if (keySystem != null) {
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(this, type, keySystem);
+    }
+    return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(this, type);
+  }
+
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
   void load() => _blink.BlinkHTMLMediaElement.instance.load_Callback_0_(this);
@@ -21452,15 +21461,6 @@
   @Experimental()
   ElementStream<MediaKeyEvent> get onNeedKey => needKeyEvent.forElement(this);
 
-  @DomName('HTMLMediaElement.canPlayType')
-  @DocsEditable()
-  @Unstable()
-  String canPlayType(String type, [String keySystem]) {
-    if (keySystem != null) {
-      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(this, type, keySystem);
-    }
-    return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(this, type, null);
-  }
 }
 // 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
@@ -31426,10 +31426,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource)) {
+    if ((blob_OR_source_OR_stream is MediaStream)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream)) {
+    if ((blob_OR_source_OR_stream is MediaSource)) {
       return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index dc2d5b0..7bad1e0 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -128,7 +128,7 @@
  *     });
  *
  * Check out the
- * [dartiverse_search](https://code.google.com/p/dart/source/browse/branches/bleeding_edge/dart/samples/dartiverse_search)
+ * [dartiverse_search](https://github.com/dart-lang/sample-dartiverse-search)
  * sample for a client/server pair that uses
  * WebSockets to communicate.
  *
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index 5a8900e..b8f530c 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -538,12 +538,16 @@
   bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) => true;
 
   void processWorkItem(void f(WorkItem work), WorkItem work) {
-    if (work.element.library.canonicalUri == script) {
-      f(work);
-      printWallClock('Processed ${work.element}.');
-    } else {
-      printWallClock('Skipped ${work.element}.');
+    if (work.element.library.canonicalUri != script) {
+      // TODO(ahe): Rather nasty hack to work around another nasty hack in
+      // backend.dart. Find better solution.
+      if (work.element.name != 'closureFromTearOff') {
+        printWallClock('Skipped ${work.element}.');
+        return;
+      }
     }
+    f(work);
+    printWallClock('Processed ${work.element}.');
   }
 }
 
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index ca3ee3c..20b65f1 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -25,6 +25,16 @@
 Language/14_Libraries_and_Scripts/2_Exports_A04_t02: fail # Dart issue 12916
 Language/14_Libraries_and_Scripts/2_Exports_A04_t03: fail # Dart issue 12916
 
+Language/13_Statements/15_Assert_A03_t02: skip # co19 issue 734
+Language/13_Statements/15_Assert_A03_t03: skip # co19 issue 734
+Language/13_Statements/15_Assert_A04_t02: skip # co19 issue 734
+Language/13_Statements/15_Assert_A04_t05: skip # co19 issue 734
+
+# re-enable next 3 tests when co19 revision synched to r793
+Language/12_Expressions/20_Logical_Boolean_Expressions_A03_t01: skip  # until >= r793
+Language/12_Expressions/27_Unary_Expressions_A02_t03: skip  # until >= r793
+Language/13_Statements/06_For/1_For_Loop_A01_t08: skip  # until >= r793
+
 LibTest/core/DateTime/parse_A03_t01: fail # Issue 12514
 
 LibTest/core/DateTime/DateTime.now_A01_t02: Pass, Fail # co19 issue 709
diff --git a/tests/compiler/dart2js/backend_dart/sexpr2_test.dart b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart
index 0225334..774f142 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr2_test.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart
@@ -7,6 +7,7 @@
 

 import 'package:compiler/src/dart2jslib.dart';

 import 'package:compiler/src/cps_ir/cps_ir_nodes_sexpr.dart';

+import 'package:compiler/src/elements/elements.dart';

 import 'package:expect/expect.dart';

 

 import '../../../../pkg/analyzer2dart/test/test_helper.dart';

@@ -17,13 +18,24 @@
 main() {

   performTests(TEST_DATA, asyncTester, (TestSpec result) {

     return compilerFor(result.input).then((Compiler compiler) {

-      String expectedOutput = result.output.trim();

-      String output = compiler.irBuilder.getIr(compiler.mainFunction)

-          .accept(new SExpressionStringifier()).trim();

-      Expect.equals(expectedOutput, output,

-          '\nInput:\n${result.input}\n'

-          'Expected:\n$expectedOutput\n'

-          'Actual:\n$output\n');

+      void checkOutput(Element element, String expectedOutput) {

+        expectedOutput = expectedOutput.trim();

+        String output = compiler.irBuilder.getIr(element)

+            .accept(new SExpressionStringifier()).trim();

+        Expect.equals(expectedOutput, output,

+            '\nInput:\n${result.input}\n'

+            'Expected:\n$expectedOutput\n'

+            'Actual:\n$output\n');

+      }

+

+      if (result.output is String) {

+        checkOutput(compiler.mainFunction, result.output);

+      } else {

+        assert(result.output is Map<String, String>);

+        result.output.forEach((String elementName, String output) {

+          checkOutput(compiler.mainApp.localLookup(elementName), output);

+        });

+      }

     });

   });

 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
index 56315ad..d0eeba8 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
@@ -184,6 +184,8 @@
       new Tokens(
           s.replaceAll("(", " ( ")
            .replaceAll(")", " ) ")
+           .replaceAll("{", " { ")
+           .replaceAll("}", " } ")
            .replaceAll(new RegExp(r"[ \t\n]+"), " ")
            .trim()
            .split(" ")
@@ -269,19 +271,37 @@
 
     // name
     Element element = new DummyElement("");
-    if (tokens.current != "(") {
+    if (tokens.current != '(' && tokens.current != '{') {
       // This is a named function.
       element = new DummyElement(tokens.read());
     }
 
+    // [closure-vars]
+    List<ClosureVariable> closureVariables = <ClosureVariable>[];
+    if (tokens.current == '{') {
+      tokens.read('{');
+      while (tokens.current != '}') {
+        String varName = tokens.read();
+        ClosureVariable variable =
+            new ClosureVariable(element, new DummyElement(varName));
+        closureVariables.add(variable);
+        name2variable[varName] = variable;
+      }
+      tokens.read('}');
+    }
+
     // (args cont)
-    List<Parameter> parameters = <Parameter>[];
+    List<Definition> parameters = <Definition>[];
     tokens.consumeStart();
     while (tokens.next != ")") {
       String paramName = tokens.read();
-      Parameter param = new Parameter(new DummyElement(paramName));
-      name2variable[paramName] = param;
-      parameters.add(param);
+      if (name2variable.containsKey(paramName)) {
+        parameters.add(name2variable[paramName]);
+      } else {
+        Parameter param = new Parameter(new DummyElement(paramName));
+        name2variable[paramName] = param;
+        parameters.add(param);
+      }
     }
 
     String contName = tokens.read("return");
@@ -293,7 +313,8 @@
     Expression body = parseExpression();
 
     tokens.consumeEnd();
-    return new FunctionDefinition(element, cont, parameters, body, null, null);
+    return new FunctionDefinition(element, cont, parameters, body, null, null,
+        closureVariables);
   }
 
   /// (IsTrue arg)
@@ -339,7 +360,7 @@
     tokens.consumeStart(DECLARE_FUNCTION);
 
     // name =
-    Local local = new DummyLocal(tokens.read());
+    ClosureVariable local = name2variable[tokens.read()];
     tokens.read("=");
 
     // function in
@@ -480,7 +501,7 @@
   SetClosureVariable parseSetClosureVariable() {
     tokens.consumeStart(SET_CLOSURE_VARIABLE);
 
-    Local local = new DummyLocal(tokens.read());
+    ClosureVariable local = name2variable[tokens.read()];
     Primitive value = name2variable[tokens.read()];
     assert(value != null);
 
@@ -642,7 +663,7 @@
   GetClosureVariable parseGetClosureVariable() {
     tokens.consumeStart(GET_CLOSURE_VARIABLE);
 
-    Local local = new DummyLocal(tokens.read());
+    ClosureVariable local = name2variable[tokens.read()];
     tokens.consumeEnd();
 
     return new GetClosureVariable(local);
diff --git a/tests/compiler/dart2js/check_elements_invariants_test.dart b/tests/compiler/dart2js/check_elements_invariants_test.dart
index 2aff254..471cee4 100644
--- a/tests/compiler/dart2js/check_elements_invariants_test.dart
+++ b/tests/compiler/dart2js/check_elements_invariants_test.dart
@@ -4,15 +4,13 @@
 
 import 'dart:async';
 import 'package:compiler/src/apiimpl.dart';
-import 'package:compiler/src/dart2jslib.dart' show NullSink;
 import 'package:expect/expect.dart';
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/source_file_provider.dart';
 import 'package:compiler/src/elements/elements.dart'
     show ClassElement;
 import 'package:compiler/src/resolution/class_members.dart'
     show ClassMemberMixin;
 import "package:async_helper/async_helper.dart";
+import 'memory_compiler.dart';
 
 
 const String DART2JS_SOURCE =
@@ -24,8 +22,8 @@
 
 Iterable<ClassElement> computeLiveClasses(Compiler compiler) {
   return new Set<ClassElement>()
-      ..addAll(compiler.resolverWorld.instantiatedClasses)
-      ..addAll(compiler.codegenWorld.instantiatedClasses);
+      ..addAll(compiler.resolverWorld.directlyInstantiatedClasses)
+      ..addAll(compiler.codegenWorld.directlyInstantiatedClasses);
 }
 
 void checkClassInvariants(ClassElement cls) {
@@ -35,16 +33,7 @@
 }
 
 Future checkElementInvariantsAfterCompiling(Uri uri) {
-  var inputProvider = new CompilerSourceFileProvider();
-  var handler = new FormattingDiagnosticHandler(inputProvider);
-  var compiler = new Compiler(inputProvider.readStringFromUri,
-                              NullSink.outputProvider,
-                              handler,
-                              currentDirectory.resolve('sdk/'),
-                              currentDirectory.resolve('sdk/'),
-                              DART2JS_OPTIONS,
-                              {});
-
+  var compiler = compilerFor({}, options: DART2JS_OPTIONS);
    return compiler.run(uri).then((passed) {
      Expect.isTrue(passed, "Compilation of dart2js failed.");
 
@@ -53,6 +42,6 @@
 }
 
 void main () {
-  var uri = currentDirectory.resolve(DART2JS_SOURCE);
+  var uri = Uri.base.resolve(DART2JS_SOURCE);
   asyncTest(() => checkElementInvariantsAfterCompiling(uri));
 }
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 1c5dd3a..23f459b 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -36,12 +36,12 @@
 uri_retention_test: Pass, Slow
 deferred_mirrors_test: Pass, Slow
 mirror_final_field_inferrer2_test: Pass, Slow
+check_elements_invariants_test: Slow, Pass
 
-[ $checked || $mode == debug ]
+[ $mode == debug ]
 check_elements_invariants_test: Skip # Slow and only needs to be run in one
                                      # configuration
 
-[ $mode == debug ]
 mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
 
 deferred_mirrors_test: Pass, Slow
diff --git a/tests/compiler/dart2js/frontend_checker.dart b/tests/compiler/dart2js/frontend_checker.dart
index c3fc633..24f83c0 100644
--- a/tests/compiler/dart2js/frontend_checker.dart
+++ b/tests/compiler/dart2js/frontend_checker.dart
@@ -14,7 +14,7 @@
 

 import '../../../tools/testing/dart/multitest.dart'

     show ExtractTestsFromMultitest;

-import '../../../tools/testing/dart/utils.dart'

+import '../../../tools/testing/dart/path.dart'

     show Path;

 

 void check(List<String> testFiles,

diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
index 95d2c2b..55c058a 100644
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js_parser_statements_test.dart
@@ -200,7 +200,6 @@
                   {'a': ['x', 'y']},
                   'function foo(x, y) {\n}'),
 
-
     testStatement('a = #.#', [eVar,eOne], 'a = x[1];'),
     testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;'),
     testStatement('a = #a.#b', {'a': eVar, 'b': eOne}, 'a = x[1];'),
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index a5f923b..e3768a3 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -174,11 +174,13 @@
     testExpression("[]"),
     testError("[42 42]"),
     testExpression('beebop([1, 2, 3])'),
-    // *We can't parse array literals with holes in them.
-    testError("[1,, 2]"),
-    testError("[1,]"),
-    testError("[,]"),
-    testError("[, 42]"),
+    // Array literals with holes in them.
+    testExpression("[1,, 2]"),
+    testExpression("[1,]", "[1]"),
+    testExpression("[1,,]", "[1,,]"),
+    testExpression("[,]"),
+    testExpression("[,,]"),
+    testExpression("[, 42]"),
     // Ternary operator.
     testExpression("x = a ? b : c"),
     testExpression("y = a == null ? b : a"),
diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index 4f63420..d1c5c93 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -59,13 +59,13 @@
       bool encodeTypedefName = false;
       Expression expression =
             typeRepresentation.getTypeRepresentation(type, onVariable,
-                                                    (x) => encodeTypedefName);
+                                                     (x) => encodeTypedefName);
       Expect.stringEquals(expectedRepresentation, stringify(expression));
 
       encodeTypedefName = true;
       expression =
             typeRepresentation.getTypeRepresentation(type, onVariable,
-                                                    (x) => encodeTypedefName);
+                                                     (x) => encodeTypedefName);
       if (expectedTypedefRepresentation == null) {
         expectedTypedefRepresentation = expectedRepresentation;
       }
diff --git a/tests/compiler/dart2js/unused_empty_map_test.dart b/tests/compiler/dart2js/unused_empty_map_test.dart
new file mode 100644
index 0000000..dfda62d
--- /dev/null
+++ b/tests/compiler/dart2js/unused_empty_map_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Ensure that unused empty HashMap nodes are dropped from the output.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'memory_compiler.dart';
+
+const TEST_SOURCE = const {"main.dart": r"""
+void main() {
+  var x = {};
+  return;
+}
+"""};
+
+const HASHMAP_EMPTY_CONSTRUCTOR = r"LinkedHashMap_LinkedHashMap$_empty";
+
+main() {
+  var collector = new OutputCollector();
+  var compiler = compilerFor(TEST_SOURCE, outputProvider: collector);
+  asyncTest(() =>
+    compiler.run(Uri.parse('memory:main.dart')).then((_) {
+      String generated = collector.getOutput('', 'js');
+      Expect.isFalse(generated.contains(HASHMAP_EMPTY_CONSTRUCTOR));
+    })
+  );
+}
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
new file mode 100644
index 0000000..94197cd
--- /dev/null
+++ b/tests/compiler/dart2js_extra/21579_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.
+
+// Regression test for http://dartbug.com/21579
+//
+// Fails for --trust-type-annotations:
+//
+// test.py -mrelease -cdart2js -rd8 --dart2js-options='--trust-type-annotations' dart2js_extra/21579_test
+
+import 'package:expect/expect.dart';
+
+main() {
+  var a = new List.generate(100, (i) => i);
+  a.sort((a, b) => 1000000000000000000000 * a.compareTo(b));
+  Expect.equals(0, a.first);
+  Expect.equals(99, a.last);
+}
diff --git a/tests/compiler/dart2js_extra/21724_test.dart b/tests/compiler/dart2js_extra/21724_test.dart
new file mode 100644
index 0000000..a578ca6
--- /dev/null
+++ b/tests/compiler/dart2js_extra/21724_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+
+// Regression test for issue 21724 - invalid call to local closure
+
+main() {
+  foo(x) {}
+  try {
+    foo();
+  } catch (_) {}
+}
+
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 5b00f9e..f01bb1f 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -204,10 +204,6 @@
 list_insert_test: fail
 list_removeat_test: fail
 
-[ $arch == simmips || $arch == mips ]
-big_integer_parsed_mul_div_vm_test: Skip # Timeout. Issue 20879.
-big_integer_huge_mul_vm_test: Skip # Timeout. Issue 20879.
-
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 error_stack_trace_test: StaticWarning, OK # Test generates errors on purpose.
 iterable_element_at_test: StaticWarning, OK # Test generates errors on purpose.
diff --git a/tests/corelib/date_time_test.dart b/tests/corelib/date_time_test.dart
index 62c8ab8..79dcdd9 100644
--- a/tests/corelib/date_time_test.dart
+++ b/tests/corelib/date_time_test.dart
@@ -13,14 +13,16 @@
 void testNow() {
   var t1 = new DateTime.now();
   bool timeMovedForward = false;
-  for (int i = 0; i < 1000000; i++) {
-    var t2 = new DateTime.now();
-    if (t1.millisecondsSinceEpoch < t2.millisecondsSinceEpoch) {
-      timeMovedForward = true;
-      break;
+  const int N = 1000000;
+  outer: while (true) {
+    for (int i = N; i > 0; i--) {
+      var t2 = new DateTime.now();
+      if (t1.millisecondsSinceEpoch < t2.millisecondsSinceEpoch) {
+        break outer;
+      }
     }
+    print("testNow: No Date.now() progress in $N loops. Time: $t1");
   }
-  Expect.equals(true, timeMovedForward);
   Expect.isFalse(t1.isUtc);
 }
 
diff --git a/tests/html/custom/attribute_changed_callback_test.html b/tests/html/custom/attribute_changed_callback_test.html
index cf1042b..8237473 100644
--- a/tests/html/custom/attribute_changed_callback_test.html
+++ b/tests/html/custom/attribute_changed_callback_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/constructor_calls_created_synchronously_test.html b/tests/html/custom/constructor_calls_created_synchronously_test.html
index 3ba2ba8..c18be7d 100644
--- a/tests/html/custom/constructor_calls_created_synchronously_test.html
+++ b/tests/html/custom/constructor_calls_created_synchronously_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/created_callback_test.html b/tests/html/custom/created_callback_test.html
index e68ef23..892277b 100644
--- a/tests/html/custom/created_callback_test.html
+++ b/tests/html/custom/created_callback_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/document_register_basic_test.html b/tests/html/custom/document_register_basic_test.html
index f87df4b..10041c9 100644
--- a/tests/html/custom/document_register_basic_test.html
+++ b/tests/html/custom/document_register_basic_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/document_register_type_extensions_test.html b/tests/html/custom/document_register_type_extensions_test.html
index 92cdd27..75419cb 100644
--- a/tests/html/custom/document_register_type_extensions_test.html
+++ b/tests/html/custom/document_register_type_extensions_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/element_upgrade_test.html b/tests/html/custom/element_upgrade_test.html
index 498a47b..3267d7f 100644
--- a/tests/html/custom/element_upgrade_test.html
+++ b/tests/html/custom/element_upgrade_test.html
@@ -7,7 +7,7 @@
    .unittest-fail { background: #d55;}
    .unittest-error { background: #a11;}
 </style>
-<script src="/packages/web_components/platform.concat.js"></script>
+<script src="/packages/web_components/webcomponents.js"></script>
 <script src="/packages/web_components/dart_support.js"></script>
 
 <body>
diff --git a/tests/html/custom/entered_left_view_test.html b/tests/html/custom/entered_left_view_test.html
index 3ba2ba8..c18be7d 100644
--- a/tests/html/custom/entered_left_view_test.html
+++ b/tests/html/custom/entered_left_view_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/js_custom_test.html b/tests/html/custom/js_custom_test.html
index 92a36d1..18e254c 100644
--- a/tests/html/custom/js_custom_test.html
+++ b/tests/html/custom/js_custom_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom/mirrors_test.html b/tests/html/custom/mirrors_test.html
index f28c4fa..76079b3 100644
--- a/tests/html/custom/mirrors_test.html
+++ b/tests/html/custom/mirrors_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/custom_elements_test.html b/tests/html/custom_elements_test.html
index 7a3eb2c..42c6ed6 100644
--- a/tests/html/custom_elements_test.html
+++ b/tests/html/custom_elements_test.html
@@ -10,7 +10,7 @@
      .unittest-fail { background: #d55;}
      .unittest-error { background: #a11;}
   </style>
-  <script src="/packages/web_components/platform.concat.js"></script>
+  <script src="/packages/web_components/webcomponents.js"></script>
   <script src="/packages/web_components/dart_support.js"></script>
 </head>
 <body>
diff --git a/tests/html/html.status b/tests/html/html.status
index 510b2fa..d42d012 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -314,7 +314,6 @@
 dart_object_local_storage_test: Skip  # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 webgl_1_test: Pass, Fail   # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Firefox does not like dataUrl videos for drawImage
-canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 21526
 
 # Firefox Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
diff --git a/tests/isolate/function_send_test.dart b/tests/isolate/function_send_test.dart
index 95f4f93..51d26ba 100644
--- a/tests/isolate/function_send_test.dart
+++ b/tests/isolate/function_send_test.dart
@@ -153,13 +153,12 @@
 
   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
+  Expect.throws(() {
+    noReply.sendPort.send(func);
+  }, null, "send direct");
+  Expect.throws(() {
+    noReply.sendPort.send([func]);
+  }, null, "send wrapped");
   scheduleMicrotask(() {
     noReply.close();
     asyncEnd();
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index 6a6742d..0f44869 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -10,13 +10,11 @@
 mandel_isolate_test: Skip # Uses 600 MB Ram on our 1 GB test device.
 
 [ $compiler == none || $compiler == dart2dart ]
-serialization_test: SkipByDesign # Tests dart2js-specific serialization code
 compile_time_error_test/01: Skip # Issue 12587
-capability_test: Fail     # Not implemented yet
 start_paused_test: Fail   # Not implemented yet
 ondone_test: Fail         # Not implemented yet
-ping_test: Fail           # Not implemented yet
-ping_pause_test: Fail     # Not implemented yet
+ping_test: Skip           # Resolve test issues
+ping_pause_test: Skip     # Resolve test issues
 kill_test: Fail           # Not implemented yet
 kill2_test: Fail          # Not implemented yet
 kill3_test: Fail          # Not implemented yet
@@ -26,6 +24,13 @@
 handle_error3_test: Fail  # Not implemented yet
 function_send_test: Fail   # Not implemented yet
 
+message3_test/constList_identical: RuntimeError # Issue 21816
+message3_test/constMap: RuntimeError  # Issue 21816
+message3_test/fun: RuntimeError  # Issue 21585
+message3_test/constInstance: RuntimeError # Issue 21816
+message3_test/byteBuffer: Crash # Issue 21818
+message3_test/int32x4: Crash # Issue 21818
+
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 *: Skip # Isolate tests are timing out flakily on Android content_shell.  Issue 19795
 
@@ -38,11 +43,6 @@
 [ $compiler == dart2js && $runtime == jsshell ]
 pause_test: Fail  # non-zero timer not supported.
 
-[ $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
@@ -50,13 +50,14 @@
 [ $compiler == dart2js ]
 spawn_uri_vm_test: SkipByDesign # Test uses a ".dart" URI.
 spawn_uri_nested_vm_test: SkipByDesign # Test uses a ".dart" URI.
+message3_test/constList: RuntimeError # Issue 21817
+message3_test/constList_identical: RuntimeError # Issue 21817
+message3_test/constMap: RuntimeError  # Issue 21817
+message3_test/constInstance: RuntimeError # Issue 21817
 
 [ $compiler == dart2js && $jscl ]
 spawn_uri_test: SkipByDesign # Loading another file is not supported in JS shell
 
-[ $compiler == dart2js && $runtime == none ]
-serialization_test: Pass # Issue 12628
-
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 isolate_stress_test: Pass, Slow # TODO(kasperl): Please triage.
 
@@ -94,6 +95,8 @@
 compile_time_error_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_import_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 isolate_stress_test: Skip # Issue 13921 Dom isolates don't support spawnFunction
+message3_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
+object_leak_test: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 simple_message_test/none: Fail, OK # Issue 13921 Dom isolates don't support spawnFunction
 spawn_uri_missing_from_isolate_test: RuntimeError # http://dartbug.com/17649
 spawn_uri_missing_test: Skip # Times out.
@@ -101,7 +104,6 @@
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 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/message3_test.dart b/tests/isolate/message3_test.dart
new file mode 100644
index 0000000..a29c8f9
--- /dev/null
+++ b/tests/isolate/message3_test.dart
@@ -0,0 +1,438 @@
+// 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.
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library MessageTest;
+import 'dart:async';
+import 'dart:collection';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'dart:typed_data';
+
+void echoMain(msg) {
+  SendPort replyTo = msg[0];
+  SendPort pong = msg[1];
+  ReceivePort port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.listen((msg) {
+    if (msg == "halt") {
+      port.close();
+    } else {
+      pong.send(msg);
+    }
+  });
+}
+
+class A {
+  var field = 499;
+
+  A();
+  A.named(this.field);
+}
+
+class B extends A {
+  final field2;
+  B() : field2 = 99;
+  B.named(this.field2, x) : super.named(x);
+}
+
+class C extends B {
+  var field = 33;
+
+  get superField => super.field;
+  get superField2 => super.field2;
+}
+
+class M {
+  get field2 => 11;
+}
+
+class D extends C with M {
+  var gee = 123;
+}
+
+class E {
+  Function fun;
+  E(this.fun);
+
+  static fooFun() => 499;
+  instanceFun() => 1234;
+}
+barFun() => 42;
+
+class F {
+  final field = "field";
+  const F();
+}
+
+class G {
+  final field;
+  const G(this.field);
+}
+
+class Value {
+  final val;
+  Value(this.val);
+
+  operator==(other) {
+    if (other is! Value) return false;
+    return other.val == val;
+  }
+
+  get hashCode => val;
+}
+
+void runTests(SendPort ping, Queue checks) {
+  ping.send("abc");
+  checks.add((x) => Expect.equals("abc", x));
+
+  ping.send([1, 2]);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([1, 2], x);
+    // Make sure the list is mutable.
+    x[0] = 0;
+    Expect.equals(0, x[0]);
+    // List must be extendable.
+    x.add(3);
+    Expect.equals(3, x[2]);
+  });
+
+  List fixed = new List(2);
+  fixed[0] = 0;
+  fixed[1] = 1;
+  ping.send(fixed);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([0, 1], x);
+    // List must be mutable.
+    x[0] = 3;
+    Expect.equals(3, x[0]);
+    // List must be fixed length.
+    Expect.throws(() { x.add(5); });
+  });
+
+  List cyclic = [];
+  cyclic.add(cyclic);
+  ping.send(cyclic);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.equals(1, x.length);
+    Expect.identical(x, x[0]);
+    // List must be mutable.
+    x[0] = 55;
+    Expect.equals(55, x[0]);
+    // List must be extendable.
+    x.add(42);
+    Expect.equals(42, x[1]);
+  });
+
+  List cyclic2 = new List(1);
+  cyclic2[0] = cyclic2;
+  ping.send(cyclic2);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.equals(1, x.length);
+    Expect.identical(x, x[0]);
+    // List must be mutable.
+    x[0] = 55;
+    Expect.equals(55, x[0]);
+    // List must be fixed.
+    Expect.throws(() => x.add(42));
+  });
+
+  List constList = const [1, 2];
+  ping.send(constList);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([1, 2], x);
+    // Make sure the list is immutable.
+    Expect.throws(() => x[0] = 0);  /// constList: ok
+    // List must not be extendable.
+    Expect.throws(() => x.add(3));
+    Expect.identical(x, constList);  /// constList_identical: ok
+  });
+
+  Uint8List uint8 = new Uint8List(2);
+  uint8[0] = 0;
+  uint8[1] = 1;
+  ping.send(uint8);
+  checks.add((x) {
+    Expect.isTrue(x is Uint8List);
+    Expect.equals(2, x.length);
+    Expect.equals(0, x[0]);
+    Expect.equals(1, x[1]);
+  });
+
+  Uint16List uint16 = new Uint16List(2);
+  uint16[0] = 0;
+  uint16[1] = 1;
+  ByteBuffer byteBuffer = uint16.buffer;
+  ping.send(byteBuffer);  /// byteBuffer: ok
+  checks.add(             /// byteBuffer: ok
+  (x) {
+    Expect.isTrue(x is ByteBuffer);
+    Uint16List uint16View = new Uint16List.view(x);
+    Expect.equals(2, uint16View.length);
+    Expect.equals(0, uint16View[0]);
+    Expect.equals(1, uint16View[1]);
+  }
+  )                      /// byteBuffer: ok
+  ;
+
+  Int32x4List list32x4 = new Int32x4List(2);
+  list32x4[0] = new Int32x4(1, 2, 3, 4);
+  list32x4[1] = new Int32x4(5, 6, 7, 8);
+  ping.send(list32x4);   /// int32x4: ok
+  checks.add(            /// int32x4: ok
+  (x) {
+    Expect.isTrue(x is Int32x4List);
+    Expect.equals(2, x.length);
+    Int32x4 entry1 = x[0];
+    Int32x4 entry2 = x[1];
+    Expect.equals(1, entry1.x);
+    Expect.equals(2, entry1.y);
+    Expect.equals(3, entry1.z);
+    Expect.equals(4, entry1.w);
+    Expect.equals(5, entry2.x);
+    Expect.equals(6, entry2.y);
+    Expect.equals(7, entry2.z);
+    Expect.equals(8, entry2.w);
+  }
+  )                     /// int32x4: ok
+  ;
+
+  ping.send({"foo": 499, "bar": 32});
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.listEquals(["foo", "bar"], x.keys.toList());
+    Expect.listEquals([499, 32], x.values.toList());
+    // Must be mutable.
+    x["foo"] = 22;
+    Expect.equals(22, x["foo"]);
+    // Must be extendable.
+    x["gee"] = 499;
+    Expect.equals(499, x["gee"]);
+  });
+
+  ping.send({0: 499, 1: 32});
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.listEquals([0, 1], x.keys.toList());
+    Expect.listEquals([499, 32], x.values.toList());
+    // Must be mutable.
+    x[0] = 22;
+    Expect.equals(22, x[0]);
+    // Must be extendable.
+    x["gee"] = 499;
+    Expect.equals(499, x["gee"]);
+  });
+
+  Map cyclicMap = {};
+  cyclicMap["cycle"] = cyclicMap;
+  ping.send(cyclicMap);
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.identical(x, x["cycle"]);
+    // Must be mutable.
+    x["cycle"] = 22;
+    Expect.equals(22, x["cycle"]);
+    // Must be extendable.
+    x["gee"] = 499;
+    Expect.equals(499, x["gee"]);
+  });
+
+  Map constMap = const {'foo': 499};
+  ping.send(constMap);
+  checks.add((x) {
+    Expect.isTrue(x is Map);
+    print(x.length);
+    Expect.equals(1, x.length);
+    Expect.equals(499, x['foo']);
+    Expect.identical(constMap, x);  /// constMap: ok
+    Expect.throws(() => constMap['bar'] = 42);
+  });
+
+  ping.send(new A());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.equals(499, x.field);
+  });
+
+  ping.send(new A.named(42));
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.equals(42, x.field);
+  });
+
+  ping.send(new B());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.equals(499, x.field);
+    Expect.equals(99, x.field2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new B.named(1, 2));
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.equals(2, x.field);
+    Expect.equals(1, x.field2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new C());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.equals(33, x.field);
+    Expect.equals(99, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new D());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.isTrue(x is D);
+    Expect.isTrue(x is M);
+    Expect.equals(33, x.field);
+    Expect.equals(11, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.equals(99, x.superField2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  D cyclicD = new D();
+  cyclicD.field = cyclicD;
+  ping.send(cyclicD);
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.isTrue(x is D);
+    Expect.isTrue(x is M);
+    Expect.identical(x, x.field);
+    Expect.equals(11, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.equals(99, x.superField2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new E(E.fooFun));  /// fun: ok
+  checks.add((x) {             /// fun: continued
+    Expect.equals(E.fooFun, x.fun);  /// fun: continued
+    Expect.equals(499, x.fun());     /// fun: continued
+  });                                /// fun: continued
+
+  ping.send(new E(barFun));  /// fun: continued
+  checks.add((x) {           /// fun: continued
+    Expect.equals(barFun, x.fun);  /// fun: continued
+    Expect.equals(42, x.fun());    /// fun: continued
+  });                              /// fun: continued
+
+  Expect.throws(() => ping.send(new E(new E(null).instanceFun)));
+
+  F nonConstF = new F();
+  ping.send(nonConstF);
+  checks.add((x) {
+    Expect.equals("field", x.field);
+    Expect.isFalse(identical(nonConstF, x));
+  });
+
+  const F constF = const F();
+  ping.send(constF);
+  checks.add((x) {
+    Expect.equals("field", x.field);
+    Expect.identical(constF, x);  /// constInstance: ok
+  });
+
+  G g1 = new G(nonConstF);
+  G g2 = new G(constF);
+  G g3 = const G(constF);
+  ping.send(g1);
+  ping.send(g2);
+  ping.send(g3);
+
+  checks.add((x) {  // g1.
+    Expect.isTrue(x is G);
+    Expect.isFalse(identical(g1, x));
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.isFalse(identical(nonConstF, f));
+  });
+  checks.add((x) {  // g1.
+    Expect.isTrue(x is G);
+    Expect.isFalse(identical(g1, x));
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.identical(constF, f);  /// constInstance: continued
+  });
+  checks.add((x) {  // g3.
+    Expect.isTrue(x is G);
+    Expect.identical(g1, x);  /// constInstance: continued
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.identical(constF, f);  /// constInstance: continued
+  });
+
+  // Make sure objects in a map are serialized and deserialized in the correct
+  // order.
+  Map m = new Map();
+  Value val1 = new Value(1);
+  Value val2 = new Value(2);
+  m[val1] = val2;
+  m[val2] = val1;
+  // Possible bug we want to catch:
+  // serializer runs through keys first, and then the values:
+  //    - id1 = val1, id2 = val2, ref[id2], ref[id1]
+  // deserializer runs through the keys and values in order:
+  //    - val1;  // id1.
+  //    - ref[id2];  // boom. Wasn't deserialized yet.
+  ping.send(m);
+  checks.add((x) {
+    Expect.isTrue(x is Map);
+    Expect.equals(2, x.length);
+    Expect.equals(val2, x[val1]);
+    Expect.equals(val1, x[val2]);
+    Expect.identical(x.keys.elementAt(0), x.values.elementAt(1));
+    Expect.identical(x.keys.elementAt(1), x.values.elementAt(0));
+  });
+}
+
+void main() {
+  asyncStart();
+  Queue checks = new Queue();
+  ReceivePort testPort = new ReceivePort();
+  Completer completer = new Completer();
+
+  testPort.listen((msg) {
+    Function check = checks.removeFirst();
+    check(msg);
+    if (checks.isEmpty) {
+      completer.complete();
+      testPort.close();
+    }
+  });
+
+  ReceivePort initialReplyPort = new ReceivePort();
+  Isolate
+    .spawn(echoMain, [initialReplyPort.sendPort, testPort.sendPort])
+    .then((_) => initialReplyPort.first)
+    .then((SendPort ping) {
+      runTests(ping, checks);
+      Expect.isTrue(checks.length > 0);
+      completer.future
+        .then((_) => ping.send("halt"))
+        .then((_) => asyncEnd());
+    });
+}
diff --git a/tests/isolate/object_leak_test.dart b/tests/isolate/object_leak_test.dart
index 4511b43..d15f2b5 100644
--- a/tests/isolate/object_leak_test.dart
+++ b/tests/isolate/object_leak_test.dart
@@ -16,25 +16,23 @@
 }
 
 fun(msg) {
-  print("received: ${msg.x}");
-  msg.x = 1;
-  print("done updating: ${msg.x}");
+  var a = msg[0];
+  var replyTo = msg[1];
+  print("received: ${a.x}");
+  a.x = 1;
+  print("done updating: ${a.x}");
+  replyTo.send("done");
 }
 
 main() {
   asyncStart();
   var a = new A();
-  // Sending an A object to another isolate should not work.
-  Isolate.spawn(fun, a).then((isolate) {
-    new Timer(const Duration(milliseconds: 300), () {
-      // Changes in other isolate must not reach here.
-      Expect.equals(0, a.x);
-      asyncEnd();
-    });
-  }, onError: (e) {
-    // Sending an A isn't required to work.
-    // It works in the VM, but not in dart2js.
-    print("Send of A failed:\n$e");
+  ReceivePort rp = new ReceivePort();
+  Isolate.spawn(fun, [a, rp.sendPort]);
+  rp.first.then((msg) {
+    Expect.equals("done", msg);
+    // Changes in other isolate must not reach here.
+    Expect.equals(0, a.x);
     asyncEnd();
   });
 }
diff --git a/tests/isolate/serialization_test.dart b/tests/isolate/serialization_test.dart
deleted file mode 100644
index 8a8cc25..0000000
--- a/tests/isolate/serialization_test.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Dart test program for testing serialization of messages without spawning
-// isolates.
-
-// ---------------------------------------------------------------------------
-// Serialization test.
-// ---------------------------------------------------------------------------
-library SerializationTest;
-import "package:expect/expect.dart";
-import 'dart:isolate';
-
-main() {
-  // TODO(sigmund): fix once we can disable privacy for testing (bug #1882)
-  testAllTypes(TestingOnly.copy);
-  testAllTypes(TestingOnly.serialize);
-}
-
-void testAllTypes(Function f) {
-  copyAndVerify(0, f);
-  copyAndVerify(499, f);
-  copyAndVerify(true, f);
-  copyAndVerify(false, f);
-  copyAndVerify("", f);
-  copyAndVerify("foo", f);
-  copyAndVerify([], f);
-  copyAndVerify([1, 2], f);
-  copyAndVerify([[]], f);
-  copyAndVerify([1, []], f);
-  copyAndVerify({}, f);
-  copyAndVerify({ 'a': 3 }, f);
-  copyAndVerify({ 'a': 3, 'b': 5, 'c': 8 }, f);
-  copyAndVerify({ 'a': [1, 2] }, f);
-  copyAndVerify({ 'b': { 'c' : 99 } }, f);
-  copyAndVerify([ { 'a': 499 }, { 'b': 42 } ], f);
-
-  var port = new ReceivePort();
-  Expect.throws(() => f(port));
-  port.close();
-
-  var a = [ 1, 3, 5 ];
-  var b = { 'b': 49 };
-  var c = [ a, b, a, b, a ];
-  var copied = f(c);
-  verify(c, copied);
-  Expect.isFalse(identical(c, copied));
-  Expect.identical(copied[0], copied[2]);
-  Expect.identical(copied[0], copied[4]);
-  Expect.identical(copied[1], copied[3]);
-}
-
-void copyAndVerify(o, Function f) {
-  var copy = f(o);
-  verify(o, copy);
-}
-
-void verify(o, copy) {
-  if ((o is bool) || (o is num) || (o is String)) {
-    Expect.equals(o, copy);
-  } else if (o is List) {
-    Expect.isTrue(copy is List);
-    Expect.equals(o.length, copy.length);
-    for (int i = 0; i < o.length; i++) {
-      verify(o[i], copy[i]);
-    }
-  } else if (o is Map) {
-    Expect.isTrue(copy is Map);
-    Expect.equals(o.length, copy.length);
-    o.forEach((key, value) {
-      Expect.isTrue(copy.containsKey(key));
-      verify(value, copy[key]);
-    });
-  } else {
-    Expect.fail("Unexpected object encountered");
-  }
-}
diff --git a/tests/language/bool_check_test.dart b/tests/language/bool_check_test.dart
new file mode 100644
index 0000000..49363ff
--- /dev/null
+++ b/tests/language/bool_check_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+bool typeChecksEnabled() {
+  try {
+    var i = 42;
+    String s = i;
+  } on TypeError catch (e) {
+    return true;
+  }
+  return false;
+}
+
+bool assertionsEnabled() {
+  try {
+    assert(false);
+    return false;
+  } on AssertionError catch (e) {
+    return true;
+  }
+  return false;
+}
+
+final bool typeChecksOn = typeChecksEnabled();
+final bool assertionsOn = assertionsEnabled();
+
+ifExpr(e) { if (e) return true; else return false; }
+bool ifNull() => ifExpr(null);
+bool ifString() => ifExpr("true");
+
+main() {
+  print("type checks: $typeChecksOn");
+  print("assertions:  $assertionsOn");
+
+  if (typeChecksOn) {
+    Expect.throws(ifNull, (e) => e is AssertionError);
+  }
+  if (assertionsOn && !typeChecksOn) {
+    Expect.throws(ifNull, (e) => e is AssertionError);
+  }
+  if (!typeChecksOn && !assertionsOn) {
+    Expect.identical(false, ifNull());
+  }
+
+  if (!typeChecksOn) {
+    Expect.identical(false, ifString());
+  }
+  if (typeChecksOn) {
+    Expect.throws(ifString, (e) => e is TypeError);
+  }
+}
\ No newline at end of file
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 09d51d8..a19cceb 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -3,6 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2js || $compiler == dart2dart ]
+symbol_literal_test/*: Fail # Issue 21825
 constructor_duplicate_final_test/01: Fail # Issue 13363
 constructor_duplicate_final_test/02: Fail # Issue 13363
 override_inheritance_mixed_test/08: Fail # Issue 18124
@@ -141,6 +142,8 @@
 
 deferred_constant_list_test: RuntimeError # Issue 21293
 
+enum_const_test: RuntimeError # Issue 21817
+
 # Compilation errors.
 const_var_test: CompileTimeError # Issue 12793
 map_literal3_test: CompileTimeError # Issue 12793
diff --git a/tests/language/regress_21793_test.dart b/tests/language/regress_21793_test.dart
new file mode 100644
index 0000000..b4eca96
--- /dev/null
+++ b/tests/language/regress_21793_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 21793.
+
+import 'package:expect/expect.dart';
+
+/*   /// 01: static type warning, runtime error
+class A { call(x) => x; }
+*/   /// 01: continued
+
+main() {
+  print(new A()(499));
+}
diff --git a/tests/language/symbol_literal_test.dart b/tests/language/symbol_literal_test.dart
index 052773d..b4520ba 100644
--- a/tests/language/symbol_literal_test.dart
+++ b/tests/language/symbol_literal_test.dart
@@ -12,6 +12,14 @@
 
 var check = foo; // Indirection used to avoid inlining.
 
+testSwitch(Symbol s) {
+  switch(s) {
+    case #abc: return 1;
+    case const Symbol("def"): return 2;
+    default: return 0;
+  }
+}
+
 main() {
   check(const Symbol("a"), #a);
   check(const Symbol("a"), #
@@ -28,6 +36,11 @@
   check(const Symbol("=="), # ==);
   check(const Symbol("a.toString"), #a.toString);
 
+  Expect.equals(1, testSwitch(#abc));
+
+  const m = const <Symbol, int>{#A:0, #B:1};
+  Expect.equals(1, m[#B]);
+
   // Tries to call the symbol literal #a.toString
   Expect.throws(() => #a.toString(), (e) => e is NoSuchMethodError); /// 01: static type warning
 }
diff --git a/tests/language/type_argument_substitution_test.dart b/tests/language/type_argument_substitution_test.dart
new file mode 100644
index 0000000..1383c4f
--- /dev/null
+++ b/tests/language/type_argument_substitution_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that substitutions are emitted for classes that are only used as
+// type arguments.
+
+import 'package:expect/expect.dart';
+
+class K {}
+
+class A<T> {}
+
+class B extends A<K> {}
+
+class X<T> {}
+
+main() {
+  var v = new DateTime.now().millisecondsSinceEpoch != 42
+    ? new X<B>() : new X<A<String>>();
+  Expect.isFalse(v is X<A<String>>);
+}
diff --git a/tests/language/vm/type_vm_test.dart b/tests/language/vm/type_vm_test.dart
index fda7b1c..f061a14 100644
--- a/tests/language/vm/type_vm_test.dart
+++ b/tests/language/vm/type_vm_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--enable_type_checks --no_show_internal_names
+// VMOptions=--enable_type_checks --enable_asserts --no_show_internal_names
 // Dart test program testing type checks.
 
 import "package:expect/expect.dart";
@@ -266,15 +266,13 @@
           "type_vm_test.dart:258:20"));
     }
     try {
-      if (null) {};  // Throws a TypeError if type checks are enabled.
-    } on TypeError catch (error) {
+      if (null) {};  // Throws an AssertionError if assertions are enabled.
+    } on AssertionError catch (error) {
       result++;
       var msg = error.toString();
-      Expect.isTrue(msg.contains("'bool'"));  // dstType
-      Expect.isTrue(msg.contains("'Null'"));  // srcType
-      Expect.isTrue(msg.contains("boolean expression"));  // dstName
-      Expect.isTrue(error.stackTrace.toString().contains(
-          "type_vm_test.dart:269:11"));
+      Expect.isTrue(msg.contains("assertion"));
+      Expect.isTrue(msg.contains("boolean expression"));
+      Expect.isTrue(msg.contains("null"));
     }
     return result;
   }
@@ -319,7 +317,7 @@
         Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
         Expect.isTrue(msg.contains("'ai'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:314:24"));
+            "type_vm_test.dart:312:24"));
       }
       try {
         List<num> an = a;
@@ -330,7 +328,7 @@
         Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
         Expect.isTrue(msg.contains("'an'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:325:24"));
+            "type_vm_test.dart:323:24"));
       }
       try {
         List<String> as = a;
@@ -341,7 +339,7 @@
         Expect.isTrue(msg.contains("'List<Object>'"));  // srcType
         Expect.isTrue(msg.contains("'as'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:336:27"));
+            "type_vm_test.dart:334:27"));
       }
     }
     {
@@ -359,7 +357,7 @@
         Expect.isTrue(msg.contains("'List<int>'"));  // srcType
         Expect.isTrue(msg.contains("'as'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:354:27"));
+            "type_vm_test.dart:352:27"));
       }
     }
     {
@@ -375,7 +373,7 @@
         Expect.isTrue(msg.contains("'List<num>'"));  // srcType
         Expect.isTrue(msg.contains("'ai'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:370:24"));
+            "type_vm_test.dart:368:24"));
       }
       List<num> an = a;
       try {
@@ -387,7 +385,7 @@
         Expect.isTrue(msg.contains("'List<num>'"));  // srcType
         Expect.isTrue(msg.contains("'as'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:382:27"));
+            "type_vm_test.dart:380:27"));
       }
     }
     {
@@ -403,7 +401,7 @@
         Expect.isTrue(msg.contains("'List<String>'"));  // srcType
         Expect.isTrue(msg.contains("'ai'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:398:24"));
+            "type_vm_test.dart:396:24"));
       }
       try {
         List<num> an = a;
@@ -414,7 +412,7 @@
         Expect.isTrue(msg.contains("'List<String>'"));  // srcType
         Expect.isTrue(msg.contains("'an'"));  // dstName
         Expect.isTrue(error.stackTrace.toString().contains(
-            "type_vm_test.dart:409:24"));
+            "type_vm_test.dart:407:24"));
       }
       List<String> as = a;
     }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 85b8e2c..54fef3d 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -127,9 +127,6 @@
 [ $compiler == dart2js && ($minified || $runtime == jsshell) ]
 mirrors/invocation_fuzz_test: RuntimeError # Issue 15566
 
-[ $runtime == vm && $mode == debug && $system == macos ]
-mirrors/invocation_fuzz_test: Pass, RuntimeError # Issue 21707
-
 [ $compiler == dart2js && $runtime == jsshell ]
 async/future_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
 async/slow_consumer2_test: RuntimeError # Timer interface not supported; dartbug.com/7728.
@@ -306,10 +303,6 @@
 [ $compiler == dart2js && $mode == debug ]
 mirrors/native_class_test: Pass, Slow
 
-[ $arch == simmips || $arch == mips ]
-convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12025.
-convert/streamed_conversion_json_utf8_decode_test: Skip  # Pass, Slow
-
 [ $arch == simarm ]
 convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
 convert/utf85_test: Skip  # Pass, Slow Issue 12644.
@@ -323,5 +316,5 @@
 [ $mode == debug && $arch == ia32 && $system == windows ]
 convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification OOM.
 
-[ $mode == debug && $arch != ia32 && $arch != x64 ]
-convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification not yet implemented.
+[ $mode == debug && $arch != ia32 && $arch != x64 && $arch != simarm ]
+convert/streamed_conversion_json_utf8_decode_test: Skip  # Verification not yet implemented.
\ No newline at end of file
diff --git a/tests/lib/mirrors/intercepted_object_test.dart b/tests/lib/mirrors/intercepted_object_test.dart
index e01733b..27e561a 100644
--- a/tests/lib/mirrors/intercepted_object_test.dart
+++ b/tests/lib/mirrors/intercepted_object_test.dart
@@ -16,6 +16,11 @@
   ClassMirror cls = reflect(object).type;
   checkClassMirrorMethods(cls);
 
+  // The VM implements List via a mixin, so check for that.
+  if (cls.superinterfaces.isEmpty && object is List) {
+    cls = cls.superclass.superclass.mixin;
+  }
+
   List<ClassMirror> superinterfaces = cls.superinterfaces;
   String symName = 's($name)';
   for (ClassMirror superinterface in superinterfaces) {
diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invocation_fuzz_test.dart
index 017bcb0..102f541 100644
--- a/tests/lib/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib/mirrors/invocation_fuzz_test.dart
@@ -20,46 +20,42 @@
   // Don't exit the test pre-maturely.
   'dart.io.exit',
 
+  // Don't change the exit code, which may fool the test harness.
+  'dart.io.exitCode',
+
   // Don't run blocking io calls.
   new RegExp(r".*Sync$"),
 
   // 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
+  new RegExp('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
-  'dart.async._asyncRunCallback',
+  'dart.async._ScheduleImmediate._closure',
 
   // These either cause the VM to segfault or throw uncatchable API errors.
   // TODO(15274): Fix them and remove from blacklist.
   'dart.io._IOService.dispatch',
-  new RegExp(r'.*_RandomAccessFile.*'),
   'dart.io._StdIOUtils._socketType',
   'dart.io._StdIOUtils._getStdioOutputStream',
   'dart.io._Filter.newZLibInflateFilter',
   'dart.io._Filter.newZLibDeflateFilter',
   '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
+  'dart.io.SystemEncoding.decode',  // Windows only
+  'dart.io.SystemEncoding.encode',  // Windows only
 ];
 
 bool isBlacklisted(Symbol qualifiedSymbol) {
   var qualifiedString = MirrorSystem.getName(qualifiedSymbol);
   for (var pattern in blacklist) {
-    if (qualifiedString.contains(pattern)) return true;
+    if (qualifiedString.contains(pattern)) {
+      print('Skipping $qualifiedString');
+      return true;
+    }
   }
   return false;
 }
@@ -163,18 +159,20 @@
 
 var fuzzArgument;
 
-main([args]) {
+main() {
   fuzzArgument = null;
   fuzzArgument = 1;  /// smi: ok
   fuzzArgument = false;  /// false: ok
   fuzzArgument = 'string';  /// string: ok
   fuzzArgument = new List(0);  /// emptyarray: ok
 
+  print('Fuzzing with $fuzzArgument');
+
   currentMirrorSystem().libraries.values.forEach(checkLibrary);
 
   var valueObjects =
-    [true, false, null,
-     0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
+    [true, false, null, [], {}, dynamic,
+     0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 3.14159,
      "foo", 'blåbærgrød', 'Îñţérñåţîöñåļîžåţîờñ', "𝄞", #symbol];
   valueObjects.forEach((v) => checkInstance(reflect(v), 'value object'));
 
diff --git a/tests/standalone/io/skipping_dart2js_compilations_test.dart b/tests/standalone/io/skipping_dart2js_compilations_test.dart
index 55ef68b..0c907ba 100644
--- a/tests/standalone/io/skipping_dart2js_compilations_test.dart
+++ b/tests/standalone/io/skipping_dart2js_compilations_test.dart
@@ -18,6 +18,7 @@
 import 'package:path/path.dart';
 import 'dart:async';
 import 'dart:io';
+import '../../../tools/testing/dart/path.dart';
 import '../../../tools/testing/dart/test_suite.dart' as suite;
 import '../../../tools/testing/dart/test_runner.dart' as runner;
 import '../../../tools/testing/dart/test_options.dart' as options;
diff --git a/tests/standalone/io/status_file_parser_test.dart b/tests/standalone/io/status_file_parser_test.dart
index aabd645..547a54c 100644
--- a/tests/standalone/io/status_file_parser_test.dart
+++ b/tests/standalone/io/status_file_parser_test.dart
@@ -6,6 +6,7 @@
 
 import "package:expect/expect.dart";
 import "dart:io";
+import "../../../tools/testing/dart/path.dart";
 import "../../../tools/testing/dart/status_file_parser.dart";
 import "../../../tools/testing/dart/utils.dart";
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index a15a598..f3579db 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -107,15 +107,12 @@
 # Skip until we stabilize language tests.
 *: Skip
 
-[ $arch == simarm ]
+[ $arch == simarm || $arch == simmips]
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
 
 [ $arch == simmips || $arch == mips ]
-io/web_socket_test: Pass, Slow
-io/http_server_response_test: Pass, Slow
-out_of_memory_test: Skip # passes on Mac, crashes on Linux
-oom_error_stacktrace_test: Skip # Fails on Linux
+javascript_int_overflow_test: Skip # --throw_on_javascript_int_overflow not supported on MIPS.
 
 [ $arch == mips ]
 io/signals_test: Fail # dartbug.com/17440
@@ -160,5 +157,5 @@
 [ $system != linux ]
 io/server_socket_reference_issue21383_and_issue21384_test: Skip # Not supported on other platforms so far
 
-[ $arch != ia32 && $arch != x64 && $mode == debug ]
+[ $arch != ia32 && $arch != x64 && $arch != simarm && $mode == debug ]
 verified_mem_test: Skip  # Not yet implemented.
diff --git a/tests/try/web/incremental_compilation_update_test.dart b/tests/try/web/incremental_compilation_update_test.dart
index d8fea21..5520f5b 100644
--- a/tests/try/web/incremental_compilation_update_test.dart
+++ b/tests/try/web/incremental_compilation_update_test.dart
@@ -158,12 +158,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v1']),
+            const <String> ['instance is null', 'v1']),
         const ProgramResult(
             """
 class C {
@@ -174,6 +175,7 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
@@ -194,12 +196,13 @@
 var closure;
 main() {
   if (closure == null) {
+    print('closure is null');
     closure = new C().m;
   }
   closure();
 }
 """,
-            const <String> ['v1']),
+            const <String> ['closure is null', 'v1']),
         const ProgramResult(
             """
 class C {
@@ -210,6 +213,7 @@
 var closure;
 main() {
   if (closure == null) {
+    print('closure is null');
     closure = new C().m;
   }
   closure();
@@ -230,16 +234,17 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   try {
     instance.m();
   } catch (e) {
-    print('v2');
+    print('threw');
   }
 }
 """,
-            const <String> ['v1']),
+            const <String> ['instance is null', 'v1']),
         const ProgramResult(
             """
 class C {
@@ -247,16 +252,17 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   try {
     instance.m();
   } catch (e) {
-    print('v2');
+    print('threw');
   }
 }
 """,
-            const <String> ['v2']),
+            const <String> ['threw']),
     ],
 
     // Test that deleting an instance method works, even when accessed through
@@ -282,12 +288,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v1']),
+            const <String> ['instance is null', 'v1']),
         const ProgramResult(
             """
 class A {
@@ -305,6 +312,7 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
@@ -325,19 +333,20 @@
     try {
       toplevel();
     } catch (e) {
-      print('v2');
+      print('threw');
     }
   }
 }
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v1']),
+            const <String> ['instance is null', 'v1']),
         const ProgramResult(
             """
 class C {
@@ -345,19 +354,20 @@
     try {
       toplevel();
     } catch (e) {
-      print('v2');
+      print('threw');
     }
   }
 }
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v2']),
+            const <String> ['threw']),
     ],
 
     // Test that deleting a static method works.
@@ -374,7 +384,7 @@
     try {
       B.staticMethod();
     } catch (e) {
-      print('v2');
+      print('threw');
     }
     try {
       // Ensure that noSuchMethod support is compiled. This test is not about
@@ -388,12 +398,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v1']),
+            const <String> ['instance is null', 'v1']),
         const ProgramResult(
             """
 class B {
@@ -403,7 +414,7 @@
     try {
       B.staticMethod();
     } catch (e) {
-      print('v2');
+      print('threw');
     }
     try {
       // Ensure that noSuchMethod support is compiled. This test is not about
@@ -417,12 +428,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String> ['v2']),
+            const <String> ['threw']),
     ],
 
     // Test that a newly instantiated class is handled.
@@ -444,14 +456,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
-//   } else {
-//     instance = new B();
   }
   instance.m();
 }
 """,
-            const <String>['Called A.m']),
+            const <String>['instance is null', 'Called A.m']),
         const ProgramResult(
             """
 class A {
@@ -469,6 +480,7 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   } else {
     instance = new B();
@@ -519,14 +531,13 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
-//   } else {
-//     instance = new B();
   }
   instance.m();
 }
 """,
-            const <String>['Called A.m']),
+            const <String>['instance is null', 'Called A.m']),
         const ProgramResult(
             r"""
 class A {
@@ -544,6 +555,7 @@
 var instance;
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   } else {
     instance = new B();
@@ -605,11 +617,11 @@
   try {
     foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
-            const <String>['v1']),
+            const <String>['threw']),
         const ProgramResult(
             r"""
 foo() {
@@ -620,7 +632,7 @@
   try {
     foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
@@ -638,11 +650,11 @@
   try {
     C.foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
-            const <String>['v1']),
+            const <String>['threw']),
         const ProgramResult(
             r"""
 class C {
@@ -655,7 +667,7 @@
   try {
     C.foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
@@ -673,17 +685,18 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
 
   try {
     instance.foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
-            const <String>['v1']),
+            const <String>['instance is null', 'threw']),
         const ProgramResult(
             r"""
 class C {
@@ -696,13 +709,14 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
 
   try {
     instance.foo();
   } catch(e) {
-    print('v1');
+    print('threw');
   }
 }
 """,
@@ -779,13 +793,14 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
 
   instance.foo();
 }
 """,
-            const <String>['v1']),
+            const <String>['instance is null', 'v1']),
         const ProgramResult(
             r"""
 class C {
@@ -798,6 +813,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
 
@@ -874,13 +890,6 @@
 
 main() {
   try {
-    // TODO(ahe): Incremental compiler can't handle new noSuchMethod
-    // situations, crashes when compiling a constructor which uses type
-    // arguments.
-    C.missing();
-  } catch (e) {
-  }
-  try {
     C.m();
   } catch (e) {
     print('v2');
@@ -925,12 +934,13 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
 }
 """,
-            const <String>['v1']),
+            const <String>['instance is null', 'v1']),
         const ProgramResult(
             r"""
 class A {
@@ -953,6 +963,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new C();
   }
   instance.m();
@@ -972,6 +983,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   }
   try {
@@ -986,7 +998,7 @@
   }
 }
 """,
-            const <String>['setter threw', 'getter threw']),
+            const <String>['instance is null', 'setter threw', 'getter threw']),
         const ProgramResult(
             r"""
 class A {
@@ -997,6 +1009,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   }
   try {
@@ -1015,8 +1028,6 @@
     ],
 
     // Test removing a field from a class works.
-    // TODO(ahe): The emitter still see the field, and we need to ensure that
-    // old names aren't used again.
     const <ProgramResult>[
         const ProgramResult(
             r"""
@@ -1028,6 +1039,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   }
   try {
@@ -1042,7 +1054,7 @@
   }
 }
 """,
-            const <String>['v1']),
+            const <String>['instance is null', 'v1']),
         const ProgramResult(
             r"""
 class A {
@@ -1052,6 +1064,7 @@
 
 main() {
   if (instance == null) {
+    print('instance is null');
     instance = new A();
   }
   try {
@@ -1068,6 +1081,235 @@
 """,
             const <String>['setter threw', 'getter threw']),
     ],
+
+    // Test that named arguments can be called.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v1', x}) {
+    print(named);
+  }
+}
+
+var instance;
+
+main() {
+  if (instance == null) {
+    print('instance is null');
+    instance = new C();
+  }
+  instance.foo();
+}
+""",
+            const <String>['instance is null', 'v1']),
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v1', x}) {
+    print(named);
+  }
+}
+
+var instance;
+
+main() {
+  if (instance == null) {
+    print('instance is null');
+    instance = new C();
+  }
+  instance.foo(named: 'v2');
+}
+""",
+            const <String>['v2']),
+    ],
+
+    // Test than named arguments can be called.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v2', x}) {
+    print(named);
+  }
+}
+
+var instance;
+
+main() {
+  if (instance == null) {
+    print('instance is null');
+    instance = new C();
+  }
+  instance.foo(named: 'v1');
+}
+""",
+            const <String>['instance is null', 'v1']),
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v2', x}) {
+    print(named);
+  }
+}
+
+var instance;
+
+main() {
+  if (instance == null) {
+    print('instance is null');
+    instance = new C();
+  }
+  instance.foo();
+}
+""",
+            const <String>['v2']),
+    ],
+
+    // Test that an instance tear-off with named parameters can be called.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v1', x}) {
+    print(named);
+  }
+}
+
+var closure;
+
+main() {
+  if (closure == null) {
+    print('closure is null');
+    closure = new C().foo;
+  }
+  closure();
+}
+""",
+            const <String>['closure is null', 'v1']),
+        const ProgramResult(
+            r"""
+class C {
+  foo({a, named: 'v1', x}) {
+    print(named);
+  }
+}
+
+var closure;
+
+main() {
+  if (closure == null) {
+    print('closure is null');
+    closure = new C().foo;
+  }
+  closure(named: 'v2');
+}
+""",
+            const <String>['v2']),
+    ],
+
+/*
+    // Test that a lazy static is supported.
+    // TODO(ahe): This test doesn't pass yet.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+var normal;
+
+foo() {
+  print(normal);
+}
+
+main() {
+  if (normal == null) {
+    normal = 'v1';
+  } else {
+    normal = '';
+  }
+  foo();
+}
+""",
+            const <String>['v1']),
+        const ProgramResult(
+            r"""
+var normal;
+
+var lazy = bar();
+
+foo() {
+  print(lazy);
+}
+
+bar() {
+  print('v2');
+  return 'lazy';
+}
+
+main() {
+  if (normal == null) {
+    normal = 'v1';
+  } else {
+    normal = '';
+  }
+  foo();
+}
+""",
+            const <String>['v2', 'lazy']),
+    ],
+*/
+
+    // Test that superclasses of directly instantiated classes are also
+    // emitted.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+class A {
+}
+
+class B extends A {
+}
+
+main() {
+  print('v1');
+}
+""",
+            const <String>['v1']),
+        const ProgramResult(
+            r"""
+class A {
+}
+
+class B extends A {
+}
+
+main() {
+  new B();
+  print('v2');
+}
+""",
+            const <String>['v2']),
+    ],
+
+    // Test that interceptor classes are handled correctly.
+    const <ProgramResult>[
+        const ProgramResult(
+            r"""
+main() {
+  // TODO(ahe): Remove next line when new constants are handled correctly.
+  [].map(null);
+  print('v1');
+}
+""",
+            const <String>['v1']),
+        const ProgramResult(
+            r"""
+main() {
+  // TODO(ahe): Use forEach(print) when closures are computed correctly.
+  ['v2'].forEach((e) { print(e); });
+}
+""",
+            const <String>['v2']),
+    ],
 ];
 
 void main() {
@@ -1075,7 +1317,17 @@
 
   document.head.append(lineNumberStyle());
 
-  return asyncTest(() => Future.forEach(tests, compileAndRun));
+  String query = window.location.search;
+  int skip = 0;
+  if (query != null && query.length > 1) {
+    query = query.substring(1);
+    String skipParam = Uri.splitQueryString(window.location.search)['skip'];
+    if (skipParam != null) {
+      skip = int.parse(skipParam);
+    }
+  }
+
+  return asyncTest(() => Future.forEach(tests.skip(skip), compileAndRun));
 }
 
 int testCount = 1;
@@ -1140,7 +1392,9 @@
   }).then((_) {
     status.style.color = 'limegreen';
 
-    // Remove the iframe to work around a bug in test.dart.
+    // Remove the iframe and status to work around a bug in test.dart
+    // (https://code.google.com/p/dart/issues/detail?id=21691).
+    status.remove();
     iframe.remove();
   });
 }
diff --git a/tests/try/web/sandbox.dart b/tests/try/web/sandbox.dart
index c099165..61a7583 100644
--- a/tests/try/web/sandbox.dart
+++ b/tests/try/web/sandbox.dart
@@ -102,7 +102,8 @@
           break;
 
         default:
-          completer.completeError('Unexpected message: "$message".');
+          completer.completeError(
+              'Unexpected message: "$message" (expected "$expectedMessage").');
       }
     }
   }
diff --git a/tools/VERSION b/tools/VERSION
index 507dd98..ff84985 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 9
 PATCH 0
-PRERELEASE 0
+PRERELEASE 1
 PRERELEASE_PATCH 0
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index f8d5cad..60845a4 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -708,7 +708,6 @@
     'HTMLLinkElement.rev',
     'HTMLLinkElement.target',
     'HTMLMarqueeElement.*',
-    'HTMLMediaElement.canPlayType',
     'HTMLMenuElement.compact',
     'HTMLMetaElement.scheme',
     'HTMLOListElement.compact',
diff --git a/tools/test.dart b/tools/test.dart
index f8cec4c..bbfdf25 100755
--- a/tools/test.dart
+++ b/tools/test.dart
@@ -30,288 +30,13 @@
 
 import "dart:async";
 import "dart:io";
-import "dart:math" as math;
-import "testing/dart/browser_controller.dart";
-import "testing/dart/http_server.dart";
+import "testing/dart/test_configurations.dart";
 import "testing/dart/test_options.dart";
 import "testing/dart/test_progress.dart";
-import "testing/dart/test_runner.dart";
 import "testing/dart/test_suite.dart";
 import "testing/dart/utils.dart";
 
-import "testing/dart/vm_test_config.dart";
-import "testing/dart/co19_test_config.dart";
-
-/**
- * The directories that contain test suites which follow the conventions
- * required by [StandardTestSuite]'s forDirectory constructor.
- * New test suites should follow this convention because it makes it much
- * simpler to add them to test.dart.  Existing test suites should be
- * moved to here, if possible.
-*/
-final TEST_SUITE_DIRECTORIES = [
-    new Path('pkg'),
-    new Path('runtime/tests/vm'),
-    new Path('runtime/bin/vmservice'),
-    new Path('samples'),
-    new Path('samples-dev'),
-    new Path('tests/benchmark_smoke'),
-    new Path('tests/chrome'),
-    new Path('tests/compiler/dart2js'),
-    new Path('tests/compiler/dart2js_extra'),
-    new Path('tests/compiler/dart2js_native'),
-    new Path('tests/corelib'),
-    new Path('tests/html'),
-    new Path('tests/isolate'),
-    new Path('tests/language'),
-    new Path('tests/lib'),
-    new Path('tests/standalone'),
-    new Path('tests/try'),
-    new Path('tests/utils'),
-    new Path('utils/tests/css'),
-    new Path('utils/tests/peg'),
-];
-
-void testConfigurations(List<Map> configurations) {
-  var startTime = new DateTime.now();
-  // Extract global options from first configuration.
-  var firstConf = configurations[0];
-  var maxProcesses = firstConf['tasks'];
-  var progressIndicator = firstConf['progress'];
-  // TODO(kustermann): Remove this option once the buildbots don't use it
-  // anymore.
-  var failureSummary = firstConf['failure-summary'];
-  BuildbotProgressIndicator.stepName = firstConf['step_name'];
-  var verbose = firstConf['verbose'];
-  var printTiming = firstConf['time'];
-  var listTests = firstConf['list'];
-
-  var recordingPath = firstConf['record_to_file'];
-  var recordingOutputPath = firstConf['replay_from_file'];
-
-  Browser.deleteCache = firstConf['clear_browser_cache'];
-
-  if (recordingPath != null && recordingOutputPath != null) {
-    print("Fatal: Can't have the '--record_to_file' and '--replay_from_file'"
-          "at the same time. Exiting ...");
-    exit(1);
-  }
-
-  if (!firstConf['append_logs'])  {
-    var files = [new File(TestUtils.flakyFileName()),
-                 new File(TestUtils.testOutcomeFileName())];
-    for (var file in files) {
-      if (file.existsSync()) {
-        file.deleteSync();
-      }
-    }
-  }
-
-  DebugLogger.init(firstConf['write_debug_log'] ?
-      TestUtils.debugLogfile() : null, append: firstConf['append_logs']);
-
-  // Print the configurations being run by this execution of
-  // test.dart. However, don't do it if the silent progress indicator
-  // is used. This is only needed because of the junit tests.
-  if (progressIndicator != 'silent') {
-    List output_words = configurations.length > 1 ?
-        ['Test configurations:'] : ['Test configuration:'];
-    for (Map conf in configurations) {
-      List settings = ['compiler', 'runtime', 'mode', 'arch']
-          .map((name) => conf[name]).toList();
-      if (conf['checked']) settings.add('checked');
-      output_words.add(settings.join('_'));
-    }
-    print(output_words.join(' '));
-  }
-
-  var runningBrowserTests = configurations.any((config) {
-    return TestUtils.isBrowserRuntime(config['runtime']);
-  });
-
-  List<Future> serverFutures = [];
-  var testSuites = new List<TestSuite>();
-  var maxBrowserProcesses = maxProcesses;
-  if (configurations.length > 1 &&
-      (configurations[0]['test_server_port'] != 0 ||
-       configurations[0]['test_server_cross_origin_port'] != 0)) {
-    print("If the http server ports are specified, only one configuration"
-          " may be run at a time");
-    exit(1);
-  }
-  for (var conf in configurations) {
-    Map<String, RegExp> selectors = conf['selectors'];
-    var useContentSecurityPolicy = conf['csp'];
-    if (!listTests && runningBrowserTests) {
-      // Start global http servers that serve the entire dart repo.
-      // The http server is available on window.location.port, and a second
-      // server for cross-domain tests can be found by calling
-      // getCrossOriginPortNumber().
-      var servers = new TestingServers(new Path(TestUtils.buildDir(conf)),
-                                       useContentSecurityPolicy,
-                                       conf['runtime'],
-                                       null,
-                                       conf['package_root']);
-      serverFutures.add(servers.startServers(conf['local_ip'],
-          port: conf['test_server_port'],
-          crossOriginPort: conf['test_server_cross_origin_port']));
-      conf['_servers_'] = servers;
-      if (verbose) {
-        serverFutures.last.then((_) {
-          var commandline = servers.httpServerCommandline();
-          print('Started HttpServers: $commandline');
-        });
-      }
-    }
-
-    if (conf['runtime'].startsWith('ie')) {
-      // NOTE: We've experienced random timeouts of tests on ie9/ie10. The
-      // underlying issue has not been determined yet. Our current hypothesis
-      // is that windows does not handle the IE processes independently.
-      // If we have more than one browser and kill a browser we are seeing
-      // issues with starting up a new browser just after killing the hanging
-      // browser.
-      maxBrowserProcesses = 1;
-    } else if (conf['runtime'].startsWith('safari')) {
-      // Safari does not allow us to run from a fresh profile, so we can only
-      // use one browser. Additionally, you can not start two simulators
-      // for mobile safari simultainiously.
-      maxBrowserProcesses = 1;
-    } else if (conf['runtime'] == 'chrome' &&
-               Platform.operatingSystem == 'macos') {
-      // Chrome on mac results in random timeouts.
-      maxBrowserProcesses = math.max(1, maxBrowserProcesses ~/ 2);
-    }
-
-    // If we specifically pass in a suite only run that.
-    if (conf['suite_dir'] != null) {
-      var suite_path = new Path(conf['suite_dir']);
-      testSuites.add(new PKGTestSuite(conf, suite_path));
-    } else {
-      for (String key in selectors.keys) {
-        if (key == 'co19') {
-          testSuites.add(new Co19TestSuite(conf));
-        } else if (conf['compiler'] == 'none' &&
-                   conf['runtime'] == 'vm' &&
-                   key == 'vm') {
-          // vm tests contain both cc tests (added here) and dart tests (added
-          // in [TEST_SUITE_DIRECTORIES]).
-          testSuites.add(new VMTestSuite(conf));
-        } else if (conf['analyzer']) {
-          if (key == 'analyze_library') {
-            testSuites.add(new AnalyzeLibraryTestSuite(conf));
-          }
-        } else if (conf['compiler'] == 'none' &&
-                   conf['runtime'] == 'vm' &&
-                   key == 'pkgbuild') {
-          if (!conf['use_repository_packages'] &&
-              !conf['use_public_packages']) {
-            print("You need to use either --use-repository-packages or "
-                  "--use-public-packages with the pkgbuild test suite!");
-            exit(1);
-          }
-          if (!conf['use_sdk']) {
-            print("Running the 'pkgbuild' test suite requires "
-                  "passing the '--use-sdk' to test.py");
-            exit(1);
-          }
-          testSuites.add(
-              new PkgBuildTestSuite(conf, 'pkgbuild', 'pkg/pkgbuild.status'));
-        } else if (key == 'pub') {
-          // TODO(rnystrom): Move pub back into TEST_SUITE_DIRECTORIES once
-          // #104 is fixed.
-          testSuites.add(new StandardTestSuite(conf, 'pub',
-              new Path('sdk/lib/_internal/pub_generated'),
-              ['sdk/lib/_internal/pub/pub.status'],
-              isTestFilePredicate: (file) => file.endsWith('_test.dart'),
-              recursive: true));
-        }
-      }
-
-      for (final testSuiteDir in TEST_SUITE_DIRECTORIES) {
-        final name = testSuiteDir.filename;
-        if (selectors.containsKey(name)) {
-          testSuites.add(
-              new StandardTestSuite.forDirectory(conf, testSuiteDir));
-        }
-      }
-    }
-  }
-
-  void allTestsFinished() {
-    for (var conf in configurations) {
-      if (conf.containsKey('_servers_')) {
-        conf['_servers_'].stopServers();
-      }
-    }
-    DebugLogger.close();
-  }
-
-  var eventListener = [];
-  if (progressIndicator != 'silent') {
-    var printFailures = true;
-    var formatter = new Formatter();
-    if (progressIndicator == 'color') {
-      progressIndicator = 'compact';
-      formatter = new ColorFormatter();
-    }
-    if (progressIndicator == 'diff') {
-      progressIndicator = 'compact';
-      formatter = new ColorFormatter();
-      printFailures = false;
-      eventListener.add(new StatusFileUpdatePrinter());
-    }
-    eventListener.add(new SummaryPrinter());
-    eventListener.add(new FlakyLogWriter());
-    if (printFailures) {
-      // The buildbot has it's own failure summary since it needs to wrap it
-      // into '@@@'-annotated sections.
-      var printFailureSummary = progressIndicator != 'buildbot';
-      eventListener.add(new TestFailurePrinter(printFailureSummary, formatter));
-    }
-    eventListener.add(progressIndicatorFromName(progressIndicator,
-                                                startTime,
-                                                formatter));
-    if (printTiming) {
-      eventListener.add(new TimingPrinter(startTime));
-    }
-    eventListener.add(new SkippedCompilationsPrinter());
-    eventListener.add(new LeftOverTempDirPrinter());
-  }
-  if (firstConf['write_test_outcome_log']) {
-    eventListener.add(new TestOutcomeLogWriter());
-  }
-  if (firstConf['copy_coredumps']) {
-    eventListener.add(new UnexpectedCrashDumpArchiver());
-  }
-
-  eventListener.add(new ExitCodeSetter());
-
-  void startProcessQueue() {
-    // [firstConf] is needed here, since the ProcessQueue needs to know the
-    // settings of 'noBatch' and 'local_ip'
-    new ProcessQueue(firstConf,
-                     maxProcesses,
-                     maxBrowserProcesses,
-                     startTime,
-                     testSuites,
-                     eventListener,
-                     allTestsFinished,
-                     verbose,
-                     listTests,
-                     recordingPath,
-                     recordingOutputPath);
-  }
-
-  // Start all the HTTP servers required before starting the process queue.
-  if (serverFutures.isEmpty) {
-    startProcessQueue();
-  } else {
-    Future.wait(serverFutures).then((_) => startProcessQueue());
-  }
-}
-
-Future deleteTemporaryDartDirectories() {
+Future _deleteTemporaryDartDirectories() {
   var completer = new Completer();
   var environment = Platform.environment;
   if (environment['DART_TESTING_DELETE_TEMPORARY_DIRECTORIES'] == '1') {
@@ -332,7 +57,7 @@
 void main(List<String> arguments) {
   // This script is in [dart]/tools.
   TestUtils.setDartDirUri(Platform.script.resolve('..'));
-  deleteTemporaryDartDirectories().then((_) {
+  _deleteTemporaryDartDirectories().then((_) {
     var optionsParser = new TestOptionsParser();
     var configurations = optionsParser.parse(arguments);
     if (configurations != null && configurations.length > 0) {
@@ -340,4 +65,3 @@
     }
   });
 }
-
diff --git a/tools/testing/dart/android.dart b/tools/testing/dart/android.dart
index 54d56ba..d514bd6 100644
--- a/tools/testing/dart/android.dart
+++ b/tools/testing/dart/android.dart
@@ -9,6 +9,7 @@
 import "dart:core";
 import "dart:io";
 
+import "path.dart";
 import "utils.dart";
 
 Future _executeCommand(String executable,
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 661104d..01c5aec 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -10,6 +10,7 @@
 
 import 'android.dart';
 import 'http_server.dart';
+import 'path.dart';
 import 'utils.dart';
 
 class BrowserOutput {
diff --git a/tools/testing/dart/browser_test.dart b/tools/testing/dart/browser_test.dart
index 5e6be19..63d8de0 100644
--- a/tools/testing/dart/browser_test.dart
+++ b/tools/testing/dart/browser_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of test_suite;
+library browser_test;
+
+import 'path.dart';
 
 String getHtmlContents(String title,
                        String scriptType,
diff --git a/tools/testing/dart/co19_test.dart b/tools/testing/dart/co19_test.dart
index 48558fb..ad05dca 100644
--- a/tools/testing/dart/co19_test.dart
+++ b/tools/testing/dart/co19_test.dart
@@ -20,7 +20,7 @@
 
 import "test_options.dart";
 import "test_suite.dart";
-import "../../test.dart" as test_dart;
+import "test_configurations.dart";
 
 const List<String> COMMON_ARGUMENTS =
     const <String>['--report', '--progress=diff', 'co19'];
@@ -55,7 +55,7 @@
   }
 
   if (configurations != null || configurations.length > 0) {
-    test_dart.testConfigurations(configurations);
+    testConfigurations(configurations);
   }
 }
 
diff --git a/tools/testing/dart/co19_test_config.dart b/tools/testing/dart/co19_test_config.dart
index 57214eb..e8d6492 100644
--- a/tools/testing/dart/co19_test_config.dart
+++ b/tools/testing/dart/co19_test_config.dart
@@ -4,8 +4,8 @@
 
 library co19_test_config;
 
+import 'path.dart';
 import 'test_suite.dart';
-import 'utils.dart' show Path;
 
 class Co19TestSuite extends StandardTestSuite {
   RegExp _testRegExp = new RegExp(r"t[0-9]{2}.dart$");
diff --git a/tools/testing/dart/html_test.dart b/tools/testing/dart/html_test.dart
index 9808cfb..0f69eed 100644
--- a/tools/testing/dart/html_test.dart
+++ b/tools/testing/dart/html_test.dart
@@ -14,6 +14,7 @@
 import "dart:convert";
 import "dart:io";
 
+import "path.dart";
 import "test_suite.dart";
 import "utils.dart";
 
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 4e04773..7f5fae7 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -10,6 +10,7 @@
 import 'dart:convert' show
     HtmlEscape;
 
+import 'path.dart';
 import 'test_suite.dart';  // For TestUtils.
 // TODO(efortuna): Rewrite to not use the args library and simply take an
 // expected number of arguments, so test.dart doesn't rely on the args library?
diff --git a/tools/testing/dart/multitest.dart b/tools/testing/dart/multitest.dart
index 2670155..3aed790 100644
--- a/tools/testing/dart/multitest.dart
+++ b/tools/testing/dart/multitest.dart
@@ -6,6 +6,8 @@
 
 import "dart:async";
 import "dart:io";
+
+import "path.dart";
 import "test_suite.dart";
 import "utils.dart";
 
@@ -283,7 +285,6 @@
 
 
 Path CreateMultitestDirectory(String outputDir, Path suiteDir) {
-  final String generatedTestDirectory = 'generated_tests';
   Directory generatedTestDir = new Directory('$outputDir/generated_tests');
   if (!new Directory(outputDir).existsSync()) {
     new Directory(outputDir).createSync();
diff --git a/tools/testing/dart/legacy_path.dart b/tools/testing/dart/path.dart
similarity index 98%
rename from tools/testing/dart/legacy_path.dart
rename to tools/testing/dart/path.dart
index 57a4ac7..1e1bf7d 100644
--- a/tools/testing/dart/legacy_path.dart
+++ b/tools/testing/dart/path.dart
@@ -2,8 +2,12 @@
 // for 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 utils;
+library legacy_path;
 
+import 'dart:io';
+import 'dart:math';
+
+// TODO: Remove this class, and use the URI class for all path manipulation.
 class Path {
   final String _path;
   final bool isWindowsShare;
diff --git a/tools/testing/dart/record_and_replay.dart b/tools/testing/dart/record_and_replay.dart
index 5abb41c..68e67ce 100644
--- a/tools/testing/dart/record_and_replay.dart
+++ b/tools/testing/dart/record_and_replay.dart
@@ -7,8 +7,8 @@
 import 'dart:io';
 import 'dart:convert';
 
+import 'path.dart';
 import 'test_runner.dart';
-import 'utils.dart' show Path;
 
 /*
  * Json files look like this:
diff --git a/tools/testing/dart/status_file_parser.dart b/tools/testing/dart/status_file_parser.dart
index f728636..20b57c7 100644
--- a/tools/testing/dart/status_file_parser.dart
+++ b/tools/testing/dart/status_file_parser.dart
@@ -8,8 +8,8 @@
 import "dart:convert" show LineSplitter, UTF8;
 import "dart:io";
 
+import "path.dart";
 import "status_expression.dart";
-import "utils.dart" show Path;
 
 class Expectation {
   // Possible outcomes of running a test.
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
new file mode 100644
index 0000000..63d7f1d
--- /dev/null
+++ b/tools/testing/dart/test_configurations.dart
@@ -0,0 +1,287 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_configurations;
+
+import "dart:async";
+import 'dart:io';
+import "dart:math" as math;
+
+import "browser_controller.dart";
+import "co19_test_config.dart";
+import "http_server.dart";
+import "path.dart";
+import "test_progress.dart";
+import "test_runner.dart";
+import "test_suite.dart";
+import "utils.dart";
+import "vm_test_config.dart";
+
+/**
+ * The directories that contain test suites which follow the conventions
+ * required by [StandardTestSuite]'s forDirectory constructor.
+ * New test suites should follow this convention because it makes it much
+ * simpler to add them to test.dart.  Existing test suites should be
+ * moved to here, if possible.
+*/
+final TEST_SUITE_DIRECTORIES = [
+    new Path('pkg'),
+    new Path('runtime/tests/vm'),
+    new Path('runtime/bin/vmservice'),
+    new Path('samples'),
+    new Path('samples-dev'),
+    new Path('tests/benchmark_smoke'),
+    new Path('tests/chrome'),
+    new Path('tests/compiler/dart2js'),
+    new Path('tests/compiler/dart2js_extra'),
+    new Path('tests/compiler/dart2js_native'),
+    new Path('tests/corelib'),
+    new Path('tests/html'),
+    new Path('tests/isolate'),
+    new Path('tests/language'),
+    new Path('tests/lib'),
+    new Path('tests/standalone'),
+    new Path('tests/try'),
+    new Path('tests/utils'),
+    new Path('utils/tests/css'),
+    new Path('utils/tests/peg'),
+];
+
+void testConfigurations(List<Map> configurations) {
+  var startTime = new DateTime.now();
+  // Extract global options from first configuration.
+  var firstConf = configurations[0];
+  var maxProcesses = firstConf['tasks'];
+  var progressIndicator = firstConf['progress'];
+  // TODO(kustermann): Remove this option once the buildbots don't use it
+  // anymore.
+  var failureSummary = firstConf['failure-summary'];
+  BuildbotProgressIndicator.stepName = firstConf['step_name'];
+  var verbose = firstConf['verbose'];
+  var printTiming = firstConf['time'];
+  var listTests = firstConf['list'];
+
+  var recordingPath = firstConf['record_to_file'];
+  var recordingOutputPath = firstConf['replay_from_file'];
+
+  Browser.deleteCache = firstConf['clear_browser_cache'];
+
+  if (recordingPath != null && recordingOutputPath != null) {
+    print("Fatal: Can't have the '--record_to_file' and '--replay_from_file'"
+          "at the same time. Exiting ...");
+    exit(1);
+  }
+
+  if (!firstConf['append_logs'])  {
+    var files = [new File(TestUtils.flakyFileName()),
+                 new File(TestUtils.testOutcomeFileName())];
+    for (var file in files) {
+      if (file.existsSync()) {
+        file.deleteSync();
+      }
+    }
+  }
+
+  DebugLogger.init(firstConf['write_debug_log'] ?
+      TestUtils.debugLogfile() : null, append: firstConf['append_logs']);
+
+  // Print the configurations being run by this execution of
+  // test.dart. However, don't do it if the silent progress indicator
+  // is used. This is only needed because of the junit tests.
+  if (progressIndicator != 'silent') {
+    List output_words = configurations.length > 1 ?
+        ['Test configurations:'] : ['Test configuration:'];
+    for (Map conf in configurations) {
+      List settings = ['compiler', 'runtime', 'mode', 'arch']
+          .map((name) => conf[name]).toList();
+      if (conf['checked']) settings.add('checked');
+      output_words.add(settings.join('_'));
+    }
+    print(output_words.join(' '));
+  }
+
+  var runningBrowserTests = configurations.any((config) {
+    return TestUtils.isBrowserRuntime(config['runtime']);
+  });
+
+  List<Future> serverFutures = [];
+  var testSuites = new List<TestSuite>();
+  var maxBrowserProcesses = maxProcesses;
+  if (configurations.length > 1 &&
+      (configurations[0]['test_server_port'] != 0 ||
+       configurations[0]['test_server_cross_origin_port'] != 0)) {
+    print("If the http server ports are specified, only one configuration"
+          " may be run at a time");
+    exit(1);
+  }
+  for (var conf in configurations) {
+    Map<String, RegExp> selectors = conf['selectors'];
+    var useContentSecurityPolicy = conf['csp'];
+    if (!listTests && runningBrowserTests) {
+      // Start global http servers that serve the entire dart repo.
+      // The http server is available on window.location.port, and a second
+      // server for cross-domain tests can be found by calling
+      // getCrossOriginPortNumber().
+      var servers = new TestingServers(new Path(TestUtils.buildDir(conf)),
+                                       useContentSecurityPolicy,
+                                       conf['runtime'],
+                                       null,
+                                       conf['package_root']);
+      serverFutures.add(servers.startServers(conf['local_ip'],
+          port: conf['test_server_port'],
+          crossOriginPort: conf['test_server_cross_origin_port']));
+      conf['_servers_'] = servers;
+      if (verbose) {
+        serverFutures.last.then((_) {
+          var commandline = servers.httpServerCommandline();
+          print('Started HttpServers: $commandline');
+        });
+      }
+    }
+
+    if (conf['runtime'].startsWith('ie')) {
+      // NOTE: We've experienced random timeouts of tests on ie9/ie10. The
+      // underlying issue has not been determined yet. Our current hypothesis
+      // is that windows does not handle the IE processes independently.
+      // If we have more than one browser and kill a browser we are seeing
+      // issues with starting up a new browser just after killing the hanging
+      // browser.
+      maxBrowserProcesses = 1;
+    } else if (conf['runtime'].startsWith('safari')) {
+      // Safari does not allow us to run from a fresh profile, so we can only
+      // use one browser. Additionally, you can not start two simulators
+      // for mobile safari simultainiously.
+      maxBrowserProcesses = 1;
+    } else if (conf['runtime'] == 'chrome' &&
+               Platform.operatingSystem == 'macos') {
+      // Chrome on mac results in random timeouts.
+      maxBrowserProcesses = math.max(1, maxBrowserProcesses ~/ 2);
+    }
+
+    // If we specifically pass in a suite only run that.
+    if (conf['suite_dir'] != null) {
+      var suite_path = new Path(conf['suite_dir']);
+      testSuites.add(new PKGTestSuite(conf, suite_path));
+    } else {
+      for (String key in selectors.keys) {
+        if (key == 'co19') {
+          testSuites.add(new Co19TestSuite(conf));
+        } else if (conf['compiler'] == 'none' &&
+                   conf['runtime'] == 'vm' &&
+                   key == 'vm') {
+          // vm tests contain both cc tests (added here) and dart tests (added
+          // in [TEST_SUITE_DIRECTORIES]).
+          testSuites.add(new VMTestSuite(conf));
+        } else if (conf['analyzer']) {
+          if (key == 'analyze_library') {
+            testSuites.add(new AnalyzeLibraryTestSuite(conf));
+          }
+        } else if (conf['compiler'] == 'none' &&
+                   conf['runtime'] == 'vm' &&
+                   key == 'pkgbuild') {
+          if (!conf['use_repository_packages'] &&
+              !conf['use_public_packages']) {
+            print("You need to use either --use-repository-packages or "
+                  "--use-public-packages with the pkgbuild test suite!");
+            exit(1);
+          }
+          if (!conf['use_sdk']) {
+            print("Running the 'pkgbuild' test suite requires "
+                  "passing the '--use-sdk' to test.py");
+            exit(1);
+          }
+          testSuites.add(
+              new PkgBuildTestSuite(conf, 'pkgbuild', 'pkg/pkgbuild.status'));
+        } else if (key == 'pub') {
+          // TODO(rnystrom): Move pub back into TEST_SUITE_DIRECTORIES once
+          // #104 is fixed.
+          testSuites.add(new StandardTestSuite(conf, 'pub',
+              new Path('sdk/lib/_internal/pub_generated'),
+              ['sdk/lib/_internal/pub/pub.status'],
+              isTestFilePredicate: (file) => file.endsWith('_test.dart'),
+              recursive: true));
+        }
+      }
+
+      for (final testSuiteDir in TEST_SUITE_DIRECTORIES) {
+        final name = testSuiteDir.filename;
+        if (selectors.containsKey(name)) {
+          testSuites.add(
+              new StandardTestSuite.forDirectory(conf, testSuiteDir));
+        }
+      }
+    }
+  }
+
+  void allTestsFinished() {
+    for (var conf in configurations) {
+      if (conf.containsKey('_servers_')) {
+        conf['_servers_'].stopServers();
+      }
+    }
+    DebugLogger.close();
+  }
+
+  var eventListener = [];
+  if (progressIndicator != 'silent') {
+    var printFailures = true;
+    var formatter = new Formatter();
+    if (progressIndicator == 'color') {
+      progressIndicator = 'compact';
+      formatter = new ColorFormatter();
+    }
+    if (progressIndicator == 'diff') {
+      progressIndicator = 'compact';
+      formatter = new ColorFormatter();
+      printFailures = false;
+      eventListener.add(new StatusFileUpdatePrinter());
+    }
+    eventListener.add(new SummaryPrinter());
+    eventListener.add(new FlakyLogWriter());
+    if (printFailures) {
+      // The buildbot has it's own failure summary since it needs to wrap it
+      // into '@@@'-annotated sections.
+      var printFailureSummary = progressIndicator != 'buildbot';
+      eventListener.add(new TestFailurePrinter(printFailureSummary, formatter));
+    }
+    eventListener.add(progressIndicatorFromName(progressIndicator,
+                                                startTime,
+                                                formatter));
+    if (printTiming) {
+      eventListener.add(new TimingPrinter(startTime));
+    }
+    eventListener.add(new SkippedCompilationsPrinter());
+    eventListener.add(new LeftOverTempDirPrinter());
+  }
+  if (firstConf['write_test_outcome_log']) {
+    eventListener.add(new TestOutcomeLogWriter());
+  }
+  if (firstConf['copy_coredumps']) {
+    eventListener.add(new UnexpectedCrashDumpArchiver());
+  }
+
+  eventListener.add(new ExitCodeSetter());
+
+  void startProcessQueue() {
+    // [firstConf] is needed here, since the ProcessQueue needs to know the
+    // settings of 'noBatch' and 'local_ip'
+    new ProcessQueue(firstConf,
+                     maxProcesses,
+                     maxBrowserProcesses,
+                     startTime,
+                     testSuites,
+                     eventListener,
+                     allTestsFinished,
+                     verbose,
+                     recordingPath,
+                     recordingOutputPath);
+  }
+
+  // Start all the HTTP servers required before starting the process queue.
+  if (serverFutures.isEmpty) {
+    startProcessQueue();
+  } else {
+    Future.wait(serverFutures).then((_) => startProcessQueue());
+  }
+}
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index c00e124..940c5cc 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -7,7 +7,7 @@
 import "dart:io";
 import "drt_updater.dart";
 import "test_suite.dart";
-import "utils.dart";
+import "path.dart";
 import "compiler_configuration.dart" show CompilerConfiguration;
 import "runtime_configuration.dart" show RuntimeConfiguration;
 
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index e315c34..bb31d29 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -8,6 +8,7 @@
 import "dart:io";
 import "dart:io" as io;
 import "dart:convert" show JSON;
+import "path.dart";
 import "status_file_parser.dart";
 import "test_runner.dart";
 import "test_suite.dart";
@@ -341,7 +342,6 @@
       var commandOutput = outputs[i];
       var command = commandOutput.command;
       var testCases = _command2testCases[command];
-      var duration = commandOutput.time;
 
       var testCasesDescription = testCases.map((testCase) {
         return "${testCase.configurationString}/${testCase.displayName}";
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index bf28d11..e1652ff8 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -20,6 +20,7 @@
 import "dart:math" as math;
 import 'dependency_graph.dart' as dgraph;
 import "browser_controller.dart";
+import "path.dart";
 import "status_file_parser.dart";
 import "test_progress.dart";
 import "test_suite.dart";
@@ -394,7 +395,6 @@
   Future<ScriptCommandOutputImpl> run() {
     var watch = new Stopwatch()..start();
 
-    var source = new io.Directory(_sourceDirectory);
     var destination = new io.Directory(_destinationDirectory);
 
     return destination.exists().then((bool exists) {
@@ -1453,8 +1453,6 @@
   }
 
   void parseAnalyzerOutput(List<String> outErrors, List<String> outWarnings) {
-    AnalysisCommand analysisCommand = command;
-
     // Parse a line delimited by the | character using \ as an escape charager
     // like:  FOO|BAR|FOO\|BAR|FOO\\BAZ as 4 fields: FOO BAR FOO|BAR FOO\BAZ
     List<String> splitMachineError(String line) {
@@ -2770,7 +2768,6 @@
 class ProcessQueue {
   Map _globalConfiguration;
 
-  bool _listTests;
   Function _allDone;
   final dgraph.Graph _graph = new dgraph.Graph();
   List<EventListener> _eventListener;
@@ -2783,7 +2780,6 @@
                this._eventListener,
                this._allDone,
                [bool verbose = false,
-                this._listTests = false,
                 String recordingOutputFile,
                 String recordedInputFile]) {
     void setupForListing(TestCaseEnqueuer testCaseEnqueuer) {
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 8f9e996..cb13655 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -18,6 +18,7 @@
 import "dart:io";
 import "drt_updater.dart";
 import "html_test.dart" as htmlTest;
+import "path.dart";
 import "multitest.dart";
 import "status_file_parser.dart";
 import "test_runner.dart";
@@ -31,7 +32,7 @@
 import "runtime_configuration.dart" show
     RuntimeConfiguration;
 
-part "browser_test.dart";
+import 'browser_test.dart';
 
 
 RegExp multiHtmlTestGroupRegExp = new RegExp(r"\s*[^/]\s*group\('[^,']*");
@@ -362,7 +363,6 @@
   }
 
   String createPubspecCheckoutDirectory(Path directoryOfPubspecYaml) {
-    var relativeDir = directoryOfPubspecYaml.relativeTo(TestUtils.dartDir);
     var sdk = configuration['use_sdk'] ? '-sdk' : '';
     var pkg = configuration['use_public_packages']
         ? 'public_packages' : 'repo_packages';
@@ -371,7 +371,6 @@
   }
 
   String createPubPackageBuildsDirectory(Path directoryOfPubspecYaml) {
-    var relativeDir = directoryOfPubspecYaml.relativeTo(TestUtils.dartDir);
     var pkg = configuration['use_public_packages']
         ? 'public_packages' : 'repo_packages';
     return createGeneratedTestDirectoryHelper(
@@ -776,14 +775,12 @@
   }
 
   void enqueueDirectory(Directory dir, FutureGroup group) {
-    var listCompleter = new Completer();
-    group.add(listCompleter.future);
-
     var lister = dir.list(recursive: listRecursively)
-        .listen((FileSystemEntity fse) {
-          if (fse is File) enqueueFile(fse.path, group);
-        },
-        onDone: listCompleter.complete);
+        .where((fse) => fse is File)
+        .forEach((File f) {
+          enqueueFile(f.path, group);
+        });
+    group.add(lister);
   }
 
   void enqueueFile(String filename, FutureGroup group) {
@@ -1127,7 +1124,6 @@
     File file = new File(dartWrapperFilename);
     RandomAccessFile dartWrapper = file.openSync(mode: FileMode.WRITE);
 
-    var usePackageImport = localDartLibraryFilename.segments().contains("pkg");
     var libraryPathComponent = _createUrlPathFromFile(localDartLibraryFilename);
     var generatedSource = dartTestWrapper(libraryPathComponent);
     dartWrapper.writeStringSync(generatedSource);
@@ -1200,8 +1196,6 @@
     Path dir = filePath.directoryPath;
     String nameNoExt = filePath.filenameWithoutExtension;
 
-    Path pngPath = dir.append('$nameNoExt.png');
-    Path txtPath = dir.append('$nameNoExt.txt');
     String customHtmlPath = dir.append('$nameNoExt.html').toNativePath();
     File customHtml = new File(customHtmlPath);
 
@@ -1323,8 +1317,6 @@
       var fullHtmlPath =
           _getUriForBrowserTest(htmlPath_subtest, subtestName).toString();
 
-      List<String> args = <String>[];
-
       if (runtime == "drt") {
         var dartFlags = [];
         var contentShellOptions = [];
@@ -1456,14 +1448,11 @@
   Command _compileCommand(String inputFile, String outputFile,
       String compiler, String dir, optionsFromFile) {
     assert (['dart2js', 'dart2dart'].contains(compiler));
-    String executable;
     List<String> args;
     if (compilerPath.endsWith('.dart')) {
       // Run the compiler script via the Dart VM.
-      executable = dartVmBinaryFileName;
       args = [compilerPath];
     } else {
-      executable = compilerPath;
       args = [];
     }
     args.addAll(TestUtils.standardOptions(configuration));
@@ -1912,7 +1901,6 @@
   }
 
   bool isTestFile(String filename) {
-    var sep = Platform.pathSeparator;
     // NOTE: We exclude tests and patch files for now.
     return filename.endsWith(".dart") &&
         !filename.endsWith("_test.dart") &&
@@ -2016,8 +2004,6 @@
     }
 
     doTest = onTest;
-    Map<String, String> _localPackageDirectories;
-    Map<String, String> _localSampleDirectories;
     List<String> statusFiles = [
         TestUtils.dartDir.join(new Path(statusFilePath)).toNativePath()];
     ReadTestExpectations(statusFiles, configuration).then((expectations) {
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index 5b24234..a1c4ecc 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -5,10 +5,9 @@
 library utils;
 
 import 'dart:io';
-import 'dart:math' show min;
 import 'dart:convert';
 
-part 'legacy_path.dart';
+import 'path.dart';
 
 // This is the maximum time we expect stdout/stderr of subprocesses to deliver
 // data after we've got the exitCode.